数学与计算机学院课程设计说明书课程名称: 面向对象程序设计-课程设计课程代码:题目: 计算器年级/专业/班:学生姓名:学号:开始时间:2011 年 5 月28日完成时间:2011 年6月 27 日课程设计成绩:指导教师签名:年月日目录1 引言 (1)1.1问题的提出 (1)1.2任务与分析 (1)2.1加法功能 (2)2.2减法功能 (2)2.3乘法功能 (2)2.4除法功能 (2)2.5开平方功能 (2)2.6四则混合运算功能 (2)2.7显示功能 (2)3 程序运行平台 (3)4 总体设计 (3)5 程序类的说明 (4)6 模块分析 (6)6.1加法模块 (6)6.2减法模块 (7)6.3乘法模块 (8)6.4除法模块 (10)6.5开方模块 (11)6.6求余模块 (13)6.7四则混合运算模块 (14)7 系统测试 (22)8 结论 (27)参考文献 (28)摘要本课程设计是为了实现一个简单计算器,该计算器类似于windows附件中自带的计算器。
分析了现在人们对数据的处理需求,利用系统平台Windows 2000XP,程序设计语言采用面向对象程序设计语言C++,利用Visual C++编程实现了该系统。
该系统具有数据录入,数据修改,数据处理,数据显示等功能。
用户根据系统界面提示,输入需要处理的数据,系统根据要求实现加、减、乘、除以及开方等功能。
关键词:计算器;程序设计;C++1 引言1.1 问题的提出在现在这个现代化的经济社会中,经常会涉及到大量数据的处理。
这时计算器就显得相当重要,计算器系统允许人们录入大量数据,实现各种运算功能。
本课程设计主要在运算过程中,如果通过计算器来完成,就会减少计算量,该程序即可以在简单计算器键面下进行简单运算,也可以在科学计算器键面下进行高级的科学计算。
并且可以分别计算弧度、角度的三角函数的计算等较为复杂的运算。
1.2任务与分析本课程设计的主要目的是通过计算器的来完成各种功能的运算过程,这样可以减少计算量。
该计算器可以实现加、减、乘、除运算以及平方根运算,也可以实现四则混合运算。
数据操作既可以实现整数操作也可以实现实数的操作。
2 程序的主要功能2.1加法功能可以实现整数和实数的相加运算。
2.2减法功能可以实现整数和实数的相减运算。
2.3 乘法功能可以实现整数和实数的乘法运算。
2.4除法功能可以实现整数和实数的除法运算。
2.5开平方功能可以实现整数和浮点数的求平方根运算2.6四则混合运算功能可以实现整数和实数的四则混合运算。
2.7显示功能显示用户输入的数据,并显示处理后的结果。
3 程序运行平台VC++6.0具体操作如下:建立工程Calculator ,添加相应的源文件Main 和Mixoperation.h ,最后编译,链接,执行。
4 总体设计由本系统的要求可以得到相应的总体设计模块:图4.1 计算机总体框架图计算器减法运算加法运算求余运算开方运算除法运算乘法运算显示功能5 程序类的说明•Operation类的声明//-----operation类(+ 、-、 *、 / 、remainder、sqrt、mixopertion)定义----- class operation{double first;double second;public:void get(){cout<<"输入第一操作数:\n";cin>>first;cout<<"输入第二操作数:\n";cin>>second;cout<<"操作结果:";} //输入操作数函数void add(){cout<<first<<"+"<<second<<"="<< first+second<<endl;} //加法定义void subtract(){cout<<first<<"-"<<second<<"="<<first-second<<endl;} //减法定义void multiplication(){cout<<first<<"*"<<second<<"="<<first*second<<endl;} //乘法定义void divide(){cout<<first<<"/"<<second<<"="<<first/second<<endl;} //除法定义void square(){cout<<"输入要开平方的数:\n";cin>>first;cout<<first<<"开放后:"<<sqrt(first)<<endl;} //开方运算定义void FindRemainder(){cout <<first<<" % " <<second <<" = " <<(int)first % (int)second <<endl; } //求余定义void FindMixOperation();}; //四则混合运算定义6 模块分析6.1 加法模块用户根据需要选择加法功能,输入需要处理数据,系统根据用户要求实现整数和实数的相加功能加法流程图如下:开始第一操作get()第二操作数get()结果显示结束图 6.1 加法流程图实现加法功能的主要代码:void Plus(){system("cls");cout<<" ***********************************************\n";cout<<" * *\n";cout<<" * 相加运算 *\n";cout<<" * *\n";cout<<" * *\n";cout<<" ***********************************************\n";operation a; //调用类a.get ();a.add();}6.2 减法模块用户根据需要选择减法功能,输入需要处理数据,实现整数和实数的相减功能减法流程图:开始第一操作get()第二操作数get()结果显示结束图 6.2减法流程图实现减法功能的主要代码:void Minus(){ system("cls");cout<<" ***********************************************\n";cout<<" * *\n";cout<<" * 减法运算 *\n";cout<<" * *\n";cout<<" * *\n";cout<<" ***********************************************\n";operation b;b.get ();b.subtract();}6.3 乘法模块用户根据需要选择乘法功能,输入需要处理数据,实现整数和实数的相减功能乘法流程图如下:开始第一操作get()第二操作数get()结果显示结束图 6.3 乘法流程图实现乘法功能的主要代码:void Multiplication(){system("cls");cout<<" ***********************************************\n";cout<<" * *\n";cout<<" * 乘法运算 *\n";cout<<" * *\n";cout<<" * *\n";cout<<" ***********************************************\n";operation c;c.get ();c.multiplication ();}6.4 除法模块用户输入系统功能,输入数据实现整数与实数的除法功能除法流程图:开始第一操作get()第二操作数get()结果显示结束图 6.4 除法流程图实现除法功能主要代码:void Divide(){system("cls");cout<<" ***********************************************\n";cout<<" * *\n";cout<<" * 除法运算 *\n";cout<<" * *\n";cout<<" * *\n";cout<<" ***********************************************\n";operation d;d.get();d.divide();}6.5开方模块用户选择功能,输入处理数据,实现整数和实数的开方功能开方流程图:开始第一操作get()第二操作数get()结果显示结束图 6.5 开方流程图实现开方功能主要代码:void OpenSqrt(){system("cls");cout<<" ***********************************************\n";cout<<" * *\n"; cout<<" * 开方运算 *\n";cout<<" * *\n";cout<<" * *\n";cout<<" ***********************************************\n";operation e;e.square();}6.6 求余模块用户选择功能,输入数据,实现整数的求余求余流程图:开始第一操作get()第二操作数get()结果显示结束图 6.6 求余流程图实现求余功能的主要代码:void Remainder(){operation f;f.get();f.FindRemainder();}6.7四则混合运算模块用户选择功能,输入需要进行处理的多项式(不能输入空格符),实现整数和实数的四则混合运算混合运算流程图:开始输入多项式处理函数mixoperation()结果显示结束图 6.7 四则混合运算流程图实现四则混合运算功能的主要代码:#include<iostream>using namespace std;int check(char *c) //检查字符串中是否有除了 0-9, +,-,*,/,(,),之外的其他字符,有返回0无则为1,正确输出{int k=0;while(*c!='\0'){if((*c>='0' && *c<='9') || *c=='+' ||*c=='-' || *c=='*' || *c=='/' ||*c=='.' || *c=='(' || *c==')' )}else{cout<<"input error, there have the char not the math expression char!\n"; return 0;}if(*c=='(')k++;else if(*c==')')k--;c++;}if(k!=0){cout <<"input error, there is not have correct bracket '()'!\n";return 0;}return 1;}void move(char *f, double *s,int p) //将当前已经完成运算的运算符消去,同时将数值数组的位置调整以进行下一次运算{int i=0,len=strlen(f);for(i=p; i<len; i++) //将已经运算过的符号,空出来的位置用后面的符号来填充, { //即把乘和除号的位置用后面的加和减号填充f[i]=f[i+1];s[i]=s[i+1];}s[i]=s[i+1];f[len-1]='\0';}double convnum(char *c)// 将输入的字符串先将其小数点以前的部分复制到temp[]数组中{double num=0.0;double a=1.0;int i=0,p=0,len=0;char temp[100];int tempi=0;int start=0;int f=1; //正负符号指示器,若为1则为正数,为-1,此数为负数len=strlen(c);if(c[0]=='-'){start=1;f=-1;}for(i=start; i<len; i++){if(c[i]=='.'){p=i;break;}temp[tempi++]=c[i]; //将整数部分复制到temp[]中}temp[tempi]='\0';if(p!=0){for(i=p+1;i<len;i++) //将小数部分计算出来{if(c[i]=='.') //如果有多余的小数点,则表示输入错误{cout <<"there is more that one dot '.' in number!error!\n"; exit(0);}a=a*0.1;num+=(a*(c[i]-48));}}a=1.0;len=strlen(temp); //计算整数部分for(i=len-1;i>=0; i--){num=num+(a*(temp[i]-48));a*=10;}num=num*f;return num;}double good(char *c) //可递归函数{ //取得数值字符串,并调用convnum转换成doublechar g[100],number[30]; //g,保存当前的表达式串,number保存一个数的所有字符 char f[80]; //保存所有的符号的堆栈int fi=0; //保存符号的位置指针double s[80]; //保存当前所有的数的一个堆栈int si=0; //保存数字位置指针int k=0; // 若k=1则表示有一对括号int num=0,i=0; //num保存新括号内的字符数,i 保存number里的字符位置 int cc=0; //乘除符号数量int jj=0; //加减符号数量while(*c!='\0') //当p==1 和k==0时,表示已经把括号里的内容全部复制到g[100]中了{k=0;num=0;switch(*c){case '+': //当前字符为+-乘除时则表示case '-':case '*':case'/':f[fi++]=*c;if(*c=='*' || *c=='/')cc++;elsejj++;if(*(c-1)!=')'){number[i]='\0';i=0; //完成一个数字的复制,其位置指针i=0s[si++]=convnum(number);}break;case'(': //有括号,则将当前括号作用范围内的全部字符保存,作为 k++; //一个新的字符表达式进行递归调用good函数计算。