my计算器程序设计报告.docx
《my计算器程序设计报告.docx》由会员分享,可在线阅读,更多相关《my计算器程序设计报告.docx(31页珍藏版)》请在冰点文库上搜索。
![my计算器程序设计报告.docx](https://file1.bingdoc.com/fileroot1/2023-7/21/2f67c0fb-41f7-4ae1-a580-42703e17e5f6/2f67c0fb-41f7-4ae1-a580-42703e17e5f61.gif)
my计算器程序设计报告
计算器程序设计报告
计算器是一种在日常生活中很常用的计算工具,它在计算方面给了我们提供很大的方便。
本程序的功能包括:
(1)加,减,乘,除运算,正弦,余弦,正切,余切,反正切,反余切,反正弦,反余弦,自然对数,以10为底的对数还有阶乘等函数功能。
(2)还包括存储清,存储显示,存储相加。
“计算器”是一个关于多种控件,以及控件数组应用的程序,它包含许对字符串的处理,多模块程序设计,数学函数的使用。
它所需知识点较多,必须对各个方面都有所了解.
数学模型:
主界面
界面:
进制转化界面
数学函数代码
代码:
存储清代码
进制转化代码
第一步,要编辑计算器界面,如右图
,对于界面上的按钮较多,我们可以分成四组,这就是控件数组的使用,而且每个按钮的属性都一一设置,而且要调入图片.第二个界面如右图
比较简单,只是一些普通的控件.
计算器是一个输入原始数据,运算中间数据和结果数据都显示在窗口顶部的同一个文本框的工具,这就要求我们可以把文本框的内容付给两个不同的变量,对于这一点我们就可以用一个逻辑变量来实现.比如,Ifnotbooleanstr1=str
Elsestr2=str
计算器的主要功能就是运算,但是任何一个数值的输入都是以字符串的形式进行的,而字符串是无法参与运算的,所以必须用CInt()转换成整形变量,而输出时必须用CStr()转化成字符串的形式输出,更为麻烦的是,在进行进制转换时,两种变量之间的转换更为频繁。
在编程过程中要时刻注意!
就拿一个简单的程序中的一部分来说吧:
Ifnotbooleanthenstr=str1
Elsestr=str2
Str=text1.text
n=CInt(str)‘“将其转换成整形变量"
…….
t4=str()‘“将返回值转换成字符串"
计算器的功能程序简单易懂,但编制过程极为烦琐,我在编程的过程中,体会最深的就是其过程有重复,但又不得再编,在这里尤其要注意,有些过程虽然相似,但它们却存在着质的区别,就拿删除按扭来说吧,
"C","0->M","CE","->"按扭都有删除的功能,在这里我就它们的区别作一下详细介绍:
将"C","CE","->"作为一个控件数组,其程序如下:
Ifnotbooleanstr1=strelsestr2=str
SelectCaseIndex
Case0
str1="",str2="",Text1.text="""C"键
Case1
str="""CE"键
Case2
str=Left(str,len(str)-1)"->"键
而"0->M"在另一个数组控件中,其程序的一部分如下:
Case0
n4=0:
Text1.text="0"
可见它们的代码是存在区别的,这就要求在编程时弄清楚它们的区别,不可想当然把同一种代码复制过来.
这里我再介绍一下小数点的使用
PrivateSubCommand2_Click(IndexAsInteger)
IfIndex<10Then
str=str+CStr(Index)"输入数字"
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
Text1.text=str"显示输入的数据"
IfnotbooleanThenstr1=strElsestr2=str"用两个字符串变量存放"
EndSub
计算器虽复杂,但大部分还是比较简单的,最难的地方就是进制转换器的编码了,要编好这一部分必须对各进制之间的转换关系了如指掌.其中各个进制都和二进制有着直接的转换关系.而其他三个之间都不可直接进行转换.对于不能直接转化的,可以间接转化,例如,可以将十六进制先转化成十进制然后再转化成八进制.
ElseIfOption4=TrueThen
t4=""
str=Text1.Text
DimpAsInteger,qAsLong
q=0
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+n*16^(p)
str=Left(str,Len(str)-1)’从后逐步取出每个字符
p=p+1’指数从后依次加一
Loop
m=q’十六进制转成了十进制
DoWhilem<>0
Form1=1To3
n=mMod2
m=m\2
int1=n*2^(m1-1)十进制再转化为八进制
int2=int2+int1
Next
t3=CStr(int2)
t4=t3+t4
t3=""
int1=0
int2=0
Loop
Text2.Text=t4
以下是用来判断输入的字符是否符合所选择进制的要求的,如果不符和就会出现一个对话框同时删除所输入的字符。
PrivateSubText1_Change()
str=Text1.Text
t=Right(str,1)
Ift<>""Then
n=Asc(s)找出所输入数字的ASCII码
Else:
ExitSub
EndIf
IfOption1=TrueThen
Ifn<48Orn>49Then与符合要求的比较,排除符合的
MsgBox"输入的数据不符和进制要求,请重新输入.",16,"数据输入"
Text1.Text=Left(str,Len(str)-1)删除最后一位
EndIf
ElseIfOption2=TrueThen
Ifn<48Orn>55Then
MsgBox"输入的数据不符和进制要求,请重新输入.",16,"数据输入"
Text1.Text=Left(str,Len(str)-1)
EndIf
ElseIfOption3=TrueThen
Ifn<48Orn>57Then
MsgBox"输入的数据不符和进制要求,请重新输入.",16,"数据输入"
Text1.Text=Left(str,Len(str)-1)
EndIf
ElseIfOption4=TrueThen
Ifn<48Or(n>57Andn<97)Orn>102Then
MsgBox"输入的数据不符和进制要求,请重新输入.",16,"数据输入"
Text1.Text=Left(str,Len(str)-1)
EndIf
EndIf
EndSub
通过此次编程,我知道了它的难处,我在参考了前人的基础上加以摸索,并对前人的不足加以改善,但是并没有做到十分完美,还是有一些不足之处,这也是将来要努力的地方。
以下是代码
主窗体
OptionExplicit'强制申明变量
Dimstr,str1,str2,str3,str4AsString
Dimx1,x2,x3,x4,pAsDouble
Dimj,k,x,int1AsLong
DimwAsBoolean
PrivateSubText1_Change()'调节输入的内容和输出的结果
EndSub
PrivateSubCommand2_Click(IndexAsInteger)'函数转换
IfNotwThenstr=str1Elsestr=str2
str=Text1.Text
x=str
SelectCaseIndex
Case0'sin函数
str=CStr(Sin(x))
Case1
str=CStr(Cos(x))'cos函数
Case2
str=CStr(Tan(x))'tan函数
Case3
str=CStr(1/Tan(x))'ctg函数
Case4
str=CStr(1/Cos(x))'sec函数
Case5
k=1
Forj=1Tox'阶乘运算
k=j*k
Next
str=CStr(k)
Case6
p=3.1415926535898'边界限定
Ifx>1Orx<-1Then
MsgBox"数据超出反正弦的数值范围,请重新输入",0,"出错提醒"
ElseIfx=1Then
str=CStr(p/2)
ElseIfx=-1Then'限定反三角的范围
str=CStr(-p/2)
Else
str=CStr(Atn(x/Sqr(1-x*x)))
EndIf
Case7
p=3.1415926535898'边界限定
Ifx>1Orx<-1Then
MsgBox"数据超出反余弦的数值范围,请重新输入",0,"出错提醒"
ElseIfx=1Then
str=CStr(0)
ElseIfx=-1Then
str=CStr(p)
Else
str=CStr(Atn(-x/Sqr(1-x*x)))+2*Atn
(1)
EndIf
Case8
str=CStr(Atn(x))
Case9
str=(Atn(x)+2*Atn
(1))
Case10
Ifx<=0Then
MsgBox"请重新输入一个正数",0,"出错提醒"'Log函数
Else
str=CStr(Log(x)/Log(10))
EndIf
Case11
Ifx<=0Then
MsgBox"请重新输入一个正数",0,"出错提醒"
Else'Ln函数
str=CStr(Log(x))
EndIf
EndSelect
Text1.Text=str
str1=str
str=""
EndSub
PrivateSubCommand3_Click(IndexAsInteger)'关于小数点的使用
Text1.Text=""'"输入数字"
IfIndex<10Then
str=str+CStr(Index)
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
Text1.Text=str
IfNotwThenstr1=strElsestr2=str
EndSub
PrivateSubCommand4_Click(IndexAsInteger)
Ifstr2<>""Then
x1=Val(str1):
x2=Val(str2)
SelectCaseint1
Case0
Ifx2=0Then
MsgBox"除数不能为0!
",16,"计算器"
ExitSub
EndIf
x3=x1/x2
Case1
x3=x1*x2
Case2
x3=x1+x2'加减乘除运算
Case3
x3=x1-x2
EndSelect
str1=CStr(x3)
str2="":
Text1.Text="":
w=True:
int1=Index
str=""
Else
str2="":
Text1.Text="":
w=True:
int1=Index
str=""
EndIf
EndSub
PrivateSubCommand5_Click(IndexAsInteger)
SelectCaseIndex'“M+”按钮
Case0
x4=0:
Text1.Text="0"'“0->M”按钮
Case1
Text1.Text=CStr(x4)'“RM”按钮
Case2
x4=x4+Val(Text1.Text)
Text1.Text="0"
EndSelect
str=""
EndSub
PrivateSubCommand6_Click()
str=Text1.Text
IfLen(str)>0AndLeft(str,1)="-"Then'负号的使用
str=Right(str,Len(str)-1)
Else
str="-"&str
EndIf
Text1.Text=str
IfNotwThenstr=str1Elsestr=str2
str=""
EndSub
PrivateSubCommand8_Click()'“C”按钮
Text1.Text="0":
str1="":
w=False
str2=""
EndSub
PrivateSubCommand9_Click()'“CE"按钮
Text1.Text=str1:
str2=""
EndSub
PrivateSubCommand1_Click()'OFF按钮
Unloadfrmcal
EndSub
PrivateSubCommand10_Click()'->按钮
str3=Text1.Text
str3=Left(str3,Len(str3)-1)
Ifstr3=""Then
Text1.Text="0"
Else
Text1.Text=str3
EndIf
str=str3
EndSub
PrivateSubCommand11_Click()'=按钮
IfLen(Trim(str1))=0OrLen(Trim(str2))=0Then
w=False
ExitSub
EndIf
x1=Val(str1):
x2=Val(str2)
SelectCaseint1
Case0
Ifx2=0Then
MsgBox"除数不能为0!
",16,"计算器"
ExitSub'防止除数为零
EndIf
x3=x1/x2
Case1
x3=x1*x2
Case2
x3=x1+x2
Case3
x3=x1-x2
EndSelect
Text1.Text=CStr(x3)
str1=Text1.Text
str2=""
str=""
w=False
EndSub
PrivateSubCommand12_Click()'显示进制转换窗口
formjdzh.Show
EndSub
进制转化窗体
OptionExplicit
Dimstr,t,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11AsString
Dimn,n1,n2,n3,m,m1,m2,int1,int2,int3AsLong
PrivateSubCommand1_Click()'转换成二进制
str=Text1.Text
IfOption1=TrueThen'输入二进制数
Text2.Text=Text1.Text'结果不变
ElseIfOption2=TrueThen'八进制转换成二进制
t4=""
DoWhilestr<>""
t=Right(str,1)
n=CInt(t)
Form=1To3
t2=CStr(nMod2)
n=n\2
t3=t2+t3
Next
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)
EndIf
Text2.Text=t4
ElseIfOption3=TrueThen'十进制转换成二进制
t2=""
m=CInt(str)
DoWhilem<>0
n=mMod2
m=m\2
t1=CStr(n)
t2=t1+t2
Loop
Text2.Text=t2
ElseIfOption4=TrueThen'十六进制转换成二进制
t4=""
str=Text1.Text
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=n\2
t3=t2+t3
Next
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
Text2.Text=t4
EndIf
EndSub
PrivateSubCommand2_Click()'转换成八进制
str=Text1.Text
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=n*2^(m-1)
int2=int2+int1
t2=""
t=Left(t,Len(t)-1)
Next
t3=CStr(int2)
t4=t3+t4
str=Left(str,Len(str)-3)
t3=""
int1=0
int2=0
Loop
Text2.Text=t4
ElseIfOption2=TrueThen'八进制转换成八进制,结果不变
Text2.Text=Text1.Text
ElseIfOption3=TrueThen'十进制转换成八进制
t4=""
m=CInt(str)
DoWhilem<>0
Form1=1To3
n=mMod2
m=m\2
int1=n*2^(m1-1)
int2=int2+int1
Next
t3=CStr(int2)
t4=t3+t4
t3=""
int1=0
int2=0
Loop
Text2.Text=t4
ElseIfOption4=TrueThen'十六进制转换成八进制
t4=""
str=Text1.Text
DimpAsInteger,qAsLong
q=0
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+n*16^(p)
str=Left(str,Len(str)-1)
p=p+1
Loop
m=q
Do