1

Тема: Калькулятор. Не правильно виконує дію.

Наприклад, 1+1 рахує правильно, а 1+1+1 - не правильно. І так для всіх операцій. Як виправити?

unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Button12: TButton;
    Button13: TButton;
    Button14: TButton;
    Button15: TButton;
    Button16: TButton;
    Edit1: TEdit;
    sSkinManager1: TsSkinManager;
    Button17: TButton;
    Button18: TButton;
    Button19: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button16Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Button15Click(Sender: TObject);
    procedure Button14Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button17Click(Sender: TObject);
    procedure Button18Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button19Click(Sender: TObject);
    
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  kod:char;
  x,y,z:real;
  

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
edit1.Text:=edit1.Text+'1'
end;

procedure TForm2.Button4Click(Sender: TObject);
begin
edit1.Text:=edit1.Text+'2'
end;

procedure TForm2.Button5Click(Sender: TObject);
begin
edit1.Text:=edit1.Text+'3'
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
edit1.Text:=edit1.Text+'4'
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
edit1.Text:=edit1.Text+'5'
end;

procedure TForm2.Button7Click(Sender: TObject);
begin
edit1.Text:=edit1.Text+'6'
end;

procedure TForm2.Button9Click(Sender: TObject);
begin
edit1.Text:=edit1.Text+'7'
end;

procedure TForm2.Button11Click(Sender: TObject);
begin
edit1.Text:=edit1.Text+'8'
end;

procedure TForm2.Button10Click(Sender: TObject);
begin
edit1.Text:=edit1.Text+'9'
end;

procedure TForm2.Button12Click(Sender: TObject);
begin
edit1.Text:=edit1.Text+'0'
end;

procedure TForm2.Button16Click(Sender: TObject);
begin
edit1.Clear;
end;

procedure TForm2.Button6Click(Sender: TObject);
begin
if edit1.Text<>'' then x:=strtofloat(edit1.text);
kod := '*';
edit1.Clear;
end;

procedure TForm2.Button8Click(Sender: TObject);
begin
if edit1.Text<>'' then x:=strtofloat(edit1.text);
kod := '/';
edit1.Clear;
end;

procedure TForm2.Button15Click(Sender: TObject);
begin
if edit1.Text<>'' then x:=strtofloat(edit1.text);
kod := '+';
edit1.Clear;
end;

procedure TForm2.Button14Click(Sender: TObject);
begin
if edit1.Text<>'' then x:=strtofloat(edit1.text);
kod := '-';
edit1.Clear;
end;

procedure TForm2.Button13Click(Sender: TObject);
begin
if edit1.Text<>'' then  y:=strtofloat(edit1.text);
    case kod of
    '+': z:=x+y;
    '-': z:=x-y;
    '*': z:=x*y;
    '/': if y=0 then ShowMessage ('На нуль ділити не можна!') else z:=x/y;


else ShowMessage ('Виконайте дію');    

    end;
edit1.Text:=FloatToStr(Z);
end;



procedure TForm2.Button17Click(Sender: TObject);
begin
x:=StrToFloat(Edit1.Text);
Edit1.Clear;
z:=sqrt(x);
Edit1.Text:=FloatToStr(z);
end;

procedure TForm2.Button18Click(Sender: TObject);
begin
x:=StrToFloat(Edit1.Text);
Edit1.Clear;
z:=x*x;
Edit1.Text:=FloatToStr(z);
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
 Application.Title:= 'Калькулятор';
end;

procedure TForm2.Button19Click(Sender: TObject);
begin
if Edit1.Text = '0' then
    begin
      Edit1.Text := '0';
      Z := 1;
    end;
  if Pos('.',Edit1.Text) = 0 then
      Edit1.Text := Edit1.Text + ',';
end;



end.

2 Востаннє редагувалося Chemist-i (18.11.2014 16:56:42)

Re: Калькулятор. Не правильно виконує дію.

