2020-03-30 18:01:44 +00:00
|
|
|
unit CalculatorUnit;
|
|
|
|
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
uses
|
2020-12-16 23:29:40 +00:00
|
|
|
Classes, SysUtils, Forms, Controls, Graphics, Dialogs,
|
2020-03-30 18:01:44 +00:00
|
|
|
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
|
|
|
|
|
2020-12-16 23:29:40 +00:00
|
|
|
{$R *.lfm}
|
|
|
|
|
|
|
|
uses
|
|
|
|
Utils;
|
|
|
|
|
2020-03-30 18:01:44 +00:00
|
|
|
{ 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
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := log10(X);
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.MemInBtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, Xmemory) then
|
|
|
|
XEdit.Text := '';
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.MemOutBtnClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
XEdit.Text := FloatToStr(Xmemory);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.MemPlusBtnClick(Sender: TObject);
|
2020-12-16 23:29:40 +00:00
|
|
|
var
|
|
|
|
value: Double;
|
2020-03-30 18:01:44 +00:00
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, value) then
|
|
|
|
begin
|
|
|
|
stack[NoStack] := stack[NoStack] + value;
|
|
|
|
NoStack := NoStack + 1;
|
|
|
|
NEdit.Text := IntToStr(NoStack);
|
|
|
|
XEdit.Text := '';
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.multbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, TempX) then
|
|
|
|
begin
|
|
|
|
XEdit.Text := '';
|
|
|
|
operation := 2; // multiply
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.natlogbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := ln(X);
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.nfactorialbtnClick(Sender: TObject);
|
2020-12-16 23:29:40 +00:00
|
|
|
var
|
|
|
|
n : integer;
|
2020-03-30 18:01:44 +00:00
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToInt(XEdit.Text, n) then
|
|
|
|
begin
|
|
|
|
n := factorial(n);
|
|
|
|
XEdit.Text := IntToStr(n);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.ninebtnClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
XEdit.Text := XEdit.Text + '9';
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.nPrbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToInt(XEdit.Text, Xint) then
|
|
|
|
begin
|
|
|
|
operation := 7;
|
|
|
|
XEdit.Text := '';
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.onebtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
XEdit.Text := XEdit.Text + '1';
|
2020-03-30 18:01:44 +00:00
|
|
|
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
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := sin(DegToRad(X));
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.sixbtnClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
XEdit.Text := XEdit.Text + '6';
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.sqrbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := X * X;
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.sqrtbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := sqrt(X);
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.subtractbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, TempX) then
|
|
|
|
begin
|
|
|
|
XEdit.Text := '';
|
|
|
|
operation := 3; // subtract
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.tanbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrTofloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := tan(DegToRad(X));
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.tentoxbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := power(10,X);
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
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
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, tempX) then
|
|
|
|
begin
|
|
|
|
operation := 5;
|
|
|
|
XEdit.Text := '';
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.ZeroBtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
XEdit.text := XEdit.Text + '0';
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.ClearEntryBtnClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
XEdit.Text := '';
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.CombobtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, tempX) then
|
|
|
|
begin
|
|
|
|
operation := 6;
|
|
|
|
XEdit.Text := '';
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.cosbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := cos(DegToRad(X));
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.AddbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, TempX) then
|
|
|
|
begin
|
|
|
|
XEdit.Text := '';
|
|
|
|
operation := 4; // add
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.ChangeSignBtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := -X;
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.etoxbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := exp(X); //power(2.71828182845905, X);
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.PiBtnClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
X := Pi;
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.absbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := abs(X);
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.VarBtnClick(Sender: TObject);
|
2020-12-16 23:29:40 +00:00
|
|
|
var
|
|
|
|
Sum, SSQ: double;
|
|
|
|
NCount: double;
|
|
|
|
i, index: integer;
|
2020-03-30 18:01:44 +00:00
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if not TryStrToFloat(NEdit.Text, NCount) then // wp: why read the same Edit into two variables?
|
|
|
|
exit;
|
|
|
|
if not TryStrToInt(NEdit.Text, index) then
|
|
|
|
exit;
|
2020-03-30 18:01:44 +00:00
|
|
|
Sum := 0.0;
|
|
|
|
SSQ := 0.0;
|
2020-12-16 23:29:40 +00:00
|
|
|
if NCount < 1 then
|
2020-03-30 18:01:44 +00:00
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
ErrorMsg('No values in stack memory');
|
2020-03-30 18:01:44 +00:00
|
|
|
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
|
2020-12-16 23:29:40 +00:00
|
|
|
if not TryStrToFloat(NEdit.Text, NCount) then // wp: why two variables?
|
|
|
|
exit;
|
|
|
|
if not TryStrToInt(NEdit.Text, index) then
|
|
|
|
exit;
|
2020-03-30 18:01:44 +00:00
|
|
|
Sum := 0.0;
|
|
|
|
if Ncount < 1 then
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
ErrorMsg('No values in stack memory');
|
2020-03-30 18:01:44 +00:00
|
|
|
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
|
2020-12-16 23:29:40 +00:00
|
|
|
if not TryStrToFloat(NEdit.Text, NCount) then // wp: why two variables?
|
|
|
|
exit;
|
|
|
|
if not TryStrToInt(NEdit.Text, index) then
|
|
|
|
exit;
|
2020-03-30 18:01:44 +00:00
|
|
|
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
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, TempX) then
|
|
|
|
begin
|
|
|
|
XEdit.Text := '';
|
|
|
|
operation := 1; // //divide
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.eightbtnClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
XEdit.Text := XEdit.Text + '8';
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.EqualBtnClick(Sender: TObject);
|
2020-12-16 23:29:40 +00:00
|
|
|
var
|
|
|
|
x1, x2: double;
|
|
|
|
editVal: Double;
|
2020-03-30 18:01:44 +00:00
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if not TryStrToFloat(XEdit.Text, editVal) then
|
|
|
|
exit;
|
|
|
|
|
2020-03-30 18:01:44 +00:00
|
|
|
case (operation) of
|
|
|
|
1 : begin // divide operation
|
|
|
|
x1 := tempX;
|
2020-12-16 23:29:40 +00:00
|
|
|
x2 := x1 / editVal;
|
2020-03-30 18:01:44 +00:00
|
|
|
XEdit.Text := FloatToStr(x2);
|
|
|
|
end;
|
|
|
|
2 : begin // nultiply operation
|
|
|
|
x1 := tempX;
|
2020-12-16 23:29:40 +00:00
|
|
|
x2 := x1 * editVal;
|
2020-03-30 18:01:44 +00:00
|
|
|
XEdit.Text := FloatToStr(x2);
|
|
|
|
end;
|
|
|
|
3 : begin
|
|
|
|
x1 := tempX; // subtract operation
|
2020-12-16 23:29:40 +00:00
|
|
|
x2 := x1 - editVal;
|
2020-03-30 18:01:44 +00:00
|
|
|
XEdit.Text := FloatToStr(x2);
|
|
|
|
end;
|
|
|
|
4 : begin
|
|
|
|
x1 := tempX; // Add operation
|
2020-12-16 23:29:40 +00:00
|
|
|
x2 := x1 + editVal;
|
2020-03-30 18:01:44 +00:00
|
|
|
XEdit.Text := FloatToStr(x2);
|
|
|
|
end;
|
|
|
|
5 : begin // y to the X power (Y stored in tempx first, x in register)
|
2020-12-16 23:29:40 +00:00
|
|
|
X := power(tempX, editVal);
|
2020-03-30 18:01:44 +00:00
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
|
|
|
6 : begin // combinations of x things out of N
|
2020-12-16 23:29:40 +00:00
|
|
|
X := combos(editVal,tempX);
|
2020-03-30 18:01:44 +00:00
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
|
|
|
7 : begin // permutations of x things out of N
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToInt(XEdit.Text, XInt2) then
|
|
|
|
begin
|
|
|
|
Xint := factorial(Xint) div (factorial(Xint - Xint2));
|
|
|
|
XEdit.Text := IntToStr(Xint);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.expbtnClick(Sender: TObject);
|
|
|
|
begin
|
2020-12-16 23:29:40 +00:00
|
|
|
if TryStrToFloat(XEdit.Text, X) then
|
|
|
|
begin
|
|
|
|
X := exp(X);
|
|
|
|
XEdit.Text := FloatToStr(X);
|
|
|
|
end;
|
2020-03-30 18:01:44 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TCalculatorForm.fivebtnClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
XEdit.Text := XEdit.Text + '5';
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
end.
|
|
|
|
|