[Pascal] Błędy w kodzie, struktura Begin End;

Witam.

Jakiś czas temu zacząłem uczyć się Pascala, napisałem kilka małych programików i chciałem się zabrać za coś większego. Razem z kumplem napisaliśmy po programie, a potem je złączyliśmy. Oba programy działały, dopóki ich nie połączyliśmy. Jako że z Pascalem mam do czynienia od niedawna, i znam tylko podstawy to w kodzie może być dużo błędów. Wydaję mi się że głównym problemem jest pomieszana struktura blokowa Begin End; w skrócie End’y mam w złym miejscu. Ale to tylko moje podejrzenia. Mam nadzieje że odszukacie wszystkie błędy i pomożecie mi naprawić program :slight_smile:

O to kod:

Program Weendow;










Uses dos, crt;






Const


haslo='Kis';


pi=3.14;




Var




  dalejwyjscie:byte;


  boka:integer;


  bokb:integer;


  bokc:integer;


  promien:integer;


  wybierztrojkat:byte;


  prostokatny:byte;


  pitagoras:byte;


  dowolny:byte;


  wysokosc:integer;


  pole:integer;


wprowadz1: integer;


wprowadz2: integer;


imie:String;


wprowadz: integer;


petla:byte;


 menu1:byte;


 menu2:byte;


 menu3:byte;


 menu4:byte;


 bokakwadratu:integer;


 bokaprostokonta:integer;


 bokbprostokonta:integer;


 kat:integer;


 wyborkolo:byte;


 menu_wyjscie:byte;





liczba1: Integer;


liczba2: Integer;










begin


textcolor(white);


textbackground(blue);


    ClrScr;


           WriteLn;


          WriteLn( 'Jak sie nazywasz?');


          Readln( imie );


           ClrScr;


          WriteLn;


          WriteLn('Siema ' , imie , '! Witaj w WeeKalkulatorze!' );


    repeat


          WriteLn('Co chcesz robic?');


          WriteLn('[1]Dodawac,[2]odejmowac, [3]dzielic czy [4]mnozyc, [5]obliczenia na figurach?');


          ReadLn(wprowadz);


          IF (wprowadz<1) OR (wprowadz>5) THEN


          begin


          writeln('Musisz wybrac [1], [2], [3], [4] lub [5]');


          readln(wprowadz);


          END;




                IF wprowadz=5 THEN


           begin


           CLRscr;


           WriteLn('Wybierz Rodzaj Figury');


           WriteLn('[1]Plaska | [2]Przestrzenna');


           ReadLn(wprowadz2);


           IF (wprowadz2<1) OR (wprowadz2>2) THEN


           begin


           writeln('Musisz wybrac [1] lub [2]');


           readln(wprowadz2);


           END;




           IF wprowadz2=1 THEN


