吉首大学课程设计课程设计名称:简单的计算器专业班级: 10 网络工程学生姓名:胡申城唐茂林赖佳学号:20104045049 20104045006 201040450指导教师:鲁荣波老师课程序设计时间:2011.12.18-2011.12.25目录一内容 (1)二.设计要求 (2)三.计算器的算法 (2)四..流程图 (5)五.源程序 (7)六.执行结果 (8)七.课程设计总结 (3)八.参考书目 (3)一、内容编写一个功能基本完善的计算器程序,支持四则运算、乘方开方、指数对数等运算,支持带括号的表达式。
二、设计要求1) 程序采用字符界面2) 显示功能菜单,用户指定键即可进入相应功能3) 每次计算完成后输出一个提示符,要计算的数字或表达式由用户在提示后面输入4) 用户输入完按回车立即显示计算结果三、计算器的算法我们现在用的计算器多是一个数一个运算符的输入输出的。
一个比较具有现实意义的计算器,应该具有如下功能:1.能够实现整数的四则运算:如:1+6-9*4+4/32.能够实现小数的四则运算:如:0.2+7-4这样的计算器基本可以使用在我们生活中。
如果我们按照栈的使用来描述一下表达式的进栈出栈问题:表达式例如:1+9*4/4-5。
假设有栈D和数组S;S中放运算数,D栈放入运算符,优先级高的现运算,四则运算中,*和/优先级最高。
第一步:扫描到‘1’,是运算数,放入S;第二步:扫描到‘+‘进入D第三步:扫描到9;进S第四步:扫描‘*’,因为乘比加优先级高,所以9出栈实现:9*4,把结果入S,第五步:扫描到/,同样计算S的栈顶元素出栈,实现36/4,把结果如S第六步:扫描到—,进入D栈;第七步:扫描到‘5’,进S第八步:扫描到‘\0’,为结束符;把S栈顶元素栈S1,D顶元素出栈,然后S栈顶元素在出栈,实现减操作,接着S栈顶元素出栈,实现加操作。
具体进出栈如图:Next 为下一个字符或数字,run表示运行,空为不操作表1-1 运算数运算符进栈、出栈含括号的运算表达式本文是实现带括号的表达式的运算并输出结果。
与上面的相类似,只不过优先级最高的为‘(’,其次为‘*’和‘/’最后为‘+’和‘-’,最最后是‘)’。
当遇到‘(’时,就直接保留立即做下面遇到的优先级较高‘*’和‘/’的运算。
方法类似上面的:例如:3+5*(3-1)=我们实际上计算为:3-1=2;5*2=10;3+10=13. 按照我们给定的运算优先级,进栈出栈的实际情况为下图:其中D为运算符栈,S为数组表1-2 带括号的运算数运算符进栈、出栈所以,运行结果为13.四、流程图4.1主体流程图4.2细节程序的流程图2-1 计算带括号的表达式流程图五、源程序编写(附上了运行图)#include<stdio.h>#include<math.h>#include<stdlib.h>#define N 1000double expe[N]; //操作数栈int top_exp;char op[N]; // 运算符栈int top;int top_op;int mark;double calc(double a,double b,int c) //进行运算的函数{switch(c){case '+':return a+b;case '-':return a-b;case '*':return a*b;case '^':return pow(a,b);case '/':{if(b==0){printf("错误:除数含0啦\n\n");mark=0;return 0;}return a/b;;}}return 0;}char Priority(char y,char x) //判断优先级的函数{char ch='<';switch(x){case '+':case '-':if(y=='(' || y=='\0') ch='>';break;case '*':case '/':case '^':if(y=='(' || y=='\0'|| y=='+' || y=='-') ch='>';break;case '(':ch='>';break;case ')':if(y=='(') ch='=';break;case '\0':if(y=='\0') ch='=';break;}return ch;}void process(char *str) //处理表达式{double a,b;char c;double x,s;int i=0,flag,t;while (str[i]!='\0' || op[top_op]!='\0'&&mark){if (str[i]>='0' && str[i]<='9'){x=0, flag=0,t=1;while (str[i]>='0' && str[i]<='9'||str[i]=='.'){if(flag) t*=10;if(str[i]=='.') flag=1;else{x=x*10+ str[i] - '0';}i++;}expe[++top_exp]=x/t;}else{if(str[i]=='l') //处理对数{i+=2;if (str[i]>='0' && str[i]<='9'){s=0;flag=0,t=1;while (str[i]>='0' && str[i]<='9'||str[i]=='.'){if(flag) t*=10;if(str[i]=='.') flag=1;else{s=s*10+ str[i] - '0';}i++;}expe[++top_exp]=log10(s);}continue;}switch (Priority(op[top_op],str[i])) /判断操作符的优先级{case '>':op[++top_op]=str[i];i++;break;case '<':c=op[top_op--]; //先把优先级高的操作符出栈b=expe[top_exp--]; //运算的2个操作数出栈a=expe[top_exp];expe[top_exp]=calc(a,b,c); //calc(a,b,c)运算出来的2个操作数,把结果入栈break;case '=':top_op--;i++;break;}}}}int main(){char str[N];int n;int flag=1;while(flag){printf("〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n");printf("◆◆\n");printf("◆说明;本计算器支持四则运算、乘方开方、指数对数等运算,支持带括号的表达式◆\n");printf("◆乘方和指数所用符号为^号, 对数用的符号为两个字符'lg'构成◆\n");printf("◆◆\n");printf("◆1:请输入将要计算的表达式2:退出计算器◆\n");printf("〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n");printf("请选择相应的阿拉伯数字:");scanf("%d",&n);system("cls");if(n==1){printf("请输入将要计算的表达式:");mark=1;top_exp=-1;top_op=0;op[top_op]='\0';scanf("%s",str);process(str);if(mark){printf("〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇\n");printf("所得结果为:%s=%lf\n",str,expe[top_exp]);printf("〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇\n\n");}}else{flag=0;}}return 0;}六、执行结果图1 计算器的主界面图2 进行简单的四则运算图3 进行乘方运算图4 进行开方运算图5 进行指数运算七、心得体会本次课程实验是设计一个简单计算器。
这次的课程设计我们这组成员都有不少的收获:在分配好题目之后,我们组立即分配任务,时不时的讨论,彼此增进了解。
通过课程设计,学会了更多的计算机知识,觉得编程是一件很有意思的事,特别是课程设计完成之后的那种心情,难以言表。
同时增强对不同问题的运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,规范编程思想,为以后在专业课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下了基础。
当然也遇到了很多的犯了很多的错,这些都让我们意识到编写C语言是需要一些耐心、细心的。
更让我们体会到团队精神的重要性。
八、参考书目[1] 谭浩强.《C程序设计》.清华大学出版社[2] 谭浩强.《C++程序设计》.清华大学出版社[3]严蔚敏、吴伟民.《数据结构》.清华大学出版社。