1、c+课程设计作业学号:201205527姓名:刘新雯学院:数理学院专业:统计学一、设计名称:计算器二、基本功能:本课程设计是在基于对话框的应用程序中模拟一个计算器,本计算器可以进行十进制下的四则运算(加、减、乘、除)和四则混合运算,可以把十进制转化为二进制或十六进制,可以进行一些常用的函数运算(比如sin、cos、tan、cot、sqrt、ln等),还可以支持带“(”,“)”符号的表达式的计算。三、程序运行结果分析(1)在运行程序后,系统会弹出一个基于对话框的计算器界面,如下图所示: (2)在计算器程序中,主要通过一个编辑框来获取表达式和显示计算结果,表达式可以通过键盘和单击按钮2种方式输入,
2、输入后的结果如下图所示: (3)在输入完表达式后,单击“=”后,开始对表达式进行计算,计算完成后,在编辑框中显示计算的结果。 (4)计算器可以实现十进制转化为十六进制或二进制,其实现的操作为先输入一个十进制整数,再单击按钮“转化为二进制”或“转化为十六进制。 (4)另外,计算器还可以实现一些简单的函数运算,实现的操作和十六进制/二进制转化类似,是先输入一个数字,在单击想要进行的函数的按钮,单击后就会在编辑框中显示运算的结果。 四、程序代码void CMyDlg:OnNo0() UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult if(Operator
3、Pressed=true|Restarted=true)/在按下了=,AC,sqrt,tan,sin等按忸时, m_strResult=0; /变量m_strResult的值为按下的按忸0 else /在按下数字键的情况下,则在m_strResult后加0 m_strResult+=0; OperatorPressed=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE); /把字符串变量m_strResult传给编辑框void CMyDlg:OnNo1() UpdateData
4、(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed=true|Restarted=true)/在按下了=,AC,sqrt,tan,sin等按忸时, m_strResult=1; /变量m_strResult的值为按下的按忸1 else /在按下数字键的情况下,则在m_strResult后加1 m_strResult+=1; OperatorPressed=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE); /把字符
5、串变量m_strResult传给编辑框void CMyDlg:OnNo2() UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed=true|Restarted=true)/在按下了=,AC,sqrt,tan,sin等按忸时, m_strResult=2; /变量m_strResult的值为按下的按忸2 else /在按下数字键的情况下,则在m_strResult后加2 m_strResult+=2; OperatorPressed=false; /把bool变量OperatorPressed和Restarted的
6、值改为false Restarted=false; UpdateData(FALSE); /把字符串变量m_strResult传给编辑框void CMyDlg:OnNo3() UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed=true|Restarted=true)/在按下了=,AC,sqrt,tan,sin等按忸时, m_strResult=3; /变量m_strResult的值为按下的按忸3 else /在按下数字键的情况下,则在m_strResult后加3 m_strResult+=3; Operator
7、Pressed=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE); /把字符串变量m_strResult传给编辑框void CMyDlg:OnNo4() UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed=true|Restarted=true)/在按下了=,AC,sqrt,tan,sin等按忸时, m_strResult=4; /变量m_strResult的值为按下的按忸4 else /在按下
8、数字键的情况下,则在m_strResult后加4 m_strResult+=4; OperatorPressed=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE); /把字符串变量m_strResult传给编辑框void CMyDlg:OnNo5() UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed=true|Restarted=true)/在按下了=,AC,sqrt,tan,sin等按忸时,
9、 m_strResult=5; /变量m_strResult的值为按下的按忸5 else /在按下数字键的情况下,则在m_strResult后加5 m_strResult+=5; OperatorPressed=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE); /把字符串变量m_strResult传给编辑框void CMyDlg:OnNo6() UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPresse
10、d=true|Restarted=true)/在按下了=,AC,sqrt,tan,sin等按忸时, m_strResult=6; /变量m_strResult的值为按下的按忸6 else /在按下数字键的情况下,则在m_strResult后加6 m_strResult+=6; OperatorPressed=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE); /把字符串变量m_strResult传给编辑框void CMyDlg:OnNo7() UpdateData(TRUE)
11、; /把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed=true|Restarted=true)/在按下了=,AC,sqrt,tan,sin等按忸时, m_strResult=7; /变量m_strResult的值为按下的按忸7 else /在按下数字键的情况下,则在m_strResult后加7 m_strResult+=7; OperatorPressed=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE); /把字符串变量m_s
12、trResult传给编辑框void CMyDlg:OnNo8() UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed=true|Restarted=true)/在按下了=,AC,sqrt,tan,sin等按忸时, m_strResult=8; /变量m_strResult的值为按下的按忸8 else /在按下数字键的情况下,则在m_strResult后加8 m_strResult+=8; OperatorPressed=false; /把bool变量OperatorPressed和Restarted的值改为fal
13、se Restarted=false; UpdateData(FALSE); /把字符串变量m_strResult传给编辑框void CMyDlg:OnNo9() UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed=true|Restarted=true)/在按下了=,AC,sqrt,tan,sin等按忸时, m_strResult=9; /变量m_strResult的值为按下的按忸9 else /在按下数字键的情况下,则在m_strResult后加9 m_strResult+=9; OperatorPresse
14、d=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE); /把字符串变量m_strResult传给编辑框void CMyDlg:OnAdd() UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult m_strResult+=+; /在变量m_strResult后加+ OperatorPressed=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; Upd
15、ateData(FALSE); /把字符串变量m_strResult传给编辑框void CMyDlg:OnDec() UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult m_strResult+=-; /在变量m_strResult后加- OperatorPressed=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE); /把字符串变量m_strResult传给编辑框void CMyDlg:OnMut() UpdateData(TR
16、UE); /把编辑框显示的字符串传给相应的变量m_strResult m_strResult+=*; /在变量m_strResult后加* OperatorPressed=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE); /把字符串变量m_strResult传给编辑框void CMyDlg:OnDiv() UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult m_strResult+=/; /在变量m_strResult后加/ Op
17、eratorPressed=false; /把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE); /把字符串变量m_strResult传给编辑框/通过这个函数,实现把字符串中的数字和运算符读取出来,并分别储存在2个数组里void CMyDlg:GetStr(CString str) int i=0,z=0; double rate=10.0,itemp=0.0; for(i=0;i20;i+) ai=1000000.0; /对数组a20初始化 for(i=0;i10;i+) bi= ; /对数
18、组b10初始化 i=0; /把0赋给i for(;istr.GetLength();i+) if(isdigit(str.GetAt(i) /如果字符串str.GetAt(i)的内容是整数 if(rate=10.0) /整数部分 itemp=itemp*rate+(str.GetAt(i)-0);/获得整数 else /小数部分 itemp=itemp+rate*(str.GetAt(i)-0);/获得小数 rate=rate/10; /每次让rate小10倍 else if(str.GetAt(i)=.) /如果str.GetAt(i)是小数点 rate=0.1; /让rate=0.1,开始
19、计算小数部分 else if(str.GetAt(i)=+) /如果str.GetAt(i)是加号 az=itemp;itemp=0; /把itemp的值放入双精度数组a中,并把itemp的值改为0 z+; /让z自加一次 bz=+; /把加号放入字符数组b中 z+; /让z自加一次 rate=10.0; /把10赋给rate,确保读取下个数字时,先计算整数部分 else if(str.GetAt(i)=-) /如果str.GetAt(i)是减号 az=itemp;itemp=0; /把itemp的值放入双精度数组a中,并把itemp的值改为0 z+; /让z自加一次 bz=-; /把减号放入
20、字符数组b中 z+; /让z自加一次 rate=10.0; /把10赋给rate,确保读取下个数字时,先计算整数部分 else if(str.GetAt(i)=*) /如果str.GetAt(i)是乘号 az=itemp;itemp=0; /把itemp的值放入双精度数组a中,并把itemp的值改为0 z+; /让z自加一次 bz=*; /把减号放入字符数组b中 z+; /让z自加一次 rate=10.0; /把10赋给rate,确保读取下个数字时,先计算整数部分 else if(str.GetAt(i)=/) /如果str.GetAt(i)是除号 az=itemp;itemp=0; /把it
21、emp的值放入双精度数组a中,并把itemp的值改为0 z+; /让z自加一次 bz=/; /把除号放入字符数组b中 z+; /让z自加一次 rate=10.0; /把10赋给rate,确保读取下个数字时,先计算整数部分 az=itemp; /把最后一个整数itemp的值放入双精度数组a中s=z; /把z的值赋给变量s,用来控制计算结果的循环中的条件/*这个函数结束后编辑框的表达式被分成了数字和运算符2部分,数字保存在a0,a2,a4.中,运算符保存在b1,b3.中*/void CMyDlg:GetResult() int i=0,x=0,y=1,t,z=1;/这个循环的目的是把所有除法运算都
22、改为乘法计算 for(i=0;i=s;i+) if(bi=/) /当循环遇到除号时 ai+1=1/ai+1; /把ai+1的值改为1/ai+1 bi=*; /把bi的值改为乘号 /这个循环可以对所有乘法进行计算 for(i=0;i=s;i+) if(bi=*) /当循环遇到乘号时 /*如果i-t=2(再上次循环中,t被赋值成了i,这次2个值只相差2,说明表达式的情况是连续乘法,比如2*3*4)以2*3*4为例,在这个条件之前,函数已经进行了2*3的运算,其计算结果保存在原来的2中,把2的值覆盖了,这个条件的作用是让2*3的结果再和4相乘,结果保存在原来的2中*/ if(i-t=2) at-z=
23、at-z*ai+1; /进行乘法运算,把结果保存在前面的数组元素中 z=z+2; /这里引进变量z,可以解决很多数连续相乘的问题,比如2*2*2*2*2*2 ai-1=ai-1*ai+1; /碰到乘号后把乘号前后2个数字相乘,结果保存在前面的数组元素 ai+1=1000000.0; /对乘号后面的数字初始化为0.0 bi= ; /对乘号初始化为空格/*2数相乘后把乘号及其后面的数字初始化了,如果是2*3*4的情况,将会无法计算*4,所以要用开始的条件语句来解决*/ t=i; /把i的值赋给t /*这个循环的目的是对数组a和b进行整理,因为已经进行了乘法和除法运算,进行运算的时候,把一些数字和运
24、算符初始化了这个函数的作用可以使中间一些初始化了的数字和符号被后面的数字和符号代替,让数组可以重新排列*/ for(i=0;i=s;i+) if(ai!=1000000.0) /如果ai的值不为0.0 ax=ai; /把ai的值赋给ax x+=2; /x自加2 if(bi!= ) /如果bi的值不为空格 by=bi; /把bi的值赋给by y=y+2; /y自加2 /这个循环是进行最后的加减法运算 for(i=0;i1)/当m_strResult不等于0且m_strResult长度大于1时 m_strResult=m_strResult.Left(m_strResult.GetLength()-1);/使m_strResult长度减少1,去掉最右边的字符 else Restarted=true;/把bool变量Restarted的值改为true,再次输入数字时,覆盖掉现在的m_strResult m_strResult=0;/把字符串0赋给m_strResult UpdateData(FALSE);/把字符串变量m_strResult传给编辑框 void CMyDlg:OnSin() UpdateData(TRUE);/把编辑框显示的字符串传给相应的变量m_strResult double result;/定义一个双精度型变量result,用来获取进行了sin运算的结果
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1