Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Калькулятор


Автор: Гость_TwisT_X 6.6.2005, 13:34
Помогите найати ошибку вданном приложении :

Код

unit UCalc;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button0: TButton;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    BClear: TButton;
    BPoint: TButton;
    BSing: TButton;
    BAbs: TButton;
    BCos: TButton;
    BExp: TButton;
    BLn: TButton;
    BLog: TButton;
    BSin: TButton;
    BSqrt: TButton;
    BPi: TButton;
    BMC: TButton;
    BMS: TButton;
    BMR: TButton;
    BMplus: TButton;
    Label1: TLabel;
    Label2: TLabel;
    BPlus: TButton;
    BMinus: TButton;
    BMultiply: TButton;
    BDivide: TButton;
    BEq: TButton;
    BPower: TButton;
    BFactor: TButton;
    procedure BClearClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure BSingClick(Sender: TObject);
    procedure BAbsClick(Sender: TObject);
    procedure BPiClick(Sender: TObject);
    procedure BMCClick(Sender: TObject);
    procedure BMSClick(Sender: TObject);
    procedure BMplusClick(Sender: TObject);
    procedure BMRClick(Sender: TObject);
    procedure BCosClick(Sender: TObject);
    procedure BExpClick(Sender: TObject);
    procedure BLnClick(Sender: TObject);
    procedure BLogClick(Sender: TObject);
    procedure BSinClick(Sender: TObject);
    procedure BSqrtClick(Sender: TObject);
    procedure BPlusClick(Sender: TObject);
    procedure BEqClick(Sender: TObject);
    procedure BMinusClick(Sender: TObject);
    procedure BMultiplyClick(Sender: TObject);
    procedure BDivideClick(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure BFactorClick(Sender: TObject);
    procedure BPowerClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses Math;
var M: real = 0.;
    LBegin: Boolean = true;   // фиксация начала ввода
    LPoint: Boolean = false;   // фиксация ввода запятой
    LOp: Boolean = false;   // фиксация щелчка на кнопке операции
    Num1, Num2: real;   // первый и второй операнды
Op: char = '0';
const Serr = 'Вы ошиблись, исправьте исходные данные!';

function factor(n: integer): Int64;
var i: integer;
begin
 Result := 1;
 for i := 2 to n do
  Result := Result * i;
end;

procedure TForm1.BClearClick(Sender: TObject);   //очистка строки
begin
 Edit1.Clear;
 LBegin := true;
 Op := ' ';
 LOp := false;
end;

procedure TForm1.Button1Click(Sender: TObject);
// щелчок на кнопках с цифрами и кнопке с запятой
begin
 // Если ввод не начат, LPoint = false
 if LBegin then LPoint := false;
 {Если нажата кнопка с символом "0" (Botton0) и в окне Edit1
 только символ "0", или нажата кнопка с запятой (BPoint), и
 запятая уже вводилась (LPoint = true), то заносить символ в
 Edit1 не надо. Так что при этих условиях оператор структуры
 if не выполняется}
 if not (((Sender = Button0) and (Edit1.Text = '0')) or
        ((Sender = BPoint) and LPoint))
  then begin
   if (Sender = Bpoint)
    then begin
     LPoint := true;
     if LBegin
      then Edit1.Text := '0,'
      else Edit1.Text := Edit1.Text + ',';
    end   // Sender = BPoint
    else  // Sender <> BPoint
     if (not LBegin) and (Edit1.Text <> '0')
      then Edit1.Text := Edit1.Text + (Sender as TButton).Caption
      else Edit1.Text := (Sender as TButton).Caption;
  LBegin := false;
 end;
end;

procedure TForm1.BSingClick(Sender: TObject);   // операция " +/- "
begin
 try
  Edit1.Text := FloatToStr(-(StrToFloat(Edit1.Text)));
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BAbsClick(Sender: TObject);   // абсолютное число
begin
 try
  Edit1.Text := FloatToStr(Abs(StrToFloat(Edit1.Text)));
  LBegin := true;
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BPiClick(Sender: TObject);   // число Пи
begin
 Edit1.Text := FloatToStr(Pi);
 LBegin := true;
end;

procedure TForm1.BMCClick(Sender: TObject);   // очистка памяти
begin
 M := 0.;
 Label1.Caption := ' ';
end;

procedure TForm1.BMSClick(Sender: TObject);   // сохранение памяти
begin
 try
  Label1.Caption := 'M';
  M := StrToFloat(Edit1.Text);
  LBegin := true;
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BMplusClick(Sender: TObject);  // добавление в память
begin
 try
  Label1.Caption := 'M';
  M := M + StrToFloat(Edit1.Text);
   if M = 0 then Label1.Caption := ' ';
  Lbegin := true;
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BMRClick(Sender: TObject);   // загрузка памяти
begin
 try
  Edit1.Text := FloatToStr(M);
  LBegin := true;
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BCosClick(Sender: TObject);   // косинус
begin
 try
  Edit1.Text := FloatToStr(Cos(StrToFloat(Edit1.Text)));
  LBegin := true;
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BExpClick(Sender: TObject);   // експонента
begin
 try
  Edit1.Text := FloatToStr(Exp(StrToFloat(Edit1.Text)));
  LBegin := true;
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BLnClick(Sender: TObject);   // натуральный логарифм
begin
 try
  Edit1.Text := FloatToStr(Ln(Strtofloat(edit1.text)));
  LBegin := true;
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BLogClick(Sender: TObject);   // логарифм по основанию два
begin
 try
  Edit1.Text := FloatToStr(Log2(StrToFloat(Edit1.Text)));
  LBegin := true;
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BSinClick(Sender: TObject);   // синус
begin
 try
  Edit1.Text := FloatToStr(Sin(StrToFloat(Edit1.Text)));
  LBegin := true;
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BSqrtClick(Sender: TObject);   // квадратный корень
begin
 try
  Edit1.Text := FloatToStr(Sqrt(StrToFloat(Edit1.Text)));
  LBegin := true;
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BPlusClick(Sender: TObject);  // сложение
begin
 try
  Num1 := StrToFloat(Edit1.Text);
  Op := (Sender as TButton).Caption[1];
  LBegin := true;
  LOp := true
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BEqClick(Sender: TObject);  // равно
begin
 try
  if LOp then Num2 := StrToFloat(Edit1.Text);
  case Op of
   '+': Edit1.Text := FloatToStr(Num1 + Num2);
   '-': Edit1.Text := FloatToStr(Num1 - Num2);
   '*': Edit1.Text := FloatToStr(Num1 * Num2);
   '/': Edit1.Text := FloatToStr(Num1 / Num2);
   'x^y': Edit1.Text := FloatToStr(Num1 ^ Num2);
  end;
  Num1 := StrToFloat(Edit1.Text);
  LBegin := true;
  LOp := false;
 except
  ShowMessage(Serr);
 end;
end;
procedure TForm1.BMinusClick(Sender: TObject);  // вычитание
begin
 try
  Num1 := StrToFloat(Edit1.Text);
  Op := (Sender as TButton).Caption[1];
  LBegin := true;
  LOp := true
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BMultiplyClick(Sender: TObject); // умножение
begin
 try
  Num1 := StrToFloat(Edit1.Text);
  Op := (Sender as TButton).Caption[1];
  LBegin := true;
  LOp := true
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.BDivideClick(Sender: TObject);  // деление
begin
 try
  Num1 := StrToFloat(Edit1.Text);
  Op := (Sender as TButton).Caption[1];
  LBegin := true;
  LOp := true
 except
  ShowMessage(Serr);
 end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);  // кнопки
begin
 case Key of
  '0'..'9', ',', #8: ;
 else
  Key := #0;
 end;
end;

procedure TForm1.BFactorClick(Sender: TObject);
begin
Edit1.Text := IntToStr(factor(StrToInt(Edit1.Text)));
end;

procedure TForm1.BPowerClick(Sender: TObject);
begin
  try
  Num1 := StrToFloat(Edit1.Text);
  Op := (Sender as TButton).Caption[1];
  LBegin := true;
  LOp := true
 except
  ShowMessage(Serr);
 end;
end;

end.


Ошибка где-то в коде возведения в произвольную степень ... smile

Автор: Alexandr87 6.6.2005, 17:55
Я конечно Дельфи не знаю, но на мой взгляд операция x^y, ни есть операция возведения x в степень y.

Автор: Pakshin A. S. 6.6.2005, 17:59
Верно... В разделе с паскалем была функция для человеческого возведения числа в степень...
Добавлено @ 18:02
Вот... http://forum.vingrad.ru/index.php?showtopic=43796&unread=1&hl=степень

Автор: TwisT_X 8.6.2005, 09:26
Да я уже сам разобрался
Там короче не ^ a Num1 Power Num2..
всеравно спосибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)