计算器是一种在日常生活中很常用的计算工具,它在计算方面给了我们提供很大的方便。本程序的功能包括:(1)加,减,乘,除运算,正弦,余弦,正切,余切,反正切,反余切,反正弦,反余弦,自然对数,以10为底的对数还有阶乘等函数功能。(2)还包括存储清,存储显示,存储相加。
“计算器”是一个关于多种控件,以及控件数组应用的程序,它包含许对字符串的处理,多模块程序设计,数学函数的使用。它所需知识点较多,必须对各个方面都有所了解.
数学模型:主界面
界面:进制转化界面
数学函数代码
代码:存储清代码
进制转化代码
第一步,要编辑计算器界面,如右图
,对于界面上的按钮较多,我们可以分成四组,这就是控件数组的使用,而且每个按钮的属性都一一设置,而且要调入图片.第二个界面如右图比较简单,只是一些普通的控件.
计算器是一个输入原始数据,运算中间数据和结果数据都显示在窗口顶部的同一个文本框的工具,这就要求我们可以把文本框的内容付给两个不同的变量,对于这一点我们就可以用一个逻辑变量来实现.比如,Ifnotbooleanstr1=str
Elsestr2=str
计算器的主要功能就是运算,但是任何一个数值的输入都是以字符串的形式进行的,而字符串是无法参与运算的,所以必须用CInt()转换成整形变量,而输出时必须用CStr()转化成字符串的形式输出,更为麻烦的是,在进行进制转换时,两种变量之间的转换更为频繁。在编程过程中要时刻注意!就拿一个简单的程序中的一部分来说吧:
Ifnotbooleanthenstr=str1
Elsestr=str2
Str=te_t1.te_t
n=CInt(str)‘“将其转换成整形变量"
t4=str()‘“将返回值转换成字符串"
计算器的功能程序简单易懂,但编制过程极为烦琐,我在编程的过程中,体会最深的就是其过程有重复,但又不得再编,在这里尤其要注意,有些过程虽然相似,但它们却存在着质的区别,就拿删除按扭来说吧,
"C","0->M","CE","->"按扭都有删除的功能,在这里我就它们的区别作一下详细介绍:
将"C","CE","->"作为一个控件数组,其程序如下:
Ifnotbooleanstr1=strelsestr2=str
SelectCaseInde_
Case0
str1="",str2="",Te_t1.te_t="""C"键
Case1
str="""CE"键
Case2
str=Left(str,len(str)-1)"->"键
而"0->M"在另一个数组控件中,其程序的一部分如下:
Case0
n4=0:Te_t1.te_t="0"
可见它们的代码是存在区别的,这就要求在编程时弄清楚它们的区别,不可想当然把同一种代码复制过来.
这里我再介绍一下小数点的使用
PrivateSubCommand2_Click(Inde_AsInteger)
IfInde_<10Then
str=str+CStr(Inde_)"输入数字"
Else
IfInStr(str,".")=0Thenstr=str+".""输入小数点"
EndIf
IfLen(str)>1AndLeft(str,1)="0"AndMid(str,2,1)<>"."Then
str=Right(str,Len(str)-1)"删除前面多余的0"
EndIf
Te_t1.te_t=str"显示输入的数据"
IfnotbooleanThenstr1=strElsestr2=str"用两个字符串变量存放"EndSub
计算器虽复杂,但大部分还是比较简单的,最难的地方就是进制转换器的编码了,要编好这一部分必须对各进制之间的转换关系了如指掌.其中各个进制都和二进制有着直接的转换关系.而其他三个之间都不可直接进行转换.对于不能直接转化的,可以间接转化,例如,可以将十六进制先转化成十进制然后再转化成八进制.
ElseIfOption4=TrueThen
t4=""
str=Te_t1.Te_t
DimpAsInteger,qAsLong
DoWhilestr<>""‘把输入的字母先转化为对应的数
t=Right(str,1)
Ift="a"Then
n=10
ElseIft="b"Then
n=11
ElseIft="c"Then
n=12
ElseIft="d"Then
n=13
ElseIft="e"Then
n=14
ElseIft="f"Then
n=15
Else:n=CInt(t)
EndIf
q=q+n16^(p)
str=Left(str,Len(str)-1)’从后逐步取出每个字符
p=p+1’指数从后依次加一
Loop
m=q’十六进制转成了十进制
DoWhilem<>0
Form1=1To3
n=mMod2
m=m2
int1=n2^(m1-1)十进制再转化为八进制
int2=int2+int1
Ne_t
t3=CStr(int2)
t4=t3+t4
t3=""
int1=0
int2=0
Loop
Te_t2.Te_t=t4
PrivateSubTe_t1_Change()
str=Te_t1.Te_t
t=Right(str,1)
Ift<>""Then
n=Asc(s)找出所输入数字的ASCII码
Else:E_itSub
EndIf
IfOption1=TrueThen
Ifn<48Orn>49Then与符合要求的比较,排除符合的
MsgBo_"输入的数据不符和进制要求,请重新输入.数据输入
Te_t1.Te_t=Left(str,Len(str)-1)删除最后一位
EndIf
ElseIfOption2=TrueThen
Ifn<48Orn>55Then
MsgBo_"输入的数据不符和进制要求,请重新输入.数据输入
Te_t1.Te_t=Left(str,Len(str)-1)
EndIf
ElseIfOption3=TrueThen
Ifn<48Orn>57Then
MsgBo_"输入的数据不符和进制要求,请重新输入.数据输入
Te_t1.Te_t=Left(str,Len(str)-1)
EndIf
ElseIfOption4=TrueThen
Ifn<48Or(n>57Andn<97)Orn>102Then
MsgBo_"输入的数据不符和进制要求,请重新输入.数据输入
Te_t1.Te_t=Left(str,Len(str)-1)
EndIf
EndIf
EndSub
通过此次编程,我知道了它的难处,我在参考了前人的基础上加以摸索,并对前人的不足加以改善,但是并没有做到十分完美,还是有一些不足之处,这也是将来要努力的地方。
OptionE_plicit'强制申明变量
Dimstr,str1,str2,str3,str4AsString
Dim_1,_2,_3,_4,pAsDouble
Dimj,k,_,int1AsLong
DimwAsBoolean
PrivateSubTe_t1_Change()'调节输入的内容和输出的结果
EndSub
PrivateSubCommand2_Click(Inde_AsInteger)'函数转换
IfNotwThenstr=str1Elsestr=str2
str=Te_t1.Te_t
Case0'sin函数
str=CStr(Sin(_))
Case1
str=CStr(Cos(_))'cos函数
Case2
str=CStr(Tan(_))'tan函数
Case3
str=CStr(1/Tan(_))'ctg函数
Case4
str=CStr(1/Cos(_))'sec函数
Case5
Forj=1To_'阶乘运算
k=jk
Ne_t
str=CStr(k)
Case6
p=3.5358'边界限定
If_>1Or_<-1Then
MsgBo_"数据超出反正弦的数值范围,请重新输入",0,"出错提醒"ElseIf_=1Then
str=CStr(p/2)
ElseIf_=-1Then'限定反三角的范围
str=CStr(-p/2)
Else
str=CStr(Atn(_/Sqr(1-__)))
EndIf
Case7
p=3.5358'边界限定
If_>1Or_<-1Then
MsgBo_"数据超出反余弦的数值范围,请重新输入",0,"出错提醒"ElseIf_=1Then
str=CStr(0)
ElseIf_=-1Then
str=CStr(p)
Else
str=CStr(Atn(-_/Sqr(1-__)))+2Atn(1)
EndIf
Case8
str=CStr(Atn(_))
Case9
str=(Atn(_)+2Atn(1))
Case10
If_<=0Then
MsgBo_"请重新输入一个正数",0,"出错提醒"'Log函数Else
str=CStr(Log(_)/Log(10))
EndIf
Case11
If_<=0Then
MsgBo_"请重新输入一个正数",0,"出错提醒"
Else'Ln函数str=CStr(Log(_))
EndIf
EndSelect
Te_t1.Te_t=str
str1=str
str=""
EndSub
PrivateSubCommand3_Click(Inde_AsInteger)'关于小数点的使用Te_t1.Te_t=""'"输入数字"
IfInde_<10Then
str=str+CStr(Inde_)
Else
IfInStr(str,".")=0Thenstr=str+"."'"输入小数点"EndIf
IfLen(str)>1AndLeft(str,1)="0"AndMid(str,2,1)<>"."Thenstr=Right(str,Len(str)-1)'"删除前面多余的0"
EndIf
Te_t1.Te_t=str
IfNotwThenstr1=strElsestr2=str
EndSub
PrivateSubCommand4_Click(Inde_AsInteger)
Ifstr2<>""Then
str=""
Else
str2="":Te_t1.Te_t="":w=True:int1=Inde_
str=""
EndIf
EndSub
PrivateSubCommand5_Click(Inde_AsInteger)
SelectCaseInde_'“M+”按钮
Case0
_4=0:Te_t1.Te_t="0"'“0->M”按钮
Case1
Te_t1.Te_t=CStr(_4)'“RM”按钮
Case2
_4=_4+Val(Te_t1.Te_t)
Te_t1.Te_t="0"
EndSelect
str=""
EndSub
PrivateSubCommand6_Click()
str=Te_t1.Te_t
IfLen(str)>0AndLeft(str,1)="-"Then'负号的使用str=Right(str,Len(str)-1)
Else
str="-"str
EndIf
Te_t1.Te_t=str
IfNotwThenstr=str1Elsestr=str2
str=""
EndSub
PrivateSubCommand8_Click()'“C”按钮
Te_t1.Te_t="0":str1="":w=False
str2=""
EndSub
PrivateSubCommand9_Click()'“CE"按钮
Te_t1.Te_t=str1:str2=""
EndSub
PrivateSubCommand1_Click()'OFF按钮
Unloadfrmcal
EndSub
PrivateSubCommand10_Click()'->按钮
str3=Te_t1.Te_t
str3=Left(str3,Len(str3)-1)
Ifstr3=""Then
Te_t1.Te_t="0"
Else
Te_t1.Te_t=str3
EndIf
str=str3
EndSub
PrivateSubCommand11_Click()'=按钮
IfLen(Trim(str1))=0OrLen(Trim(str2))=0Thenw=False
E_itSub
EndIf
_1=Val(str1):_2=Val(str2)
SelectCaseint1
Case0
If_2=0Then
MsgBo_"除数不能为0!",16,"计算器"
E_itSub'防止除数为零
EndIf
_3=_1/_2
Case1
_3=_1_2
Case2
_3=_1+_2
Case3
_3=_1-_2
EndSelect
Te_t1.Te_t=CStr(_3)
str1=Te_t1.Te_t
str2=""
str=""
w=False
EndSub
PrivateSubCommand12_Click()'显示进制转换窗口
formjdzh.Show
EndSub
进制转化窗体
OptionE_plicit
Dimstr,t,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11AsStringDimn,n1,n2,n3,m,m1,m2,int1,int2,int3AsLong
PrivateSubCommand1_Click()'转换成二进制
str=Te_t1.Te_t
IfOption1=TrueThen'输入二进制数Te_t2.Te_t=Te_t1.Te_t'结果不变
ElseIfOption2=TrueThen'八进制转换成二进制t4=""
DoWhilestr<>""
t=Right(str,1)
n=CInt(t)
Form=1To3
t2=CStr(nMod2)
n=n2
t3=t2+t3
Ne_t
t4=t3+t4
str=Left(str,Len(str)-1)
t3=""
Loop
IfLeft(t4,1)="0"AndLeft(t4,2)<>"00"Thent4=Right(t4,Len(t4)-1)
ElseIfLeft(t4,2)="00"AndLeft(t4,3)<>"000"Thent4=Right(t4,Len(t4)-2)
EndIf
Te_t2.Te_t=t4
ElseIfOption3=TrueThen'
t2=""
m=CInt(str)
DoWhilem<>0
n=mMod2
m=m2
t1=CStr(n)
t2=t1+t2
Loop
Te_t2.Te_t=t2
ElseIfOption4=TrueThen'
t4=""
str=Te_t1.Te_t
DoWhilestr<>""
t=Right(str,1)
Ift="a"Then
n=10
ElseIft="b"Then
n=11
ElseIft="c"Then
n=12
ElseIft="d"Then
n=13
ElseIft="e"Then
n=14
ElseIft="f"Then
n=15
Else:n=CInt(t)
EndIf
Form=1To4
t2=CStr(nMod2)
n=n2
t3=t2+t3十进制转换成二进制十六进制转换成二进制
Ne_t
t4=t3+t4
str=Left(str,Len(str)-1)
t3=""
Loop
IfLeft(t4,1)="0"AndLeft(t4,2)<>"00"Then
t4=Right(t4,Len(t4)-1)
ElseIfLeft(t4,2)="00"AndLeft(t4,3)<>"000"Then
t4=Right(t4,Len(t4)-2)
ElseIfLeft(t4,3)="000"AndLeft(t4,4)<>"0000"Then
t4=Right(t4,Len(t4)-3)
EndIf
Te_t2.Te_t=t4
EndIf
EndSub
PrivateSubCommand2_Click()'转换成八进制
str=Te_t1.Te_t
IfOption1=TrueThen'二进制转换成八进制t4=""
DoWhilestr<>""
IfLen(str)=1Then
str="00"+str
ElseIfLen(str)=2Then
str="0"+str
EndIf
t=Right(str,3)
Form=1To3
t2=Right(t,1)
n=CInt(t2)
int1=n2^(m-1)
int2=int2+int1
t2=""
t=Left(t,Len(t)-1)
Ne_t
t3=CStr(int2)
t4=t3+t4
str=Left(str,Len(str)-3)
t3=""
int1=0
int2=0
Loop
Te_t2.Te_t=t4
ElseIfOption2=TrueThen'八进制转换成八进制,结果不变Te_t2.Te_t=Te_t1.Te_t
ElseIfOption3=TrueThen'十进制转换成八进制t4=""
m=CInt(str)
DoWhilem<>0
Form1=1To3
n=mMod2
m=m2
int1=n2^(m1-1)
int2=int2+int1
Ne_t
t3=CStr(int2)
t4=t3+t4
t3=""
int1=0
int2=0
Loop
Te_t2.Te_t=t4
ElseIfOption4=TrueThen'
t4=""
str=Te_t1.Te_t
DimpAsInteger,qAsLong
DoWhilestr<>""
t=Right(str,1)
Ift="a"Then
n=10
ElseIft="b"Then
n=11
ElseIft="c"Then
n=12
ElseIft="d"Then
n=13
ElseIft="e"Then
n=14
ElseIft="f"Then
n=15
Else:n=CInt(t)
EndIf
q=q+n16^(p)
str=Left(str,Len(str)-1)
p=p+1
Loop
DoWhilem<>0十六进制转换成八进制
Form1=1To3
n=mMod2
m=m2
int1=n2^(m1-1)
int2=int2+int1
Ne_t
t3=CStr(int2)
t4=t3+t4
t3=""
int1=0
int2=0
Loop
Te_t2.Te_t=t4
EndIf
EndSub
PrivateSubCommand3_Click()'
str=Te_t1.Te_t
Te_t2.Te_t=""
IfOption1=TrueThen't4=""
DoWhilestr<>""
t=Right(str,1)
m=CInt(t)
n=m2^(int1)
int1=int1+1
int2=int2+n
str=Left(str,Len(str)-1)
Loop
t4=CStr(int2)
Te_t2.Te_t=t4
int2=0
int1=0
ElseIfOption2=TrueThen't4=""
DoWhilestr<>""
t=Right(str,1)
n=CInt(t)
Form=1To3
m1=nMod2
n=n2
int1=m12^n2
int2=int2+int1
n2=n2+1
Ne_t转换成十进制二进制转换成十进制八进制转换成十进制
int3=int2+int3
int2=0
int1=0
t4=CStr(int3)
str=Left(str,Len(str)-1)Loop
Te_t2.Te_t=t4
n2=0
int3=0
ElseIfOption3=TrueThen'Te_t2.Te_t=Te_t1.Te_t
ElseIfOption4=TrueThen'int2=0
DimsAsInteger
DoWhilestr<>""
t=Right(str,1)
Ift="a"Then
n=10
ElseIft="b"Then
n=11
ElseIft="c"Then
n=12
ElseIft="d"Then
n=13
ElseIft="e"Then
n=14
ElseIft="f"Then
n=15
Else:n=CInt(t)
EndIf
int2=int2+n16^(s)
str=Left(str,Len(str)-1)s=s+1
Loop
Te_t2.Te_t=int2
n2=0
int3=0
EndIf
EndSub
PrivateSubCommand4_Click()'str=Te_t1.Te_t
Te_t2.Te_t=""
IfOption1=TrueThen'十进制转换成十进制,结果不变十六进制转换成十进制转换成十六进制二进制转换成十六进制
t4=""
DoWhilestr<>""
IfLen(str)=2Then
str="00"+str
ElseIfLen(str)=3Then
str="0"+str
ElseIfLen(str)=1Then
str="000"+str
EndIf
t=Right(str,4)
Form=1To4
t2=Right(t,1)
n=CInt(t2)
int1=n2^(m-1)int2=int2+int1
t2=""
t=Left(t,Len(t)-1)Ne_t
Ifint2=10Then
t3="a"
ElseIfint2=11Then
t3="b"
ElseIfint2=12Then
t3="c"
ElseIfint2=13Then
t3="d"
ElseIfint2=14Then
t3="e"
ElseIfint2=15Then
t3="f"
Else
t3=CStr(int2)
EndIf
t4=t3+t4
int1=0
int2=0
t3=""
str=Left(str,Len(str)-4)t=""
Loop
Te_t2.Te_t=t4
ElseIfOption3=TrueThen'n=CInt(str)
t7=""十进制转换成十六进制
DoWhilen<>0
Form=1To4
m1=nMod2
n=n2
int1=m12^(m-1)
int2=int2+int1
Ne_t
Ifint2=10Then
t6="a"
ElseIfint2=11Then
t6="b"
ElseIfint2=12Then
t6="c"
ElseIfint2=13Then
t6="d"
ElseIfint2=14Then
t6="e"
ElseIfint2=15Then
t6="f"
Else:t6=CStr(int2)
EndIf
t7=t6+t7
t6=""
int1=0
int2=0
str=Left(str,Len(str)-1)
Loop
Te_t2.Te_t=t7
ElseIfOption2=TrueThen'八进制转换成十六进制t7=""
t4=""
DoWhilestr<>""
t=Right(str,1)
n=CInt(t)
Form=1To3
t2=CStr(nMod2)
n=n2
t3=t2+t3
Ne_t
t4=t3+t4
str=Left(str,Len(str)-1)
t3=""
Loop
IfLeft(t4,1)="0"AndLeft(t4,2)<>"00"Then
t4=Right(t4,Len(t4)-1)
ElseIfLeft(t4,2)="00"AndLeft(t4,3)<>"000"Thent4=Right(t4,Len(t4)-2)
EndIf
DoWhilet4<>""
IfLen(t4)=2Then
t4="00"+t4
ElseIfLen(t4)=3Then
t4="0"+t4
ElseIfLen(t4)=1Then
t4="000"+t4
EndIf
t1=Right(t4,4)
Form=1To4
t5=Right(t1,1)
n1=CInt(t5)
int1=n12^(m-1)
int2=int2+int1
t5=""
t1=Left(t1,Len(t1)-1)
Ne_t
Ifint2=10Then
t6="a"
ElseIfint2=11Then
t6="b"
ElseIfint2=12Then
t6="c"
ElseIfint2=13Then
t6="d"
ElseIfint2=14Then
t6="e"
ElseIfint2=15Then
t6="f"
Else
t6=CStr(int2)
EndIf
t7=t6+t7
int1=0
int2=0
t4=Left(t4,Len(t4)-4)
t1=""
Loop
Te_t2.Te_t=t7
ElseIfOption4=TrueThen'十六进制转换成十六进制结果不变
Te_t2.Te_t=Te_t1.Te_t
EndIf
EndSub
PrivateSubTe_t1_Change()
str=Te_t1.Te_t
t=Right(str,1)
Ift<>""Then
n=Asc(t)
Else:E_itSub
EndIf
IfOption1=TrueThen'输入二进制数
Ifn<48Orn>49Then'输入的数不是0或1时,报错
MsgBo_"输入的数据不符合所选择的进制要求,请重新输入",16,"数据输入"Te_t1.Te_t=Left(str,Len(str)-1)
EndIf
ElseIfOption2=TrueThen'输入八进制数
Ifn<48Orn>55Then'不在0-7之间时
MsgBo_"输入的数据不符合所选择的进制要求,请重新输入",16,"数据输入"Te_t1.Te_t=Left(str,Len(str)-1)
EndIf
ElseIfOption3=TrueThen'输入十进制数
Ifn<48Orn>57Then'不在0-9之间时
MsgBo_"输入的数据不符合所选择的进制要求,请重新输入",16,"数据输入"Te_t1.Te_t=Left(str,Len(str)-1)
EndIf
ElseIfOption4=TrueThen'输入十六进制数
Ifn<48Or(n>57Andn<97)Orn>102Then'不在0-9或不在a-f之间时
MsgBo_"输入的数据不符合所选择的进制要求,请重新输入",16,"数据输入"Te_t1.Te_t=Left(str,Len(str)-1)
EndIf
EndIf
EndSub
PrivateFunctionse(aAsString)AsString
DimsAsString,dAsDouble,fAsString,qAsString
d=Val(a)
f=fdMod2
d=d2
LoopUntild=0
Ford=Len(f)To1Step-1
q=Mid(f,d,1)
s=sq
Ne_t
se=s
EndFunction
PrivateFunctionbe(strAsString)AsString
t4=""
DoWhilestr<>""
t=Right(str,1)
n=CInt(s)
Form=1To3
t2=CStr(nMod2)
n=n2
t3=t2+t3
Ne_t
t4=t3+t4
str=Left(str,Len(str)-1)
t3=""
Loop
IfLeft(t4,1)="0"AndLeft(t4,2)<>"00"Thent4=Right(t4,Len(t4)-1)
ElseIfLeft(s4,2)="00"AndLeft(t4,3)<>"000"Thent4=Right(t4,Len(t4)-2)
EndIf
be=t4
EndFunction
PrivateFunctioni(aAsString)AsString
t2=""
m=CInt(str)
DoWhilem<>0
n=mMod2
m=m2
t1=CStr(n)
t2=t1+t2
Loop
Te_t2.Te_t=t2
EndFunction
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- niushuan.com 版权所有 赣ICP备2024042780号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务