Pascal - Menu


(Mancewicz1993) #1

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ś ??


(Simplex111) #2

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