科学计算器课程设计报告C课程设计修订稿.docx
- 文档编号:17472837
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:19
- 大小:109.69KB
科学计算器课程设计报告C课程设计修订稿.docx
《科学计算器课程设计报告C课程设计修订稿.docx》由会员分享,可在线阅读,更多相关《科学计算器课程设计报告C课程设计修订稿.docx(19页珍藏版)》请在冰点文库上搜索。
科学计算器课程设计报告C课程设计修订稿
集团标准化工作小组[Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]
科学计算器课程设计报告C课程设计
计算机科学与技术学部
C++课程设计
题目科学计算器
学部计算机科学与技术
班级计科1103
指导教师李军
姓名刘明
学号
2012年6月27日
摘要
计算器的产生和发展是建立在电子计算机基础之上的。
硬件方面,自1946年第一台电子计算机诞生以来,计算机技术的发展可谓日新月异,从庞大的只能在实验室里供研究使用的计算机到如今能适应不同环境满足不同需求的各种各样的计算机;运算速度从每秒几千次到每秒几百亿次;处理器从焊有上百万个电子管的大的惊人的电子板到只有指甲大小的集成电路;现在计算机在硬件方面的发展已达到了每三个月更新换代一次的惊人速度。
软件方面,也已从机器语言、汇编语言、高级语言发展到现如今的第四代语言——非结构化、面向对象、可视化的语言。
在这个计算器里面,我们实现了简单的四则运算以及更高功能的科学计算,它的外观简洁美观,使人们能快捷简单的操作。
能准确的得到计算结果,大大减少了数字计算所需要的时间,为人们的生活带来便利。
此系统在Windows7环境下,使用VC++进行编写。
简单计算器包括双目运算和单目运算功能,双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦,对数,开方,阶乘,倒数,进制转换等运算。
可对其输入任意操作数,包括小数和整数及正数和负数进行以上的所有运算并能连续运算。
并且包含清除,退格功能等。
我们所做的计算器其功能较Windows7下的计算器还是很不够多,没有其菜单的实现功能项,没有其小巧的标准计算器。
关键词:
计算器;运算;VC++等
课程设计任务分配表:
表1分配信息表
姓名
主要工作
组长
刘明
程序设计和编写
组员
舒兆月
实验报告书的制作
凡力强
实验报告书的制作
课程设计成绩表:
表2成绩表
姓名
学号
班级
成绩
组长
刘明
计科1103
组员
舒兆月
计科1103
凡力强
计科1103
采用的类的数据类型:
classCCalculatorDlg:
publicCDialog
{
public:
voidclean_aliter();
CStringOLD_ANSWER;
voidout_change(intsystem);
CCalculatorDlg(CWnd*pParent=NULL);
m_POINT
IDC_POW
x^y
m_Pow
IDC_SQRT
Sqrt
m_SQRT
IDC_DIVID
/
m_DIVID
IDC_CE
CE
m_CE
IDC_C
C
m_C
IDC_BACKSPACE
Backspace
m_BACKSPACE
IDC_Ln
Ln
m_LN
IDC_Log
Log
m_LOG
IDC_Sin
Sin
m_SIN
IDC_Cos
Cos
m_COS
IDC_Tan
Tan
m_TAN
IDC_ACOS
acos
m_ACOS
IDC_ATAN
atan
m_ATAN
IDC_XOR
Xor
m_Xor
IDC_BUTTON43
MS
m_BUTTON43
IDC_MOD
Mod
m_MOD
IDC_BUTTON40
Dms
m_BUTTON40
IDC_BUTTON49
Ave
m_BUTTON49
IDC_BUTTON48
Sum
m_BUTTON48
IDC_BUTTON47
S
m_BUTTON47
IDC_NOT
Not
m_NOT
IDC_BUTTON46
Dat
m_BUTTON46
IDC_PI
pi
m_PI
IDC_BUTTON42
M+
m_BUTTON42
IDC_BUTTON45
MC
m_BUTTON45
IDC_Equal
=
m_EQUAL
变量的定义以及初始化
intSel,EndSel;//定义输入或插入时光标的位置
intExpr_pos;//词法分析表达式时,标记当前字符位置
intOS_pos;//操作数栈顶位置
intold_pos;//历史表达式的位置
intold_head;//历史表达式数组中最最前位置
intold_back;//历史表达式数组中最最后位置
interror_mark;//标记表达式错误
intparentheses_count;//记录表达式中括号的个数
doubleoperand_Stack[200];//操作数栈
CStringold_expression[20];//表达式历史记录
//以上为定义部分,以下为初始化部分
Sel=0;//输入的光标位置
EndSel=0;//插入光标的位置
Expr_pos=0;//当前字符的位置
OS_pos=0;//操作数栈顶位置
old_pos=old_head=old_back=0;//历史表达式的位置
error_mark=0;//表达式错误
parentheses_count=0;//括号的个数
OLD_ANSWER=_T("");//初始化
第三章系统实现
窗体设计
利用MFCAppWinzard生成计算器应用程序框架具体步骤如下:
(1)执行VC++程序,选择文件——新建命令,转到工程选项卡,选择MFCAppWizard(exe)选项,然后在工程名称输入名字,一般以C开头,也可以自定义,位置路径自定义。
(2)单击确定,弹出MFC应用程序向导-步骤1对话框。
选中单选按钮基本对话框,单击完成即可,如图所示:
图文件新建示意图
(1)为控件添加成员变量已经在系统设计里面列举出,这里就不再重复;
(2)为控件添加消息,查看-类向导命令,转到MessageMaps选项卡,为控件添加BN_CLICKED消息,单击确定即可,具体哪些控件这里就不再详细介绍了。
程序核心代码
voidCCalculatorDlg:
:
OnNumberKey(UINTnID)//按键输入
{
(Sel,EndSel);//得到输入框的光标位置
switch(nID)
{//在光标位置插入按钮表示的字符,在输入框插入相应的数值
caseIDC_0:
{(Sel,"0");break;}
caseIDC_1:
{(Sel,"1");break;}
caseIDC_2:
{(Sel,"2");break;}
caseIDC_3:
{(Sel,"3");break;}
caseIDC_4:
{(Sel,"4");break;}
caseIDC_5:
{(Sel,"5");break;}
caseIDC_6:
{(Sel,"6");break;}
caseIDC_7:
{(Sel,"7");break;}
caseIDC_8:
{(Sel,"8");break;}
caseIDC_9:
{(Sel,"9");break;}
caseIDC_A:
{(Sel,"A");break;}
caseIDC_B:
{(Sel,"B");break;}
caseIDC_C:
{(Sel,"C");break;}
caseIDC_D:
{(Sel,"D");break;}
caseIDC_E:
{(Sel,"E");break;}
caseIDC_F:
{(Sel,"F");break;}
}
Sel++;//光标后移
UpdateData(FALSE);
(Sel,Sel);//更新输入框光标后移位置
UpdateData(FALSE);
}
voidCCalculatorDlg:
:
compute(OperatorOp)
{//根据操作计算类型,计算结果
switch(Op)
{
caseOpAdd:
{operand_Stack[OS_pos-2]+=operand_Stack[OS_pos-1];OS_pos--;break;}
caseOpSubtract:
{operand_Stack[OS_pos-2]-=operand_Stack[OS_pos-1];OS_pos--;break;}
caseOpMultiply:
{operand_Stack[OS_pos-2]*=operand_Stack[OS_pos-1];OS_pos--;break;}
caseOpDivide:
{if(operand_Stack[OS_pos-1]==0){error(5);break;}
else
{operand_Stack[OS_pos-2]/=operand_Stack[OS_pos-1];
OS_pos--;break;
}}
caseOpMod:
{if(operand_Stack[OS_pos-1]==0){error(5);break;}
else
{__int64temp=0;
temp=(__int64)(operand_Stack[OS_pos-2]/operand_Stack[OS_pos-1]);
operand_Stack[OS_pos-1]*=temp;
operand_Stack[OS_pos-2]-=operand_Stack[OS_pos-1];
OS_pos--;break;}}
caseOpPower:
{operand_Stack[OS_pos-2]=pow(operand_Stack[OS_pos-2],operand_Stack[OS_pos-1]);
OS_pos--;break;}
caseOpLog:
{operand_Stack[OS_pos-1]=log10(operand_Stack[OS_pos-1]);break;}
caseOpLn:
{operand_Stack[OS_pos-1]=log(operand_Stack[OS_pos-1]);break;}
caseOpSqrt:
{operand_Stack[OS_pos-1]=sqrt(operand_Stack[OS_pos-1]);break;}
caseOpExp:
{operand_Stack[OS_pos-1]=exp(operand_Stack[OS_pos-1]);
break;}
caseOpSin:
{if(m_Radio2==0)operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*PI/180;
operand_Stack[OS_pos-1]=sin(operand_Stack[OS_pos-1]);
break;}
caseOpCos:
{if(m_Radio2==0)operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*PI/180;
operand_Stack[OS_pos-1]=cos(operand_Stack[OS_pos-1]);
break;}
caseOpTan:
{if(m_Radio2==0)operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*PI/180;operand_Stack[OS_pos-1]=tan(operand_Stack[OS_pos-1]);break;}
caseOpAsin:
{if(operand_Stack[OS_pos-1]>1||operand_Stack[OS_pos-1]<-1)
{error(9);return;}
operand_Stack[OS_pos-1]=asin(operand_Stack[OS_pos-1]);
if(m_Radio2==0)
operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*180/PI;
break;}
caseOpAcos:
{if(operand_Stack[OS_pos-1]>1||operand_Stack[OS_pos-1]<-1)
{error(9);return;}
operand_Stack[OS_pos-1]=acos(operand_Stack[OS_pos-1]);
if(m_Radio2==0)
operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*180/PI;
break;}
caseOpAtan:
{operand_Stack[OS_pos-1]=atan(operand_Stack[OS_pos-1]);
if(m_Radio2==0)
operand_Stack[OS_pos-1]=operand_Stack[OS_pos-1]*180/PI;
break;}
caseOpFactorial:
{if(OS_pos<=0){error
(1);return;}
longk;
k=(long)operand_Stack[OS_pos-1];
if(k {error(8);return;} __int64temp=1; for(longi=1;i<=k;i++) {temp*=i;//operand_Stack[OS_pos-1]*=i;} /*(_T("%I64X"),temp); UpdateData(FALSE); MessageBox("sdfsd");*/ operand_Stack[OS_pos-1]=(double)temp; break; }} 提示错误的核心代码 voidCCalculatorDlg: : error(interror_type)//错误类型 {//错误处理 switch(error_type) { case1: {m_result="错误: 缺少操作数! ";break;} case2: {m_result="错误: 括号不匹配! ";break;} case3: {m_result="错误: 函数名不正确! ! ";break;} case4: {m_result="错误: 非法输入! ! ";break;} case5: {m_result="错误: 出现除数为零! ! ";break;} case6: {m_result="错误: 函数缺少括号! ! ";break;} case7: {m_result="错误: 缺少运算符! ! ";break;} case8: {m_result="错误: 阶乘操作数不是整数! ! ";break;} case9: {m_result="asin和acos函数计算必须在[-1,1]内! ! ";break;} } error_mark=1;} voidCCalculatorDlg: : getword(WordType&w_type,Operator&Fun_Ope,intsystem)//进制转为浮点型 {//词法分析器,参数w_type,Fun_Ope,system分别表示单词类型,操作运算类型,进制类型 intt=(); if(t<=0){error(4);return;}//表达式为空则返回 if(Expr_pos {if((m_expression[Expr_pos]>='0'&&m_expression[Expr_pos]<='9')||(m_expression[Expr_pos]>='A'&&m_expression[Expr_pos]<='F')) {//当前字符为数字则 转换为浮点数压入操作数栈 if((Expr_pos+1) =3) {error(4); return ;}//数字前面有两个零,报错返回 switch(system) {//根据传来的进制类型,把字符串表示的数字转换为浮点数 case0: {if(! getword16()){error(4);return;}break;} case1: {if(! getword10()){error(4);return;}break;} case2: {if(! getword8()){error(4);return;}break;} case3: {if(! getword2()){error(4);return;}break;} default: {error(4);return;} } w_type=Tynum;//单词类型为数字 return; } if(m_expression[Expr_pos]>='a'&& m_expression[Expr_pos]<='z') {/*当前字符为字母则 ,把字母串保存到str中 */ char str[100]=""; int i=0; while(Expr_pos {str[i]=m_expression[Expr_pos]; i++; Expr_pos++;} if(Expr_pos>=t){error(3);w_type=TyFun;return;} //表达式结束,则报错 /* ***以下ifelse语句为匹配字符串*** */ if(strcmp(str,"ln")==0){Fun_Ope=OpLn;} elseif(strcmp(str,"log")==0){Fun_Ope=OpLog;} elseif(strcmp(str,"sqrt")==0){Fun_Ope=OpSqrt;} elseif(strcmp(str,"exp")==0){Fun_Ope=OpExp;} elseif(strcmp(str,"sin")==0){Fun_Ope=OpSin;} elseif(strcmp(str,"cos")==0){Fun_Ope=OpCos;} elseif(strcmp(str,"tan")==0){Fun_Ope=OpTan;} elseif(strcmp(str,"asin")==0){Fun_Ope=OpAsin;} elseif(strcmp(str,"acos")==0){Fun_Ope=OpAcos;} elseif(strcmp(str,"atan")==0){Fun_Ope=OpAtan;} //elseif(m_expression[Expr_pos]=='('){w_type=TyFun;} else{error(3);w_type=TyFun;return;} //匹配不到函数单词,报错 w_type=TyFun;return;} switch(m_expression[Expr_pos]) {/*当前字符为操作运算符,则设置单词类型,和操作运算*/ case'+': {Fun_Ope=OpAdd;Expr_pos++;w_type=oper;break;} case'-': {Fun_Ope=OpSubtract;Expr_pos++;w_type=oper;break;} case'*': {Fun_Ope=OpMultiply;Expr_pos++;w_type=oper;break;} case'/': {Fun_Ope=OpDivide;Expr_pos++;w_type=oper;break;} case'^': {Fun_Ope=OpPower;Expr_pos++;w_type=oper;break;} case'(': {Fun_Ope=Left_par;Expr_pos++;w_type=oper;break;} case')': {Fun_Ope=Right_par;Expr_pos++;w_type=oper;break;} case'%': {Fun_Ope=OpMod;Expr_pos++;w_type=oper;break;} default: {error(4);return;}//其他字符都为非法字符,报错 }} elseif(Expr_pos==t)w_type=TyEnd;//表达式已结束,返回 else{error(4);return;}} voidCCalculatorDlg: : OnOctal()//八进制单选按钮消息响应函数 { //TODO: Addyourcontrolnotificationhandlercodehere WordTypetype; OperatorOpe; CStringresult; intsystem; system=m_Radio1; m_Radio1=2; if()>0)m_expression=OLD_ANSWER; UpdateData(FALSE); getword(type,Ope,system); if(type==Tynum&&(! error_mark)&&(Expr_pos==())) { out_change(m_Radio1); result=m_result; clean_all(); m_expression=m_result=result; UpdateData(FALSE) Sel=(); (Sel,Sel); UpdateData(FALSE); } else { Expr_pos=0; OS_pos=0; error_mark=0; parentheses_count=0; m_result=_T(""); } (TRUE); (TRUE); (TRUE); (TRUE); (TRUE); (TRUE); (FALSE); (FALSE); (FALSE); (FALSE); (FALSE); (FALSE); (FALSE); (FALSE); (FALSE); } voidCCalculatorDlg: : OnBinary()//二进制单选按钮消息响应函数 { //TODO: Addyourcontrolnotificationhandlercodehere //E_AddSub(); WordTypetype; OperatorOpe; CStringresult; intsystem; system=m_Ra
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 科学 计算器 课程设计 报告 修订稿
![提示](https://static.bingdoc.com/images/bang_tan.gif)