Kalkulator parę pytań.

0

Witam.

Robię kalkulator i mam kilka problemów.

  1. Gdy odpalę kalkulator i od razu wcisnę znak '=' wywala mi go. : )
  2. Jak zrobić zabezpieczenie przed dzieleniem przez zero.
  3. I jak zabrać się do przycisku +/- , M+ oraz miejsc dziesiętnych.

Prosiłbym o jakieś wskazówki : )

Pozdrawiam.

0

Pokaż kod, nikt nie usunie ci błędów nie znając kodu.

0

Program działa, tylko wywala się przy wciśnięciu przycisku = od razu przed wykonaniem działań, oraz jak dziele przez zero ;)

unit glowny_u;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tkalkulator_f = class(TForm)
    wyswietlacz: TEdit;
    siedem: TButton;
    osiem: TButton;
    dziewiec: TButton;
    dzielenie: TButton;
    szesc: TButton;
    piec: TButton;
    cztery: TButton;
    mnozenie: TButton;
    trzy: TButton;
    dwa: TButton;
    jeden: TButton;
    odejmowanie: TButton;
    zero: TButton;
    zmianaznaku: TButton;
    dziesietna: TButton;
    dodawanie: TButton;
    czysc: TButton;
    wynik: TButton;
    procedure siedemClick(Sender: TObject);
    procedure osiemClick(Sender: TObject);
    procedure dziewiecClick(Sender: TObject);
    procedure szescClick(Sender: TObject);
    procedure piecClick(Sender: TObject);
    procedure czteryClick(Sender: TObject);
    procedure trzyClick(Sender: TObject);
    procedure dwaClick(Sender: TObject);
    procedure jedenClick(Sender: TObject);
    procedure zeroClick(Sender: TObject);
    procedure czyscClick(Sender: TObject);
    procedure wynikClick(Sender: TObject);
    procedure dzielenieClick(Sender: TObject);
    procedure mnozenieClick(Sender: TObject);
    procedure odejmowanieClick(Sender: TObject);
    procedure dodawanieClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  kalkulator_f: Tkalkulator_f;

implementation
var
   Operator : char;
   Liczba1 : real;
   Liczba2 : real;
{$R *.dfm}

procedure Tkalkulator_f.siedemClick(Sender: TObject);
begin
        wyswietlacz.Text := wyswietlacz.Text +  TButton(Sender).Caption;
end;

procedure Tkalkulator_f.osiemClick(Sender: TObject);
begin
        wyswietlacz.Text := wyswietlacz.Text +  TButton(Sender).Caption;
end;

procedure Tkalkulator_f.dziewiecClick(Sender: TObject);
begin
        wyswietlacz.Text := wyswietlacz.Text +  TButton(Sender).Caption;
end;

procedure Tkalkulator_f.szescClick(Sender: TObject);
begin
        wyswietlacz.Text := wyswietlacz.Text +  TButton(Sender).Caption;
end;

procedure Tkalkulator_f.piecClick(Sender: TObject);
begin
        wyswietlacz.Text := wyswietlacz.Text +  TButton(Sender).Caption;
end;

procedure Tkalkulator_f.czteryClick(Sender: TObject);
begin
        wyswietlacz.Text := wyswietlacz.Text +  TButton(Sender).Caption;
end;

procedure Tkalkulator_f.trzyClick(Sender: TObject);
begin
        wyswietlacz.Text := wyswietlacz.Text +  TButton(Sender).Caption;
end;

procedure Tkalkulator_f.dwaClick(Sender: TObject);
begin
        wyswietlacz.Text := wyswietlacz.Text +  TButton(Sender).Caption;
end;

procedure Tkalkulator_f.jedenClick(Sender: TObject);
begin
        wyswietlacz.Text := wyswietlacz.Text +  TButton(Sender).Caption;
end;

procedure Tkalkulator_f.zeroClick(Sender: TObject);
begin
        wyswietlacz.Text := wyswietlacz.Text +  TButton(Sender).Caption;
end;

procedure Tkalkulator_f.czyscClick(Sender: TObject);
begin
        wyswietlacz.text:='';
end;

procedure Tkalkulator_f.wynikClick(Sender: TObject);
    var
      wynik : real;
begin
     Liczba2 := StrToFloat(wyswietlacz.Text);
     case Operator of
     '+' : wynik := Liczba1 + Liczba2;
     '-' : wynik := Liczba1 - Liczba2;
     '*' : wynik := Liczba1 * Liczba2;
     '/' : wynik := Liczba1 / Liczba2;
       end;
    wyswietlacz.Text := FloatToStr(wynik);
    end;

procedure Tkalkulator_f.dzielenieClick(Sender: TObject);
begin
     Liczba1 := StrToFloat(wyswietlacz.Text);
     Operator := '/';
     wyswietlacz.SetFocus;
     wyswietlacz.text:='';
