Files
lazarus-ccr/applications/lazstats/source/forms/tools/calculatorunit.pas
wp_xxyyzz 2f33dc9f7b LazStats: initial commit.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7345 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2020-03-30 18:01:44 +00:00

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.