You've already forked lazarus-ccr
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7345 8e941d3f-bd1b-0410-a28a-d453659cc2b4
506 lines
12 KiB
ObjectPascal
506 lines
12 KiB
ObjectPascal
unit CalculatorUnit;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
|
|
StdCtrls, Math,
|
|
FunctionsLib, Globals;
|
|
|
|
type
|
|
|
|
{ TCalculatorForm }
|
|
|
|
TCalculatorForm = class(TForm)
|
|
ReturnBtn: TButton;
|
|
NEdit: TEdit;
|
|
Label1: TLabel;
|
|
sevenbtn: TButton;
|
|
dividebtn: TButton;
|
|
multbtn: TButton;
|
|
subtractbtn: TButton;
|
|
Addbtn: TButton;
|
|
ZeroBtn: TButton;
|
|
ChangeSignBtn: TButton;
|
|
PeriodBtn: TButton;
|
|
MemInBtn: TButton;
|
|
MemOutBtn: TButton;
|
|
MemPlusBtn: TButton;
|
|
eightbtn: TButton;
|
|
EqualBtn: TButton;
|
|
sinbtn: TButton;
|
|
cosbtn: TButton;
|
|
tanbtn: TButton;
|
|
Combobtn: TButton;
|
|
ClearEntryBtn: TButton;
|
|
MeanBtn: TButton;
|
|
VarBtn: TButton;
|
|
StdDevBtn: TButton;
|
|
natlogbtn: TButton;
|
|
ninebtn: TButton;
|
|
log10btn: TButton;
|
|
sqrbtn: TButton;
|
|
sqrtbtn: TButton;
|
|
ytopowerxbtn: TButton;
|
|
etoxbtn: TButton;
|
|
tentoxbtn: TButton;
|
|
expbtn: TButton;
|
|
absbtn: TButton;
|
|
PiBtn: TButton;
|
|
nPrbtn: TButton;
|
|
fourbtn: TButton;
|
|
nfactorialbtn: TButton;
|
|
fivebtn: TButton;
|
|
sixbtn: TButton;
|
|
onebtn: TButton;
|
|
twobtn: TButton;
|
|
threebtn: TButton;
|
|
XEdit: TEdit;
|
|
GroupBox1: TGroupBox;
|
|
GroupBox2: TGroupBox;
|
|
GroupBox3: TGroupBox;
|
|
procedure absbtnClick(Sender: TObject);
|
|
procedure AddbtnClick(Sender: TObject);
|
|
procedure ChangeSignBtnClick(Sender: TObject);
|
|
procedure etoxbtnClick(Sender: TObject);
|
|
procedure PiBtnClick(Sender: TObject);
|
|
procedure VarBtnClick(Sender: TObject);
|
|
procedure MeanBtnClick(Sender: TObject);
|
|
procedure StdDevBtnClick(Sender: TObject);
|
|
procedure ClearEntryBtnClick(Sender: TObject);
|
|
procedure CombobtnClick(Sender: TObject);
|
|
procedure cosbtnClick(Sender: TObject);
|
|
procedure dividebtnClick(Sender: TObject);
|
|
procedure eightbtnClick(Sender: TObject);
|
|
procedure EqualBtnClick(Sender: TObject);
|
|
procedure expbtnClick(Sender: TObject);
|
|
procedure fivebtnClick(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure fourbtnClick(Sender: TObject);
|
|
procedure log10btnClick(Sender: TObject);
|
|
procedure MemInBtnClick(Sender: TObject);
|
|
procedure MemOutBtnClick(Sender: TObject);
|
|
procedure MemPlusBtnClick(Sender: TObject);
|
|
procedure multbtnClick(Sender: TObject);
|
|
procedure natlogbtnClick(Sender: TObject);
|
|
procedure nfactorialbtnClick(Sender: TObject);
|
|
procedure ninebtnClick(Sender: TObject);
|
|
procedure nPrbtnClick(Sender: TObject);
|
|
procedure onebtnClick(Sender: TObject);
|
|
procedure PeriodBtnClick(Sender: TObject);
|
|
procedure ReturnBtnClick(Sender: TObject);
|
|
procedure sevenbtnClick(Sender: TObject);
|
|
procedure sinbtnClick(Sender: TObject);
|
|
procedure sixbtnClick(Sender: TObject);
|
|
procedure sqrbtnClick(Sender: TObject);
|
|
procedure sqrtbtnClick(Sender: TObject);
|
|
procedure subtractbtnClick(Sender: TObject);
|
|
procedure tanbtnClick(Sender: TObject);
|
|
procedure tentoxbtnClick(Sender: TObject);
|
|
procedure threebtnClick(Sender: TObject);
|
|
procedure twobtnClick(Sender: TObject);
|
|
procedure XEditKeyPress(Sender: TObject; var Key: char);
|
|
procedure ytopowerxbtnClick(Sender: TObject);
|
|
procedure ZeroBtnClick(Sender: TObject);
|
|
private
|
|
{ private declarations }
|
|
Xmemory : double; // value in the memory
|
|
X : double; // value in register
|
|
TempX : double; // temporary storage of last entry
|
|
keyentered : double; // numeric key press value
|
|
operation : integer; // operation to be performed upon press of equal sign
|
|
NoStack : integer; // no. in memory stack
|
|
stack : DblDyneVec;
|
|
Xint, Xint2 : integer;
|
|
public
|
|
{ public declarations }
|
|
end;
|
|
|
|
var
|
|
CalculatorForm: TCalculatorForm;
|
|
|
|
implementation
|
|
|
|
{ TCalculatorForm }
|
|
|
|
procedure TCalculatorForm.FormShow(Sender: TObject);
|
|
begin
|
|
XEdit.Text := '';
|
|
Xmemory := 0.0;
|
|
X := 0.0;
|
|
keyentered := 0.0;
|
|
NoStack := 0;
|
|
SetLength(stack,1000);
|
|
NEdit.Text := '0';
|
|
XEdit.SetFocus;
|
|
end;
|
|
|
|
procedure TCalculatorForm.fourbtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := XEdit.Text + '4';
|
|
end;
|
|
|
|
procedure TCalculatorForm.log10btnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := log10(X);
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.MemInBtnClick(Sender: TObject);
|
|
begin
|
|
Xmemory := StrToFloat(XEdit.Text);
|
|
XEdit.Text := '';
|
|
end;
|
|
|
|
procedure TCalculatorForm.MemOutBtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := FloatToStr(Xmemory);
|
|
end;
|
|
|
|
procedure TCalculatorForm.MemPlusBtnClick(Sender: TObject);
|
|
begin
|
|
stack[NoStack] := stack[NoStack] + StrToFloat(XEdit.Text);
|
|
NoStack := NoStack + 1;
|
|
NEdit.Text := IntToStr(NoStack);
|
|
XEdit.Text := '';
|
|
end;
|
|
|
|
procedure TCalculatorForm.multbtnClick(Sender: TObject);
|
|
begin
|
|
TempX := StrToFloat(XEdit.Text);
|
|
XEdit.Text := '';
|
|
operation := 2; // multiply
|
|
end;
|
|
|
|
procedure TCalculatorForm.natlogbtnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := ln(X);
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.nfactorialbtnClick(Sender: TObject);
|
|
var n : integer;
|
|
begin
|
|
n := StrToInt(XEdit.Text);
|
|
n := factorial(n);
|
|
XEdit.Text := IntToStr(n);
|
|
end;
|
|
|
|
procedure TCalculatorForm.ninebtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := XEdit.Text + '9';
|
|
end;
|
|
|
|
procedure TCalculatorForm.nPrbtnClick(Sender: TObject);
|
|
begin
|
|
operation := 7;
|
|
Xint := StrToInt(XEdit.Text);
|
|
XEdit.Text := '';
|
|
end;
|
|
|
|
procedure TCalculatorForm.onebtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := XEdit.Text + '1';
|
|
end;
|
|
|
|
procedure TCalculatorForm.PeriodBtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := XEdit.Text + '.';
|
|
end;
|
|
|
|
procedure TCalculatorForm.ReturnBtnClick(Sender: TObject);
|
|
begin
|
|
stack := nil;
|
|
end;
|
|
|
|
procedure TCalculatorForm.sevenbtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := XEdit.Text + '7';
|
|
end;
|
|
|
|
procedure TCalculatorForm.sinbtnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := sin(DegToRad(X));
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.sixbtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := XEdit.Text + '6';
|
|
end;
|
|
|
|
procedure TCalculatorForm.sqrbtnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := X * X;
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.sqrtbtnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := sqrt(X);
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.subtractbtnClick(Sender: TObject);
|
|
begin
|
|
TempX := StrToFloat(XEdit.Text);
|
|
XEdit.Text := '';
|
|
operation := 3; // subtract
|
|
end;
|
|
|
|
procedure TCalculatorForm.tanbtnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := tan(DegToRad(X));
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.tentoxbtnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := power(10,X);
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.threebtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := XEdit.Text + '3';
|
|
end;
|
|
|
|
procedure TCalculatorForm.twobtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := XEdit.Text + '2';
|
|
end;
|
|
|
|
procedure TCalculatorForm.XEditKeyPress(Sender: TObject; var Key: char);
|
|
begin
|
|
// XEdit.Text := XEdit.Text + Key;
|
|
end;
|
|
|
|
procedure TCalculatorForm.ytopowerxbtnClick(Sender: TObject);
|
|
begin
|
|
operation := 5;
|
|
tempX := StrToFloat(XEdit.Text);
|
|
XEdit.Text := '';
|
|
end;
|
|
|
|
procedure TCalculatorForm.ZeroBtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.text := XEdit.Text + '0';
|
|
end;
|
|
|
|
procedure TCalculatorForm.ClearEntryBtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := '';
|
|
end;
|
|
|
|
procedure TCalculatorForm.CombobtnClick(Sender: TObject);
|
|
begin
|
|
operation := 6;
|
|
tempX := StrToFloat(XEdit.Text);
|
|
XEdit.Text := '';
|
|
end;
|
|
|
|
procedure TCalculatorForm.cosbtnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := cos(DegToRad(X));
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.AddbtnClick(Sender: TObject);
|
|
begin
|
|
TempX := StrToFloat(XEdit.Text);
|
|
XEdit.Text := '';
|
|
operation := 4; // add
|
|
end;
|
|
|
|
procedure TCalculatorForm.ChangeSignBtnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := -1.0 * X;
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.etoxbtnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := power(2.71828182845905,X);
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.PiBtnClick(Sender: TObject);
|
|
begin
|
|
X := Pi;
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.absbtnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := abs(X);
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.VarBtnClick(Sender: TObject);
|
|
VAR
|
|
Sum, SSQ : double;
|
|
Ncount : double;
|
|
i, index : integer;
|
|
begin
|
|
Ncount := StrToFloat(NEdit.Text);
|
|
index := StrToInt(NEdit.Text);
|
|
Sum := 0.0;
|
|
SSQ := 0.0;
|
|
if Ncount < 1 then
|
|
begin
|
|
ShowMessage('No values in stack memory');
|
|
exit;
|
|
end
|
|
else
|
|
begin
|
|
for i := 0 to index - 1 do
|
|
begin
|
|
Sum := Sum + stack[i];
|
|
SSQ := SSQ + (stack[i] * stack[i]);
|
|
end;
|
|
// Sum := Sum / Ncount; // mean
|
|
// SSQ := SSQ / Ncount;
|
|
SSQ := SSQ - (Sum * Sum) / Ncount;
|
|
SSQ := SSQ / (Ncount - 1.0);
|
|
XEdit.Text := FloatToStr(SSQ);
|
|
end;
|
|
end;
|
|
|
|
procedure TCalculatorForm.MeanBtnClick(Sender: TObject);
|
|
Var
|
|
Sum : double;
|
|
Ncount : double;
|
|
i, index : integer;
|
|
begin
|
|
Ncount := StrToFloat(NEdit.Text);
|
|
index := StrToInt(NEdit.Text);
|
|
Sum := 0.0;
|
|
if Ncount < 1 then
|
|
begin
|
|
ShowMessage('No values in stack memory');
|
|
exit;
|
|
end
|
|
else
|
|
begin
|
|
for i := 0 to index - 1 do Sum := Sum + stack[i];
|
|
Sum := Sum / Ncount;
|
|
XEdit.Text := FloatToStr(Sum);
|
|
end;
|
|
end;
|
|
|
|
procedure TCalculatorForm.StdDevBtnClick(Sender: TObject);
|
|
VAR
|
|
Sum, SSQ : double;
|
|
Ncount : double;
|
|
i, index : integer;
|
|
begin
|
|
Ncount := StrToFloat(NEdit.Text);
|
|
index := StrToInt(NEdit.Text);
|
|
Sum := 0.0;
|
|
SSQ := 0.0;
|
|
if Ncount < 1 then
|
|
begin
|
|
ShowMessage('No values in stack memory');
|
|
exit;
|
|
end
|
|
else
|
|
begin
|
|
for i := 0 to index - 1 do
|
|
begin
|
|
Sum := Sum + stack[i];
|
|
SSQ := SSQ + (stack[i] * stack[i]);
|
|
end;
|
|
// Sum := Sum / Ncount; // mean
|
|
// SSQ := SSQ / Ncount;
|
|
SSQ := SSQ - (Sum * Sum) / Ncount;
|
|
SSQ := SSQ / (Ncount - 1.0);
|
|
SSQ := sqrt(SSQ);
|
|
XEdit.Text := FloatToStr(SSQ);
|
|
end;
|
|
end;
|
|
|
|
procedure TCalculatorForm.dividebtnClick(Sender: TObject);
|
|
begin
|
|
TempX := StrToFloat(XEdit.Text);
|
|
XEdit.Text := '';
|
|
operation := 1; // //divide
|
|
end;
|
|
|
|
procedure TCalculatorForm.eightbtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := XEdit.Text + '8';
|
|
end;
|
|
|
|
procedure TCalculatorForm.EqualBtnClick(Sender: TObject);
|
|
Var x1, x2 : double;
|
|
begin
|
|
case (operation) of
|
|
1 : begin // divide operation
|
|
x1 := tempX;
|
|
x2 := x1 / StrToFloat(XEdit.Text);
|
|
XEdit.Text := FloatToStr(x2);
|
|
end;
|
|
2 : begin // nultiply operation
|
|
x1 := tempX;
|
|
x2 := x1 * StrToFloat(XEdit.Text);
|
|
XEdit.Text := FloatToStr(x2);
|
|
end;
|
|
3 : begin
|
|
x1 := tempX; // subtract operation
|
|
x2 := x1 - StrToFloat(XEdit.Text);
|
|
XEdit.Text := FloatToStr(x2);
|
|
end;
|
|
4 : begin
|
|
x1 := tempX; // Add operation
|
|
x2 := x1 + StrToFloat(XEdit.Text);
|
|
XEdit.Text := FloatToStr(x2);
|
|
end;
|
|
5 : begin // y to the X power (Y stored in tempx first, x in register)
|
|
X := StrToFloat(XEdit.Text);
|
|
X := power(tempX,X);
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
6 : begin // combinations of x things out of N
|
|
X := StrToFloat(XEdit.Text);
|
|
X := combos(X,tempX);
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
7 : begin // permutations of x things out of N
|
|
Xint2 := StrToInt(XEdit.Text);
|
|
Xint := factorial(Xint) div (factorial(Xint - Xint2));
|
|
XEdit.Text := IntToStr(Xint);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TCalculatorForm.expbtnClick(Sender: TObject);
|
|
begin
|
|
X := StrToFloat(XEdit.Text);
|
|
X := exp(X);
|
|
XEdit.Text := FloatToStr(X);
|
|
end;
|
|
|
|
procedure TCalculatorForm.fivebtnClick(Sender: TObject);
|
|
begin
|
|
XEdit.Text := XEdit.Text + '5';
|
|
end;
|
|
|
|
initialization
|
|
{$I calculatorunit.lrs}
|
|
|
|
end.
|
|
|