打印

小程序也纠结

[复制链接]
2231|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
天雨粟|  楼主 | 2010-8-31 22:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个PC下的小计算程序,读起来很吃力,也很有一些不可解之处.源程序见于一本VB的教程,我完全抄下来,只去掉了那些望文生义、无甚帮助价值的注释。请本坛的大侠帮忙看看.


资源如下:

1 标签:
name:Readout ;初始caption:0. 用于显示输入过程及计算结果
2 命令按钮:
0~9数字控件数组,Number(0)~Number(9),Caption属性相应
小数点按钮:Decimal
“+”
“-”
“X”
“/”
“=”
操作控件数组,Operater(0)~ Operater(4),Caption属性相应

3 其它命令按钮
       C
name=Cancel

       CE name=CancelEntry

全局变量
Dim Op1,Op2

被操作数,操作数

Dim DecimalFlag As Integer
小数点标志

Dim NumOps As Integer
统计操作数个数

Dim LastInput
上一次的键输入类型

Dim OpFlag
上一次的操作类型

Dim TempReadout

Private Sub Form_load()

DecimalFlag=False


NumOps=0


LastInput=”NONE”


OpFlag=””


Readout=Format(0,”0.”)

纠结,Readout是控件名,是否Readout.Caption=Format(0,”0.”)为妥?
已试,二者均可
End Sub


‘C按钮过程实际上是完全复位
Private Sub Cancel_Click()

Readout=Format(0,”0.”)


Op1=0


Op2=0


Form_Load

End Sub

‘CE按钮过程实际上是把标签上的数强制置为0
Private Sub CancelEntry_Click()

Readout=Format(0,”0.”)


DecimalFlag=False


LastInpt=”CE”

End Sub

如果上一个事件是按的“-”号键,例如想输入负数或进行减法,则本次事件屏
显“-0.;ElseIf语句成立的相关条件为:上一次事件输入了负号(减号)之外的其
它操作符或者系统处于复位状态(或未进行操作).这个与Windows下的那个计算
'器好像有点不同.
输入0.5等类型的数,可以输为.5,效果相同
连续不断地输入小数点,则仅取一个小数点.在后面,你连续输入操作符,则亦仅
取最后那个操作符为有效操作符
这种算法真亏作者想得到,佩服佩服,自愧弗如,望尘莫及!

Private Sub Decimal_Click()

If LastInput=”NEG” Then
按了“-”键后标记NEG


Readout=Format(0,”-0.”)


ElseIf LastInput<>”NUMS” Then

按了数字键或小数点键后标记为NUMS


Readout=Format(0,”0.”)


End If


DecimalFlag=True


LastInput=”NUMS”

End Sub
(待续)

相关帖子

沙发
天雨粟|  楼主 | 2010-8-31 22:48 | 只看该作者
‘如果是进行浮点运算,则把数顺次添加在小数点后面;如果是进行整数运算,则把
’数顺次添加到小数点前面.什么状态是浮点运算呢?自然是按下了小数点之后.
'什么状态是整数运算呢?一,初始状态默认如此,二,根据本事件最前面的那条语句
’在本次事件之前,按下了非数字键的其它键,比如加、减、乘、除、等于、复
’位、清除等,则系统要进入整数运算状态。其切换机制就是如此。难为了作者,
’想得真周到,非精于编程者,孰能至此而极!
Private Sub Number_Click(Index As Integer)
        If LastInput<>”NUMS” Then
                Readout=Format(0,”.”)               
’先清一下屏,且将”0.”变显为”.”,后见妙用.草蛇灰线,伏延千
’里之外,可称精巧,而用户却看不到这个变化
                DecimalFlag=False                               
End If
        If DecimalFlag Then
                Readout=Readout+Number(Index).Caption
        Else
                Readout=Left(Readout,InStr(Readout,Format(0,”.”))-1) _               
                                +Number(Index).Caption+Format(0,”.”)
        End If
        If LastInput=”NEG” Then Readout=”-“&Readout
LastInput=”NUMS”
End Sub

(待续)

使用特权

