学了零基础入门delphi7的前四节课编写的一个计算器,比小甲鱼课堂展示的效果好
小甲鱼课堂上编写的计算器,有如下缺陷:1.可以输入多个小数点;
2。实数前会出现0,例如输入7,可以输入成007,正常的应该是输入007显示7;
3.按‘=’显示计算结果后再按‘=’会不断显示更多结果(电脑自带的计算器也存在这个问题);
4.不能进行连续运算,即不能输入1+2+3-4*5÷6再按“=”求结果,只能每次计算两个数的运算;
5. 4不成立5自然也不能成立,5针对电脑自带的标准计算器而言的,连续运算时不遵守四则运算先乘除后加减的优先级。
6.输入操作数和运算符后直接按“=”会报错,电脑自带的计算器这样操作出现的结果有点怪异,我实现的效果其实也好不到哪去T_T!
7.除数为0时,没有预先处理;
8.没有删除功能和取反功能。
我的语法比较糟糕,但因为只学了前四课,做出的效果自我感觉还不错,希望大家多多指教。话不多说,我的作品在下面:
好悲催,本想直接报所有文件打包添加到附件的,好像不行,只好附上代码了:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, jpeg, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
edt1: TEdit;
img1: TImage;
btn1: TSpeedButton;
btn2: TSpeedButton;
btn3: TSpeedButton;
btn4: TSpeedButton;
btn5: TSpeedButton;
btn6: TSpeedButton;
btn7: TSpeedButton;
btn8: TSpeedButton;
btn9: TSpeedButton;
btn10: TSpeedButton;
btn11: TSpeedButton;
btn12: TSpeedButton;
btn13: TSpeedButton;
btn14: TSpeedButton;
btn15: TSpeedButton;
btn16: TSpeedButton;
btn17: TSpeedButton;
btn18: TSpeedButton;
btn19: TSpeedButton;
btn20: TSpeedButton;
btn21: TSpeedButton;
edt2: TEdit;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure btn4Click(Sender: TObject);
procedure btn5Click(Sender: TObject);
procedure btn6Click(Sender: TObject);
procedure btn7Click(Sender: TObject);
procedure btn8Click(Sender: TObject);
procedure btn9Click(Sender: TObject);
procedure btn10Click(Sender: TObject);
procedure btn11Click(Sender: TObject);
procedure btn12Click(Sender: TObject);
procedure btn13Click(Sender: TObject);
procedure btn14Click(Sender: TObject);
procedure btn15Click(Sender: TObject);
procedure btn16Click(Sender: TObject);
procedure btn17Click(Sender: TObject);
procedure btn18Click(Sender: TObject);
procedure btn19Click(Sender: TObject);
procedure btn20Click(Sender: TObject);
procedure btn21Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
var
result:Real; //结果
mdl_result:Real;//_混合运算时加减运算的结果
temp:Real; //中间量
opre:Char; //运算符
mdl_opre:Char;// 混合运算时加减运算的运算符
{$R *.dfm}
//输入1,当1前面的数字全为0时,显示1
procedure TForm1.btn1Click(Sender: TObject);
Begin
If StrToFloat(edt1.Text+'1')<> 1 Then
edt1.Text:= edt1.Text + '1'
Else
edt1.Text:= '1';
End;
//输入2,当2前面的数字全为0时,显示2
procedure TForm1.btn2Click(Sender: TObject);
Begin
If StrToFloat(edt1.Text+'2')<> 2 Then
edt1.Text:= edt1.Text + '2'
Else
edt1.Text:= '2';
End;
//输入3,当3前面的数字全为0时,显示3
procedure TForm1.btn3Click(Sender: TObject);
Begin
If StrToFloat(edt1.Text+'3')<> 3 Then
edt1.Text:= edt1.Text + '3'
Else
edt1.Text:= '3';
End;
//输入4,当4前面的数字全为0时,显示4
procedure TForm1.btn4Click(Sender: TObject);
Begin
If StrToFloat(edt1.Text+'4')<> 4 Then
edt1.Text:= edt1.Text + '4'
Else
edt1.Text:= '4';
End;
//输入5,当5前面的数字全为0时,显示5
procedure TForm1.btn5Click(Sender: TObject);
Begin
If StrToFloat(edt1.Text+'5')<> 5 Then
edt1.Text:= edt1.Text + '5'
Else
edt1.Text:= '5';
End;
//输入6,当6前面的数字全为0时,显示6
procedure TForm1.btn6Click(Sender: TObject);
Begin
If StrToFloat(edt1.Text+'6')<> 6 Then
edt1.Text:= edt1.Text + '6'
Else
edt1.Text:= '6';
End;
//输入7,当7前面的数字全为0时,显示7
procedure TForm1.btn7Click(Sender: TObject);
Begin
If StrToFloat(edt1.Text+'7')<> 7 Then
edt1.Text:= edt1.Text + '7'
Else
edt1.Text:= '7';
End;
//输入8,当8前面的数字全为0时,显示8
procedure TForm1.btn8Click(Sender: TObject);
Begin
If StrToFloat(edt1.Text+'8')<> 8 Then
edt1.Text:= edt1.Text + '8'
Else
edt1.Text:= '8';
End;
//输入9,当9前面的数字全为0时,显示9
procedure TForm1.btn9Click(Sender: TObject);
Begin
If StrToFloat(edt1.Text+'9')<> 9 Then
edt1.Text:= edt1.Text + '9'
Else
edt1.Text:= '9';
End;
//输入0,为整数时 从高位到低位第一个非0数前不能出现0,纯小数时小数点前只能有一个0
procedure TForm1.btn10Click(Sender: TObject);
Begin
If (edt1.Text <>'') and(edt1.Text <>'0')or (POS('.',edt1.Text)= 1) Then
edt1.Text:= edt1.Text + '0'
Else
edt1.Text:='0';
End;
//输入00,为整数时 从高位到低位第一个非0数前不能出现0,纯小数时小数点前只能有一个0
procedure TForm1.btn11Click(Sender: TObject);
Begin
If (edt1.Text <>'') and (edt1.Text <>'0') and (edt1.Text <>'00') or (POS('.',edt1.Text)= 1) Then
edt1.Text:= edt1.Text + '00'
Else
edt1.Text:='0';
End;
//输入小数点,且只能输入一个小数点
procedure TForm1.btn12Click(Sender: TObject);
Begin
If POS('.',edt1.Text)= 0Then
edt1.Text:= edt1.Text + '.';
End;
//删除功能
procedure TForm1.btn13Click(Sender: TObject);
Begin
//edt1.Text:=Copy(edt1.Text,1,Length(Trim(edt1.Text))-1);
If (opre <>'') and (opre <> ' ')Then //按下过'+','-','×','÷'而未曾按下过'='键的情况下
IfLength(edt1.Text )>0 Then//删掉edt1.Text的最末尾的一个字符
edt1.Text:=Copy(edt1.Text,1,Length(edt1.Text)-1)
Else//Length(edt1.Text )=0删掉前面的运算符opre
opre:=' '
Else //刚开机未曾按下过 '+','-','×','÷'或按下过'='键的情况下
If (Length(edt1.Text )>0) and (edt1.Text<>'0') Then//当edt1.Text为不等于'0'的字符串时删掉edt1.Text的最末尾的一个字符
edt1.Text:=Copy(edt1.Text,1,Length(edt1.Text)-1)
Else// edt1.Text ='0'不执行删除
;
End;
//浮点除
procedure TForm1.btn14Click(Sender: TObject);
Begin
IfLength(edt1.Text)> 0Then
temp:= StrToFloat(edt1.Text);
Case opre of
'+': Begin //保存前面的运算结果及加号
mdl_result:= result;
mdl_opre:= opre;
result:= temp;
End;
'-': Begin //保存前面的运算结果及减号
mdl_result:= result;
mdl_opre:= opre;
result:= temp;
End;
'*': result:= result * temp;
'/': Iftemp = 0 Then
Begin
edt1.Text:= '除数不能为0' ;
result:= result / temp;
End
Else
result:= result / temp;
End;
If(result = 0 )and ((opre = ' ')or(opre = '')) Then
Begin
result:= temp;
temp:= 0;
End ;
opre:='/';
edt1.Text:= '' ;
edt2.Text:= FloatToStr(result) ;
End;
//归零 (C)
procedure TForm1.btn15Click(Sender: TObject);
Begin
edt1.Text:= '0';
edt2.Text:= '0';
opre:= ' ';
mdl_opre:=' ';
temp:= 0;
result:= 0;
mdl_result:= 0;
End;
//乘法
procedure TForm1.btn16Click(Sender: TObject);
Begin
IfLength(edt1.Text)> 0Then
temp:= StrToFloat(edt1.Text);
Case opre of
'+': Begin //保存前面的运算结果及加号
mdl_result:= result;
mdl_opre:= opre;
result:= temp;
End;
'-': Begin //保存前面的运算结果及减号
mdl_result:= result;
mdl_opre:= opre;
result:= temp;
End;
'*': result:= result * temp;
'/': Iftemp = 0 Then
Begin
edt1.Text:= '除数不能为0' ;
result:= result / temp;
End
Else
result:= result / temp;
End;
If(result = 0 )and ((opre = ' ')or(opre = '')) Then
Begin
result:= temp;
temp:= 0;
End ;
opre:='*';
edt1.Text:= '' ;
edt2.Text:= FloatToStr(result) ;
End;
//输入百分数或转变为百分数
procedure TForm1.btn17Click(Sender: TObject);
Begin
If (Length(edt1.Text)>0) and(edt1.Text<> '0') Then //如果edt1.Text为不等于'0' 的字符串,则将字符串转化成数字再除以100
Begin
temp:= StrToFloat(edt1.Text);
edt1.Text:=FloatToStr(temp/100);
End ;
// edt1.Text等于其他的情况忽视('',' ', '0')
End;
//加法
procedure TForm1.btn18Click(Sender: TObject);
Begin
IfLength(edt1.Text)> 0Then
temp:= StrToFloat(edt1.Text);
Case opre of
'+': result:= result + temp;
'-': result:= result - temp;
'*': Begin
result:= result * temp;
Casemdl_opre of
'+' : result:= result + mdl_result ;
'-' : result:= -result + mdl_result ;
End ;
//清空中间结果和中间运算符
mdl_result:= 0;
mdl_opre:= ' ';
End;
'/': Iftemp = 0 Then
Begin
edt1.Text:= '除数不能为0' ;
result:= result / temp;
End
Else
Begin
result:= result / temp;
Casemdl_opre of
'+' : result:= result + mdl_result ;
'-' : result:= -result + mdl_result ;
End ;
//清空中间结果和中间运算符
mdl_result:= 0;
mdl_opre:= ' ';
End;
End;
If(result = 0 )and ((opre = ' ')or(opre = '')) Then
Begin
result:= temp;
temp:= 0;
End ;
opre:='+';
edt1.Text:= '' ;
edt2.Text:= FloatToStr(result) ;
End;
//取反键 (±)
procedure TForm1.btn19Click(Sender: TObject);
Begin
If (Length(edt1.Text)>0) and(edt1.Text<> '0') Then //如果edt1.Text为不等于'0' 的字符串,则将字符串转化成数字再根据是否有运算符进取反及其他更改
Begin
temp:= StrToFloat(edt1.Text);
Case opre of
' ' : temp:= -temp; //按下过'='键后 ,就没有运算符了
'+' : opre:= '-'; //temp前的运算符为'+'
'-' : opre:= '+'; // temp前的运算符为'-'
//temp前的运算符为'×'
'*' : Casemdl_opre of
//按下过'='或'C'键后
' ' :Begin
mdl_opre:= '-';
mdl_result:= 0 ;
End;
'+' : mdl_opre:= '-';
'-' : mdl_opre:= '+';
Else//开机就直接进行乘法运算,此时mdl_opre的值为未知值
Begin
mdl_opre:= '-';
mdl_result:= 0;
End;
End;
//temp前的运算符为'÷'
'/' : Casemdl_opre of
//按下过'='或'C'键后
' ' :Begin
mdl_opre:= '-';
mdl_result:= 0
End;
'+' : mdl_opre:= '-';
'-' : mdl_opre:= '+';
Else//开机就直接进行乘法运算,此时mdl_opre的值为未知值
Begin
mdl_opre:= '-';
mdl_result:= 0 ;
End;
End;
Else
temp:= -temp; //刚开机未输入运算符 ,则opre为的值未知
End ;
End;// edt1.Text等于其他的情况忽视('',' ', '0')
edt1.Text:=FloatToStr(temp);
End;
//减法
procedure TForm1.btn20Click(Sender: TObject);
Begin
IFLength(edt1.Text)> 0Then
temp:= StrToFloat(edt1.Text);
Case opre of
'+': result:= result + temp;
'-': result:= result - temp;
'*': Begin
result:= result * temp;
Casemdl_opre of
'+' : result:= result + mdl_result ;
'-' : result:= -result + mdl_result ;
End ;
//清空中间结果和中间运算符
mdl_result:= 0;
mdl_opre:= ' ';
End;
'/': Iftemp = 0 Then
Begin
edt1.Text:= '除数不能为0' ;
result:= result / temp;
End
Else
Begin
result:= result / temp;
Casemdl_opre of
'+' : result:= result + mdl_result ;
'-' : result:= -result + mdl_result ;
End ;
//清空中间结果和中间运算符
mdl_result:= 0;
mdl_opre:= ' ';
End;
End;
If(result = 0 )and ((opre = ' ')or(opre = '')) Then
Begin
result:= temp;
temp:= 0;
End ;
opre:='-';
edt1.Text:= '' ;
edt2.Text:= FloatToStr(result) ;
End;
//'='键
procedure TForm1.btn21Click(Sender: TObject);
Begin
IFLength(edt1.Text)> 0Then
temp:= StrToFloat(edt1.Text);
Case opre of
'+': result:= result + temp;
'-': result:= result - temp;
'*':Begin
result:= result * temp;
Casemdl_opre of
'+' : result:= result + mdl_result ;
'-' : result:= -result + mdl_result ;
End ;
//清空中间结果和中间运算符
mdl_result:= 0;
mdl_opre:= ' ';
End;
'/': Iftemp = 0 Then
Begin
edt1.Text:= '除数不能为0' ;
result:= result / temp;
End
Else
Begin
result:= result / temp;
Casemdl_opre of
'+' : result:= result + mdl_result ;
'-' : result:= -result + mdl_result ;
End ;
//清空中间结果和中间运算符
mdl_result:= 0;
mdl_opre:= ' ';
End;
//避免连续按”=” 后出现不良结果
' ': If (edt2.Text <>' ')or(edt2.Text <>'')Then
result:= StrToFloat(edt1.Text)
Else
result:=0;
Else//开机直接按”=”的结果
If (edt1.Text ='')or (edt1.Text =' ')Then
result:=0
Else
result:= temp;
End;
//最终结果显示
//edt1.Text:= '0';
edt2.Text:= FloatToStr(result);
edt1.Text:= FloatToStr(result);
//按下'='键后运算符号及中间值全部清除
opre:= ' ';
mdl_opre:= ' ';
mdl_result:= 0;
result:= 0;
temp:= 0;
End ;
//设置edt1,edt2从右边开始显示
procedure TForm1.FormCreate(Sender: TObject);
Begin
SetWindowLong(edt1.Handle,GWL_STYLE,GetWindowLong(edt1.Handle,GWL_STYLE)or ES_RIGHT);
edt1.Invalidate;
SetWindowLong(edt2.Handle,GWL_STYLE,GetWindowLong(edt2.Handle,GWL_STYLE)or ES_RIGHT);
edt2.Invalidate;
End;
End.
牛皮大佬
页:
[1]