case kod of
  '+': z:=z+y;
  '-': z:=z-y;
  '*': z:=z*y;
  '/': if y=0 then ShowMessage ('На нуль ділити не можна!') else z:=z/y;

Що я зробив?

і що треба змінити тут, щоб запрацювало?

if edit1.Text<>'' then x:=strtofloat(edit1.text);

Ну або просто:

case kod of
  '+': z:=z+x+y;
  '-': z:=z+x-y;
  '*': z:=z+x*y;
  '/': if y=0 then ShowMessage ('На нуль ділити не можна!') else z:=z/y;
Подякували: vanekulykov1

3

Re: Калькулятор. Не правильно виконує дію.

На жаль, все одно працює неправильно

4 Востаннє редагувалося koala (18.11.2014 17:11:56)

Re: Калькулятор. Не правильно виконує дію.

Нумерація кнопок і їхнє значення - просто вершина очевидності. Вже не кажу за DRY.

У вас помилка в логіці роботи калькулятора. Візьміть звичайного калькулятора і перевірте - коли ми натискаємо кнопку з операцією, то виконується попередня операція, якщо така була. Тобто у Button13Click (і на початок роботи) додайте

kod := ' ';

а у всі інші кнопки з операціями -

if kod <> ' ' then Button13Click( self );

Стосовно читаності коду:
- назвіть всі кнопки по функціях, які вони виконують (на кшталт Button3 чи ButtonPlus); те саме стосується інших елементів інтерфейсу.
- якщо у вас на кнопках написано той самий символ, який вони вводять (телепатично бачу, що так і є), то замініть 10 обробників для цифрових кнопок на один:

procedure TForm2.ButtonNumberClick(Sender: TObject);
begin
  edit1.Text:=edit1.Text+(Sender as TButton).Caption;
end;

і аналогічно - для бінарних операцій.

Подякували: vanekulykov, Torbins2

5

Re: Калькулятор. Не правильно виконує дію.

Зараз спробую. Дякую

6

Re: Калькулятор. Не правильно виконує дію.

koala написав:
ButtonNumberClick(Sender: TObject);

і аналогічно - для бінарних операцій.

Undeclared identifier

7

Re: Калькулятор. Не правильно виконує дію.

koala написав:

(і на початок роботи) додайте

kod := ' ';

Це тобто куди?

8

Re: Калькулятор. Не правильно виконує дію.

vanekulykov написав:

Undeclared identifier

От тому і вважають, що Delphi для бидлокодерів - бо дозволяє людям користуватися складними речами навіть тоді, коли вони ними користуватися не вміють.
Ви не знаєте, як створити нову подію? Щоб довго не бігати - відкриваєте властивості будь-якої кнопки з тих, що мають її викликати, і замість автоматично згенерованого обробника OnClick (Button18Click і т.д.) пишете ButtonNumberClick і натискаєте Enter. Або в проголошенні класу додаєте цю процедуру, різниці немає, просто Delphi це зазвичай робить за вас. А потім у властивостях решти кнопок з такою самою поведінкою виставляєте в OnClick ButtonNumberClick.

vanekulykov написав:

Це тобто куди?

Знаєте, навіть правильніше буде не ' ' робити, а #0, бо він за замовчанням виставляється.

Подякували: Torbins, DOP2

9

Re: Калькулятор. Не правильно виконує дію.

Chemist-i
z тут взагалі треба прибрати.

koala
+1

10

Re: Калькулятор. Не правильно виконує дію.

З цифровими розібрався. А от з операціями - не зовсім, так як, мені треба передбачити можливість виконувати бінарні операції для 2,3 чи більшої кількості кнопок.Як бути?

11

Re: Калькулятор. Не правильно виконує дію.

Викладіть поточну версію коду, і які конкретно з нею проблеми. Бо поки що не зрозуміло чим вам іще можна допомогти.

12 Востаннє редагувалося vanekulykov (20.11.2014 18:54:09)

Re: Калькулятор. Не правильно виконує дію.

