@fasadin: b
nie może być zerem, bo to wartość logiczna. Co prawda Ord(True)
to 1
, a Ord(False)
to 0
, jednak z racji bardzo silnego typowania języka, ma to kluczowe znaczenie.
@Grimus23: analizując od początku:
b := ((q div p + 1) = q);
Zmienna b
otrzyma wartość True, albowiem zmienne q
i p
zawierają wartości 2
, co da nam 2 div 2 + 1 = 2
, operator div ma wyższy priorytet niż operator dodawania, więc najpierw wykonujemy dzielenie bez reszty, co daje 1 + 1 = 2
, czyli 2 = 2
, czyli prawda.
while b do
b
zawiera True, więc warunek jest spełniony i nastepuje pierwsza iteracja pętli.
p := p - 1;
p
zawiera wartość 2
, odejmujemy 1
i otrzymujemy 1
.
b := ((q div p + 1) = q);
Zmienna b
otrzymuje wartość False, dlatego że zmienna q
zawiera wartość 2
, zmienna p
została dekrementowana i zawiera wartość 1
, co daje nam 2 div 1 + 1 = 2
, znów najpierw wykonujemy dzielenie co daje nam 2 + 1 = 2
, czyli 3 = 2
, co jest nieprawdą.
Skoro zmienna b
otrzymuje wartość False, kolejna iteracja pętli nie zostanie wykonana. Po zakończeniu pętli, zmienna q
zawiera wartość 2
, a zmienna p
wartość 1
- prawidłową odpowiedź nie problem wskazać.