[Turbo Pascal] Case Of jako procedura - problem


(Lightextract) #1
program Wyborowy;

uses crt;


procedure Trojkat;

begin

writeln('Trójkąt');

delay(3000);

end;


procedure Kwadrat;

begin

writeln('Kwadrat');

delay(3000);

end;


Procedure Wybor;

var sel:byte;

begin

readln(sel);

case sel of

1:Trojkat;

2:Kwadrat;

end;


begin

Wybor;

end.

Mam informację w kompilatorze o błędzie, że o ile dobrze rozumiem zamiast kropki powinien być średnik w ostatniej linijce. (Fatal:Syntax error, ";" expected but "." found)

Skąd ten błąd ?

Jeżeli tutaj niepoprawnie umieściłem case of w procedurze to jak umieścić poprawnie ją tak, aby działała ?


(system) #2

To bardzo proste :

Procedure Wybor;

var sel:byte;

begin

readln(sel);

case sel of

 1:Trojkat;

 2:Kwadrat;

end;

end;

Zobaczysz tutaj swój błąd.


(Lightextract) #3

Spróbuję zrozumieć:

Czyli tak jakby to co jest między " end; " i " end;" które dodałeś zaraz po tym pierwszym end; to miejsce dla wykonania procedury Trojkat lub Kwadrat?

Dobrze myślę? To end po endzie - to i to ze średnikiem wygląda tak, że nigdy bym na to nie wpadł, chociaż dosyć jasna być może wydaje mi się logika tego.

To tak jakbym wykonywał mniej więcej procedurę w procedurze ?

Dzięki wielkie za odpowiedź.


(system) #4

Instrukcja wyboru w Pascalu ma postać :

Case zmienna of 

   warunek : .....;

   warunek : .....;

End;

Jeżeli używasz już modułu crt; to warto wstawić

clrscr;

(Lightextract) #5

Nooo ja wieem, ale w sumie nie wiem czemu o tym wspomniałeś.

Jaki to ma związek z podwójnym " end; " ?

Prosiłbym o odpowiedź na powyżej zadane pytania :stuck_out_tongue:

Co do clrscr - też wieem, to tylko przykład który opierał się na moim problemie :slight_smile:


(system) #6

Ma to związek taki, że deklarując procedurę wygląda to mniej więcej tak

procedure jakas_procedura(lista parametrów formalnych)

część opisowa

Begin

Case zmienna of

warunek : .....;

warunek : .....;

End;

End;

---EDIT---

zdanie dotyczące Pascala brzmi mniej więcej tak : "Jeżeli chcesz coś wykorzystać to najpierw to zadeklaruj". W tym wypadku jasne jest, że wywołujesz procedurę w procedurze, tylko najpierw taką procedurę należy opisać. Za bardzo nie rozumiem, co masz dokładnie na myśli :slight_smile:


(Lightextract) #7

Czyli pisząc case w procedurze muszę zamknąć ową instrukcję case jednym " end; ", następnie samą procedurę zawierającą owe case kolejnym " end; " ?

Ponieważ normalnie jest to chyba zbędne, tyle że w procedurze wymagane ?


(system) #8

W każdym wypadku instrukcję wyboru musisz zakończyć

end;

Niezależnie, gdzie to się znajduje oraz procedurę. Tak, jak powyżej widać w przykładzie.


(Lightextract) #9

W sumie ostatnie pytanie: czyli w sumie nawet jak takie case of działa bez " end; " na końcu, to i tak trzeba je dopisać, bo tak powinno być?

Dzięki wielkie ! :slight_smile:


(system) #10

Nie ma takiej możliwości, żeby to działałoby Tobie bez zakończenia END;. Czyli odpowiadając na twoje pytanie, tak na końcu koniecznie musi być END;


(Lightextract) #11

Faktycznie, masz jak najbardziej rację.

Z krótkiego internetowego kursu Turbo Pascala, który był pisany na szybko ( http://turbopascal.skryptoteka.pl/12.html) nauczyłem się błędnie, że niekoniecznie trzeba.

Przykładowy fragment ze strony:

USES CRT;


VAR

liczba:byte;


BEGIN

clrscr;

writeln(' Wprowadź liczbę od 1 do 20');

read(liczba);

CASE liczba OF

1 : writeln('Liczba ta dzieli się przez 1');

2 : writeln('Liczba ta dzieli się przez 2 i 1');

3 : writeln('Liczba ta dzieli się przez 1 i 3');

4 : writeln('Liczba ta dzieli się przez 1,2 i 4');

5 : writeln('Liczba ta dzieli się przez 1 i 5');

6 : writeln('Liczba ta dzieli się przez 1,2,3 i 6');

7 : writeln('Liczba ta dzieli się przez 1 i 7');

8 : writeln('Liczba ta dzieli się przez 1,2,4 i 8');

9 : writeln('Liczba ta dzieli się przez 1,3 i 9');

10 : writeln('Liczba ta dzieli się przez 1,2,5 i 10');

11 : writeln('Liczba ta dzieli się przez 1 i 11');

12 : writeln('Liczba ta dzieli się przez 1,2,4,6 i 12');

13 : writeln('Liczba ta dzieli się przez 1 i 13');

14 : writeln('Liczba ta dzieli się przez 1,2,7 i 14');

15 : writeln('Liczba ta dzieli się przez 1,3,5 i 15');

16 : writeln('Liczba ta dzieli się przez 1,2,4,8 i 16');

17 : writeln('Liczba ta dzieli się przez 1 i 17');

18 : writeln('Liczba ta dzieli się przez 1,2,6,9 i 18');

19 : writeln('Liczba ta dzieli się przez 1 i 19');

20 : writeln('Liczba ta dzieli się przez 1,2,4,5,10 i 20');

readln;

END.

Turbo Pascal jest jedynie moim wstępnym i przejściowym językiem, więc nie uczę się go z profesjonalnej i długiej książki, a raczej z krótszych kursów internetowych opisujących podstawy...

przynajmniej na razie :slight_smile: Co do powyższego kodu - po prostu nie testując akurat tego kawałka kodu przyjąłem, że jest on napisany poprawnie. Kod potraktowałem bardziej jako teoretyczny przykład opisany przez autora kursu.

Jeszcze raz wielkie dzięki.