44模拟计算器算法_第1页
44模拟计算器算法_第2页
44模拟计算器算法_第3页
44模拟计算器算法_第4页
44模拟计算器算法_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

数据结构 课程设计报告 设计题目 设计一个模拟计算器的程 序 专 业 机电一体化 班 级 08 专接本 学 生 金磊 学 号 104910252044 指导教师 高在村 完成时间 2011 12 模拟计算器算法模拟计算器算法 目录 1 问题描述 1 2 设计思路 1 3 数据结构设计 2 4 功能函数设计 2 1 判断一个字符是否是数字字符 2 2 求字符的优先级 2 3 对分数约分的函数 2 4 打印最后的结果 2 5 求解表达式程序 2 6 判断表达式是否合法 2 7 栈的相关操作 2 8 主函数 void main 3 5 编码实现 3 6 运行和测试 8 模拟计算器算法模拟计算器算法 1 问题描述 问题描述 要求能够对包含加 减 乘 除 括号的任意可带小数的表达式进行求解 2 设计思路 设计思路 首先 表达式采用字符串进行存储 运算的过程 也是对字符串进行扫描 输入后 程序会对这个字符串进行判断 看是否有非法字符 是否括号配对 是否最后有一个等号 如果不满足要求则要求重新输入 合法后还要判断 如果字符串长度是 1 的话就输出提示 是 2 的话 表面式子中只有一个整数和一个等号 也是直接输出第一个字符 因为这样的 字符串函数无法处理 进数字栈的操作总是在遇到字符后 因而这样的数进不了栈 其次 采用两个栈分别用于存放字符数据和数字数据 按照书上的中缀表达式变成后 缀表达式的求解方法 对表达式字符串进行遍历 采用一个分子和分母 分子置初值为 0 分母置初值为 1 遇到数字则将分子乘以 10 后在加上这个数 遇到小数点后则将一个 flag 位置为 1 此后如果遇到数则分子继续如上述形式实现 分母则每次都乘上 10 直到 遇到其他的特殊字符 遇到字符后 首先判断刚才的数是否是 0 如果是 0 则数字不进栈 如果不是 0 则将分子和分母进栈 然后对刚才的字符进行判断 如果是 则直接进栈 它 的优先级最高 如果是 则再判断 如果栈顶是 则直接出栈 字符后移 否则直接 进字符栈 如果收到的不是括号 则判断当前字符的优先级是否小于栈顶字符的优先级 如果小于则将两个数字出栈并进行运算 然后在进一个数进栈 否则进字符栈 最后出来的结果是数字栈中只有一个分数 则对这个分数进行约分 如果约分后分母 是 1 的话就直接输出这个整数 否则输出一个分数和一个小数 3 数据结构设计 数据结构设计 该程序数据结构主要是两个栈的数组结构 表达式是用字符串进行存储的 数字栈 栈节点 typedef struct int x int y datatype 采用分数表示数字 栈 typedef struct datatype num MAXSIZE int top seqstack1 pseqstack1 存放表达式中数字的顺序栈 字符栈 typedef struct char ch MAXSIZE int top seqstack2 pseqstack2 存放表达式中操作符的顺序栈 4 功能函数设计 功能函数设计 1 判断一个字符是否是数字字符 判断一个字符是否是数字字符 int IsNum char c c 是要判断的字符 是的话返回 1 否则返回 0 2 求字符的优先级 求字符的优先级 int priority char op op 是要求的字符 返回值是该字符的优先级 3 对分数约分的函数 对分数约分的函数 void simple datatype p 因为有可能改变它的值 所以传地址 p 是要求的数 4 打印最后的结果 打印最后的结果 void print datatype p 对分数 p 进行有选择性的打印 如果分母是 1 的话打印 5 求解表达式程序 求解表达式程序 datatype Cal expression char s 求解的是字符串 s 返回值是一个 分数 6 判断表达式是否合法判断表达式是否合法 int Is Correct char s 判断字符串 s 是否合法 合法返回 1 否 则返回 0 7 栈的相关操作 栈的相关操作 void push seqstack1 pseqstack1 data datatype p 入数据栈 data 是数据栈 p 是一个分数 void push seqstack2 pseqstack2 symbol char op 入字符栈 symbol 是字符栈 op 是一个操 作符 void pop seqstack1 pseqstack1 data datatype p 出数字栈 dada 是数据栈 p 是出栈后带 出分数 void pop seqstack2 pseqstack2 symbol char p 出字符栈 symbol 是字符栈 p 是出栈后带 出字符 8 主函数 主函数 void main 提示用户输入要求的字符串 当求解合法后 再判断是否长 度只是 1 或 2 如果只是长度为 1 或 2 的话就直接输出结果 否则调用函数进行求解 5 编码实现 编码实现 define MAXSIZE 100 include include include typedef struct int x int y datatype 采用分数表示数字 typedef struct datatype num MAXSIZE int top seqstack1 pseqstack1 存放表达式中数字的顺序栈 typedef struct char ch MAXSIZE int top seqstack2 pseqstack2 存放表达式中操作符的顺序栈 判断是否是字符 int IsNum char c return c 0 exit 0 else data top data num data top x p x data num data top y p y void push seqstack2 pseqstack2 symbol char op 入字符栈 if symbol top MAXSIZE 1 printf Too large n exit 0 else symbol top symbol ch symbol top op void pop seqstack1 pseqstack1 data datatype p 出数字栈 if data top 1 exit 0 else p x data num data top x p y data num data top y void pop seqstack2 pseqstack2 symbol char p 出字符栈 if symbol top 1 exit 0 else p symbol ch symbol top 处理一个表达式的值 s 是指向该字符串的指针 datatype Cal expression char s pseqstack1 data 用来存放数据的栈 pseqstack2 symbol 用来存放字符的栈 int a b c d 用来对出栈的数字进行存储和运算 datatype p q char w op w 用来标志需要处理的字符串 op 用来保存操作符 int t1 0 t2 1 flag 0 两个栈的初始化 data pseqstack1 malloc sizeof seqstack1 data top 1 if data printf No enough memory available n exit 0 symbol pseqstack2 malloc sizeof seqstack2 symbol top 1 if symbol printf No enough memory available n exit 0 push seqstack2 symbol w s while w symbol ch symbol top 出循环条件 w s if flag 1 t2 t2 10 else if w flag 1 s else if t1 0 针对第一个就不是数字的情况或者是两个操作符连在一起的情况 p x t1 p y t2 push seqstack1 data p t1 0 t2 1 flag 0 if if symbol ch symbol top if w pop seqstack2 symbol s else push seqstack2 symbol w s if else if priority symbol ch symbol top num data top 最后的结果进行约分 void simple datatype p 对最后的结果进行约分 int i flag 0 if p x 2 i if p x i 0 p y i if flag 1 p x 1 打印最后的结果 void print datatype p if p y 1 针对分母是 1 的情况 printf The result is d n p x else if p x 0 针对分子是 0 的情况 printf The result is 0 n else printf 这个表达式的分数结果是 d d n p x p y printf 这个表达式的小数结果是 f n 1 0 p x p y 判断输入的字符串是否合法 int Is Correct char s int i N Bracket 0 i strlen s if s i 1 printf 输入错误 最后必须以 结束 n return 1 for i 0 s i i if IsNum s i return 1 for i 0 s i i if s i N Bracket else if s i N Bracket if N Bracket printf 输入错误 括号不配对 n return 1 return 0 主函数 void main char str MAXSIZE op y datatype result while op y do printf 请输入您要求的表达式并且以等号结束 n scanf s str while Is Correct str if strlen str 1 printf 您只输入了一个 号 无法求解 n else if strlen str 2 只有一个整数和一个等号的情况 printf 这个表达式的结果是 c n str else result Cal expression st

温馨提示

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

评论

0/150

提交评论