VC版科学计算器程序实验报告.docx
- 文档编号:4698477
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:43
- 大小:618.51KB
VC版科学计算器程序实验报告.docx
《VC版科学计算器程序实验报告.docx》由会员分享,可在线阅读,更多相关《VC版科学计算器程序实验报告.docx(43页珍藏版)》请在冰豆网上搜索。
VC版科学计算器程序实验报告
西安科技大学
《程序设计方法与优化》
实验报告
题目科学计算器
院、系(部)计算机科学与技术学院
专业及班级软件工程1101班
姓名张XX
日期2013/04/24
一.功能需求:
1.能进行加、减、乘、除运算:
这时最基本的计算器功能。
2.还能进行以下的数值计算:
函数名:
ln
在数学中ln(x)是以e为底的x的对数。
e是一个常数
函数名:
exp功能:
指数函数
exp就是以e为底的指数,exp(0)=1,exp
(1)=e,exp
(2)=e
n!
代表一个数的阶乘,例如:
5!
就是5*4*3*2*1;
sta代表统计算法;
x^3代表x的3次方;
x^y代表x的y次方。
sin正弦,
cos余弦,
tan正切,
dms度分秒切换
Lsh左移
ln自然对数,
F-E科学计数法开关,Xor异或,
Int整数部分,
Exp允许输入用科学计数法表示的数字
1/x倒数,
log常用倒数
mod余数
Pi是圆周率,
Exp是科学计数法
exp代表以e为幂指数函数例如:
exp10就是e的10次方;
ln是以e为底的对数函数例如:
ln10就是以e为底10的对数;
M+是计算结果并加上已经储存的数;
M-是计算结果并用已储存的数字减去目前的结果;
MR是读取储存的数据;
MC是清除储存数据;
AC,CE归零是有一个是清除现有数据重新输入,另一个是清除全部数据结果和运算符.
数学计算
度量衡换算
XX计算器为用户提供常用的数学计算功能。
您可在任何地方的网页搜索栏内,输入需要计算的数学表达式(例如:
3+2),点击搜索,即可获得结果。
XX计算器支持实数范围内的计算,支持的运算包括:
加法(+或+),减法(-或-),乘法(*或×),除法(/),幂运算(^),阶乘(!
或!
)。
支持的函数包括:
正弦,余弦,正切,对数。
支持上述运算的混合运算。
例:
加法:
3+2
减法:
3-2
乘法:
3*2
除法:
3/2
阶乘:
4!
4的阶乘
电脑自带计算器开根号:
1,调到科学型。
2,开方:
(1)选一下INV这个。
(2)按一个数字。
(3)再按х^у。
(4)开几次方就按几然后等于就行了!
平方:
4^24的平方
立方:
4^34的立方
开平方:
4^(1/2)4的平方根
开立方:
4^(1/3)4的立方根
倒数:
1/44的倒数
幂运算:
2^82的8次方
常用对数:
log(8)以10为底8的对数
以自然底数为底的对数:
ln(8)以e为底8的对数
求弧度的正弦:
sin(10)10弧度角正弦值
求弧度的余弦:
cos(10)10弧度角余弦值
求弧度的正切:
tan(10)10弧度角正切值
上述运算的混合运算:
log((5+5)^2)-3+pi
圆周率pi=3.14159265
自然底数e=2.71828183
您可以直接使用常数字符,比如:
如果您输入的算式不符合上述格式,则不会得到计算结果,而只得到算式的搜索结果。
提示:
-英文字母不分大小写
-支持中文运算符和中文括号
-如果对数字进行函数计算,则可省略括号
计算反函数:
windows自带的科学计算器,注意打开计算器后一定要选择科学。
首先要搞清楚是角度还是弧度,我们默认选择就是角度
1,输入2,
2,点选Inv打钩。
3.点击tan按键
4.得到结果为63.434948822922010648427806279547
就是63度多了,其他同理。
二.总体设计计:
1.用例图:
2.类图:
这其中包含了主要的类,还有其它不太重要的类,如:
CMyButton类:
实现按钮自绘的类;
PlayBtnMusic类:
播放按键音类;
CHelp类:
对各种按键进行说明的类:
3.设计
(1).对话框窗体及各种资源的设计:
(1).要进行计算,必须要添加相应的按钮。
这其中包括能进行计算的数字按钮和操作符按钮两种按键按钮;
还有能进行数制转换和角度、弧度转换的单选按钮;以及能求反函数的复选框与组框。
(2).要能显示计算机过及过程,必须有编辑框。
(3).要能有菜单就更好了,其可以实现复制、拷贝,进制转换及显示关于对话框。
(2).对资源进行响应的各种函数设计:
(1).对数字按钮进行响应的函数。
(2).对操作符进行响应的函数。
(3).对进制转换进行响应的函数。
(4).对弧度、角度转换进行响应的函数。
(5).存储数值的函数及求阶乘等函数。
三.详细设计:
A.表示层:
1.对话框窗体及各种资源的设计:
(1).按钮设计:
A.按键按钮:
数字按钮和操作符按钮两种;
B.单选按钮:
数制转换和角度、弧度转换的单选按钮
C.复选框:
求反函数的复选框。
D.组框:
将相应的具有同类型的按钮分组,并显示在一个框中。
(2).编辑框:
A.进行数字显示的主编辑框。
B.存储计算结果按MS按钮时,显示M的编辑框,及按括号时,显示括号的编辑框。
(3).菜单:
A.实现复制、拷贝的“编辑”菜单。
B.进制转换及角度弧度转换选择的“查看”菜单。
C.显示关于对话框的“帮助”菜单。
对话框设计截图如下:
2.对资源进行响应的各种函数设计:
(1).对数字按钮进行响应的函数:
由于数字等按钮有10几个,若能将其实现在一个函数(OnNumberKey())中,并用ON_COMMAND_RANGE宏实现对多个具有相同属性按钮的集体映射。
便可以避免对没有个按钮单个映射的麻烦。
代码如下:
//----------------------操作数按钮响应函数----------------
voidCCalculatorDlg:
:
OnNumberKey(UINTnID)
{
////播放按键音
PressBtnMusicPlay;
Play.PlayMusic();
/////定义局部变量
TransFormtrans;
CStringn,pi;
CStringstrexpshow;
intinpi=0;
///若上次按键为“=”,按数字时,重新初始化一些变量
if(OperationState==IDC_NUMBER_Equal)
{
number1=m_number;
OperationState=0;
m_copym=m_number;
m_equalvalue=m_Cnumber;
number1=m_number;
m_number=0;
m_Cnumber="";
}
//-----
switch(nID)
{
caseIDC_NUMBER1:
n="1";break;
caseIDC_NUMBER2:
n="2";break;
caseIDC_NUMBER3:
n="3";break;
caseIDC_NUMBER4:
n="4";break;
caseIDC_NUMBER5:
n="5";break;
caseIDC_NUMBER6:
n="6";break;
caseIDC_NUMBER7:
n="7";break;
caseIDC_NUMBER8:
n="8";break;
caseIDC_NUMBER9:
n="9";break;
caseIDC_NUMBER0:
n="0";break;
caseIDC_NUMBER_A:
n="A";break;
caseIDC_NUMBER_B:
n="B";break;
caseIDC_NUMBER_C:
n="C";break;
caseIDC_NUMBER_D:
n="D";break;
caseIDC_NUMBER_E:
n="E";break;
caseIDC_NUMBER_F:
n="F";break;
caseIDC_NUMBERpoint:
if(!
m_PointFlag)n=".";//如果输入一个点后,就不能再输入点
elsen="";
if(m_Cnumber=="")
m_Cnumber="0";//如果直接按小数点按钮,小数点前显示“0”
m_PointFlag=1;
break;
caseIDC_NUMBER_PI:
inpi=1;break;
default:
break;
}
if(NumberState==1)
{
if(inpi==1)
{
number1=ExPi();
m_Cnumber.Format("%g",ExPi());//输入pi时,对其单独响应并转换
UpdateData(FALSE);
}
else
{
if(m_flagexp==1)//当使用科学计数法时,对数字单独进行存储
{
m_Cnumber=m_Cnumber+n;
strexpshow=strexpshow+n;
number2=atof(strexpshow);
UpdateData(FALSE);
}
else
{
m_Cnumber=m_Cnumber+n;
if(m_NR==10)//若选择十进制,直接使用atof()函数转换
number1=atof(m_Cnumber);
else//否则,为其它进制时,都先转换为为十进制
{
number1=trans.Transform_to10(m_Cnumber,m_NR);
m_Cnumber=trans.Transform_to_2_8_16(number1,m_NR);}//再转换为相应的进制显示
UpdateData(FALSE);
}
}
}
else//if(NumberState==2)//数字状态为2时,与1相同
{
if(inpi==1)
{
number2=ExPi();
m_Cnumber.Format("%g",ExPi());
UpdateData(FALSE);
}
else
{
if(m_flagexp==1)
{m_Cnumber=m_Cnumber+n;
strexpshow=strexpshow+n;
number2=atof(strexpshow);
UpdateData(FALSE);}
else
{
m_Cnumber=m_Cnumber+n;
if(m_NR==10)
number2=atof(m_Cnumber);
else
{
number2=trans.Transform_to10(m_Cnumber,m_NR);
m_Cnumber=trans.Transform_to_2_8_16(number2,m_NR);}
UpdateData(FALSE);
}
}
}
}
(2).对操作符进行响应的函数:
除了数字外,其余全都可视为操作符,将其设计在一个函数中,
能进行单目运算的设计一个OnOperationKey()函数,进行双目运算的设计一个Cal()函数。
大部分的单目运算但可使用math.h中相应的库函数来实现,其他一部分可通过自己设及实现。
部分实现代码如下:
//-------------操作符按钮响应函数----------------
voidCCalculatorDlg:
:
OnOperationKey(UINTnID)
{
/////播放按键音
PressBtnMusicPlay;
Play.PlayMusic();
/////////////////
TransFormtrans;
if(m_NR==10)//若选择十进制,直接使用atof()函数转换
m_number=atof(m_Cnumber);
else//否则,为其它进制时,都先转换为为十进制
m_number=trans.Transform_to10(m_Cnumber,m_NR);
//////////
m_PointFlag=0;//使用完操作符后,使点标志为初始状态,即下次输入数字时还可再用点
inti=0;
CStringstr,a;
intcout=0;//转换为科学记数法时,记录指数
CStringstrcout;//将cout整型转化为CString型
intflagExp=0;//pi标志置为初始状态
boolinvalid=false;
/////////////
switch(nID)
{
caseIDC_NUMBER_BackSpace:
intn;
n=m_Cnumber.GetLength();
m_Cnumber=m_Cnumber.Left(n-1);
UpdateData(FALSE);
break;
caseIDC_NUMBER_Clear:
number1=number2=m_number=0;
m_Cnumber=trans.Transform_to_2_8_16(m_number,m_NR);
UpdateData(FALSE);
m_Cnumber="";
NumberState=1;
IsButtonPress=true;
break;
caseIDC_NUMBER_CE:
//清除当前输入
if(NumberState==1)
number1=m_number=0;
else
number2=m_number=0;
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
m_Cnumber="";
break;
///-------------双目运算----------------
caseIDC_NUMBER_Divide:
cal(OperationState);
OperationState=IDC_NUMBER_Divide;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_NUMBER_Multiply:
cal(OperationState);
OperationState=IDC_NUMBER_Multiply;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_NUMBER_Add:
cal(OperationState);
OperationState=IDC_NUMBER_Add;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_NUMBER_Subtract:
cal(OperationState);
OperationState=IDC_NUMBER_Subtract;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_NUMBER_Mod:
cal(OperationState);//取余按钮响应
OperationState=IDC_NUMBER_Mod;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_NUMBER_E_X_P:
cal(OperationState);//用科学计数法输入
m_flagexp=1;
OperationState=IDC_NUMBER_E_X_P;
m_number=0;
m_Cnumber.Format("%g",number1);
m_Cnumber=m_Cnumber+"."+"e"+"+";
NumberState=2;
UpdateData(FALSE);
break;
caseIDC_NUMBER_And:
cal(OperationState);//按位与按钮响应
OperationState=IDC_NUMBER_And;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_NUMBER_Or:
cal(OperationState);//按位或按钮响应
OperationState=IDC_NUMBER_Or;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_NUMBER_Xor:
cal(OperationState);//按位异或按钮响应
OperationState=IDC_NUMBER_Xor;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
caseIDC_NUMBER_X_Y:
//求x的y次方
OperationState=IDC_NUMBER_X_Y;
m_number=0;
m_Cnumber="";
NumberState=2;
break;
//-------------单目运算--------------
caseIDC_NUMBER_PlusMinus:
m_number=sinop.GetResult(nID,m_number);
if(NumberState==1)
number1=m_number;
else
number2=m_number;
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
break;
caseIDC_NUMBER_Not:
//非按钮响应
number1=m_number=sinop.GetResult(nID,number1);
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
m_copym=m_number;
m_number=0;
m_Cnumber="";
break;
caseIDC_NUMBER_Sqrt:
number1=m_number=sinop.GetResult(nID,number1);
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
m_copym=m_number;
m_number=0;
m_Cnumber="";
break;
caseIDC_NUMBER_Derivative:
number1=m_number=sinop.GetResult(nID,number1);
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
m_copym=m_number;
m_number=0;
m_Cnumber="";
break;
caseIDC_NUMBER_Sin:
if(m_angle_radian==1)//若选为角度
{
if(((CButton*)GetDlgItem(IDC_CHECK_Inv))->GetCheck()==FALSE)//当没有选用反函数复选框时
{number1=m_number=angle.AngleToArc(number1);
m_number=sinop.GetResult(nID,number1);}
else//当选用反函数复选框时
{
if(!
(m_number<=1&&m_number>=-1))//判断输入是否符合要求
{m_Cnumber="函数输入无效";
invalid=true;
UpdateData(FALSE);
//break;
}
else
{
number1=m_number=sinop.GetResult(IDC_NUMBER_ASin,number1);
}
m_Inv=false;
((CButton*)GetDlgItem(IDC_CHECK_Inv))->SetCheck(FALSE);//当用完反函数复选框时,将其置为未选状态
}
}
else
{
if(m_Inv==true)
{
if(!
(m_number<=1&&m_number>=-1))//判断输入是否符合要求
{m_Cnumber="函数输入无效";
invalid=true;
UpdateData(FALSE);
}
else
{
number1=m_number=sinop.GetResult(IDC_NUMBER_ASin,number1);//asin(number1);
}
m_Inv=false;
((CButton*)GetDlgItem(IDC_CHECK_Inv))->SetCheck(FALSE);
}
else
number1=m_number=sinop.GetResult(nID,number1);//sin(number1);
}
if(!
invalid)
{
if(fabs(m_number)<1e-6)
m_Cnumber.Format("%d",m_number);
else
m_Cnumber.Format("%g",m_number);
UpdateData(FALSE);
}
m_copym=m_number;
m_number=0;
m_Cnumber="";
m_dms=0;
break;
c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 科学 计算器 程序 实验 报告