Pascal - Menu

Witam, od niedawna zająłem się programowaniem. Z łatwymi rzeczami idzie mi bez problemu, ale ostatnio naszła mnie ochota na zebranie w jeden, większości programów które do tej pory napisałem. Zależało mi również na tym, żeby program wyświetlał menu i po wciśnięciu np. jedynki (bez późniejszego wciskania Entera) przechodził do danej procedury/funkcji.

Mam problem z procedurą case … of (widziałem w programie podobnym do mojego, że została ona zastosowana) i nie mogę dojść co go powoduje. Z góry dzięki za pomoc :slight_smile:

program Zlozony;

uses crt;

var a,b,c,delta,x1,x2,x0,xl:real;

imie,odp:string;

klawisz: char;


{-----------------------------------------------------------}


PROCEDURE wyswietlMenu;

begin;

clrscr;

writeln('==================================================');

writeln('* Wybierz opcje z listy ponizej: *');

writeln('* 1. Rownanie kwadratowe/liniowe *');

writeln('* 2. Kalkulator *');

writeln('* 3. Liczba doskonala *');

writeln('* 4. Choinka *');

writeln('* 5. Gra w "Pomysl liczbe" *');

writeln('* Aby wyjsc z programu - nacisnij klawisz Esc *');

writeln('==================================================');

end;


{-----------------------------------------------------------}



PROCEDURE WczytanieOpcji (var klawisz: char);

begin

writeln('Wybierz opcje z listy powyzej');

klawisz:=ReadKey;

end;


{-----------------------------------------------------------}


function rownanie (var a,b,c,delta,x1,x2,x0:real; n: word):boolean;

begin;

   begin

   clrscr;

   writeln('==========PROGRAM ROWNANIE==========');

   writeln;

   writeln('Podaj wartosc wspolczynnika "a"');

   readln(a);

   end;

   begin;

      if a=0 then

      begin

      writeln('==========Rownanie liniowe==========');

      writeln;

      writeln('Podaj wartosc wspolczynika "b"');

      readln(b);

      writeln;

      writeln('Podaj wartosc wspolczynnika "c"');

      readln(c);

      writeln;

      writeln('Rozwiazaniem rownania * jest liczba: x = -',c:2:2,' / ',b:2:2,' = ',-c/b:2:2);

      end;

   if a<>0 then begin

   writeln('Podaj wartosc wspolczynnika "b"');

   readln(b);

   writeln('Podaj wartosc wspolczynnika "c"');

   readln(c);

   delta:=sqr(b)-4*a*c;

   writeln('Delta wynosi: ',delta:2:2);

   end;

      if delta>0 then

      begin

      x1:=(-b-sqrt(delta))/2*a;

      x2:=(-b+sqrt(delta))/2*a;

      write('Pierwiastki rownania to: ');

      write('x1= ');

      writeln(x1:2:2);

      writeln(' oraz');

      write(' x2= ');

      writeln(x2:2:2);

      end;

            if delta=0 then

            begin

            x0:=(-c)/(b);

            writeln('Pierwiastkiem rownania jest x0= ',x0:2:2);

            end;

                if delta<0 then

                begin

                writeln('Rownanie nie ma rozwiazania');

                end


     else

     begin

     writeln(' ');

   end;

END;


{-----------------------------------------------------------------------------------------}


PROCEDURE WyborOpcji (var klawisz:char);

var n:byte;

const Esc = #27;

begin

   case klawisz of

     '1': rownanie (n); {Tutaj mam problem, bo: 1. Program wywala Error 26: Type mismach, 2. Nie wiem jak wykorzystać tutaj funkcję case...of}

     '2': kalkulator (n);

     '3': doskonala (n);

     '4': choinka (n);

     '5': gra (n);

     'Esc': klawisz (n);

   end;

end;


BEGIN

clrscr;

WyswietlMenu;

READLN;

END.

P.S. Program oczywiście nie jest skończony, ale jak poznam zasadę działania do jednej funkcji, dalej chyba dam radę.

Pomoże ktoś ??

Twój problem nie dotyczy instrukcji case. Kompilator wykrył różnicę między listą parametrów formalnych funkcji rownanie oraz listą parametrów aktualnych, czyli przekazanych do funkcji podczas jej wywołania.

Deklarujesz funkcję tak:

function rownanie (var a,b,c,delta,x1,x2,x0:real; n: word):boolean;

a następnie próbujesz ją wywołać w ten sposób, podając tylko jeden parametr:

'1': rownanie (n);

Pierwszy parametr formalny tej funkcji - “a” jest typu Real , a pierwszy i zresztą jedyny (a powinno ich być osiem) parametr aktualny przekazany do funkcji, czyli “n” jest typu Byte , dlatego kompilator zgłasza błąd: Type mismatch , czyli niezgodność typów