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.