Witam, piszę dla treningu kalkulator, wykonujący 8 działań na dowolnej liczbie liczb. Oto kod programu:
program kalkulator;
uses
crt;
type
tab = array[1..1000] of real;
var
a : tab;
wybor : byte;
odp : char;
function suma1(a : tab) : real;
var
i, n : word;
l, suma : real;
nap : string;
kod : integer;
begin
clrscr;
writeln('Ile liczb chcesz dodac?');
writeln('Podaj liczbe wieksza od 1 i mniejsza od 1001.');
repeat
readln(n);
if n > 1000 then writeln('Liczb ma byc nie wiecej jak 1000!');
if n < 2 then writeln('Liczb ma byc minimum 2!');
until ((n <= 1000) and (n >= 2));
suma := 0;
for i := 1 to n do
begin
writeln('Podaj ',i,' liczbe');
repeat
readln(nap);
val(nap,l,kod);
if kod <>0 then writeln('Podaj liczbe!');
until kod = 0;
a[i] := l;
suma := a[i] + suma;
suma1 := suma;
end;
write('Suma ',i,' liczb wynosi ');
end;
function roznica1(a : tab) : real;
var
i, n : word;
l, l1, roznica : real;
nap : string;
kod : integer;
begin
clrscr;
writeln('Ile liczb chcesz odjac?');
writeln('Podaj liczbe wieksza od 1 i mniejsza od 1001.');
repeat
readln(n);
if n > 1000 then writeln('Liczb ma byc nie wiecej jak 1000!');
if n < 2 then writeln('Liczb ma byc minimum 2!');
until ((n <= 1000) and (n >= 2));
roznica := 0;
writeln('Podaj 1 liczbe');
repeat
readln(nap);
val(nap,l1,kod);
if kod <>0 then writeln('Podaj liczbe!');
until kod = 0;
for i := 2 to n do
begin
writeln('Podaj ',i,' liczbe');
repeat
readln(nap);
val(nap,l,kod);
if kod <>0 then writeln('Podaj liczbe!');
until kod = 0;
a[i] := l;
roznica := roznica + a[i];
end;
roznica1 := l1 - roznica;
write('Roznica ',i,' liczb wynosi ');
end;
function iloczyn1(a : tab) : real;
var
i, n : word;
l, iloczyn : real;
nap : string;
kod : integer;
begin
clrscr;
writeln('Ile liczb chcesz pomnozyc?');
writeln('Podaj liczbe wieksza od 1 i mniejsza od 1001.');
repeat
readln(n);
if n > 1000 then writeln('Liczb ma byc nie wiecej jak 1000!');
if n < 2 then writeln('Liczba ma byc minimum 2!');
until ((n <= 1000) and (n >= 2));
iloczyn := 1;
for i := 1 to n do
begin
writeln('Podaj ',i,' liczbe');
repeat
readln(nap);
val(nap,l,kod);
if kod <>0 then writeln('Podaj liczbe!');
until kod = 0;
a[i] := l;
iloczyn := a[i] * iloczyn;
iloczyn1 := iloczyn;
end;
write('Iloczyn ',i,' liczb wynosi ');
end;
function iloraz1(a : tab) : real;
var
i, n : word;
l, l1, iloraz : real;
nap : string;
kod : integer;
begin
clrscr;
writeln('Ile liczb chcesz podzielic?');
writeln('Podaj liczbe wieksza od 1 i mniejsza od 1001.');
repeat
readln(n);
if n > 1000 then writeln('Liczb ma byc nie wiecej jak 1000!');
if n < 2 then writeln('Liczba ma byc minimum 2!');
until ((n <= 1000) and (n >=2));
iloraz := 1;
writeln('Podaj 1 liczbe');
repeat
readln(nap);
val(nap,l1,kod);
if kod <>0 then writeln('Podaj liczbe!');
until kod = 0;
for i := 2 to n do
begin
writeln('Podaj ',i,' liczbe');
repeat
readln(nap);
val(nap,l,kod);
if kod <>0 then writeln('Podaj liczbe!');
until kod = 0;
a[i] := l;
iloraz := iloraz * a[i];
end;
iloraz1 := l1 / iloraz;
write('Iloraz ',i,' liczb wynosi ');
end;
function logarytm1 : real;
var
l, logarytm : real;
nap : string;
kod : integer;
begin
clrscr;
writeln('Logarytm naturalny z jakiej liczby chcesz policzyc?');
repeat
readln(nap);
val(nap,l,kod);
if kod <>0 then writeln('Podaj liczbe!');
until kod = 0;
logarytm := ln(l);
logarytm1 := logarytm;
write('Logarytm naturalny z ',l:0:2,' wynosi ');
end;
function potega1 : real;
var
l, x, potega : real;
nap : string;
kod : integer;
begin
clrscr;
writeln('Potege jakiej liczby chcesz policzyc?');
repeat
readln(nap);
val(nap,l,kod);
if kod <>0 then writeln('Podaj liczbe!');
until kod = 0;
writeln('Do jakiej potegi ma zostac podniesiona ta liczba? Podaj liczbe wieksza od 0 i mniejsza niz 1000.');
repeat
readln(nap);
val(nap,x,kod);
if kod <>0 then writeln('Podaj liczbe!');
until kod = 0;
potega := exp(x*ln(l));
potega1 := potega;
write(l:0:2,' do potegi ',x:0:2,' wynosi ');
end;
function pierwiastek1 : real;
var
l, pierwiastek : real;
nap : string;
kod : integer;
begin
clrscr;
writeln('Pierwiastek z jakiej liczby chcesz policzyc?');
repeat
readln(nap);
val(nap,l,kod);
if kod <>0 then writeln('Podaj liczbe!');
until kod = 0;
pierwiastek := sqrt(l);
pierwiastek1 := pierwiastek;
write('Pierwiastek z ',l:0:2,' wynosi ');
end;
function silnia1 : word;
var
l, silnia : word;
i : byte;
nap : string;
kod : integer;
begin
clrscr;
writeln('Silnie z jakiej liczby chcesz policzyc?');
silnia := 1;
repeat
readln(nap);
val(nap,l,kod);
if kod <>0 then writeln('Podaj liczbe!');
until kod = 0;
for i := 1 to (l-1) do
silnia := silnia * (i+1);
silnia1 := silnia;
write('Silnia z ',l,' wynosi ');
end;
begin
repeat
clrscr;
writeln('Program kalkulator');
writeln;
writeln('Jakie dzialanie chcesz wykonac? Wybierz z ponizszych dzialan');
writeln('1 - dodawanie');
writeln('2 - odejmowanie');
writeln('3 - mnozenie');
writeln('4 - dzielenie');
writeln('5 - logarytm naturalny');
writeln('6 - potega');
writeln('7 - pierwiastek');
writeln('8 - silnia');
writeln('9 - wyjscie');
readln(wybor);
case wybor of
1 : repeat
writeln(suma1(a):0:2);
writeln;
writeln('Czy chcesz wykonac to dzialanie ponownie?');
writeln('T - Tak, N - Nie (Powrot do menu glownego');
odp := readkey;
until ((odp = 'n') or (odp = 'N'));
2 : repeat
writeln(roznica1(a):0:2);
writeln;
writeln('Czy chcesz wykonac to dzialanie ponownie?');
writeln('T - Tak, N - Nie (Powrot do menu glownego');
odp := readkey;
until ((odp = 'n') or (odp = 'N'));
3 : repeat
writeln(iloczyn1(a):0:2);
writeln;
writeln('Czy chcesz wykonac to dzialanie ponownie?');
writeln('T - Tak, N - Nie (Powrot do menu glownego');
odp := readkey;
until ((odp = 'n') or (odp = 'N'));
4 : repeat
writeln(iloraz1(a):0:2);
writeln;
writeln('Czy chcesz wykonac to dzialanie ponownie?');
writeln('T - Tak, N - Nie (Powrot do menu glownego');
odp := readkey;
until ((odp = 'n') or (odp = 'N'));
5 : repeat
writeln(logarytm1:0:2);
writeln;
writeln('Czy chcesz wykonac to dzialanie ponownie?');
writeln('T - Tak, N - Nie (Powrot do menu glownego');
odp := readkey;
until ((odp = 'n') or (odp = 'N'));
6 : repeat
writeln(potega1:0:2);
writeln;
writeln('Czy chcesz wykonac to dzialanie ponownie?');
writeln('T - Tak, N - Nie (Powrot do menu glownego');
odp := readkey;
until ((odp = 'n') or (odp = 'N'));
7 : repeat
writeln(pierwiastek1:0:2);
writeln;
writeln('Czy chcesz wykonac to dzialanie ponownie?');
writeln('T - Tak, N - Nie (Powrot do menu glownego');
odp := readkey;
until ((odp = 'n') or (odp = 'N'));
8 : repeat
writeln(silnia1);
writeln;
writeln('Czy chcesz wykonac to dzialanie ponownie?');
writeln('T - Tak, N - Nie (Powrot do menu glownego');
odp := readkey;
until ((odp = 'n') or (odp = 'N'));
9 : halt;
else
begin
write('Nie wybrales zadnego z powyzszych dzialan, program zakonczy');
writeln(' automatycznie swoje dzialanie za 5 sekund');
delay(5000);
halt;
end;
end;
until wybor = 9;
readln;
end.
Mam następujące problemy. Nie mam bardzo pomysłu co zrobić, aby program liczył poprawnie iloraz. Chcę również w programie zrobić takie jakby menu, tzn. aby np. wykonując dodawanie, móc potem wrócić do menu głównego i np. wybrać inne działanie do wykonania. Zrobiłem na próbę na razie tylko takie coś przy dodawaniu. Zastosowałem tutaj goto, ale z tego co wiem wszędzie odradza się stosowanie tej funkcji. Tylko nie mam bardzo pomysłu jak to inaczej zrobić. Może funkcje zamienić na procedury i spróbować z jakimiś pętlami? Bo przy funkcjach nie bardzo widzę taką możliwość. Ostatnie moje pytanie dotyczy fragmentu, w którym program pyta "Czy chcesz wykonac to dzialanie jeszcze raz?" Jeśli nacisnę T to muszę to potwierdzić dwukrotnym przyciśnięciem klawisza enter. Dlaczego tak się dzieje? Chciałbym, aby program reagował na jedno naciśnięcie entera. Domyślam się, że jest to związane z umieszczeniem w nieodpowiednim miejscu w kodzie instrukcji przypisania odp := readkey;, ale gdzie ją w takim razie przenieść?