begin


 clrScr;


 Writeln('Witaj, wybierz jaka figura cie interesuje');


 Writeln('1- kwadrat');


 Writeln('2- prostokat');


 writeln('3- kolo');


 writeln('4- trojkat');


 writeln('5- exit');


 readln(menu1);




  If menu1=1 then


   begin


    ClrScr;


    Writeln('Wybrales kwadrat, oto opcje do wyboru');


    Writeln('1-pole, 2- obwod, 3- promien okregu wpisanego');


     readln(menu2);


     If menu2=1 then


      begin


       clrScr;


        Writeln('Wybrales obliczanie pola, podaj dlugosc boku a');


        readln(bokakwadratu);


        Write('Pole tego kwadratu wynosi: ');


        Writeln(bokakwadratu*bokakwadratu);


       end;




        If menu2=2 then


      begin


       clrScr;


        Writeln('Wybrales obliczanie obwodu, podaj dlugosc boku a');


        readln(bokakwadratu);


        Write('obwod tego kwadratu wynosi: ');


        Writeln(bokakwadratu*4);


        readln;


       end;


        If menu2=3 then


      begin


       clrScr;


        Writeln('Wybrales obliczanie promienia okregu wpisanego, podaj dlugosc boku a');


        readln(bokakwadratu);


        Write('Promien okregu wpisanego w ten kwadrat wynosi: ');


        Writeln(bokakwadratu/2:4:1);




       end;


     end;




      If menu1=2 then


       begin


        clrscr;


        Writeln('Wybierz co chcesz zrobic: ');


        Writeln('1- pole, 2-obwod');


        Readln(menu3);


            end;


        If menu3=1 then


        begin


        clrscr;


        writeln('Wybrales obliczanie pola, podaj dlugosc boku a');


        Readln(bokaprostokonta);


        Writeln('A teraz podaj dlugosc boku b');


        readln(bokbprostokonta);


        write('Pole tego prostokata to: ');


        writeln(bokaprostokonta*bokbprostokonta);


        end;


        if menu3=2 then


        begin


        clrscr;


        writeln('Wybrales obliczenie obwodu prostokonta, podaj dlugosc boku a');


        Readln(bokaprostokonta);


        Writeln('Podaj dlugosc boku b');


        readln(bokbprostokonta);


        Write('obwod tego prostokonta wynosi: ');


        Writeln((bokaprostokonta+bokbprostokonta)*2);


        end;


     If menu1=3 then


      begin


       clrscr;


       Writeln('Dostepne opcje dla kola:');


       Writeln('1-pole kola, 2-obwod kola, 3- pole wycinka');


       Readln(wyborkolo);


        if wyborkolo=1 then


         begin


         clrscr;


         Writeln('Wybrales obliczanie pola kola, podaj dlugosc promienia(r)');


         readln(promien);


         write('Pole wynosi: ');


         writeln((promien*promien)*pi);


         end;


       if wyborkolo=2 then


        begin


         clrscr;


         Writeln('Wybrales obliczenie obwodu kola, podaj dlugosc promienia(r)');


         readln(promien);


         Write('Obwod wynosi: ');


         Writeln(2*pi*promien);


        end;


         If wyborkolo=3 then


          begin


           clrscr;


           Writeln('Wybrales obliczanie wycinka kola, wpisz kat odcinka');


           readln(kat);


           Writeln('Podaj dlugosc promienia(r)');


           readln(promien);


           Write('Pole tego wycinka wynosi: ');


           Writeln((kat/360)*(promien*promien)*pi);


           end;






If menu1=4 then


   begin


    clrscr;


    Writeln('Wybierz jaki trojkont cie interesuje');


    Writeln('1-trojkat prostokatny');


    Writeln('2-trojkat dowolny');


    Readln(wybierztrojkat);




 If wybierztrojkat=1 then


    begin


     clrscr;


     Writeln('Wybrales trojkat prostokatny, wybierz co chcesz zrobic');


     Writeln('1-Obliczyc obwód, 2-Obliczyc pole');


     readln(prostokatny);




 If prostokatny=1 then


    begin


     Writeln('Podaj dlugosc boku a');


     readln(boka);


     writeln('Podaj dlugosc boku b');


     readln(bokb);


     writeln('Podaj dlugosc boku c');


     readln(bokc);


     write('Obwod tego trojkata wynosi ');


     Writeln(boka+bokb+bokc);


    end;




 If prostokatny=2 then


    begin


     writeln('Podaj dlugosc boku a ');


     readln(boka);


     writeln('Podaj dlugosc boku b');


     readln(bokb);


     Write('Pole tego trojkata wynosi: ');


     Writeln((boka*bokb)/2:4:2);


    end;


   end;




 If wybierztrojkat=2 then


    begin


     clrscr;


     Writeln('Co chcesz zrobic?');


     Writeln('1-Oblicz pole');


    end;




 If dowolny=1 then


    begin


     clrscr;


     Writeln('Podaj wysokosc');


     readln(wysokosc);


     Writeln('Podaj dlugosc boku a');


     readln(boka);


     Write('pole tego trojkata wynosi: ');


     Writeln((boka*wysokosc)/2:4:2);


    end;






