的数组; si’’且 si1’‐’ Y i1 之后元素向后移一位si10 ii1tt1 N N igtt?t 为数组长度 Y 结束返回新的数组 s 通信工程 11 级一班 5/17 刘 秀 C 语言课程设计-简易计算器3:表达式正误的判断由 Can 函数完成: 函数说明: 函数中将错误归为几类:括号的完整性、运算符后的数据类型、除号后的 数据不能为 0、小数点及运算符不能多个在一起、右括号后的数据必须为 运算符或结束标志;函数通过 p 和 s 记录对这些错误的判断,并返回结果; 4:进栈和出栈: 说明: 运算符和数据的进栈是通过给结 构体数组赋值并增加 top 的值来 记录栈的栈顶元素的位置 以便取用;出栈是使 top 的减 1 后的那个数组中的数据作为新栈 的栈顶元素,并返回栈顶元素. 即实质上是通过改变数组的位置 来达到进栈出栈; 通信工程 11 级一班 6/17 刘 秀 C 语言课程设计-简易计算器5:字符串数据转换成浮点型数据由 Getdouble 函数完成: 函数说明: 从字符数组的运算符开始扫描,直 到遇到下一个运算符结束,然后将这 两个运算符间的字符记录在数组 S 中,再用库函数 atof 将字符数据转 换成浮点型数据并返回数据和数组 a 中新的元素的起点即扫描到的第二 个运算符; 6:算符优先级的比较: 函数说明: 此函数是记录运算符栈的栈顶元素在运算符 集合中的位置与读入运算符在运算符集合中 的位置,将这两个值作为运算符优先级表数组 的脚码,然后返回这个元素所代表的字符; 7:算符优先算法求表达式的值的核心算法: 说明:此函数中使用两个工作栈, 一个是 OPTR, 用以寄存运算符;另一个是 OPND 用以寄存浮点型数据。
基本思想是:首先置数栈为空栈,表达式的起始符号为 ‘’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进 OPND 数栈,若为运算符则和 OPTR 算符栈的栈顶运算符比较优先级后,如 果栈顶算符优先级低, 则此算符进栈并返回新的栈顶算符; 如果栈顶算符优先 级高,则取算符栈栈顶算符 theta 并删除此算符,同时去数栈的最上面的两个 数 a 和 b 并删除这两个数,作 a theta b 运算并将结果进数栈;如果两个算符 优先级相同, 则删除算符栈顶算符并返回新的栈顶算符。
直到整个表达式求值 完毕即 OPTR 的栈顶算符和当前读入的字符均为‘’时求值完毕。
通信工程 11 级一班 7/17 刘 秀 C 语言课程设计-简易计算器 程序框图如下: 开始 定义并初始化栈 ch算符栈顶元素k0 ch’’sk’’ Y sk是算符? N Y ch 和算符栈顶元素优先级 lt gt 算符进栈 删除栈顶元素 去算符栈顶元素theta 删除 theta 并返回新栈顶元素 字符串转换为 浮点型数据 取数栈栈顶的两元素 ab 删除数栈的最上面的两元素 计算 athetab 的值 结果进数栈 kk1 ch算符栈顶元素 x数栈顶元素 输出 x 的值结束 通信工程 11 级一班 8/17 刘 秀 C 语言课程设计-简易计算器五、测试结果及存在的问题: 1:系统运行效果: 输入界面: 正确的计算: 通信工程 11 级一班 9/17 刘 秀 C 语言课程设计-简易计算器再计算界面错误报告: 通信工程 11 级一班 10/17 刘 秀 C 语言课程设计-简易计算器修正再计算:2:存在的不足及预期的解决办法: 不足之处: ○计算器的操作界面不是很美观; 1 ○而且程序循环使用不能在指定的位置退出; 2 ○目前只能用于计算、-、、/ 四则运算; 3 预期的解决办法 : ○查询资料学习了解操作界面的制作方法及需要的技巧; 1 ○查询相关资料了解学习有关处理字符数组赋值的相关问题 2 即处理字符数组赋值只取到预定的位置; ○学习了解相关的库函数的功能以增加计算器的计算功能 3 如计算器的次方、开方、π、等的运算. 通信工程 11 级一班 11/17 刘 秀 C 语言课程设计-简易计算器六、课程设计心得体会: 心得体会: 我对编程是有很浓厚兴趣的。
在编程的过程中,我深深地体会到力不从心—有 些知识没能深入地理解和掌握以及 VC的许多功能没能探索和了解使我编程时 有好多的思想运用不上如设计一个美观的操作界面。
另外,我也感受到了数据结 构的重要性,有了结构才能将好的思想付诸实践。
同时经过查询资料了解到栈由多 种运用方法,其中包括栈的顺序存储结构和链式存储结构,栈是计算表