unit Calc;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, Math;
type
TCalcForm = class(TForm)
CalcField: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button0: TButton;
ClearAll: TButton;
Clear: TButton;
Plus: TButton;
Minus: TButton;
Multiply: TButton;
Equally: TButton;
Delit: TButton;
BackSpace: TButton;
sqrt1: TButton;
SinButton: TButton;
CosButton: TButton;
Tang: TButton;
CaTang: TButton;
Comma: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button0Click(Sender: TObject);
procedure PlusClick(Sender: TObject);
procedure DelitClick(Sender: TObject);
procedure MultiplyClick(Sender: TObject);
procedure MinusClick(Sender: TObject);
procedure EquallyClick(Sender: TObject);
procedure BackSpaceClick(Sender: TObject);
procedure ClearAllClick(Sender: TObject);
procedure ClearClick(Sender: TObject);
procedure sqrt1Click(Sender: TObject);
procedure CosButtonClick(Sender: TObject);
procedure CommaClick(Sender: TObject);
procedure SinButtonClick(Sender: TObject);
procedure TangClick(Sender: TObject);
procedure CaTangClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
CalcForm: TCalcForm;
Y: TPoint;
Global_sqrt_float: extended;
implementation
{$R *.dfm}
//---------------------------------Системные операции----------------------------
procedure TCalcForm.BackSpaceClick(Sender: TObject); //BackSpace
var
st:string;
begin
st:=CalcField.Text; //Присваиваем отдельной переменной строчку из поля
delete(st,length(st),1); //Удалем последний символ
CalcField.Text:=st; //Радуемся
if CalcField.Text='' then exit; //Если же сударь захочет удалить нибытие,
//Запрещаем программе делать это. Ну это не этично как-то :С
end;
procedure TCalcForm.CaTangClick(Sender: TObject);
var cotangens: string;
begin
if CalcField.Lines[3]<>'' then exit; //Если 3 строка (Ответ) не пустая, то выход.
if CalcField.Lines[0]='' then exit; //Если первая строка пустая, то выход.
if CalcField.Lines[1]<>'' then exit; //Если вторая строка не пустая, то выход.
{Так как функция делфи (Sin/Cos) берет значения радиан и переводит их, то можно через
стандартную алгебраическую функцию PI/180*X, где X - StrToFloat из искомой строки.
Отсюда получаем катангенс градуса.}
cotangens:= FloatToStr(Cotan(Pi/180*StrToFloat(CalcField.Lines[0])));
CalcField.Lines.Add('');
CalcField.Lines.Add('');
CalcField.Lines.Add('');
CalcField.Lines[3]:= cotangens;
end;
procedure TCalcForm.ClearAllClick(Sender: TObject);
begin
//Удаляем все к херам :D
CalcField.Lines.Delete(0);
CalcField.Lines.Delete(0);
CalcField.Lines.Delete(0);
CalcField.Lines.Delete(0);
end;
procedure TCalcForm.ClearClick(Sender: TObject);
begin
{if CalcField.CaretPos.Y=0 then begin
CalcField.Lines[0]:='';
end;
if CalcField.CaretPos.Y=2 then begin
CalcField.Lines[2]:='';
end; }
if CalcField.Lines[3]<>'' then exit;
if CalcField.Lines[1]<>'' then CalcField.Lines[2]:=''
else
CalcField.Lines[0]:='';
end;
//--------------------------Конец блока системных операций------------
//
//
//------------------------Добавление чисел------------------------------
procedure TCalcForm.CommaClick(Sender: TObject);
begin
if CalcField.Lines[3]<>'' then CalcField.Text:='';
if CalcField.Lines[0]='' then CalcField.Lines[0]:='0';
CalcField.Text:=CalcField.Text + ',';
end;
procedure TCalcForm.Button0Click(Sender: TObject);
begin
if CalcField.Lines[3]<>'' then CalcField.Text:='';
CalcField.Text:=CalcField.Text + '0'
end;
procedure TCalcForm.Button1Click(Sender: TObject);
begin
if CalcField.Lines[3]<>'' then CalcField.Text:='';
CalcField.Text:=CalcField.Text + '1' ;
end;
procedure TCalcForm.Button2Click(Sender: TObject);
begin
if CalcField.Lines[3]<>'' then CalcField.Text:='';
CalcField.Text:=CalcField.Text + '2' ;
end;
procedure TCalcForm.Button3Click(Sender: TObject);
begin
if CalcField.Lines[3]<>'' then CalcField.Text:='';
CalcField.Text:=CalcField.Text + '3' ;
end;
procedure TCalcForm.Button4Click(Sender: TObject);
begin
if CalcField.Lines[3]<>'' then CalcField.Text:='';
CalcField.Text:=CalcField.Text + '4';
end;
procedure TCalcForm.Button5Click(Sender: TObject);
begin
if CalcField.Lines[3]<>'' then CalcField.Text:='';
CalcField.Text:=CalcField.Text + '5' ;
end;
procedure TCalcForm.Button6Click(Sender: TObject);
begin
if CalcField.Lines[3]<>'' then CalcField.Text:='';
CalcField.Text:=CalcField.Text + '6' ;
end;
procedure TCalcForm.Button7Click(Sender: TObject);
begin
if CalcField.Lines[3]<>'' then CalcField.Text:='';
CalcField.Text:=CalcField.Text + '7' ;
end;
procedure TCalcForm.Button8Click(Sender: TObject);
begin
if CalcField.Lines[3]<>'' then CalcField.Text:='';
CalcField.Text:=CalcField.Text + '8' ;
end;
procedure TCalcForm.Button9Click(Sender: TObject);
begin
if CalcField.Lines[3]<>'' then CalcField.Text:='';
CalcField.Text:=CalcField.Text + '9' ;
end;
//----------------------Конец ввода чисел----------------
//
//
//--------------------Начало математических действий------------------------
procedure TCalcForm.CosButtonClick(Sender: TObject); //Косинус
var cosinus: string;
begin
if CalcField.Lines[3]<>'' then exit; //Если 3 строка (Ответ) не пустая, то выход.
if CalcField.Lines[0]='' then exit; //Если первая строка пустая, то выход.
if CalcField.Lines[1]<>'' then exit; //Если же его нет, добавляем его
{Так как функция делфи (Sin/Cos) берет значения радиан и переводит их, то можно через
стандартную алгебраическую функцию PI/180*(X), где X - StrToFloat из искомой строки.
Отсюда получаем косинус градуса.}
cosinus:= FloatToStr(Cos(Pi/180*StrToFloat(CalcField.Lines[0])));
CalcField.Lines.Add('');
CalcField.Lines.Add('');
CalcField.Lines.Add('');
CalcField.Lines[3]:=cosinus;
end;
procedure TCalcForm.DelitClick(Sender: TObject); //Деление
begin
if Pos('√', CalcField.Lines[0])<>0 then exit;
if CalcField.Lines[1]<>'' then exit
else
if CalcField.Lines[0]='' then CalcField.Lines[0]:='0';
CalcField.Lines.Add('');
CalcField.Lines[1]:='/' ; //Если предыдущее условие не выполняется, то добавить знак на вторую строку.
CalcField.Lines.Add('') ;
end;
procedure TCalcForm.MinusClick(Sender: TObject); //Минус
begin
if Pos('√', CalcField.Lines[0])<>0 then exit;
if CalcField.Lines[1]<>'' then exit
else
if CalcField.Lines[0]='' then CalcField.Lines.Insert(0,'0') //Проверка наличия чисел в первой строке, если нет, то строка равна нулю.
else
if CalcField.Lines[1]='-' then exit;
CalcField.Lines[1]:='-' ; //Если предыдущее условие не выполняется, то добавить знак на вторую строку.
CalcField.Lines.Add('');
end;
procedure TCalcForm.MultiplyClick(Sender: TObject); //Умножить
begin
if Pos('√', CalcField.Lines[0])<>0 then exit;
if CalcField.Lines[1]<>'' then exit
else
if CalcField.Lines[0]='' then CalcField.Lines[0]:='0';
CalcField.Lines.Add('');
CalcField.Lines[1]:='X' ; //Если предыдущее условие не выполняется, то добавить знак на вторую строку.
CalcField.Lines.Add('') ;
end;
procedure TCalcForm.PlusClick(Sender: TObject); //Плюс
begin
if Pos('√', CalcField.Lines[0])<>0 then exit;
if CalcField.Lines[1]<>'' then exit
else
if CalcField.Lines[0]='' then CalcField.Lines[0]:='0';
CalcField.Lines.Add('');
CalcField.Lines[1]:='+' ; //Если предыдущее условие не выполняется, то добавить знак на вторую строку.
CalcField.Lines.Add('') ;
end;
procedure TCalcForm.SinButtonClick(Sender: TObject);
var sinus: string;
begin
if CalcField.Lines[3]<>'' then exit; //Если 3 строка (Ответ) не пустая, то выход.
if CalcField.Lines[0]='' then exit; //Если первая строка пустая, то выход.
if CalcField.Lines[1]<>'' then exit; //Если вторая строка не пустая, то выход.
{Так как функция делфи (Sin/Cos) берет значения радиан и переводит их, то можно через
стандартную алгебраическую функцию PI/180*X, где X - StrToFloat из искомой строки.
Отсюда получаем синус градуса.}
sinus:= FloatToStr(Sin(Pi/180*(StrToFloat(CalcField.Lines[0]))));
CalcField.Lines.Add('');
CalcField.Lines.Add('');
CalcField.Lines.Add('');
CalcField.Lines[3]:=sinus;
end;
procedure TCalcForm.sqrt1Click(Sender: TObject); //Корень
var sqrtrez: Extended;
sqrtstring: string;
begin
if CalcField.Lines[1]<>'' then exit
else
if CalcField.Lines[0]='' then CalcField.Lines[0]:='1'; //Проверка наличия чисел в первой строке, если нет, то строка равна 1.
if Pos('√', CalcField.Lines[0])<>0 then exit; //Если знак корня уже есть, то значит и число уже есть => Можно завершить операцию
if Pos('√', CalcField.Lines[0])=0 then begin //Если же его нет, добавляем его
Global_sqrt_float:= StrToFloat(CalcField.Lines[0]); //Записываем Extended значение в глобальную переменную, чтобы ЕСЛИ ЧТО
//Ей можно было воспользоваться.
CalcField.Lines[0]:= '√' + CalcField.Lines[0];
sqrtrez:= sqrt(Global_sqrt_float);
sqrtstring:= FloatToStr(sqrtrez);
CalcField.Lines.Add(''); //Пропускаем несколько строчек, чтобы ответ отобразился на 4 строке.
CalcField.Lines.Add('');
CalcField.Lines.Add('');
CalcField.Lines[3]:=sqrtstring; //Вывод значения.
end;
end;
procedure TCalcForm.TangClick(Sender: TObject);
var tangens: string;
begin
if CalcField.Lines[3]<>'' then exit; //Если 3 строка (Ответ) не пустая, то выход.
if CalcField.Lines[0]='' then exit; //Если первая строка пустая, то выход.
if CalcField.Lines[1]<>'' then exit; //Если вторая строка не пустая, то выход.
{Так как функция делфи (Sin/Cos) берет значения радиан и переводит их, то можно через
стандартную алгебраическую функцию PI/180*X, где X - StrToFloat из искомой строки.
Отсюда получаем тангенс градуса.}
tangens:= FloatToStr(Tan(Pi/180*StrToFloat(CalcField.Lines[0])));
CalcField.Lines.Add('');
CalcField.Lines.Add('');
CalcField.Lines.Add('');
CalcField.Lines[3]:=tangens;
end;
//--------------------------Конец математических действий-----------------
//
//
//------------------------Операция математического действия--------------------
procedure TCalcForm.EquallyClick(Sender: TObject);
var a,b:real;
rez: Extended;
str: string;
begin
if CalcField.Lines[3]<>'' then exit;
if CalcField.Lines[0]='' then begin
ShowMessage('У-упс! Что-то пошло не так.');
exit;
end;
if CalcField.Lines[1]='' then begin
ShowMessage('Вы не выбрали операцию и/или не ввели данные');
exit;
end else
if CalcField.Lines[2]='' then CalcField.Lines[2]:='0';
a:=StrtoFloat(CalcField.Lines[0]);
b:=StrtoFloat(CalcField.Lines[2]);
if CalcField.Lines[1]='+' then begin //Сложение
rez:=a+b;
end;
if CalcField.Lines[1]='-' then begin //Вычитание
rez:=a-b;
end;
if CalcField.Lines[1]='X' then begin //Умножение
rez:=a*b;
end;
if CalcField.Lines[1]='/' then begin //Деление
{Согласно вселенскому закону, на 0 делить нельзя.
Поэтому, чтобы глупый человечешко не разделил на ноль и
не порушил эту хрупкую цепочку кода, делаем проверку на символ
второй переменной}
if b=0 then begin
showmessage('На 0 делить нельзя!');
//Удаляем к херам все строчки и начинаем все сначала.
CalcField.Lines.Delete(0);
CalcField.Lines.Delete(1);
CalcField.Lines.Delete(2);
CalcField.Lines.Delete(0);
exit;
end else
rez:=a/b;
end;
str:=FloatToStr(rez);
CalcField.Lines.Add(str);
end;
//----------------------------Конец операции математического действия----------------------
end.