c++课程设计作业.docx
《c++课程设计作业.docx》由会员分享,可在线阅读,更多相关《c++课程设计作业.docx(22页珍藏版)》请在冰豆网上搜索。
![c++课程设计作业.docx](https://file1.bdocx.com/fileroot1/2023-1/7/e584c2eb-7a9a-4d6d-8be1-98a53e5ae9bd/e584c2eb-7a9a-4d6d-8be1-98a53e5ae9bd1.gif)
c++课程设计作业
学号:
201205527
姓名:
刘新雯
学院:
数理学院
专业:
统计学
一、设计名称:
计算器
二、基本功能:
本课程设计是在基于对话框的应用程序中模拟一个计算器,本计算器可以进行十进制下的四则运算(加、减、乘、除)和四则混合运算,可以把十进制转化为二进制或十六进制,可以进行一些常用的函数运算(比如sin、cos、tan、cot、sqrt、ln等),还可以支持带“(”,“)”符号的表达式的计算。
三、程序运行结果分析
(1)在运行程序后,系统会弹出一个基于对话框的计算器界面,如下图所示:
(2)在计算器程序中,主要通过一个编辑框来获取表达式和显示计算结果,表达式可以通过键盘和单击按钮2种方式输入,输入后的结果如下图所示:
(3)在输入完表达式后,单击“=”后,开始对表达式进行计算,计算完成后,在编辑框中显示计算的结果。
(4)计算器可以实现十进制转化为十六进制或二进制,其实现的操作为先输入一个十进制整数,再单击按钮“转化为二进制”或“转化为十六进制。
(4)另外,计算器还可以实现一些简单的函数运算,实现的操作和十六进制/二进制转化类似,是先输入一个数字,在单击想要进行的函数的按钮,单击后就会在编辑框中显示运算的结果。
四、程序代码
voidCMyDlg:
:
OnNo0()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult
if(OperatorPressed==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传给编辑框
}
voidCMyDlg:
:
OnNo1()
{
UpdateData(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);//把字符串变量m_strResult传给编辑框
}
voidCMyDlg:
:
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的值改为false
Restarted=false;
UpdateData(FALSE);//把字符串变量m_strResult传给编辑框
}
voidCMyDlg:
:
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";
OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false
Restarted=false;
UpdateData(FALSE);//把字符串变量m_strResult传给编辑框
}
voidCMyDlg:
:
OnNo4()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult
if(OperatorPressed==true||Restarted==true)
//在按下了"=","AC","sqrt","tan","sin"等按忸时,
m_strResult="4";//变量m_strResult的值为按下的按忸"4"
else//在按下数字键的情况下,则在m_strResult后加"4"
m_strResult+="4";
OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false
Restarted=false;
UpdateData(FALSE);//把字符串变量m_strResult传给编辑框
}
voidCMyDlg:
:
OnNo5()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult
if(OperatorPressed==true||Restarted==true)
//在按下了"=","AC","sqrt","tan","sin"等按忸时,
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传给编辑框
}
voidCMyDlg:
:
OnNo6()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult
if(OperatorPressed==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传给编辑框
}
voidCMyDlg:
:
OnNo7()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量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_strResult传给编辑框
}
voidCMyDlg:
:
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的值改为false
Restarted=false;
UpdateData(FALSE);//把字符串变量m_strResult传给编辑框
}
voidCMyDlg:
:
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";
OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false
Restarted=false;
UpdateData(FALSE);//把字符串变量m_strResult传给编辑框
}
voidCMyDlg:
:
OnAdd()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult
m_strResult+="+";//在变量m_strResult后加"+"
OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false
Restarted=false;
UpdateData(FALSE);//把字符串变量m_strResult传给编辑框
}
voidCMyDlg:
:
OnDec()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult
m_strResult+="-";//在变量m_strResult后加"-"
OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false
Restarted=false;
UpdateData(FALSE);//把字符串变量m_strResult传给编辑框
}
voidCMyDlg:
:
OnMut()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult
m_strResult+="*";//在变量m_strResult后加"*"
OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false
Restarted=false;
UpdateData(FALSE);//把字符串变量m_strResult传给编辑框
}
voidCMyDlg:
:
OnDiv()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult
m_strResult+="/";//在变量m_strResult后加"/"
OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false
Restarted=false;
UpdateData(FALSE);//把字符串变量m_strResult传给编辑框
}
//通过这个函数,实现把字符串中的数字和运算符读取出来,并分别储存在2个数组里
voidCMyDlg:
:
GetStr(CStringstr)
{
inti=0,z=0;
doublerate=10.0,itemp=0.0;
for(i=0;i<20;i++)
a[i]=1000000.0;//对数组a[20]初始化
for(i=0;i<10;i++)
b[i]='';//对数组b[10]初始化
i=0;//把0赋给i
for(;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倍
}
}
elseif(str.GetAt(i)=='.')//如果str.GetAt(i)是小数点
rate=0.1;//让rate=0.1,开始计算小数部分
elseif(str.GetAt(i)=='+')//如果str.GetAt(i)是加号
{
a[z]=itemp;itemp=0;
//把itemp的值放入双精度数组a中,并把itemp的值改为0
z++;//让z自加一次
b[z]='+';//把加号放入字符数组b中
z++;//让z自加一次
rate=10.0;
//把10赋给rate,确保读取下个数字时,先计算整数部分
}
elseif(str.GetAt(i)=='-')//如果str.GetAt(i)是减号
{
a[z]=itemp;itemp=0;
//把itemp的值放入双精度数组a中,并把itemp的值改为0
z++;//让z自加一次
b[z]='-';//把减号放入字符数组b中
z++;//让z自加一次
rate=10.0;
//把10赋给rate,确保读取下个数字时,先计算整数部分
}
elseif(str.GetAt(i)=='*')//如果str.GetAt(i)是乘号
{
a[z]=itemp;itemp=0;
//把itemp的值放入双精度数组a中,并把itemp的值改为0
z++;//让z自加一次
b[z]='*';//把减号放入字符数组b中
z++;//让z自加一次
rate=10.0;
//把10赋给rate,确保读取下个数字时,先计算整数部分
}
elseif(str.GetAt(i)=='/')//如果str.GetAt(i)是除号
{
a[z]=itemp;itemp=0;
//把itemp的值放入双精度数组a中,并把itemp的值改为0
z++;//让z自加一次
b[z]='/';//把除号放入字符数组b中
z++;//让z自加一次
rate=10.0;
//把10赋给rate,确保读取下个数字时,先计算整数部分
}
}
a[z]=itemp;
//把最后一个整数itemp的值放入双精度数组a中
s=z;
//把z的值赋给变量s,用来控制计算结果的循环中的条件
}
/*这个函数结束后编辑框的表达式被分成了数字和运算符2部分,数字保存在a[0],a[2],a[4]...中,运算符保存在b[1],b[3]...中*/
voidCMyDlg:
:
GetResult()
{
inti=0,x=0,y=1,t,z=1;
//这个循环的目的是把所有除法运算都改为乘法计算
for(i=0;i<=s;i++)
{
if(b[i]=='/')//当循环遇到除号时
{
a[i+1]=1/a[i+1];//把a[i+1]的值改为1/a[i+1]
b[i]='*';//把b[i]的值改为乘号
}
}
//这个循环可以对所有乘法进行计算
for(i=0;i<=s;i++)
{
if(b[i]=='*')//当循环遇到乘号时
{
/*如果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)
{
a[t-z]=a[t-z]*a[i+1];
//进行乘法运算,把结果保存在前面的数组元素中
z=z+2;
//这里引进变量z,可以解决很多数连续相乘的问题,比如2*2*2*2*2*2
}
a[i-1]=a[i-1]*a[i+1];
//碰到乘号后把乘号前后2个数字相乘,结果保存在前面的数组元素
a[i+1]=1000000.0;//对乘号后面的数字初始化为0.0
b[i]='';//对乘号初始化为空格
/*2数相乘后把乘号及其后面的数字初始化了,如果是2*3*4的情况,将会无法计算*4,所以要用开始的条件语句来解决*/
t=i;//把i的值赋给t
}
}
/*这个循环的目的是对数组a和b进行整理,因为已经进行了乘法和除法运算,进行运算的时候,把一些数字和运算符初始化了这个函数的作用可以使中间一些初始化了的数字和符号被后面的数字和符号代替,让数组可以重新排列*/
for(i=0;i<=s;i++)
{
if(a[i]!
=1000000.0)//如果a[i]的值不为0.0
{
a[x]=a[i];//把a[i]的值赋给a[x]
x+=2;//x自加2
}
if(b[i]!
='')//如果b[i]的值不为空格
{
b[y]=b[i];//把b[i]的值赋给b[y]
y=y+2;//y自加2
}
}
//这个循环是进行最后的加减法运算
for(i=0;i<=y-2;i++)
//这里i的上限小于等于y-2,可以保证不进行多余的运算
{
if(b[i]=='+')//如果b[i]等于加号
a[0]=a[0]+a[i+1];
//把加号后的数字和a[0]相加,结果保存在a[0]中
elseif(b[i]=='-')//如果b[i]等于减号
a[0]=a[0]-a[i+1];
//把减号后的数字和a[0]相减,结果保存在a[0]中
}
}
voidCMyDlg:
:
OnEqu()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult
Bracket(m_strResult);//调用Bracket(m_strResult)函数,解决括号问题
GetStr(m_strResult);
//调用函数GetStr(m_strResult),作用是把m_strResult转化成数字和加减乘除四则运算
GetResult();//调用函数GetResult(),作用是计算出表达式的值
m_strResult.Format("%1f",a[0]);//用Format函数,把双精度型小数转化为字符串
UpdateData(FALSE);//把字符串变量m_strResult传给编辑框
OperatorPressed=true
;//把bool变量OperatorPressed的值改为true,再次输入数字时,覆盖掉现在的m_strResult
}
voidCMyDlg:
:
OnAc()
{
Restarted=true;
//把bool变量Restarted的值改为true,再次输入数字时,覆盖掉现在的m_strResult
m_strResult="0";//把字符串"0"赋给m_strResult
UpdateData(FALSE);//把字符串变量m_strResult传给编辑框
}
voidCMyDlg:
:
OnBac()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult
if(m_strResult!
="0"&&m_strResult.GetLength()>1)
//当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传给编辑框
}
voidCMyDlg:
:
OnSin()
{
UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult
doubleresult;//定义一个双精度型变量result,用来获取进行了sin运算的结果