Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zagnieżdżone pętle - prośba o wyjaśnienie.

Ostatnio zmodyfikowano 2012-12-07 20:22
Autor Wiadomość
Darek254
Temat założony przez niniejszego użytkownika
Zagnieżdżone pętle - prośba o wyjaśnienie.
» 2012-12-07 14:22:02
Mam problem polegający na tym że mimo to że analizuje i patrzę w kod nie rozumiem jak on działa, nie rozumiem zagnieżdżonych pętli.

Przerobiłem program z lekcji 30 tak aby pokazywał zamiast gwiazdek liczby sądziłem że pomoże mi to w zrozumieniu sposobu w jakim to działa.

C/C++
#include <iostream>

int main()
{
    for( int pierwszaZmienna = 1; pierwszaZmienna <= 10; ++pierwszaZmienna )
    {
        for( int x = 1; x <= pierwszaZmienna; ++x )
             std::cout << x;
       
        std::cout << std::endl;
    } //for
    return 0;
}

I dało to taki wynik:
1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910

Jeśli dodam kolejną pętle dostaje wynik taki jak wyżej z pewnymi zmianami np. w rzędzie poziomym 1 raz występuje liczba "1" 2 razy liczba "2" ... 7 razy liczba "7" itd.Chodzi mi o to że nie rozumiem sposobu działania zagnieżdżonych pętli(w jakiej kolejności wykonują się instrukcje) oraz dlaczego wystąpiło takie coś jak napisałem wcześniej.

Proszę o wyjaśnienie jak działa zagnieżdżona pętla w zrozumiały jak dla osoby uczącej się sposób, najlepiej na tym lub innym przykładzie.

Z góry dzięki.
P-70481
jsc
» 2012-12-07 14:28:36
Jeśli dodam kolejną pętle

A gdzie dokładnie ją dodasz?
P-70482
Darek254
Temat założony przez niniejszego użytkownika
» 2012-12-07 14:38:21
C/C++
#include <iostream>

int main()
{
    for( int pierwszaZmienna = 1; pierwszaZmienna <= 10; ++pierwszaZmienna )
    {
        for( int x = 1; x <= pierwszaZmienna; ++x )
        {
            for( int y = 1; y <= x; ++y )
            {
                std::cout << x;
               
            }
        }
        std::cout << std::endl;
    } //for
    return 0;
}

i dostaje taki wynik:

1
122
122333
1223334444
122333444455555
122333444455555666666
1223334444555556666667777777
122333444455555666666777777788888888
122333444455555666666777777788888888999999999
12233344445555566666677777778888888899999999910101010101010101010

A jeśli w ostatniej pętli zmienię x na y to dostane przedziwny wynik jest za długi aby go przepisać ale jeśli nie chce się komuś zmieniać tej jednej litery a chce mi pomóc to tu ma kod:

C/C++
#include <iostream>

int main()
{
    for( int pierwszaZmienna = 1; pierwszaZmienna <= 10; ++pierwszaZmienna )
    {
        for( int x = 1; x <= pierwszaZmienna; ++x )
        {
            for( int y = 1; y <= x; ++y )
            {
                std::cout << y;
               
            }
        }
        std::cout << std::endl;
    } //for
    return 0;
}
P-70483
SeaMonster131
» 2012-12-07 14:47:47
Zobacz co wypisze ten program:
C/C++
#include <iostream>
using namespace std;

int main()
{
    for( int a = 0; a < 5; a++ )
    {
        cout << "\nA = " << a;
        for( int b = 0; b < 3; b++ )
        {
            cout << "\n B = " << b;
            for( int c = 0; c < 2; c++ )
            {
                cout << "\n  C = " << c;
            }
        }
    }
   
    return 0;
}

Wynik:


A = 0
 B = 0
  C = 0
  C = 1
 B = 1
  C = 0
  C = 1
 B = 2
  C = 0
  C = 1
A = 1
 B = 0
  C = 0
  C = 1
 B = 1
  C = 0
  C = 1
 B = 2
  C = 0
  C = 1
A = 2
 B = 0
  C = 0
  C = 1
 B = 1
  C = 0
  C = 1
 B = 2
  C = 0
  C = 1
A = 3
 B = 0
  C = 0
  C = 1
 B = 1
  C = 0
  C = 1
 B = 2
  C = 0
  C = 1
A = 4
 B = 0
  C = 0
  C = 1
 B = 1
  C = 0
  C = 1
 B = 2
  C = 0
  C = 1
P-70484
jsc
» 2012-12-07 14:57:39
W pierwszej pętli program ma napisać liczbę x razy x, a w drugiej ma wypisywać liczby od 1 do x razy 10, czyli wyjdzie ci:
1
112
112123
1121231234
112123123412345
112123123412345123456
1121231234123451234561234567
112123123412345123456123456712345678
112123123412345123456123456712345678123456789
11212312341234512345612345671234567812345678912345678910
P-70485
CodeMeister
» 2012-12-07 18:53:12
Pętla wewnętrzna sama wykona się 10 razy
C/C++
for( int x = 1; x <= pierwszaZmienna; ++x ) //w zależności od wartości zmiennej wykona się od 1 do 10 razy
     std::cout << x;


Jeśli umieścimy ją w kolejnej pętli (zewnętrznej):
C/C++
for( int pierwszaZmienna = 1; pierwszaZmienna <= 10; ++pierwszaZmienna ) //Wykona się 10 razy
{
    for( int x = 1; x <= pierwszaZmienna; ++x )
         std::cout << x;
   
    std::cout << std::endl;
}
Będzie wykonywała się 10 razy (tyle razy ile pętla zewnętrzna) i sama będzie tyle razy wyświetlała liczbę ile będzie wynosiła wartość zmiennej 'pierwszaZmienna'.

czyli dla 'pierwszaZmienna' o wartości 3:
-pętla wewnętrzna w pierwszym "obiegu" wypisze 1, w drugim 12 a w trzecim 123 ponieważ
for( int x = 1; x <= pierwszaZmienna; ++x )
póki 'x' (1) jest mniejsze od 'pierwszaZmienna'(3) będzie wyświetlana wartośc x
-następuje powrót do pętli zewnętrznej
-inkrementacja (dodanie 1 do) 'PierwszaZmienna'

i znowu pętla wewnętrzna wykona się 4 razy, powrót, inkrementacja, itd. dopóki 'pierwszaZmienna' nie osiągnie wartości 10
P-70490
Mrovqa
» 2012-12-07 18:54:21
@Darek254 jako podpowiedź wiedz, iż nie trzeba do tego aż trzech pętli zagnieżdżonych w sobie. Wystarczą dwie.
P-70491
Darek254
Temat założony przez niniejszego użytkownika
» 2012-12-07 20:22:35
Dzięki wielkie za pomoc wszystkim ale najlepiej doszło do mnie tłumaczenie CodeMeister'a.
Mam nadzieje że ten problem poruszony przeze mnie pomoże innym którzy uczą się programować a właśnie na zagnieżdżonych pętlach napotkali "barierę".

Temat do zamknięcia :P
P-70494
« 1 »
  Strona 1 z 1