|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
小甲鱼课堂上编写的计算器,有如下缺陷:
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)= 0 Then
- 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 //按下过'+','-','×','÷'而未曾按下过'='键的情况下
- If Length(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
- If Length(edt1.Text)> 0 Then
- 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;
- '/': If temp = 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
- If Length(edt1.Text)> 0 Then
- 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;
- '/': If temp = 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
- If Length(edt1.Text)> 0 Then
- temp:= StrToFloat(edt1.Text);
- Case opre of
- '+': result:= result + temp;
- '-': result:= result - temp;
- '*': Begin
- result:= result * temp;
- Case mdl_opre of
- '+' : result:= result + mdl_result ;
- '-' : result:= -result + mdl_result ;
- End ;
- //清空中间结果和中间运算符
- mdl_result:= 0;
- mdl_opre:= ' ';
- End;
- '/': If temp = 0 Then
- Begin
- edt1.Text:= '除数不能为0' ;
- result:= result / temp;
- End
- Else
- Begin
- result:= result / temp;
- Case mdl_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前的运算符为'×'
- '*' : Case mdl_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前的运算符为'÷'
- '/' : Case mdl_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
- IF Length(edt1.Text)> 0 Then
- temp:= StrToFloat(edt1.Text);
- Case opre of
- '+': result:= result + temp;
- '-': result:= result - temp;
- '*': Begin
- result:= result * temp;
- Case mdl_opre of
- '+' : result:= result + mdl_result ;
- '-' : result:= -result + mdl_result ;
- End ;
- //清空中间结果和中间运算符
- mdl_result:= 0;
- mdl_opre:= ' ';
- End;
- '/': If temp = 0 Then
- Begin
- edt1.Text:= '除数不能为0' ;
- result:= result / temp;
- End
- Else
- Begin
- result:= result / temp;
- Case mdl_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
- IF Length(edt1.Text)> 0 Then
- temp:= StrToFloat(edt1.Text);
- Case opre of
- '+': result:= result + temp;
- '-': result:= result - temp;
- '*': Begin
- result:= result * temp;
- Case mdl_opre of
- '+' : result:= result + mdl_result ;
- '-' : result:= -result + mdl_result ;
- End ;
- //清空中间结果和中间运算符
- mdl_result:= 0;
- mdl_opre:= ' ';
- End;
- '/': If temp = 0 Then
- Begin
- edt1.Text:= '除数不能为0' ;
- result:= result / temp;
- End
- Else
- Begin
- result:= result / temp;
- Case mdl_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.
复制代码
|
-
|