刁竞雄计算器报告.docx

上传人:b****8 文档编号:10086415 上传时间:2023-05-23 格式:DOCX 页数:32 大小:283.84KB
下载 相关 举报
刁竞雄计算器报告.docx_第1页
第1页 / 共32页
刁竞雄计算器报告.docx_第2页
第2页 / 共32页
刁竞雄计算器报告.docx_第3页
第3页 / 共32页
刁竞雄计算器报告.docx_第4页
第4页 / 共32页
刁竞雄计算器报告.docx_第5页
第5页 / 共32页
刁竞雄计算器报告.docx_第6页
第6页 / 共32页
刁竞雄计算器报告.docx_第7页
第7页 / 共32页
刁竞雄计算器报告.docx_第8页
第8页 / 共32页
刁竞雄计算器报告.docx_第9页
第9页 / 共32页
刁竞雄计算器报告.docx_第10页
第10页 / 共32页
刁竞雄计算器报告.docx_第11页
第11页 / 共32页
刁竞雄计算器报告.docx_第12页
第12页 / 共32页
刁竞雄计算器报告.docx_第13页
第13页 / 共32页
刁竞雄计算器报告.docx_第14页
第14页 / 共32页
刁竞雄计算器报告.docx_第15页
第15页 / 共32页
刁竞雄计算器报告.docx_第16页
第16页 / 共32页
刁竞雄计算器报告.docx_第17页
第17页 / 共32页
刁竞雄计算器报告.docx_第18页
第18页 / 共32页
刁竞雄计算器报告.docx_第19页
第19页 / 共32页
刁竞雄计算器报告.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

刁竞雄计算器报告.docx

《刁竞雄计算器报告.docx》由会员分享,可在线阅读,更多相关《刁竞雄计算器报告.docx(32页珍藏版)》请在冰点文库上搜索。

刁竞雄计算器报告.docx

刁竞雄计算器报告

课程设计

课程名称VisualC++可视化编程

题目名称一个简单计算器的设计

学生学院计算机学院

专业班级2006级软件工程2班

学号3106006946

学生姓名刁竞雄

指导教师谭台哲

 

2008年12月31日

VisualC++可视化编程

——简单计算器的设计

一、实验目的与要求

1.实验目的:

目标是使学生了解可视化程序设计语言的基础知识,掌握面向对象编程的分析设计方法,以及与面向对象技术相关的一些软件开发技术,掌握在VisualC++6环境下进行可视化程序设计技术。

通过实践具体的项目,为他们进一步开展相关领域的学习和科研打下良好的基础。

2.实验要求:

本实验要求学生通过学习MFC应用程序的创建;MFC类库;VisualC++6程序结构;VisualC++6工程管理;MFC自定义类;VisualC++6程序的编译等,运用面向对象编程思想的整体知识,借助于VisualC++6编程工具,设计并实现一个简单计算器的程序设计工作。

3.实验内容本实验要求计算器能够实现以下功能:

1)二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计算

2)科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运行

3)以角度、弧度两种方式实现上述部分函数

4)具备历史计算的记忆功能

5)对不正确的表达式能指出其错误原因

6)具有可操作性、开放性,容易增加各种附加功能。

7)整理上机步骤、完成实验报告、提交可运行的程序,给出实验数据和实验结果。

二、实验完成情况

1)完成了实验要求的所有内容

2)可以处理含括号的表达式

3)增加了科学计算器的一些设施,如退格键BackSpace,清空与归零键,求阶乘,π,求Ln等

三、实验(设计)仪器设备和材料

软件环境:

WindowsXP操作系统,VisualC++6.0

四、实验方案

1.设计方案:

实验要求在WindowsXP操作系统的基础上借助于VisualC++6编程工具,设计并实现一个简单计算器的程序设计工作!

根据实验的要求,本次实验把计算器分为几个模块,模块之间是相互独立但有相互联系的!

他们为实现计算器的功能体现着自己的价值:

1)计算器外观的设计

用MFCAppWizard创建一个DialogBased的对话框。

在Dialog上添加和布局控件。

2)基本按键的控制及关联

实现基本按纽与字符及字符串的关联和实现与控件的数据交换

3)运用对话框窗口实现各种数制的简单计算

分别实现计算器二进制、八进制、十进制、十六进制的简单计算,并能进行数学表达式的计算。

4)实现科学计算功能

