Kalkulator w Turbo Pascal: liczenie ilorazu

1

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

0

Spróbuj wrzucić zawartość funkcji głównej (poza ostatnim poleceniem Readln) do pętli repeat-until, z której wyjdziesz, jeśli wczytana cyfra=9.

0

kalkulator, wykonujący 8 działań na dowolnej liczbie liczb.

 if n > 1000 then writeln('Liczb ma byc nie wiecej jak 1000!');

a miała być dowolna.

2

Mały przykład, jak można można stworzyć coś w rodzaju menu:

program Project1;

uses Crt;

var Koniec: Boolean;
    Wybor, Jeszcze: Char;

begin
  Koniec:= false;
  repeat
    ClrScr;
    Writeln('1 - dodawanie');
    Writeln('2 - odejmowanie');
    Writeln('3 - koniec programu');
    Write('Twoj wybor: ');
    Wybor:= Readkey;
    Writeln;
    case Ord(Wybor) - 48 of    { Ord('0') = 48, Ord('1') = 49 itd. }
      1: repeat
           Writeln('Dodawanie');
           Write('Jeszcze raz (t/n) ');
           Jeszcze:= Readkey;
           Writeln;
         until UpCase(Jeszcze) = 'N';
      2: repeat
           Writeln('Odejmowanie');
           Write('Jeszcze raz t/n ');
           Jeszcze:= Readkey;
           Writeln;
         until UpCase(Jeszcze) = 'N';
      3: Koniec:= true;
    end;
  until Koniec;
end.

Jeszcze mała uwaga odnośnie "liczenia ilorazu". Sumę lub iloczyn kilku liczb każdy zrozumie intuicyjnie, ale różnica lub iloraz kilku liczb już nie są tak jednoznaczne. Przy ilorazie więcej niż 2 liczb nie wiadomo, która liczba (czy może liczby) to dzielna, a które to dzielniki. Zastanów się, czy może nie przebudować programu w tym miejscu

0

Simplex dzięki za odpowiedź. Z tym menu już sobie poradziłem (zedytowałem już kod programu w pierwszym poście) i chyba jest z tym już wszystko ok. Pozostaje jeszcze ten problem z różnicą i ilorazem, nadal nie wiem bardzo jak to zrobić.

0

Taka mała sugestia: Zeruj zmienne suma, roznica przed pętlą, bo nie zawsze będą równe zero. Przynajmniej u mnie po kilku uruchomieniach suma nie była obliczana prawidłowo.

0

Ja cały czas zastanawiam się, co to jest iloraz kilku liczb. Mamy dla przykładu 5 liczb: a1, a2, a3, a4, a5. Pokaż zapis matematyczny, co rozumiesz przez pojęcie ilorazu tych liczb (od tego oczywiście będzie zależał algorytm)

Chodzi mi o coś takiego a1/a2/a3/a4/a5 np. 32/2/2/2/2 = 2
Już chyba jednak doszedłem jak zrobić ten iloraz i różnicę (zedytowałem pierwszy post). Zrobiłem tak, że np. w przypadku różnicy od pierwszej wczytywanej liczby odjąłem sumę pozostałych, podobnie zrobiłem z ilorazem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1