C程序简单的加减乘除运算.doc_第1页
C程序简单的加减乘除运算.doc_第2页
C程序简单的加减乘除运算.doc_第3页
C程序简单的加减乘除运算.doc_第4页
C程序简单的加减乘除运算.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机技术基础课程设计C语言设计报告题目: 简单的加减乘除运算学院: 化学工程学院专业: 制药工程专业班级: 050607姓名: 王兰兰指导教师: 顾煜新 设计日期: 2007年1月6日一 . 选题背景 在现实生活中常需要对一些并不深奥但较长或繁琐的数字进行简单的计算,可大大提高工作效率,节约时间.该程序可运用到C语言中的大部分知识,并且简单易懂,在选择分支下判断符号的优先级别,调用加减乘除的计算函数并转化表达式即可完成程序的运行.选择该题目也有能力限制的原因,但不影响涵盖广泛的知识面.二 . 设计思路:加减乘除的运算均是双目运算,计算式涉及两个数据和一个计算符号,所以,首先定义两个结构体变量,在结构体变量中再分别定义两个栈, 所谓栈就是一个稍微复杂的数组,并且只能从后面加入数据和导出数据,就是所谓的后到先出,好比堆东西,在最上面的东西是最后放入的,但是却是最先取出的structfloat a100;int top; /*用来记录栈顶的变量*/ St; /*在外部定义了一个栈,好似定义了一个全局变量,此栈为数据栈*/structchar b100;int top; /也是用来记录栈顶的变量Op; /同上,此栈为运算符号栈 为了方便起见,选择用指针做参数来记录数据void Pop_St(float *e) /用指针作参数直接记录数据,方便 在连续计算中涉及到计算符号优先级别的比较,所以调用函数完成该比较.扩号的优先级别最高,其次是乘除,再次是加减,用,=,;else e=;else e=0&*p=0&*p=9)num=*p-0+num*10; /把用字符表示的数字转化为实际意义的数字,并且把一串字符数字变成有实际意义的数字,如1234这是一串字符,转化成1234,一千两百三十四putchar(*p);p+;Push_St(num); /把转化好的数字导入数据栈里num=0;putchar( );最后再比较读入符号的优先级别,进行计算,并返回计算函数的返回值,输出计算结果printf(nthe resule is %.fn,a);三,程序流程图将输入的表达式转化为有意义的数字和运算符号记为”栈顶的符号优先级别低于读取符号栈顶的符号优先级别等于读取符号栈顶的符号优先级别高于读取符号比较栈顶的符号和所读取符号的优先级别将输入内容分别储存进数据栈和和符号栈输入计算表达式(以字符串的格式)输出提示性表达语句输出运算结果输出”error expression”把栈顶的运算符扔了将读入的运算符导入栈将栈顶的运算符导出当栈不为空,将栈里的符号依次导出,调动运算函数运算除数不为零除数为零=读取优先级别的判定四 . 程序清单:#include #include #define Null 0structfloat a100;int top; /*用来记录栈顶的变量*/ St; /*在外部定义了一个栈,好似定义了一个全局变量,此栈为数据栈*/structchar b100;int top; /*也是用来记录栈顶的变量*/Op; /*同上,此栈为运算符号栈*/ void Push_St(float e)if (St.top!=99) /*判断栈顶是否满了*/ St.top+; /*没满的话栈顶向前进一个*/St.aSt.top=e; /*在栈顶处放入一个数据*/else printf (Stack is Fulln); /*把一个数据推入栈中*/ void Pop_St(float e) if (St.top)!=-1) /*如果栈不是空的话*/e=St.aSt.top; /*把栈顶数据导出来 */ St.top-; /*栈顶向回退一个*/else printf(Stack is emptyn); /*从栈中取出数据*/void Push_Op(char e) /*此函数同上Push_St(float e),只不过因为是两个栈,所以需另编一个*/if (Op.top!=99)Op.top+;Op.bOp.top=e;else printf(Stack is Fulln);void Pop_Op(char e) /*此函数同上Pop_St(float e),只不过因为是两个栈,所以需另编一个*/if (Op.top!=-1)*e=Op.bOp.top;Op.top-;else printf(Stack is Emptyn);char Precede(char p) /*这里就是比较优先级了,如果运算符栈顶的符号的优先级比现在读取的符号的优先级高的话,就返回一个,反之返回一个。*/char e; switch(p)case +:case -:if (Op.top!=-1&Op.bOp.top!=() e=;else e=;else e=;else e=;break;case (:e=;break;default: printf(Errorn);return e;float Operate (float a,char e,float b) /*运算*/float c;switch (e) /*判断符号,选择相应的运算*/case +: c=a+b;break;case -:c=a-b;break;case *: c=a*b;break;case /: c=a/b;break;default: printf(errorn);return c;void trans(char str) /*这里是把我们习惯的运算表达使转化成逆波兰表达式,这是本程序的核心。*/char *p,x,theta;float num=0,b,a,c;St.top=-1;Op.top=-1; /*初始化两个栈,使两个栈为空*/p=str;printf(Please input the expression:);gets(str); /*输入表达式*/printf (the change exprission is );while (*p!=0)if(*p=0&*p=0&*p=9)num=*p-0+num*10; /*把用字符表示的数字转化为实际意义的数字,并且把一串字符数字变成有实际意义的数字,如1234这是一串字符,转化成1234,一千两百三十四*/putchar(*p);p+;Push_St(num); /*把转化好的数字导入数据栈里*/num=0;putchar( );if (*p!=0) /*如果输入的是运算符,这里默认输入的除了数字就是运算符*/switch(Precede(*p) /*这里就是判断现在读入的运算符和运算符栈里的运算符的优先级*/case : /*如果返回的是的话,把运算符栈顶的运算符导出来,再把另一个数据栈里面的栈顶以及后面的两个数据导出来,进行运算*/Pop_Op(&theta);Pop_St(&b);Pop_St(&a);if (theta=/&(b=0) /*当运算符号为/时且a-b=0这时候是错误所以c=-1;*/c=-1;break;else /*如果正常就输出运算符和数据并进行运算,把运算结果再次推入数据栈*/printf(%c ,theta);Push_St(Operate(a,theta,b);break;default:break;if (c!=-1) /*这里如果c不等于-1那么把栈里面未输出的符号挨个导出运算*/while(Op.top!=-1)Pop_Op(&theta);putchar( );printf(%c,theta);Pop_St(&b);Pop_St(&a);if (theta=/&(b=0) /*注意,在导出栈里面未输出时可能也会出现除数为零的可能*/printf(nerror expressionn); /*这时c=-1*/c=-1;break;Push_St(Operate(a,theta,b);if(c!=-1) /*如果c还不是-1时才会输出结果*/Pop_St(&a);printf(nthe resule is %.fn,a);else printf(error exprission);void main() /*因为我们学的是数据结构,强调数据封装化,再主函数中应尽力减少对数据的处理,而对数据的处理应该用不同的函数去完成。*/char str100=0;trans(str);五 . 主要问题的解决方法1. 主要问题的解

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论