end;

procedure Tkalkulator_f.mnozenieClick(Sender: TObject);
begin
     Liczba1 := StrToFloat(wyswietlacz.Text);
     Operator := '*';
     wyswietlacz.SetFocus;
     wyswietlacz.text:='';
end;

procedure Tkalkulator_f.odejmowanieClick(Sender: TObject);
begin
     Liczba1 := StrToFloat(wyswietlacz.Text);
     Operator := '-';
     wyswietlacz.SetFocus;
     wyswietlacz.text:='';
end;

procedure Tkalkulator_f.dodawanieClick(Sender: TObject);
begin
     Liczba1 := StrToFloat(wyswietlacz.Text);
     Operator := '+';
     wyswietlacz.SetFocus;
     wyswietlacz.text:='';
end;

end. 
0

Aby nie wyalało błędu przy wciskaniu przcisku dla wyniku najlepiej
sprawdzić wcześniej czy to co podajesz jest prawidłową liczbą, bo
z kodu na szybko przejrzanego nie wiem, dlaczego Tobie coś tam
wywala, trzeba by podać komunikat błędu, z jakim Ci wywala się
ten program, bo nikt nie będzie robił takiego samego pogramu z
takimi przyciskami od zera, a wiadomo wróżką, nadal interesuje
się CBA i siedzi ona w areszcie. Co do sprawdzenia poprawności
liczb to możesz zrobić tak jak poniżej. A jeśli chodzi o to by nie
dzielić przez zero to również zabezpiecz się na tę ewentualność
sprawdzająć czy dzielnik nie jest zerem. Jeżeli jest to pokaż w
polu z wynikiem. jak Windowsowy kalkulator jakiś komunikat.

var
  R : Single;
  S : string;
begin
  S := '1';
  if TryStrToFloat(S, R) = True then
    ShowMessage('OK');
end;
0

Nie wiem czy jeszcze aktualne, ale zabezpieczenie przed dzieleniem przez 0 to bardzo prosta sprawa.

...
     '/' :begin
	if Liczba2 = 0 then
		wyswietlacz.Text:="Dzielenie przez 0"
	else
		wynik := Liczba1 / Liczba2;
	end;
    end;
    wyswietlacz.Text := FloatToStr(wynik);
    end;

Dlaczego wywala błąd po wciśnięciu "="? Bo chce wykonywać obliczenia i wyświetlać wynik na pustych wartościach, mało tego, nie wie jakie w ogóle działanie ma wykonać.
Nie jestem teraz w domu i nie pamiętam jak mam to u siebie :D

Co do klawiszy M+ M- etc...
Tworzysz dodatkową zmienną globalną typu rzeczywistego, np. mem.
Pod klawiszem M+ piszesz:

procedure Tkalkulator_f.M+Click(Sender: TObject);
begin
	if wyswietlacz.Text <> '' then // sprawdzasz czy nie chcesz dodawać do pamięci wartości pustej
		mem:=mem+StrToFloat(wyswietlacz.Text) // dodawaj do pamięci zawartość wyświetlacza
	else	// w przeciwnym wypadku
		exit;	// nie rób nic
end;

Podobnie z M-
MS (tylko zapis do pamięci):

procedure Tkalkulator_f.MSClick(Sender: TObject);
begin
	if wyswietlacz.Text <> '' then // sprawdzasz czy nie chcesz dodawać do pamięci wartości pustej
		mem:=StrToFloat(wyswietlacz.Text)
	else
		exit;
end;

MR (odczyt z pamięci):

procedure Tkalkulator_f.MRClick(Sender: TObject);
begin
		wyswietlacz.Text:=FloatToStr(mem); // jeśli mem będzie puste wypisze 0, w czym błędu nie ma
end;

MC (czyszczenie pamięci):

procedure Tkalkulator_f.MCClick(Sender: TObject);
begin
		mem:=0;
end;

Można pododawać różne inne zdarzenia, które powinny się wykonać po wciśnięciu tych klawiszy. Wszystko zależne od programisty, pomysłu i założeń.

Odrobinę skróć kod.
zamiast

...
	wyswietlacz.SetFocus;
	wyswietlacz.Text:='';
...

daj

...
	wyswietlacz.Clear;
...

Może się mylę, ale ustawianie focusa na edit w tym przypadku jest zbędne, gdyż wciskając przycisk z liczbą, już tam masz zaznaczone, do którego edita jest ona wpisywana.

A ja mam nadal pytanie co do zmiany znaku, tzn jak przed liczbą dodawać znak "-" i go usuwać, po wciśnięciu klawisza "+/-" ??

pozdrawiam Arek

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