调用科学计算函数,为计算器添加科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等

5)为部分科学计算函数添加角度与弧度两种数值表示形式

6)实现历史计算功能

7)程序容错处理

8)添加其它小功能,优化交互性功能并调整界面。

2.详细的设计方案

1)计算器外观的设计

建立一个对话框,将控件摆在合理的位置上。

各个控件的名称和功能如下所示:

ØEditBox

IDC_EDIT_INPUT,OnChangeEditInput演算显示框

IDC_EDIT_RESULT结果显示框

IDC_EDIT_History历史显示框

IDC_EDIT_M数据存储显示框

RadioButton

IDC_RADIO_Bin,OnRADIOBin二进制

IDC_RADIO_Oct,OnRADIOOct八进制

IDC_RADIO_DEC十进制

IDC_RADIO_Hex,OnRADIOHex十六进制

IDC_RADIO_DEGREE角度选择

IDC_RADIO_RADIAN弧度选择

ØButton

标准键:

IDC_Btn1,OnBtn11

IDC_Btn2,OnBtn22

IDC_Btn3,OnBtn33

IDC_Btn4,OnBtn44

IDC_Btn5,OnBtn55

IDC_Btn6,OnBtn66

IDC_Btn7,OnBtn77

IDC_Btn8,OnBtn88

IDC_Btn9,OnBtn99

IDC_BtnDot,OnBtnDot.

IDC_BtnNgt,OnBtnNgt+/-

IDC_BtnF,OnBtnF十六进制F

IDC_BtnA,OnBtnA十六进制A

IDC_BtnB,OnBtnB十六进制B

IDC_BtnC,OnBtnC十六进制C

IDC_BtnD,OnBtnD十六进制D

IDC_BtnE,OnBtnE十六进制E

IDC_BtnAdd,OnBtnAdd+

IDC_BtnMin,OnBtnMin-

IDC_BtnMul,OnBtnMul*

IDC_BtnDiv,OnBtnDiv/

IDC_BtnLbar,OnBtnLbar(

IDC_BtnRbar,OnBtnRbar)

IDC_BtnBack,OnBtnBackBACK

IDC_BtnPow,OnBtnPow乘方

IDC_BtnMod,OnBtnMod求模

IDC_BtnPi,OnBtnPiπ

IDC_BtnEe,OnBtnEee

科学计算器按键

IDC_BtnSin,OnBtnSinsin

IDC_BtnCos,OnBtnCoscos

IDC_BtnTan,OnBtnTantan

IDC_BtnArccos,OnBtnArccosacos

IDC_BtnCot,OnBtnCotcot

IDC_Arcsin,OnArcsinasin

IDC_BtnArctan,OnBtnArctanatan

IDC_BtnLog,OnBtnLoglog

IDC_BtnSh,OnBtnShsh

IDC_BtnCh,OnBtnChch

IDC_BtnTh,OnBtnThth

IDC_BtnLn,OnBtnLnln

IDC_BtnExp,OnBtnExp求e的x次方

IDC_BtnSqr,OnBtnSqr除方

IDC_Btn10exp,OnBtn10Exp求x的10次方

其它按键

IDC_BtnClean,OnBtnClean清空演算框

IDC_BtnMS,OnBtnMS存储一个数据

IDC_BtnMR,OnBtnMR将数据输出到对话框

IDC_BtnMC,OnBtnMC取出一个数

IDC_BtnMadd,OnBtnMadd将这个数对演算框里的数相加

IDC_BtnAbout调用ABOUT对话框,版权说明

2)计算功能

这一部分是整个程序的重点及核心部分,也是整个课程设计中遇到最难的问题,将采用一个简单的示意图表明计算时各个函数的调用关系。

以上函数各部分的功能如下:

MainPro()主函数

IsDigital()对函数数位进行检查

StoN()字符串转为数字

NtoS()数字转化为字符串

Oct2Dec()将八进制转换成十进制

Hex2Dec()将十六进制转换成十进制

Bin2Dec()将二进制转换成十进制

BraCheck()对函数中的括号进行检查

DelBracket()对各个括号内的数据进行运算

LocateLBra()对括号进行定位

SingleE()一个数据时,进行的科学计算

TwoE()两个数据时,进行的普通运算

MultiE()处理各种形式的运算

Calcu()对二元式进行计算

MinusMinus()处理“--”的情况

