Pascal: error string exceeds line

witam, mam problem z programem poniżej. Linijka 25: Error string exceeds line. Program pobiera liczby, wypisuje je i podaje ile jest liczb parzystych i nieparzystych podanych. Przy wypisaniu ile parzystych i nie parzystych jest błąd. Proszę o pomoc, dopiero uczę się tego języka :slight_smile: Edytor: Free Pascal.

program pierwszt ;

uses crt;

var

a:array[1…100] of integer;

parzyste, nieparzyste,p :integer;

begin

clrscr;

writeln (‘podaj ile liczb chcesz wpisac’);

readln§;

for p:=1 to p do

readln(a[p]);

writeln (‘Wpisałeś liczby:’);

begin

for p:=1 to p do

writeln (a[p]);

end;

for p:=1 to p do

begin

if a[p] mod 2=0 then

parzyste:=parzyste+1

else

nieparzyste:=nieparzyste+1;

writeln (‘parzystych wpisales:’,parzyste,‘a nieparzystych:’,nieparzyste,’);

end;

end.

Policz sobie apostrofy w 25 linijce, masz jeden nie do pary.

Dokładnie tak. Poza tym ta instrukcja, która zawiera błąd (writeln (‘parzystych wpisales:’,parzyste,‘a nieparzystych:’,nieparzyste,’);) powinna się znaleźć poza pętlą obliczającą ilość parzystych i nieparzystych cyfr (czyli za end; ).

Podstawowy błąd, jaki popełniłeś dotyczy niewłaściwej konstrukcji pętli for

writeln ('podaj ile liczb chcesz wpisac');

readln(p);

for p:= 1 to p do readln(a[p]);

Pisząc w taki sposób nigdy nie otrzymasz poprawnego wyniku. Musisz zadeklarować dodatkową zmienną całkowitą, np “i”. To będzie zmienna sterująca pętlą, a kod będzie wyglądał tak:

writeln ('podaj ile liczb chcesz wpisac');

readln(p);

for i:= 1 to p do readln(a[i]);

@simplex

Żeby ten kod działał prawidłowo wystarczy poprawić to o czym pisał nr47. Zgodzę się natomiast z tym, że Twój zapis pętli jest lepszy (biorąc pod uwagę sposób używania for w innych językach programowania). Sam tego nie zauważyłem, bo odpaliłem kod w kompilatorze, żeby szybko wyeliminować błędy i nie analizowałem wszystkiego linijka po linijce.

@matzu

Ja do tej pory nigdy nie wpadłem na pomysł, aby używać pętli for w ten sposób, jak to zrobił autor wątku. Szczerze mówiąc, to myślałem, że taki zapis jest błędny, a przynajmniej nielogiczny.

Teraz jednak sprawdziłem, że wszystkie dostępne mi kompilatory Pascala (Turbo Pascal, fpc, gpc) rzeczywiście poprawnie wykonują taką pętlę. Niby więc wszystko jest OK, ale jest małe ale - Delphi. Kod się kompiluje, ale już wykonanie nie jest do końca poprawne. Dokładnie to pętla wykonuje się więcej razy niż powinna. Nie wiem, z czego to może wynikać. Poniżej przykład wykonania programu dla p = 3

podaj ile liczb chcesz wpisac

3

11

12

13

Wpisales liczby:

11

12

13

0

parzystych wpisales:0 a nieparzystych:1

parzystych wpisales:1 a nieparzystych:1

parzystych wpisales:1 a nieparzystych:2

parzystych wpisales:2 a nieparzystych:2

parzystych wpisales:3 a nieparzystych:2

Tak więc wydaje mi się, że lepiej od razu nauczyć się poprawnych wzorców, aby później nie być zaskoczonym niepoprawnym działaniem programu. Zresztą z pętla for wiąże się jeszcze jeden problem - modyfikacja zmiennej sterującej wewnątrz pętli. Jedne kompilatory dopuszczają taką możliwość, a inne nie. Nawet jeżeli kompilator na to pozwala, to raz pętla się wykonuje poprawnie, a innym razem nie

Na koniec jeszcze jedna uwaga do autora wątku. Inicjalizacja zmiennych. Tutaj akurat nie jest potrzebna (zmienne globalne), ale już zmienne lokalne nie są automatycznie inicjalizowane. Dodatkowo niektóre kompilatory inicjalizują zmienne, ale inne mogą tego nie robić. Warto o tym pamiętać

Wierz mi ja też nie, ale z pewnością jest to ciekawostka.

Tak uczyłem się na programowaniu. Dzięki za pomoc. Jutro poprawiam sprawdzian z tego zakresu, więc trzymajcie kciuki :slight_smile: