mfc下的科学计算器

风云魄888 贡献于2013-04-13

作者 戴冬艳  创建于2012-10-27 08:41:00   修改者asus  修改于2012-11-12 13:00:00字数4794

文档摘要:《VC++程序设计》实验报告题目科学计算器。题目要求仿照Windows系统自带计算器做的一个小型科学计算器。2功能需求整个系统具有的功能:响应各个数字键,实现加、减、乘、除、x^y、lnx、x!、sinx、cosx、tanx、二进制、二进制转换八进制、清空、求倒数等基本功能;
关键词:

 《VC++程序设计》 实验报告 题 目 科学计算器 院、系(部) 计算机科学与技术学院 专业及班级 学 号 姓 名 日 期 2012年11月11日 1 题目要求 仿照Windows系统自带计算器做的一个小型科学计算器。 2 功能需求 整个系统具有的功能:响应各个数字键,实现加、减、乘、除、x^y、lnx、x!、sinx、cosx、tanx、二进制、二进制转换八进制、清空、求倒数等基本功能; 3 总体设计 3.1 系统模块 计算器 清屏 更换背景颜色、按ENTER键消失等功能 取负数 退格 二进制、二进制转换八进制 自然对数 开平方 正弦、余弦、正切 倒数 加、减、乘、除 法 阶乘 次方 3.2 系统业务处理流程 整体流程图 开始 键入一个数据 择相应的操作键,计算后 用UpdateData(FALSE) 刷新显示 再键入一个数据 显示结果 结束 具体的流程图 开始 输入数据子函数 编辑框关联的变量保存 输入数据子函数 双目运算符 单目运算符 进行运算 运算是否合法 把结果再就进行保存 编辑框会显示error 选择用清零键 是否用保存的结果继续进行运算 是否开始新一轮的计算 结束 jie Y N Y N N Y 4 详细设计 1)在对话框类的头文件“CalculatorDlg.h”头部添加: #include "math.h“ 2)在对话框类的定义中添加下列函数声明: afx_msg void OnNumberKey(UINT nID); //处理数字键单击事件的消息响应函数 afx_msg void OnOperationKey(UINT nID); //处理操作键单击事件的消息响应函数 3)在对话框的可执行文件的消息映射中添加如下代码: ON_COMMAND_RANGE(IDC_NUMBER1,IDC_NUMBER10,OnNumberKey) ON_COMMAND_RANGE(IDC_NUMBER_PlusMinus, IDC_NUMBER_Equal ,OnOperationKey) 4)在对话框的可执行文件中添加OnNumberKey(UINT nID)和OnOperationKey(UINT nID)的实现代码 5)在对话框类中定义如下变量: double number1,number2; //number1和number1用于存储将要进行运算的数字 int NumberState,OperationState; //NumberState用于标示是将数值赋给number1或是number1 //OperationState用于表示计算器所要执行的操作 6)为IDC_EDIT_PUTOUT添加映射变量m_Cnumber 7)在对话框的构造函数中初始化变量 m_number = 0.0; NumberState=1; 8)为对话框添加计算函数void cal(),用于计算 void CCalculatorDlg::cal() //计算函数 { m_number=atof(m_Cnumber); switch(OperationState) { case 1: m_number=(double)number1/number2; NumberState=1; m_Cnumber.Format("%g",m_number); UpdateData(FALSE); break; case 2: m_number=number1*number2; NumberState=1; m_Cnumber.Format("%g",m_number); UpdateData(FALSE); break; case 3: m_number=number1+number2; NumberState=1; m_Cnumber.Format("%g",m_number); UpdateData(FALSE); break; case 4: m_number=number1-number2; NumberState=1; m_Cnumber.Format("%g",m_number); UpdateData(FALSE); break; case 5: m_number=pow(number1,number2); NumberState=1; m_Cnumber.Format("%g",m_number); UpdateData(FALSE); break; } number1=m_number; OperationState=0; } 9)OnNumberKey(UINT nID)函数 void CCalculatorDlg::OnNumberKey(UINT nID) { CString n; switch (nID) { case IDC_BUTTON1:n="1";break; case IDC_BUTTON2:n="2";break; case IDC_BUTTON3:n="3";break; case IDC_BUTTON4:n="4";break; case IDC_BUTTON5:n="5";break; case IDC_BUTTON6:n="6";break; case IDC_BUTTON7:n="7";break; case IDC_BUTTON8:n="8";break; case IDC_BUTTON9:n="9";break; case IDC_BUTTON0:n="0";break; } if (NumberState==1) { m_Cnumber=m_Cnumber+n; number1=atof(m_Cnumber); UpdateData(FALSE); } else { m_Cnumber=m_Cnumber+n; number2=atof(m_Cnumber); UpdateData(FALSE); } //处理除数为零的情况,如果显示除,则零按钮不显示,否则显示 if (Zero=FALSE) { Zero=TRUE; m_Zero.ShowWindow(SW_SHOW); } else { m_Zero.ShowWindow(SW_SHOW); } } 10)OnOperationKey(UINT nID)函数 void CCalculatorDlg::OnOperationKey(UINT nID) { m_number=atof(m_Cnumber); switch(nID) { case IDC_BUTTON_PlusMinus:m_number=-m_number; if (NumberState==1) { number1=m_number; } else { number2=m_number; } m_Cnumber.Format("%g",m_number); UpdateData(FALSE); break; case IDC_BUTTON_BackSpace: int n; n=m_Cnumber.GetAllocLength(); m_Cnumber=m_Cnumber.Left(n-1); UpdateData(FALSE); break; case IDC_BUTTON_Divide: cal(); if (Zero=TRUE) { m_Zero.ShowWindow(SW_HIDE); Zero=FALSE; } OperationState=1; m_number=0; m_Cnumber=""; NumberState=2; break; case IDC_BUTTON_Multiply: cal(); OperationState=2; m_number=0; m_Cnumber=""; NumberState=2; break; case IDC_BUTTON_Add: cal(); OperationState=3; m_number=0; m_Cnumber=""; NumberState=2; break; case IDC_BUTTON_Subtract: cal(); OperationState=4; m_number=0; m_Cnumber=""; NumberState=2; break; case IDC_CIFANG: cal(); OperationState=5; m_number=0; m_Cnumber=""; NumberState=2; break; case IDC_BUTTON_Clear: number1=number2=m_number=0; m_Cnumber.Format("%g",m_number); UpdateData(FALSE); m_Cnumber=""; NumberState=1; break; case IDC_BUTTON_Sqrt: number1=m_number=sqrt(number1); m_Cnumber.Format("%g",m_number); UpdateData(FALSE); break; case IDC_BUTTON_Derivative: number1=m_number=(double)1/number1; m_Cnumber.Format("%g",m_number); UpdateData(FALSE); break; case IDC_BUTTON_Equal: cal(); break; } } 11)添加剩余的操作按键,(此处只写一个,如tan(),cos(),n!,x^y等详细函数看源代码 void CCalculatorDlg::OnSin() { // TODO: Add your control notification handler code here m_number=atof(m_Cnumber); m_number=sin(m_number*3.1415926/180); m_Cnumber.Format("%g",m_number); UpdateData(FALSE); } 12)二进制转换核心代码 void CCalculatorDlg::OnBinary() { // TODO: Add your control notification handler code here const int size=sizeof(int)*8; //转换成4*8=32位二进制 char str[size+1]; //来存储二进制转换结果 m_number=atof(m_Cnumber); bit(m_number,str,size); m_Cnumber.Format("%s",str); UpdateData(FALSE); } char *CCalculatorDlg::bit(int m_number,char*array,int size) { for(int i=size-1;i>=0;i--,m_number>>=1) //m_number>>=1向右移一位 array[i]='0'+(1&m_number); //判断每一位是0还是1 array[size]='\0'; return array; } 13)二进制转换八进制核心代码 void CCalculatorDlg::OnOctal() { // TODO: Add your control notification handler code here UpdateData(TRUE); int i,j,m; int sum; sum=0; m = m_Cnumber.GetLength(); for(i=m-1; i>=0; i-- ) sum+= ((m_Cnumber[i]-'0')<<(m-i-1));//<<是位操作符,表示二进制数向左移位,如001变为010,等效于sum+=((s[i]-'0')*2^(m-i-1));这样应该清楚了,如0101==0*2^3+1*2^2+0*2^1+1*2^0;即转为十进制 if(sum==0) { m_Cnumber = "0"; } int a[10]; i=0; while(sum) { a[i]=sum%8;//这部分是十进制转八进制的,原理同上。 sum/=8; i++; } char str[10]; m_Cnumber = ""; for(j=i-1; j>=0; j--) m_Cnumber += itoa(a[j],str,10);//itoa(a[j],str,10),将这个八进制转换成十进制存在str 中 UpdateData(FALSE); } 5 测试与实现 6 总结 这次的科学计算器是我个人单独完成的,在编写软件的过程中自己查阅资料以及参照了老师的上机指导书和课件,其中遇到一些问题,在此我非常感谢我们专业的**和**同学,他们帮助了很多。虽然软件完成了,但是此次的计算器不足之处在于功能还不是很完善,比如没有弧度、进制之间的转换等,在以后的学习中我会利用我学到的只是继续完善我做过的每一个软件。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档