Wykonanie kodu C++ krok po kroku: zmienne, pętle i tablice bez kompilatora
Program w C++ wykonuje się instrukcja po instrukcji, a każda zmienna ma typ nadany przy deklaracji. To narzędzie zatrzymuje się po każdej instrukcji i pokazuje dwie rzeczy naraz: wartości wszystkich zmiennych oraz tekst, który program zdążył wypisać przez cout. Zamiast liczyć obroty pętli w pamięci, po prostu je przeklikujesz.
Typ decyduje o wyniku działania. Gdy obie liczby są typu int, dzielenie odrzuca część ułamkową, więc 7 / 2 daje 3, a nie 3.5. Wystarczy, że jedna strona jest typu double, i wynik ma już ułamek. Rzutowanie (int) nie zaokrągla, tylko obcina: z 5.96 zostaje 5.
Zapis a++ i ++a zwiększa zmienną o jeden, ale jako wyrażenie oddaje co innego. Pierwszy oddaje wartość sprzed zwiększenia, drugi już po nim. Widać to w przypisaniu b = a++ oraz w warunku pętli, w którym porównanie korzysta jeszcze ze starej wartości.
Arkusze lubią błędy, które się kompilują. Pojedynczy znak równości w warunku nie porównuje, tylko przypisuje, a zero znaczy fałsz. Średnik zaraz po nawiasie while tworzy pętlę z pustym ciałem. Narzędzie wykonuje taki kod dokładnie tak, jak zrobiłby to komputer, i opisuje słowami, co zaszło w danym kroku.
Silnik obsługuje część języka potrzebną na egzaminie: zmienne, operatory, warunki, pętle, tablice, napisy, funkcje (także z referencją i wskaźnikiem na zmienną) oraz vector. Nie ma jeszcze klas i nie czyta z klawiatury, więc zamiast cin wpisuje się wartość wprost.
Przykład: co wypisze pętla while (a++ < 6)
1
Kod: int a = 1; while (a++ < 6) { cout << a << " "; }
2
Warunek porównuje starą wartość a, czyli 1 < 6, i dopiero potem a rośnie do 2. W ciele pętli program wypisuje więc 2.
3
Tak samo idą kolejne obroty: wypisane zostają 3, 4, 5 i 6.
4
Ostatnie porównanie to 6 < 6, czyli fałsz, ale a i tak rośnie do 7. Na ekranie jest 2 3 4 5 6, a zmienna a po pętli ma wartość 7.
Najczęstsze pytania
Oba zwiększają zmienną o jeden. Zapis a++ oddaje w wyrażeniu wartość sprzed zwiększenia, a ++a wartość po zwiększeniu. Dla a równego 5 przypisanie b = a++ daje b równe 5, a b = ++a daje b równe 6.
Bo obie liczby są całkowite, a dzielenie liczb całkowitych odrzuca część ułamkową. Zapis 7 / 2.0 albo (double)7 / 2 daje już 3.5.
Program się skompiluje, ale warunek przestanie porównywać. Zapis if (b = 0) wpisuje zero do b, a zero oznacza fałsz, więc blok nigdy się nie wykona. To typowy błąd logiczny z arkuszy.
Nie. Narzędzie nie czyta z klawiatury, bo każdy przebieg ma dawać ten sam wynik. Zamiast cin >> x wpisz wartość wprost, na przykład int x = 5.