风神翼龙 发表于 2019-5-30 16:58:01

学了零基础入门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.

张子川 发表于 2020-10-24 11:50:49

牛皮大佬
页: [1]
查看完整版本: 学了零基础入门delphi7的前四节课编写的一个计算器,比小甲鱼课堂展示的效果好