SynRes()返回错误结果

ModiResult()返回计算结果

程序的普通计算功能、科学计算功能、容错处理都包含在以上的主函数及调用函数里面。

普通计算功能主要包含于函数TwoE(),科学计算功能主要包含于函数于SingleE(),容错功能主要包含于函数MultiE()。

(1)实现各种数制的简单计算功能

可以描述为:

将每个过程拆分为二元计算过程进行运算。

CStringCCalculation:

:

TwoE(CStringstrEdit)

{doublex2,y,x1=StoN(strEdit);

strEdit=m_strTmp;

charop=strEdit.GetAt(0);

strEdit.Delete(0);

x2=StoN(strEdit);

if(m_strTmp!

="")return"ERROR_"+m_strTmp+"未知符号_";

if(op=='+'){y=x1+x2;}

elseif(op=='*'){y=x1*x2;}

elseif(op=='-'){y=x1-x2;}

elseif(op=='^'){y=pow(x1,x2);}

elseif(op=='/'){y=x1/x2;}

elseif(op=='%'){y=fmod(x1,x2);}

elsereturn"ERROR_"+m_strTmp+"未知运算符_";

returnNtoS(y);

}

(2)实现计算器科学计算功能

这个功能可以简单描述为:

将字符串读进程序中,并和相关字符进行匹配,接着调用各个数学函数进行运算。

CStringCCalculation:

:

SingleE(CStringop,doubledx)

{

if(op=="ln")

{

returnNtoS(log(dx));

}

elseif(op=="log")

{

returnNtoS(log10(dx));

}

elseif(op=="sqr")

{

returnNtoS(sqrt(dx));

}

elseif(op=="e^")

{

returnNtoS(exp(dx));

}

elseif(op=="abs")

{

returnNtoS(fabs(dx));

}

elseif(op=="ac")

{

returnNtoS(acos(dx));

}

elseif(op=="as")

{

returnNtoS(asin(dx));

}

elseif(op=="at")

{

returnNtoS(atan(dx));

}

if(m_bDegree)dx=dx*PI/180;

if(op=="tan")

{

returnNtoS(tan(dx));

}

elseif(op=="sin")

{

returnNtoS(sin(dx));

}

elseif(op=="cos")

{

returnNtoS(cos(dx));

}

elseif(op=="cot")

{

returnNtoS(1/tan(dx));

}

elseif(op=="sh")

{

returnNtoS(sinh(dx));

}

elseif(op=="ch")

{

returnNtoS(cosh(dx));

}

elseif(op=="th")

{

returnNtoS(sinh(dx)/cosh(dx));

}

elseif(op=="exp")

{

returnNtoS(pow(10,dx));

}

return"ERROR"+op+"_未知函数_";

}

(3)程序的具体运算过程及程序容错处理

程序容错处理包含在程序计算里面,程序运算的主体函数为:

voidCCalculation:

:

MultiE(CString*strEdit)

