{$APPTYPE CONSOLE} //Ja korzystam z Delphi, gdzie aby mieć aplikację konsolową trzeba dodać taką dyrektywę
Program Kalkulator; //Nazwa programu
Uses SysUtils; //Funkcja TryStrToInt użyta niżej

Function GetInput(Title: String): Integer; //Funkcja pobiera od użytkownika wpisaną liczbę
Var Temp: String;
    Out : Integer;
Begin
 Write(Title+' ');
 Readln(Temp);
 if (not TryStrToInt(Temp, Out)) Then //Jeżeli tego, co wpisał nie da się zamienić na liczbę (wpisał np. 123foo123), to wyświetlamy błąd
 Begin
  Writeln('', Title, ''' nie jest liczba!');
  Readln;
  Halt; //i wyłączamy program
 End;
 GetInput := Out;
End;

(* Tych funkcji niżej chyba nie trzeba komentować *)
Procedure Dodawanie(A, B: Integer); pascal;
Begin
 Writeln;
 Writeln(A,'+',B,'=',A+B);
End;

Procedure Odejmowanie(A, B: Integer); pascal;
Begin
 Writeln;
 Writeln(A,'-',B,'=',A-B);
End;

Procedure Dzielenie(A, B: Integer); pascal;
Begin
 Writeln;
 Writeln(A,'/',B,'=',A/B:6:4,' (reszta ',A mod B,')');
End;

Procedure Mnozenie(A, B: Integer); pascal;
Begin
 Writeln;
 Writeln(A,'*',B,'=',A*B);
End;

Procedure Pierwiastek(A: Integer); pascal;
Begin
 Writeln;
 Writeln('sqrt(',A,')=',sqrt(A):6:4); //sqrt = square root = pierwiastek
End;

Procedure Potega(A, B: Integer); pascal;
  Function Power(iBase, iExponent: Integer): Extended;
  Begin
   Power := Exp(Ln(iBase) * iExponent);
  End;
Begin
 Writeln;
 Writeln(A,'^',B,'=',round(Power(A, B)));
End;

Procedure Silnia(A: Integer); pascal;
Var Res, I: Integer;
Begin
 Res := 1;
 For I := 1 To A Do //Prosty algorytm iteracyjny na silnię
  Res := Res*I;
 Writeln;
 Writeln(A,'!=',Res);
End;

Procedure MainMenu;
Const Opcje: Array[0..7] of String = ('dodawanie', 'odejmowanie', 'dzielenie', 'mnozenie', 'pierwiastek', 'potega', 'silnia', 'wyjscie'); //Nasza lista opcji (to jest wygodniejsze, zamiast korzystania z drabinki if'ow typu: if opcja='foo' then foo else if opcja='cos_innego' then cos_innego else (itd)
Var Opcja: String;  //wprowadzona przez użytkownika opcja
    I, Op: Integer; //"I" jest używane do iteracji po w/w tablicy, Op to numer naszej opcji (czyli dla 'dodawanie' jest to 0, dla 'odejmowanie' jest to 1, itd.)
Begin
 Op := -1;
 Repeat
  Writeln;
  Write('Podaj nazwe dzialania do wykonania: ');
  Readln(Opcja);
  Opcja := LowerCase(Opcja);
  For I := Low(Opcje) To High(Opcje) Do //Iterujemy po całej tablicy
   if (Opcja = Opcje[I]) Then           //Jeżeli aktualnie sprawdzany indeks z tablicy jest równy temu, co wprowadził użytkownik
    Op := I;                            //to zapisujemy numer indeksu do zmiennej
 Until (Op >= 0); //Jeżeli opcja została odnaleziona
 Case Op Of //To jest coś a'la if
  0: Dodawanie(GetInput('Podaj skladnik:'), GetInput('Podaj skladnik:'));
  1: Odejmowanie(GetInput('Podaj odjemna:'), GetInput('Podaj odjemnik:'));
  2: Dzielenie(GetInput('Podaj dzielna:'), GetInput('Podaj dzielnik:'));
  3: Mnozenie(GetInput('Podaj czynnik:'), GetInput('Podaj czynnik:'));
  4: Pierwiastek(GetInput('Podaj liczbe:'));
  5: Potega(GetInput('Podaj podstawe:'), GetInput('Podaj wykladnik:'));
  6: Silnia(GetInput('Podaj liczbe:'));
  7: Halt;
 End;
 MainMenu; //I od nowa
End;
Begin
 Writeln('--------------');
 Writeln('- Kalkulator -');
 Writeln('--------------');
 Writeln;
 Writeln('Dostepne funkcje:');
 Writeln;
 Writeln('dodawanie, odejmowanie, dzielenie, mnozenie, pierwiastek, potega, silnia,wyjscie');
 Writeln;
 MainMenu;
End.