版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+程序设计课程设计说明书实数型科学计算器专业: _班级: _姓名: _学号: _时间: _17目录一、课程设计任务描述1(一)设计题目1(二)设计要求1二、计算器中所用的符号及其含义1三、程序中的运算特色2(一)四则运算2(二)幂运算2(三)!阶乘2(四)三角函数计算2(五)计算以10为底的对数2(六)对于e和pi的计算2(七)括号使用及算式结束要求2四、流程图3五、程序部分功能实现截图4六、程序源代码5七、课程设计的评价、收获与建议19八、参考文献20一、课程设计任务描述(一)设计题目实数型科学计算器(二)设计要求1、开发平台: BC+ 3.1、VC+ 6.0或Borland C+ 6.0
2、。2、对设计内容的要求 源文件要采用多文件的工程结构;在源程序中必须使用类,输入输出要符合C+语言的特性; 功能必须完善,程序代码要有相应的注释; 代码要有一定的间隙与排版,界面应美观。3、对设计说明书的要求 设计过程、流程图及源代码; 对本次设计的评价、此次设计的收获与建议。4、说明书为打印件5、源文件要采用多文件的工程结构;在源程序中必须使用类,输入输出要符合C+语言的新特性。二、计算器中所用的符号及其含义输入的算式中负号要用下划线(_)代替,注意与减号区别。简单的四则运算按常规输入即可。对于阶乘:(1+3)!表示4的阶乘。pi代表圆周率,即3.1415926536,本计算器利用弧度进行三
3、角函数计算。计算以e(2.718281828)为底的自然对数请输入ln,如lne4=4,注意指数的输入要规范,计算算式的对数要在对数符号后面把算式括起来,计算以其他数为底的对数可利用对数换底公式。对于括号,本计算器的括号只有小括号();不接受中括号 和大括号 ,且算式一定要以等号(=)结束。表1 符号及其含义符号含 义+加-减*乘/除幂!阶乘pi圆周率sin正弦函数cos余弦函数tan正切函数log对角函数三、程序中的运算特色输入算式时,请按照下列规则输入:(一)四则运算+加 -减 *乘 /除按常规输入,负号用下划线(_)代替,注意将其与减号区别;可用括号()界定优先级。(二)幂运算乘方输入x
4、y(x的y次方)如236就是23的6次方;开方也这样输入如81(1/4)或者810.25表示81开4次方。(三)!阶乘6!表示1*2*3*4*5*6,(1+3)!表示4的阶乘,结果是24;1+3!表示1再加上3做阶乘的结果,是7。(四)三角函数计算pi代表圆周率,即3.1415926536,本计算器利用弧度进行三角函数计算;计算正弦请输入sin,余弦输入cos,正切输入tan;sin(pi/2)就是二分之弧度对应的正弦值(注意一定要打括号)其他依此类推。(五)计算以10为底的对数结束i5Y请输入log,如log1000=3,计算以e(2.718281828)为底的自然对数请输入ln,如lne4
5、=4,注意指数的输入要规范,如lne4=4,但是(lne)4=1,计算算式的对数要在对数符号后面把算式括起来,如ln(3+6*9),计算以其他数为底的对数可利用对数换底公式,如以2为底,16的对数可输入ln16/ln2或者log16/log2结果都是4。(六)对于e和pi的计算可直接通过输入e和pi进行数值计算。(七)括号使用及算式结束要求本计算器的括号只有小括号();不接受中括号 和大括号 ,且算式一定要以等号(=)结束。开始四、流程图输入需要的功能输入2输入0输入1退出程序计算算式使用说明按任意键回到主界面输入算式输出结果结束图3 例2-6程序流程图五、程序部分功能实现截图图1 欢迎界面图
6、2 使用说明界面图3 计算界面六、程序源代码/main.cpp#include<iostream>#include<cmath>#include<string>#include<iomanip>#include"1.h"using namespace std;int main() menu();return 0;/1.h#include<iostream>#include<cmath>#include<string>#include<iomanip>using namespace
7、 std;void menu();/位于calculate函数后面的菜单函数声明void guide();/位于主函数后面的指导函数的声明double D_Operate(double x,char op,double y) /双目运算符的运算定义 double a;/计算结果 switch(op) case'+': a=x+y;break; case'-': a=x-y;break; case'*': a=x*y;break; case'/': a=x/y;break; case'': a=pow(x,y);br
8、eak;/幂运算包括乘方和开方 /因为都是利用double进行运算,因此不定义取模运算 return a;double S_Operate(char op,double x) /前缀单目运算符的运算定义 double a;/计算结果 switch(op) case's': a=sin(x);break; case'c': a=cos(x);break; case't': a=tan(x);break; case'l': a=log10(x);break;/以10为底的对数 case'n': a=log(x);bre
9、ak;/以e(2.718281828)为底的对数 case'_': a=-x;break;/取负用下划线代替负号,定义为一元运算 return a;char Precede(char op1,char op2) /判断符号的优先级,op1在返回的结果符的左边,op2在右边/用于判定运算符的优先级,以决定是把运算符压栈,还是把栈内的运算符弹出来进行计算 if (op1='+'|op1='-')&&(op2='+'|op2='-'|op2=')'|op2='=')| (o
10、p1='*'|op1='/')&&(op2='+'|op2='-'|op2='*'|op2='/'|op2=')'|op2='=') |(op1=''&&(op2='+'|op2='-'|op2='*'|op2='/'|op2=')'|op2='='|op2='s'|op2='c'|op2=
11、39;t'|op2='_'|op2='l'|op2='n') |(op1='_'|op1='s'|op1='c'|op1='t'|op1='l'|op1='n')&&(op2='+'|op2='-'|op2='*'|op2='/'|op2=')'|op2='='|op2='s'|op2='c'|op2=
12、't'|op2='_'|op2='l'|op2='n') return '>'/上述情况下栈顶运算符优先级高于待定运算符,需弹栈 if (op1='('&&op2=')')|(op1='='&&op2='=') return '=' else return '<'int illegal_char(string s,int i)/非法输入字符判定函数 int j=0; while
13、(j<i) if (sj>='0'&&sj<='9') j+; else if (sj='+'|sj='-'|sj='*'|sj='/'|sj='.'|sj='('|sj=')'|sj=''|sj='!'|sj='e'|sj='_') j+; else if (sj='p'&&sj+1='i')|(sj=
14、39;l'&&sj+1='n') j+=2; else if (sj='s'&&sj+1='i'&&sj+2='n')|(sj='c'&&sj+1='o'&&sj+2='s')|(sj='t'&&sj+1='a'&&sj+2='n')|(sj='l'&&sj+1='o'&
15、amp;&sj+2='g') j+=3; /以上都是标准的数字字符和运算符,如若存在其他形式的字符,则是非法输入 else cout<<"程序终止,存在非法的字符输入!"<<endl; return 0; return 1;/没有非法字符返回1,否则返回0int match(string s)/栈结构的括号匹配检测函数int i=0,top=0;char stack50;while(si!='0')if (si='(')stacktop=si;top+;/push左括号压入栈内if (si=
16、39;)')if (stacktop-1='(')int a=i+1;stacktop-1=NULL;top-;/把与右括号匹配的左括号弹掉elsecout<<"括号输入有误"<<endl;return 0;/多了右括号,括号失陪,返回非法/pop'('i+;if (top!=0)cout<<"括号输入有误"<<endl;return 0;/多了左括号,括号失陪,返回非法return 1;/返回合法class NUMstack/运算数栈public:double nu
17、m1000;int top;void start()/初始化栈清空栈顶指针置底for(int i=0;i<1000;i+)numi=0;top=0;void push(char a)/因为有多位数的运算,因此不能一压栈就提升栈顶指针numtop=numtop*10+(a-'0');/把字符转成数因为每次入栈之前要乘10,所以初始化要清0 double pop()top-;double number=numtop;numtop=0;return number;/弹栈函数,弹掉栈顶元素,栈顶归0,top指针下降double getTop()/取栈顶元素,但不必弹栈return
18、 numtop-1;void lift()/提升top指针的函数top+;class OPERstack/运算符栈public:char oper1000;int top;void start()/初始化函数栈清空栈底放一"="用于判定算式结束 oper0='='for(int i=1;i<1000;i+) operi=NULL;top=1;/栈顶指针置于栈底的上一位 void push(char a) opertop=a;top+;/与数字栈不同一压栈就可以提升指针 char pop() top-;char op=opertop;opertop=NU
19、LL;return op;/弹出计算符,用于计算 char getTop() return opertop-1;/取栈顶符号,但不弹栈,可用于判定优先级 ; void calculate(string equation)/算式计算函数(关键函数)NUMstack number;/定义运算数栈变量numberOPERstack oper;/定义运算符栈变量opernumber.start();oper.start();/把两个栈初始化int i=0,len=0,k;char p,sig;double yuan1,yuan2;while(equationi!='0')len+;i+
20、;/计算等式长度lenif(equationlen-1!='=')cout<<"输入有误没有输入终止符号-等号"=""<<endl;return;/检测有没有结束符等号"="int le;le=illegal_char(equation,len-1);if (le=0)return;/有非法字符,不进行后续计算le=match(equation);if (le=0)return;/括号匹配非法,不进行后续计算for(i=0;i<len;i+)/初步确定合法后开始计算算式if (equati
21、oni='!')/阶乘是后缀单目运算符单独进行计算yuan1=number.pop();/弹出栈顶元素做阶乘if (yuan1=0)number.numnumber.top=0;/0的阶乘为0,压结果入栈number.lift();elsenumber.numnumber.top=1;for(k=1;k<=yuan1;k+)/阶乘循环number.numnumber.top=k*number.numnumber.top;number.lift();/结果入站else if (equationi>='0'&&equationi<=
22、'9')number.push(equationi);/压数字字符入栈if (equationi+1<'0'|equationi+1>'9')&&equationi+1!='.')number.lift();/当整个多位运算数读取完毕后,运算数栈栈顶指针才能提升 else if (equationi='p') number.numnumber.top=3.1415926536;/pi值即,圆周率,要压入数字栈number.lift();i+;/pi是两个字符所以要移动扫描算式的指针往后跳
23、一个 else if (equationi='e') number.numnumber.top=2.718281828459;/e,自然对数底数,压入运算数栈number.lift(); else if (equationi='.')/小数压栈代码 int x=1;while(equationi+x>='0'&&equationi+x<='9')number.numnumber.top+=(equationi+x-'0')/pow(10,x);/第x位小数入栈x+;x-;number.l
24、ift();i=i+x; else if (equationi='(') oper.push(equationi);/左括号无条件压栈 else/数阶乘左括号判断完毕后其他运算符的分类讨论 if(oper.top=1)/运算符栈为空运算符可以无条件入栈if(equationi='l'&&equationi+1='o')oper.push('l');else if(equationi='l'&&equationi+1='n')oper.push('n')
25、;/因为log和ln都是小写字母l开头,所以要分情况讨论 elseoper.push(equationi); else/运算符栈不为空则要进行优先级判断 char temp1=oper.getTop();/取出栈顶符号 char temp2;/待入栈符号 if (equationi='l'&&equationi+1='o')temp2='l' else if (equationi='l'&&equationi+1='n')temp2='n'/log与ln的再次讨论 e
26、lsetemp2=equationi;p=Precede(temp1,temp2); if (p='<')oper.push(temp2);/栈顶符优先级较低现在待定的运算符就可以入栈了 if (p='>'|p='=') char rep=p;/当栈顶符优先级不低于待入栈的符号,则运算符栈不停地弹栈 /进行运算直到低于待入栈符号为止,rep用于记录比较结果,要多次进行判断 while(rep='>'|p='=')&&(oper.top-1>0) sig=oper.pop();
27、 yuan1=number.pop(); yuan2=number.getTop();/靠前的一个运算数只要取得不要弹出来 if(sig='/'&&yuan1=0)/yuan1是双目运算符后面的第二运算元 cout<<"计算时出错!出现了除数为0的情况!"<<endl; return; if(sig=''&&yuan2<0&&yuan1>0&&yuan1<1&&(static_cast <int>(1/yuan
28、1)%2=0)/对负数开偶次根号的限制 cout<<"计算时出错!出现了负数开偶次根号的情况!"<<endl; return; if (sig='_'|sig='s'|sig='c'|sig='t'|sig='l'|sig='n')/若为前缀单目运算符 double tt;tt=S_Operate(sig,yuan1);number.numnumber.top=tt;/运算结果压回原来yuan1在栈内的位置number.lift();/提升指针temp1=
29、oper.getTop();rep=Precede(temp1,temp2);/再判优先级 else number.num(number.top)-1=D_Operate(yuan2,sig,yuan1);temp1=oper.getTop();rep=Precede(temp1,temp2);/双目运算符的计算 if(equationi=')')/如果栈外符是右括号要把与之匹配的左括号弹出栈外oper.pop(); else if(equationi='l'&&equationi+1='o')oper.push('l
30、39;);/代表log的l else if(equationi='l')&&(equationi+1='n')oper.push('n');/代表ln的n elseoper.push(equationi); if(equationi='s'|equationi='c'|equationi='t'|(equationi='l'&&equationi+1='o')i=i+2; if(equationi='l'&&am
31、p;equationi+1='n')i+; /对于不止一个字符的运算符,sin,log,ln等等,要移动扫描算式的指针,往后跳一个或两个 if(number.num0=ceil(number.num0)cout<<equation<<number.num0<<endl; elsecout<<equation<<fixed<<setprecision(8)<<number.num0<<endl;/输出结果控制精度8位小数 /调试时检查运算结束后站内情况的代码段void menu()/菜
32、单函数cout<<"实数型科学算式计算器"<<endl;cout<<endl;cout<<"欢迎使用o(_)o !"<<endl;cout<<"请选择你需要的功能:(0,1或者2)"<<endl;cout<<"-"<<endl;cout<<"1.使用说明"<<endl;cout<<"2.计算算式"<<endl;cout&l
33、t;<"0.退出程序"<<endl;cout<<"-"<<endl;cout<<"你的选择是:"int choice;cin>>choice;switch(choice)case 0:return;case 1:guide();break;case 2:system("cls");char go_on='y'string equation;while(go_on='y')cout<<endl<<
34、endl<<"请输入算式,以=(等号)结束:"<<endl;cin>>equation;calculate(equation);cout<<"继续使用吗?是请输入y 否则输入n:"cin>>go_on;/可以循环进行算式计算system("cls");menu(); void guide()/输入规则介绍说明书system("cls");cout<<"使用说明:"<<endl;cout<<"
35、输入算式时,请按照下列规则输入:"<<endl;cout<<"1.四则运算+加 -减 *乘 /除按常规输入,负号用下划线(_)代替,注意将其与减号区别;可用括号()界定优先级"<<endl;cout<<"2.幂:幂运算如下乘方输入xy(x的y次方)如236就是23的6次方;开方也这样输入如81(1/4)或者810.25表示81开4次方"<<endl;cout<<"3.!阶乘:6!表示1*2*3*4*5*6;(1+3)!表示4的阶乘,结果是24;1+3!表示1再加上3做阶乘的结果,是7"<<endl;cout<<"4.pi代表圆周率,即3.1415926536,本计算器利用弧度进行三角函数计算;计算正弦请输入sin,余弦 输入cos,正切输入tan;sin(pi/2)就是二分之弧度对应的正弦值(注意一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年房地产销售代理合同:涉及销售策略与佣金
- 2024停薪留职劳动合同范本:服务业适用3篇
- 2024年期土建工人劳动合同合同书一
- 2024年汽车生产线建设合同3篇
- 2024版保安行业标准化服务提供聘用合同
- 2024版游戏开发授权许可合同4篇
- 2024版大学生实习就业实习成果展示与推广服务合同2篇
- 2024版特许经营合同for连锁餐饮品牌with地域限制3篇
- 2024版废纸资源化利用购销合同3篇
- 2024年度夏塘里商业街3F商铺租赁合同7篇
- 2024年度建筑工程有限公司股权转让合同3篇
- 【MOOC】工程力学-浙江大学 中国大学慕课MOOC答案
- 工会十八大精神、工会法知识考试题库及答案
- 电力系统光纤通信运行管理规程
- 独轮车校本教材
- 超高层建筑的造价含国内著名超高层建筑成本数据
- 高速公路公路养护维修作业交通标志设置示意图(国标2015)
- 护士排班表(月表)
- 华为产品测试策略及验证计划模板
- 东华大学对硝基苯胺的制备实验报告doc
- 水利水电工程单位分部工程施工质量评定表(完整版)
评论
0/150
提交评论