VC版科学计算器程序实验报告.docx

上传人:b****5 文档编号:4698477 上传时间:2022-12-07 格式:DOCX 页数:43 大小:618.51KB
下载 相关 举报
VC版科学计算器程序实验报告.docx_第1页
第1页 / 共43页
VC版科学计算器程序实验报告.docx_第2页
第2页 / 共43页
VC版科学计算器程序实验报告.docx_第3页
第3页 / 共43页
VC版科学计算器程序实验报告.docx_第4页
第4页 / 共43页
VC版科学计算器程序实验报告.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

VC版科学计算器程序实验报告.docx

《VC版科学计算器程序实验报告.docx》由会员分享,可在线阅读,更多相关《VC版科学计算器程序实验报告.docx(43页珍藏版)》请在冰豆网上搜索。

VC版科学计算器程序实验报告.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1