当前位置:文档之家› C语言简单计算器的编写课程设计

C语言简单计算器的编写课程设计

C语言简单计算器的编写课程设计IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】2013-2014学年第二学期《高级语言程序设计》课程设计报告题目:简单计算器专业:数字媒体技术班级:13级1班姓名:邢洪波指导教师:王辉成绩:计算机与信息工程系二0一四年二月二十日1设计内容及要求利用本学期所学的《C语言程序设计》课程,运用相关知识,查阅相关资料,编写C语言程序,设计一个简单计算器,要求编写的简单计算器能够模拟windows系统的计算器,用户能够用键盘输入相关数据,能够进行简单的加、减、乘、除运算,并且在程序运行过程中能够正常的退出程序。

在计算器程序运行中,输入数据时如果遇到输入错误的情况,能够能过键盘上的退格键进行删除,并且重新输入正确的数据。

在数据输入完成后,如果需要放弃本次计算操作,可以利用程序中设置好的按键进行清零,并为下一次运算作准备。

运用相关知识,查阅相关资料,编写一个简单的计算器,能够实现简单的基本的加减乘除运算,在计算器工作时用户能利用键盘或鼠标进行相应操作。

程序基本功能要求实现完整,并有简单的验证。

程序还须有符合标准的程序设计报告。

