科学计算器课程设计报告C课程设计集团标准化工作小组 [Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]计算机科学与技术学部C++课程设计题目科学计算器学部计算机科学与技术班级计科1103 指导教师李军姓名刘明学号2012年6月27日摘要计算器的产生和发展是建立在电子计算机基础之上的。
硬件方面,自1946年第一台电子计算机诞生以来,计算机技术的发展可谓日新月异,从庞大的只能在实验室里供研究使用的计算机到如今能适应不同环境满足不同需求的各种各样的计算机;运算速度从每秒几千次到每秒几百亿次;处理器从焊有上百万个电子管的大的惊人的电子板到只有指甲大小的集成电路;现在计算机在硬件方面的发展已达到了每三个月更新换代一次的惊人速度。
软件方面,也已从机器语言、汇编语言、高级语言发展到现如今的第四代语言——非结构化、面向对象、可视化的语言。
在这个计算器里面,我们实现了简单的四则运算以及更高功能的科学计算,它的外观简洁美观,使人们能快捷简单的操作。
能准确的得到计算结果,大大减少了数字计算所需要的时间,为人们的生活带来便利。
此系统在Windows 7环境下,使用VC++ 进行编写。
简单计算器包括双目运算和单目运算功能,双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦,对数,开方,阶乘,倒数,进制转换等运算。
可对其输入任意操作数,包括小数和整数及正数和负数进行以上的所有运算并能连续运算。
并且包含清除,退格功能等。
我们所做的计算器其功能较Windows 7下的计算器还是很不够多,没有其菜单的实现功能项,没有其小巧的标准计算器。
关键词:计算器;运算;VC++等课程设计任务分配表:采用的类的数据类型:class CCalculatorDlg : public CDialog{public:void clean_aliter();CString OLD_ANSWER;void out_change(int system);变量的定义以及初始化int Sel,EndSel; //定义输入或插入时光标的位置int Expr_pos; //词法分析表达式时,标记当前字符位置int OS_pos ; //操作数栈顶位置int old_pos; //历史表达式的位置int old_head; //历史表达式数组中最最前位置int old_back; //历史表达式数组中最最后位置int error_mark; //标记表达式错误int parentheses_count; //记录表达式中括号的个数double operand_Stack[200]; //操作数栈CString old_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(""); //初始化第三章系统实现窗体设计利用MFC AppWinzard生成计算器应用程序框架具体步骤如下:(1)执行VC++ 程序,选择文件——新建命令,转到工程选项卡,选择MFC AppWizard(exe)选项,然后在工程名称输入名字,一般以C开头,也可以自定义,位置路径自定义。
(2)单击确定,弹出MFC 应用程序向导-步骤1对话框。
选中单选按钮基本对话框,单击完成即可,如图所示:(1)为控件添加成员变量已经在系统设计里面列举出,这里就不再重复;(2)为控件添加消息,查看-类向导命令,转到Message Maps选项卡,为控件添加BN_CLICKED消息,单击确定即可,具体哪些控件这里就不再详细介绍了。
程序核心代码void CCalculatorDlg::OnNumberKey(UINT nID) //按键输入{(Sel,EndSel); //得到输入框的光标位置switch(nID){// 在光标位置插入按钮表示的字符,在输入框插入相应的数值case IDC_0:{ (Sel,"0");break;}case IDC_1:{ (Sel,"1");break;}case IDC_2:{ (Sel,"2");break;}case IDC_3:{ (Sel,"3");break;}case IDC_4:{ (Sel,"4");break;}case IDC_5:{ (Sel,"5");break;}case IDC_6:{ (Sel,"6");break;}case IDC_7:{ (Sel,"7");break;}case IDC_8:{ (Sel,"8");break;}case IDC_9:{ (Sel,"9");break;}case IDC_A:{ (Sel,"A");break;}case IDC_B:{ (Sel,"B");break;}case IDC_C:{ (Sel,"C");break;}case IDC_D:{ (Sel,"D");break;}case IDC_E:{ (Sel,"E");break;}case IDC_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<operand_Stack[OS_pos-1]){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;}}提示错误的核心代码void CCalculatorDlg::error(int error_type) //错误类型{ //错误处理switch(error_type){case 1: {m_result="错误:缺少操作数!";break;}case 2: {m_result="错误:括号不匹配!";break;}case 3: {m_result="错误:函数名不正确!!";break;}case 4: {m_result="错误:非法输入!!";break;}case 5: {m_result="错误:出现除数为零!!";break;}case 6: {m_result="错误:函数缺少括号!!";break;}case 7: {m_result="错误:缺少运算符!!";break;}case 8: {m_result="错误:阶乘操作数不是整数!!";break;}case 9: {m_result="asin和acos函数计算必须在[-1,1]内!!";break;}}error_mark=1; }voidCCalculatorDlg::getword(WordType&w_type,Operator&Fun_Ope,intsyste m)//进制转为浮点型{//词法分析器,参数w_type,Fun_Ope,system分别表示单词类型,操作运算类型,进制类型intt=();if(t<=0){error(4);return;}//表达式为空则返回if(Expr_pos<t){ if((m_expression[Expr_pos]>='0'&&m_expression[Expr_pos]<='9')||(m_e xpression[Expr_pos]>='A'&&m_expression[Expr_pos]<='F')){//当前字符为数字则转换为浮点数压入操作数栈if((Expr_pos+1)<t&&m_expression[Expr_pos]=='0'&&m_expression[Expr_pos +1]=='0'&&m_Radio1!=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<t&&m_expression[Expr_pos]>='a'&& m_expression[Expr_po s]<='z'){ 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;}}void CCalculatorDlg::OnOctal() //八进制单选按钮消息响应函数{// TODO: Add your control notification handler code here WordType type ;Operator Ope;CString result;int system;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);}void CCalculatorDlg::OnBinary() //二进制单选按钮消息响应函数{// TODO: Add your control notification handler code here //E_AddSub();WordType type ;Operator Ope;CString result;int system;system = m_Radio1;m_Radio1 = 3 ;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("");}(FALSE);(FALSE);(FALSE);(FALSE);(FALSE);(FALSE);(FALSE);(FALSE);(FALSE);(FALSE);(FALSE);(FALSE);(FALSE);(FALSE); (FALSE); }第四章系统运行测试以及运行界面程序主界面测试测试测试过程中要判断是否成功,要分析程序界面的变化和计算数据的结果是否正确以及各功能键是否能正常实用。