{

if(strEdit->IsEmpty())*strEdit="ERROR_函数表达式为空_";

if(IsDigital(*strEdit)){return;}

while

(1)/*处理所有的一元运算*/

{

for(inti=0;i

{

intpos=strEdit->Find(opt[i]);

if(pos!

=-1)

{

CStringstr=strEdit->Right(strEdit->GetLength()-pos-opt[i].GetLength());

doubledx=StoN(str);

if(m_strTmp==str){*strEdit="ERROR"+str+"_无法识别的函数_";return;}

strEdit->Delete(pos,strEdit->GetLength()-pos);

*strEdit+=SingleE(opt[i],dx)+m_strTmp;

MinusMinus(strEdit);

if(pos>=1)

{

charch=strEdit->GetAt(pos-1);

if(ch>=48&&ch<=57)

{*strEdit="ERROR_缺少二元运算符_";return;}

}

break;

}

}

if(i==FUNCNUM)break;

}

//按运算符优先级处理二元运算

intpos=-1;

while

(1)

{

pos=strEdit->Find('^');

if(pos==-1)break;

elseCalcu(strEdit,pos);

}

while

(1)

{

pos=strEdit->Find('/');

if(pos==-1)break;

elseCalcu(strEdit,pos);

}

while

(1)

{

pos=strEdit->Find('*');

if(pos==-1)break;

elseCalcu(strEdit,pos);

}

while

(1)

{

pos=strEdit->Find('%');

if(pos==-1)break;

elseCalcu(strEdit,pos);

}

pos=0;

if(strEdit->GetAt(0)=='-'||strEdit->GetAt(0)=='+')strEdit->Insert(0,"0");

while

(1)

{

inttmpos=strEdit->Right(strEdit->GetLength()-pos).Find('-');

if(tmpos==-1)break;

elsepos+=tmpos;

if(pos==0&&strEdit->GetAt(pos+1)=='-'||pos>0)

{

if(strEdit->GetAt(pos+1)=='+')

{

strEdit->Delete(pos+1);

pos=0;

continue;

}

/*********处理连减(如:

----1)的情况***********/

intnCount=0;

while

(1)

{

if(++pos>0)

{

if(strEdit->GetAt(pos)!

='-')break;

elsenCount++;

}

elsebreak;

}

if(nCount>0)

{

strEdit->Delete(pos-nCount-1,nCount+1);

if(nCount%2==0)strEdit->Insert(pos-nCount-1,"-");

elseif(pos-nCount-1>0)strEdit->Insert(pos-nCount-1,"+");

pos=0;

continue;

}

elsepos--;

/***********************************************/

if(pos>0&&strEdit->GetAt(pos-1)=='+')

{

pos++;

continue;

}

Calcu(strEdit,pos);

}

elsepos++;

}

pos=0;

while

(1)

{

pos=strEdit->Find('+');

//inttmpos=strEdit->Right(strEdit->GetLength()-pos).Find('+');

if(pos==-1)break;

//elsepos+=tmpos;

if(pos==0&&strEdit->GetAt(pos+1)=='+'||pos>0)

{

/*********处理连加(如:

++++1)的情况***********/

intnCount=0;

while

(1)

{

if(++pos>0)

{

if(strEdit->GetAt(pos)!

='+')break;

elsenCount++;

}

elsebreak;

}

if(nCount>0)

{

strEdit->Delete(pos-nCount-1,nCount+1);

strEdit->Insert(pos-nCount-1,"+");

pos=0;

continue;

}

elsepos--;

/***********************************************/

Calcu(strEdit,pos);

}

elsepos++;

}

}

(4)程序的其它各个主要调用函数主体程序如下:

CStringCCalculation:

:

MainPro(CStringstrEdit)

{

if(strEdit.IsEmpty())return"表达式不能为空";

Macro(&strEdit);

strEdit.MakeLower();//表达式全部小写

/**********给表达式加上保护括号************/

strEdit.Insert(0,"(");

strEdit+=")";

/******************************************/

intpos=strEdit.Find("");

intn=BraCheck(strEdit);

CStringstr;

str.Format("%d",abs(n));

if(n==1)strEdit+=")";

elseif(n==-1)strEdit.Insert(0,"(");

elseif(n>0)return"缺少"+str+"个右括号";

elseif(n<0)return"缺少"+str+"个左括号";

while(pos!

=-1)//去掉表达式中的空格符

{

strEdit.Delete(pos);

pos=strEdit.Find("");

}

Oct2Dec(&strEdit);//将表达式中的八进制数转换成十进制

Hex2Dec(&strEdit);//将表达式中的十六进制数转换成十进制

Bin2Dec(&strEdit);//将表达式中的二进制数转换成十进制

while(!

IsDigital(strEdit))

{

DelBracket(&strEdit);

if(!

SynRes(&strEdit))returnstrEdit;

}

if(!

SynRes(&strEdit))returnstrEdit;

elsereturnModiResult(strEdit);

}

CStringCCalculation:

:

NtoS(doubled)

{

intdecimal,sign;

char*buffer;

buffer=_ecvt(d,16,&decimal,&sign);

CStringstr=buffer;

if(decimal>=0&&decimal<=16)str.Insert(decimal,".");

elseif(decimal>16)

{

for(inti=str.GetLength();i

str+=".0";

}

else

{

for(inti=0;i<-decimal;i++)str.Insert(0,"0");

str.Insert(0,".");

}

if(sign==1)str.Insert(0,"-");

returnstr;

}

doubleCCalculation:

:

StoN(CStringstr)

{

char*stopstring;

doublex;

x=strtod(str.GetBuffer(0),&stopstring);

m_strTmp=stopstring;

returnx;

}

intCCalculation:

:

LocateLBra(CStringstrEdit

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2