1、 课 程 设 计 报 告 课程名称课程名称 C 语言程序设计 课题名称课题名称 输入一个表达式,输出其结果输入一个表达式,输出其结果 专专 业业 通信工程通信工程 班班 级级 通信通信 1101 2012 年年 6 月月 29 日日 湖南工程学院 课 程 设 计 任 务 书 课程名称 C 语言程序设计 课 题 输入一个表达式,输出其结果 专业班级 通信 1101 任务书下达日期 2012 年 6 月 15 日 任务完成日期 2012 年 6 月 29 日 一、设计思想一、设计思想 两种算法首先都要建立两个栈,一个是存放操作数的数栈 OdStack,一个是存放运算符 的符栈 OpStack。数栈
2、采用 double 型的用来存放浮点数,符栈采用 char 型的用来存放运算 符, 由于考虑到运算符有优先级的问题, 所以事先做了一个 Type 用来存储运算符的优先级。 栈建立好了之后做栈的相关操作,初始化栈,入栈,出栈,看栈顶。其中入栈要判满,出栈 和看栈顶要判空。 中缀转后缀再计算的算法。 此算法的基本思路是先将中缀表达式转换成后缀表达式, 之后再利用后缀表达式的算法 对表达式进行计算。 首先,用一个 char 数组将中缀表达式读入,对数组中的每一个元素进行处理,区分哪 些是数,哪些是运算符。如果是数元素(或小数点元素) ,则依次存入用来存储后缀表达式 的 char 数组,直到一个整合数
3、存完之后用空格将其与后面的元素分开。如果是运算符元素, 则根据当前运算符的优先级和栈里面的运算符的优先级进行处理。 如果栈内元素的优先级小 于当前元素的优先级或者栈内为空, 则将当前运算符入栈; 如果栈内元素的优先级大于等于 当前元素的,则依次将出栈元素存入后缀表达式,并用空格将其与后面的元素分开,直到栈 内元素的优先级小或者栈内为空。对于左括号来说,无条件进栈,并只在有右括号出现的时 候才有可能出栈。对于右括号来说,无条件让栈内元素出栈,直到左括号出栈。依次将每个 元素进行处理直到中缀表达式索引完毕。 至此, 已经实现了将中缀表达式转换成了后缀表达 式,在数组的最后加上结束符以便下一步的调用
4、。 第二步,读出后缀表达式并进行计算。如果索引到空格则将索引标志后推 1 位。之后要 先对 char 型的数字元素进行整合,从后缀表达式中依次取出数字元素(连同小数点)存入 一个新的 char 型数组, 直到一整个数取完后通过 atof 函数将 char 型转换成浮点型存入数栈, 并将新数组初始化用来存储下一个数。 如果是索引到运算符, 则在数栈中出栈两个数字与当 前运算符进行运算,先出栈的数字放在运算符后面,后出栈的数字放在运算符的前面,将运 算以后的结果再次存入数栈。 依次进行计算直到后缀表达式索引完毕。 此时对栈内剩余元素 进行操作。每在符栈出栈一个运算符,就从数栈出栈两个数进行计算,算
5、法同上,将运算以 后的结果再次存入数栈。循环操作直到符栈栈空,此时数栈出栈元素即为最后结果。 二、算法流二、算法流程图程图 中缀转后缀再计算的算法分两个流程,第一步是中缀表达式转换成后缀表达式; 图 1 中缀转后缀算法流程图 第二步是将后缀表达式进行计算输出。 三调试分析过程描述 1.首先,设计的程序每运行一次只能进行一次计算: int main() printf(“ *欢迎进入小型计算器*n请输入算术表达 式:“); char strN; double result; scanf(“%s“,str); result=Calu(str); printf(“输出计算结果: %fn“,result
6、); 为了改进程序,我在主函数里加了一个循环: int main() int a; printf(“ *欢迎进入小型计算器*n 请 输 入 算术 表 达 式:“); for(a=0;a+) char strN; double result; scanf(“%s“,str); result=Calu(str); printf(“输出计算结果: %fn“,result); printf(“ “); 2.为了人性化原则,想什么时候退出计算就退出计算,我对程序又进行了改进, 输入字母 e 退出计算: if(exp1index1=() tempsign.Type=exp1index1; tempsign.le