MFC下的科学计算器.docx
- 文档编号:5804701
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:13
- 大小:104.86KB
MFC下的科学计算器.docx
《MFC下的科学计算器.docx》由会员分享,可在线阅读,更多相关《MFC下的科学计算器.docx(13页珍藏版)》请在冰豆网上搜索。
MFC下的科学计算器
《VC++程序设计》
实验报告
题目科学计算器
院、系(部)计算机科学与技术学院
专业及班级
学号
姓名
日期2012年11月11日
1题目要求
仿照Windows系统自带计算器做的一个小型科学计算器。
2功能需求
整个系统具有的功能:
响应各个数字键,实现加、减、乘、除、x^y、lnx、x!
、sinx、cosx、tanx、二进制、二进制转换八进制、清空、求倒数等基本功能;
3总体设计
3.1系统模块
3.2系统业务处理流程
整体流程图
具体的流程图
4详细设计
1)在对话框类的头文件“CalculatorDlg.h”头部添加:
#include"math.h“
2)在对话框类的定义中添加下列函数声明:
afx_msgvoidOnNumberKey(UINTnID);
//处理数字键单击事件的消息响应函数
afx_msgvoidOnOperationKey(UINTnID);
//处理操作键单击事件的消息响应函数
3)在对话框的可执行文件的消息映射中添加如下代码:
ON_COMMAND_RANGE(IDC_NUMBER1,IDC_NUMBER10,OnNumberKey)
ON_COMMAND_RANGE(IDC_NUMBER_PlusMinus,IDC_NUMBER_Equal,OnOperationKey)
4)在对话框的可执行文件中添加OnNumberKey(UINTnID)和OnOperationKey(UINTnID)的实现代码
5)在对话框类中定义如下变量:
doublenumber1,number2;
//number1和number1用于存储将要进行运算的数字
intNumberState,OperationState;
//NumberState用于标示是将数值赋给number1或是number1
//OperationState用于表示计算器所要执行的操作
6)为IDC_EDIT_PUTOUT添加映射变量m_Cnumber
7)在对话框的构造函数中初始化变量
m_number=0.0;
NumberState=1;
8)为对话框添加计算函数voidcal(),用于计算
voidCCalculatorDlg:
:
cal()//计算函数
{
m_number=atof(m_Cnumber);
switch(OperationState)
{
case1:
m_number=(double)number1/number2;
NumberState=1;
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
break;
case2:
m_number=number1*number2;
NumberState=1;
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
break;
case3:
m_number=number1+number2;
NumberState=1;
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
break;
case4:
m_number=number1-number2;
NumberState=1;
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
break;
case5:
m_number=pow(number1,number2);
NumberState=1;
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
break;
}
number1=m_number;
OperationState=0;
}
9)OnNumberKey(UINTnID)函数
voidCCalculatorDlg:
:
OnNumberKey(UINTnID)
{
CStringn;
switch(nID)
{
caseIDC_BUTTON1:
n="1";break;
caseIDC_BUTTON2:
n="2";break;
caseIDC_BUTTON3:
n="3";break;
caseIDC_BUTTON4:
n="4";break;
caseIDC_BUTTON5:
n="5";break;
caseIDC_BUTTON6:
n="6";break;
caseIDC_BUTTON7:
n="7";break;
caseIDC_BUTTON8:
n="8";break;
caseIDC_BUTTON9:
n="9";break;
caseIDC_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(UINTnID)函数
voidCCalculatorDlg:
:
OnOperationKey(UINTnID)
{
m_number=atof(m_Cnumber);
switch(nID)
{
caseIDC_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;
caseIDC_BUTTON_BackSpace:
intn;
n=m_Cnumber.GetAllocLength();
m_Cnumber=m_Cnumber.Left(n-1);
UpdateData(FALSE);
break;
caseIDC_BUTTON_Divide:
cal();
if(Zero=TRUE)
{
m_Zero.ShowWindow(SW_HIDE);
Zero=FALSE;
}
OperationState=1;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_BUTTON_Multiply:
cal();
OperationState=2;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_BUTTON_Add:
cal();
OperationState=3;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_BUTTON_Subtract:
cal();
OperationState=4;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_CIFANG:
cal();
OperationState=5;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_BUTTON_Clear:
number1=number2=m_number=0;
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
m_Cnumber="";
NumberState=1;
break;
caseIDC_BUTTON_Sqrt:
number1=m_number=sqrt(number1);
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
break;
caseIDC_BUTTON_Derivative:
number1=m_number=(double)1/number1;
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
break;
caseIDC_BUTTON_Equal:
cal();
break;
}
}
11)添加剩余的操作按键,(此处只写一个,如tan(),cos(),n!
x^y等详细函数看源代码
voidCCalculatorDlg:
:
OnSin()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_number=atof(m_Cnumber);
m_number=sin(m_number*3.1415926/180);
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
}
12)二进制转换核心代码
voidCCalculatorDlg:
:
OnBinary()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
constintsize=sizeof(int)*8;//转换成4*8=32位二进制
charstr[size+1];//来存储二进制转换结果
m_number=atof(m_Cnumber);
bit(m_number,str,size);
m_Cnumber.Format("%s",str);
UpdateData(FALSE);
}
char*CCalculatorDlg:
:
bit(intm_number,char*array,intsize)
{
for(inti=size-1;i>=0;i--,m_number>>=1)//m_number>>=1向右移一位
array[i]='0'+(1&m_number);//判断每一位是0还是1
array[size]='\0';
returnarray;
}
13)二进制转换八进制核心代码
voidCCalculatorDlg:
:
OnOctal()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
inti,j,m;
intsum;
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";
}
inta[10];
i=0;
while(sum)
{
a[i]=sum%8;//这部分是十进制转八进制的,原理同上。
sum/=8;
i++;
}
charstr[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总结
这次的科学计算器是我个人单独完成的,在编写软件的过程中自己查阅资料以及参照了老师的上机指导书和课件,其中遇到一些问题,在此我非常感谢我们专业的**和**同学,他们帮助了很多。
虽然软件完成了,但是此次的计算器不足之处在于功能还不是很完善,比如没有弧度、进制之间的转换等,在以后的学习中我会利用我学到的只是继续完善我做过的每一个软件。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 科学 计算器