刁竞雄计算器报告.docx
- 文档编号:24024294
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:32
- 大小:283.84KB
刁竞雄计算器报告.docx
《刁竞雄计算器报告.docx》由会员分享,可在线阅读,更多相关《刁竞雄计算器报告.docx(32页珍藏版)》请在冰豆网上搜索。
刁竞雄计算器报告
课程设计
课程名称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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 刁竞雄 计算器 报告