Autor Wątek: Pytanie o pętle for  (Przeczytany 1899 razy)

Offline Fartuch

  • Użytkownik

# Czerwiec 01, 2012, 19:06:09
Cześć! dlaczego zwraca mi 3 wyniki zamiast 9 jeżeli mam podane <=9
tzn tylko:
6
15
24
koniec...
zamiast ciągnąć dalej... i dlaczego jest 6 na początku ?


        static void Main()
        {
            int a,b;

            for (a = 2, b=3; a<=9; a=a + b)
            {
                System.Console.WriteLine(a * b);
               
            }
        }


Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Groshu

  • Użytkownik

# Czerwiec 01, 2012, 19:13:06
a b a*b
2 3 6
5 3 15
8 3 24
11 <- koniec

Offline Fartuch

  • Użytkownik

# Czerwiec 01, 2012, 19:17:12
Ale dlaczego na początku pomija
a=a + b
i robi tylko
a*b

Offline ajuc

  • Użytkownik
    • strona domowa

# Czerwiec 01, 2012, 19:19:08
Jak nie wiesz, czemu program działa inaczej, niż g Ciebie powinien, to zrób sobie tabelkę na kartce papieru.

W kolumnach nazwy zmiennych, w wierszach będą kolejne ich wartości.

Czyli tak:

Na starcie mamy

    a    |    b    |
    2    |    3    |

a jest <= 9 więc wchodzimy do pierwszego obrotu pętli i wypisujemy a*b czyli 2*3 czyli 6.

Teraz jest wykonywane a = a + b. Czyli nasza tabelka:

    a    |    b    |
    2    |    3    |
    5    |    3    |

Sprawdzamy warunek pętli: dalej prawdziwy, bo 5 <= 9.

Wchodzimy do pętli (2 obrot pętli) i wyświetlamy 5*3 czyli 15.

Wykonywane jest znowu a =a + b czyli
    a    |    b    |
    2    |    3    |
    5    |    3    |
    8    |    3    |

Warunek 8 <= 9 jest spełniony więc wchodzimy do 3 obrotu pętli. Wyświetlamy a*b czyli 24.

No i robimy a = a + b. Mamy

    a    |    b    |
    2    |    3    |
    5    |    3    |
    8    |    3    |
    11  |    3    |

Sprawdzamy 11 <= 9 - nieprawda, więc już nie wchodzimy do kolejnego obrotu pętli.

Takie tabelki są bardzo przydatne na opczątku przygody z programowaniem, jak nie wiesz, czemu coś działa inaczej, niż byś chciał.

Pozdrawiam.

Offline Fartuch

  • Użytkownik

# Czerwiec 01, 2012, 19:35:39
ajuc jesteś spoko, czyli zawsze tak jest że za pierwszą pętlą robi
System.Console.WriteLine(a * b);
a od drugiej a=a+b ?
« Ostatnia zmiana: Czerwiec 01, 2012, 19:38:38 wysłana przez Fartuch »

Offline Kebab_u_Turka

  • Użytkownik

# Czerwiec 01, 2012, 20:39:10
Niezupełnie, na początku obrotu sprawdzi, czy a<=9
Jeśli tak, to wykona System.Console.WriteLine(a * b);
A na samym końcu(każdego obrotu pętli) dopiero a=a+b

Offline Fartuch

  • Użytkownik

# Czerwiec 02, 2012, 12:20:32
Dziękuje za odp. Teraz mam pętle z wyrażeniem if i jedno pytanie

            int a,b;
 
            for (a = 1, b=1; b<=9; a=a + 1)
            {
                System.Console.WriteLine(a +"pomnożone przez"+ b +"="+ a*b);

                if (a == 9)

                {
                    a = 0;
                    System.Console.WriteLine("");
                    b = b + 1;
                }
               
            }

Rozumiem że pętla wykonuje się bez "if" dopóki "a" nie równa się 9 następnie resetuje "a" do 0 a do "b" dodaje 1
dlaczego więc przy pierwszym wykonaniu pętli (drugiej serii) wychodzi 2 a nie 0 skoro zmienna "a" została
zresetowana do 0 ? Bo przypisuje zmiennej "a" wartość 1 od nowa? jeżeli tak to dlaczego zmienna "b" jest 2 a nie 1 ?
« Ostatnia zmiana: Czerwiec 02, 2012, 12:32:06 wysłana przez Fartuch »

Offline Rolek

  • Użytkownik

  • +2
# Czerwiec 02, 2012, 12:42:59

Offline Fartuch

  • Użytkownik

# Czerwiec 02, 2012, 12:47:47
Rolek dziękuje ale aż tak mądry to nie jestem. Musiałbyś rozpisać mi to tak jak koledzy wcześniej

Offline ajuc

  • Użytkownik
    • strona domowa

# Czerwiec 02, 2012, 13:38:35
A spróbuj sam zrobić tabelkę - poprawimy Cię, jak się pomylisz.

Offline Rolek

  • Użytkownik

  • +1
# Czerwiec 02, 2012, 14:49:58
Musiałbyś rozpisać mi to
Właściwie to nie ma co tu rozpisywać, po prostu podstawisz swój kod pod literki w schemacie i wykonujesz zgodnie ze strzałkami, TRUE – gdy warunek w bloku jest prawdziwy, FALSE – gdy fałszywy. Powinieneś łatwo zauważyć, że na końcu każdej iteracji twojej pętli wykonuje się a=a+1, więc jeśli w jednej iteracji ustawisz a na 0 to w następnej a będzie równe 1, bo po drodze masz jeszcze to a=a+1.

Jeśli rzeczywiście
aż tak mądry to nie jestem
to powinieneś sobie poszukać jakiegoś bardziej odpowiedniego dla ciebie hobby.

Offline ajuc

  • Użytkownik
    • strona domowa

  • +1
# Czerwiec 02, 2012, 14:56:53
Rolek - wyluzuj. Każdy kiedyś zaczynał.

Offline Fartuch

  • Użytkownik

# Czerwiec 02, 2012, 15:03:23
Przepraszam nie skupiłem się i nie zauważyłem że for(A;B;C)D; to inicjalizacja ; warnuek; interacja, instrukcja

OK już rozumiem dziękuje, schemat rzeczywiście pomocny tabelki ajuca też.
« Ostatnia zmiana: Czerwiec 02, 2012, 15:39:21 wysłana przez Fartuch »