2概要设计系统流程图系统流程图主要功能表3设计过程或程序代码#include<>#include<>#include<>/*malloc的头文件代表在内存中开辟存储空间*/ doublejisuan(chara[]){inti=1,j,k,m,cnt=0,t1=0,t2=0,t3=0;/*定义整型变量i,j,k,m,n,cnt,t1,t2,t3*/charnibo[50],zhan2[50];/*定义字符型数组*/doublex,n,l,z=0,zhan3[50];/*定义双精度变量x,n,l,z,zhan3[50]*/ typedefstruct/*表示可以用con定义结构体变量*/{doubled1;intd2;}dd;typedefstruct{dddata[50];inttop;}zhan1;zhan1*shu;/*定义指针变量*/shu=(zhan1*)malloc(sizeof(zhan1));shu->top=0;while(a[i]!='\0')/*外循环是用while语句*/{if(a[i]>='0'&&a[i]<='9')/*内循环使用if-else语句*/{z=0;j=i+1;while(a[j]>='0'&&a[j]<='9')/*内循环使用各种循环语句的嵌套*/ {j++;}j--;for(k=i;k<=j;k++){z=z*10+a[k]-'0';}j=j+1;x=z;if(a[j]=='.'){l=1;i=j+1;j=i+1;while(a[j]>='0'&&a[j]<='9')/*内循环使用各种循环语句的嵌套*/ {j++;}j--;for(k=i;k<=j;k++){n=pow,l);l=l+1;x=x+n*(a[k]-'0');}i=j+1;}elsei=j;shu->data[++shu->top].d1=x;shu->data[shu->top].d2=++cnt;nibo[++t1]='0'+shu->data[shu->top].d2;nibo[t1+1]='\0';}elseif(a[i]=='('){zhan2[++t2]=a[i];i++;}elseif(a[i]==')'){j=t2;while(zhan2[j]!='('){nibo[++t1]=zhan2[j];nibo[t1+1]='\0';j--;}t2=j-1;i++;}elseif(a[i]=='+')/*对加法的定义*/{while(t2>0&&zhan2[t2]!='(')/*定义当加号和括号同时出现时*/ {nibo[++t1]=zhan2[t2];/*将zhan2[t2]赋给nibo[++t2]*/nibo[t1+1]='\0';t2--;}zhan2[++t2]=a[i];i++;}elseif(a[i]=='-')/*对减法的定义*/{if(a[i-1]=='$'){a[0]='0';i=0;}elseif(a[i-1]=='('){a[i-1]='0';a[i-2]='(';i=i-2;t2--;}else{while(t2>0&&zhan2[t2]!='(')/*对括号的定义*/{nibo[++t1]=zhan2[t2];nibo[t1+1]='\0';t2--;}zhan2[++t2]=a[i];i++;}}elseif(a[i]=='*'||a[i]=='/')/*对乘法和除法的定义*/{while(zhan2[t2]=='*'||zhan2[t2]=='/'||zhan2[t2]=='^'||zhan2[t2]=='#')/*逻辑运算*/{nibo[++t1]=zhan2[t2];nibo[t1+1]='\0';t2--;}zhan2[++t2]=a[i];i++;}elseif(a[i]=='^'||a[i]=='#')/*逻辑运算中的或运算*/{while(zhan2[t2]=='^'||zhan2[t2]=='#'){nibo[++t1]=zhan2[t2];nibo[t1+1]='\0';t2--;}zhan2[++t2]=a[i];i++;}}while(t2>0){nibo[++t1]=zhan2[t2];/*将的zhan2[t2]值赋给nibo[++t1]*/ nibo[t1+1]='\0';/*碰到'\0'结束部分程序的运算*/t2--;}j=1;t3=0;while(j<=t1){if(nibo[j]>='0'&&nibo[j]!='^'&&nibo[j]!='#'){for(i=1;i<=shu->top;i++){if((int)(nibo[j]-'0')==shu->data[i].d2){m=i;break;}}zhan3[++t3]=shu->data[m].d1;}elseif(nibo[j]=='+')/*对加法的定义*/ {zhan3[t3-1]=zhan3[t3-1]+zhan3[t3];t3--;}elseif(nibo[j]=='-')/*对减法的定义*/ {zhan3[t3-1]=zhan3[t3-1]-zhan3[t3];t3--;}elseif(nibo[j]=='*')/*对乘法的定义*/ {zhan3[t3-1]=zhan3[t3-1]*zhan3[t3];t3--;}elseif(nibo[j]=='/')/*对除法的定义*/ {zhan3[t3-1]=zhan3[t3-1]/zhan3[t3];t3--;}elseif(nibo[j]=='^')/*对乘方的定义*/ {zhan3[t3-1]=pow(zhan3[t3-1],zhan3[t3]); t3--;}elseif(nibo[j]=='#')/*对开方的定义*/ {zhan3[t3]=sqrt(zhan3[t3]);}j++;}returnzhan3[t3];/*返回值*/}voidmain(){for(;;){charx,a[50];doublejieguo;inti=0;a[0]='$';printf("#表示开方,^表示乘方(支持负数)\n");/*对乘方和开方的定义*/ printf("请输入表达式无需输入=号直接回车可输出答案退出请输入q\n\n");scanf("%c",&x);if(x=='q')break;while(x!='\n')/*碰到'\0'结束部分程序的运算*/{a[++i]=x;scanf("%c",&x);}a[i+1]='\0';jieguo=jisuan(a);printf("\n");printf("结果为:%lf",jieguo);printf("\n\n\n");printf("退出请输入q继续请直接输入\n\n");}}4设计结果与分析系统测试结果如下:根据电脑所给的提示出现语法错误,缺少变量的定义大多的语法错误在通过书本参考下能够修改。

主要是平时看书不仔细、不太注意而产生的,如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式与使用的情况不太注意而造成不匹配;还有漏掉形参的定义是值不能传递等等。

这些语法错误有信息框的提示一般是能够排除的。

另外还有部分注释的位置也错了,最重要的是逻辑上的错误,一般电脑不容易发现。

所以更对程序仔细的检查。

经认真修改之后重新保存文件。

错误原因分析一缺少变量定义,定义位置不正确由于该程序相对来讲稍有些长,前后有些变量不容易联系起来,但是在错误信息的提示下一般还是很容易找到,不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置特别留意。

为减少这样的错误我后来还是用不同的变来名来表示,结果引起的那些错误解决了。

相关主题