刁竞雄计算器报告.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();istr+=".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