评论回复
板凳
天雨粟|  楼主 | 2010-8-31 22:49 | 只看该作者
‘加 减 乘 除 等于的按下的事件
Private Sub Operator_Click(Index As Integer)
TempReadout=Readout       
‘纠结一下,不保存,可不可以?备份值是赋给操作数的。根据机制,当
‘NumOps=2时,屏显的正是操作数,这时同样Op2=Readout不就可以了吗?
If LastInput=”NUMS” Then
        NumOps=NumOps+1
End If
        ‘如果上次按下是数字键,则操作数的个数+1.例如按了”3”,又按”+”,就会
        ‘执行上面的语句.由于程序的运行与LastInput相关,所以你狂输操作符
        ‘则亦只有最后输入的为有效,作者于编程,斯可为匠心独运也矣!
Select Case NumOps
Case 0
        If Operator(Index).Caption=”-“ And LastInput<>”NEG” Then
                Readout=”-“&Readout
                  LastInput=”NEG”
        End If
        ‘如果本次按的是负号(减号)而上次不是,则将屏显的数取相反数.Case 0
        ‘又是什么情况呢?1,初态,2,只按数字键或只按操作键,即按数字键再按”-“则
        ‘取相反数;按非负号的其它操作键再按”-“,则亦取相反数.连续多次按”-“,
‘则最先按的那个有效,没有负负得正的效果.
‘初始状态,按其它操作符,均属无效操作,只有按负号是除外
Case 1
        Op1=Readout       
‘先保存屏显,根据机制,这以后输数,屏幕会先显示”.”,所以
‘保存操作是很有必要的。看前面的讨论,由于TempReadout
‘与Readout是如影之随形的东西,同生同灭,备份保存的意义
‘又何在呢?
        If Operator(Index).Caption=”-“ And LastInput<>”NUMS” _
And OpFlag<>”=” Then
                Readout=”-“
                LastInput=”NEG”
        End If
        ‘依前面的讨论,”数字”然后”操作符”,满足Case 1,则LastInput怎么可能不是
        ‘数字呢?肯定是,何必判断呢?OpFlag保存着上一次的操作键的按键类型,于本
         ‘次的计算并不直接相关,为何仍要判断?这里,我不仅仅是纠结,而是直接崩
‘溃了,其妙用安在?安在哉?
Case 2                         ‘  ”数字”->”操作符”->”数字”,然后再”操作符”,执行至此
        Op2=TempReadout  ‘TempReadout与Readout恒相等,不知备份意义何在?
        Select Case Opflag        ‘先取用,后赋值,可见它是上一个操作键事件的操作类型
                Case “+”                                                        ‘勿须冒号,与C不同,注意
                        Op1=CDbl(Op1)+CDbl(Op2)               
‘用Op1在屏上显示.它是被操作数,而Op2是操作数.
‘作者编程,其思维精细而巧妙,非是寻常屐齿,可轻易造也.
                Case “-”       
                        Op1=CDbl(Op1)-CDbl(Op2)
                Case “X”       
                        Op1=CDbl(Op1)*CDbl(Op2)
                Case “/”       
                        If Op2=0 Then
                                MsgBox”除数不能为0”,48,”计算器”
                        Else
                                Op1=CDbl(Op1)/CDbl(Op2)
                        End If
                Case “=”       
                        Op1= CDbl(Op2)        ‘  “3”  “=”  “5”  “+”,结果为”5”,这就清楚了.
        End Select
Readout=Op1        ‘将被操作数送显,绾合矣
NumOps=1               
‘被操作数变为得数,对于连续运算,得数又变为被操作数,妙到颠
’毫,诗一样的清丽,圆融精巧,起承转合,荡荡莫名矣!
End Select
If LastInput<>”NEG” Then
        LastInput=”Ops”
        OpFlag=Operator(Index).Caption
End If
End Sub

(The End)

使用特权

评论回复
地板
new1988| | 2010-9-1 10:09 | 只看该作者
难道PC也属于单片机了?

使用特权

评论回复
5
天雨粟|  楼主 | 2010-9-1 20:01 | 只看该作者
有必要说明一下:去看单片机的书,有不少是附有VB源程序的
虽说是专学单片机,有时还非得对PC有点了解不可,例如上 下位机间通讯

语言可以不同,算法应无差异

期待大侠帮忙分析一下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

168

帖子

0

粉丝