За вимогою викладача довелося повністю модифікувати код. Сказала, що цю версію вона не розуміє. Це смішно.
Вже переробив.
Підкажіть будь-ласка, як мені реалізувати вивід в Edit1 нуля при запуску та вивід повідомлення при спробі знайти корінь від'ємного числа?

var
  Form1: TForm1;
   f:      integer;
   a:  real;
   k:   integer;
implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button16Click(Sender: TObject);
begin
if f = 0
  then begin
         Edit1.Text := '0';
         f := 1;
       end
  else
      if Edit1.Text <> '0'
        then  Edit1.Text := Edit1.Text + '0';

end;

procedure TForm1.ButtonNumberClick(Sender: TObject);
begin
if f = 0
  then  begin
      Edit1.Text := IntToStr(TButton(Sender).ComponentIndex);
      f := 1;
    end
  else Edit1.Text := Edit1.Text + IntToStr(TButton(Sender).ComponentIndex);

end;

procedure TForm1.Button17Click(Sender: TObject);
begin
if Edit1.Text = '0' then
    begin
      Edit1.Text := '0,';
      f := 1;
    end;
  if Pos(',',Edit1.Text) = 0 then
      Edit1.Text := Edit1.Text + ',';
end;

procedure Operation;
var
    c: real;
begin
    c := StrToFloat(Form1.Edit1.Text);
    case k of
    0: a := c;
    1: a := a + c;
    2: a := a - c;
    3: a := a * c;
    4: if c=0 then ShowMessage('Не можна ділити на нуль!!!') else a := a / c;

                   
    end;
    Form1.Edit1.Text := FloatToStr(a);
end;
procedure TForm1.Button15Click(Sender: TObject);
begin
if f = 0
    then k := 0
  else begin
    Operation;
    k :=0;
    f:=0;
  end;
end;
procedure TForm1.Button10Click(Sender: TObject);
begin
  if f = 0
    then k := 1
  else begin
    Operation;
    k :=1;
    f:=0;
  end;
end;
procedure TForm1.Button11Click(Sender: TObject);
begin
  if f = 0
    then k := 2
  else begin
    Operation;
    k :=2;
    f:=0;
end;
end;
procedure TForm1.Button14Click(Sender: TObject);
begin
Edit1.Text:='0' ;
  a := 0;
  k := 0;
  f := 0;
end;
procedure TForm1.Button12Click(Sender: TObject);
begin
if f = 0
    then k := 3
  else begin
    Operation;
    k :=3;
    f:=0;
  end;
  end;

procedure TForm1.Button13Click(Sender: TObject);
begin
if f = 0
    then k := 4
  else begin
    Operation;
    k :=4;
    f:=0;
  end;
  end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  key:=chr(0);
end;

procedure TForm1.Button19Click(Sender: TObject);
begin
  if f = 0
  then begin
         Edit1.Text := '-';
         f := 1;
       end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.Title:= 'Калькулятор';
end;

procedure TForm1.Button18Click(Sender: TObject);
var c:real;
begin
  c:=StrToFloat(Edit1.Text);
  Edit1.Clear;
  if c<0 then ShowMessage ('Введіть додатне число')
  a:=sqrt(c);
  Edit1.Text:=FloatToStr(a);
end;

procedure TForm1.Button20Click(Sender: TObject);
var c:real;
begin
   c:=StrToFloat(Edit1.Text);
   Edit1.Clear;
   a:=c*c;
   Edit1.Text:=FloatToStr(a);
end;

end.

13

Re: Калькулятор. Не правильно виконує дію.

З Повідомленням розібрався вже. Відредагував.

14

Re: Калькулятор. Не правильно виконує дію.

Не варто використовувати ComponentIndex, він може змінитися після деяких маніпуляцій з формою. Краще використовуйте Tag, він створений спеціально для таких випадків.
Заповнити TEdit можна просто відредагувавши його Text під час дизайну. А якщо треба виконати якісь інші операції до показу вікна програми, то їх можна помістити в OnCreate форми (подвійний клік на порожньому місці форми).

Подякували: vanekulykov1