end;












           END;




            IF wprowadz=4 THEN


           begin


           CLRscr;


           WriteLn('Wybierz pierwsza liczbe');


           ReadLn(liczba1);


           WriteLn('Wybierz druga liczbe');


           ReadLn(liczba2);


           WriteLn('Trrrr...Pfrrrr...(Trwa Mnozenie...)');


           Delay(1000);


           Write(liczba1, '*' ,liczba2, '=');


           Delay(1000);


           WriteLn(liczba1 * liczba2);


           Delay(1000);


           WriteLn('Mnozenie zakonczone...');


           Delay(1000);


           END;










           IF wprowadz=3 THEN


           begin


           CLRSCR;


           WriteLn('Wybierz pierwsza liczbe');


           ReadLn(liczba1);


           WriteLn('Wybierz druga liczbe');


           ReadLn(liczba2);


           WriteLn('Trrrr...Pfrrrr...(Trwa dzielenie...)');


           Delay(1000);


           Write(liczba1, '/' ,liczba2, '=');


           Delay(1000);


           WriteLn(liczba1 / liczba2 :8:4);


           Delay(1000);


           WriteLn('Dzielenie zakonczone...');


           Delay(1000);




           END;










          IF wprowadz=2 THEN


           begin


           clrscr;


           WriteLn('Wybierz pierwsza liczbe');


           ReadLn(liczba1);


           WriteLn('Wybierz druga liczbe');


           ReadLn(liczba2);


           WriteLn('Trrrr...Pfrrrr...(Trwa Odejmowanie...)');


           Delay(1000);


           Write(liczba1, '-' ,liczba2, '=');


           Delay(1000);


           WriteLn((liczba1 - liczba2));


           Delay(1000);


           WriteLn('Odejmowanie zakonczone...');


           Delay(1000);


           END;








          IF wprowadz=1 THEN


           begin


           clrscr;


           WriteLn('Wybierz pierwsza liczbe');


           ReadLn(liczba1);


           WriteLn('Wybierz druga liczbe');


           ReadLn(liczba2);


           WriteLn('Trrrr...Pfrrrr...(Trwa Dodawanie...)');


           Delay(500);


           Write(liczba1, '+' ,liczba2, '=');


           Delay(500);


           WriteLn((liczba1 + liczba2));


           Delay(1000);


           WriteLn('Dodawanie zakonczone...');









   end;

Delay(1000);

          Writeln('1-menu glowne, 2-wyjscie');

          readln(menu_wyjscie);




           until menu_wyjscie=2 


end;



end;


END.

Pozdrawiam

Ps. Wiem że w kodzie mam nieźle namieszane, mam nadzieje że to was nie odtrąca :wink:

A więc, błędem kompilacji było umiejscowienie endów poza repeat-until.

Końcówka wygląda u Ciebie tak:

Writeln('1-menu glowne, 2-wyjscie');

          readln(menu_wyjscie);


           until menu_wyjscie=2

end;

end;

END.

A powinna tak:

Writeln('1-menu glowne, 2-wyjscie');

          readln(menu_wyjscie);

end;

end;

           until menu_wyjscie=2

END.

Wtedy program uruchamia się. Jak na szybko przetestowałem, to i tak nie działa jak powinien. Ale nie podejmuje się naprawiania go, bo najłatwiej byłoby napisać od nowa. Poczytaj o instrukcji warunkowej case , bo z taką ilością if to się można zajechać…

Dobrze spróbuje napisać raz jeszcze, tym razem z użyciem funkcji warunkowej case.

Jednak mam pytanie. Czy cały program ma opierać się na case , nie używać w ogóle if?

Czy można wbudowywać if do case i na odwrót?

Można wbudowywać, generalnie na if’ach można zrobić efektywniej niż to robi case.

Z tym że case będzie bardziej efektywny od tego sposobu jak używasz if’ów (mam na myśli bez else).

twój sposób najgorszy:

if V=0 then fun0();V=1 then fun1();V=2 then fun2();V=3 then fun3(); [/code]

lepszy sposób równoznaczny case:
[code=php]if V=0 then fun0()V=1 then fun1()V=2 then fun2()V=3 then fun3(); 

jeszcze lepszy sposób nawet lepszy niż case:

if V2 thenif V1 then fun0()fun1();

Case jest bardziej czytelny niż if z else, oraz mniej pisania niż elseif :wink: Ale są gusta i guściki :wink:

Napisałem program od nowa, wykorzystując Case, oraz procedury.

Tzn. wszystkie akcje opisałem w procedurach, a CASE wykorzystałem tylko jako ,odnośniki".

Swoją drogą, Case bardzo umila pracę w TP :smiley:

Jedna rzecz mnie trochę że tak powiem zdziwiła. O Case uczyłem się stąd: http://turbopascal.skryptoteka.pl/12.html

jednak TP po kompilacji wołał o dodanie end; po zakończeniu funkcji warunkowej Case. I teraz moje pytanie, czy błąd jest na stronie, czy raczej to ja zrobiłem błąd? Ja byłbym za drugą opcją, ale kod w głównej części programu mam tak skąpy że nie mam w nim gdzie chyba zrobić błędu.

Sam już nie wiem. Jak już wspominałem dopiero się uczę, więc jest możliwe że nawet tam zrobiłem błąd.

Błąd jest na stronie :wink: Po Case jest end; :wink:

kubut dzięki za info :slight_smile:

Polecam się na przyszłość :slight_smile: