#科学计算器设计_第1页
#科学计算器设计_第2页
#科学计算器设计_第3页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、科学计算器设计 (C 语言版 )学校:学院:计算机信息工程学院语言平台:作者:日期:一、背景和目的计算器是现代日常生活中使用较为频繁的工具之一, 常用的计算器有简易版和科学计算 器两种模式。 简易版的计算器不支持表达式运算, 每次只能输入一个数据或者运算符来计算, 而科学计算器除了容纳简易版计算器的功能外, 还支持表达式运算, 用户可以输入一个合法 的算术表达式来得到所需的结果。常用的算术表达式有三种,前缀表达式,中缀表达式和后缀表达式。中缀表达式:我们平时书写的表达式就是中缀表达式,形如(a+b) * (c+d),事实上是运算表达式形成的树的中序遍历,特点是用括号来描述优先级。后缀表达式:

2、也叫逆波兰表达式, 事实上是算数表达式形成的树的后序遍历。 中缀表达 式(a+b)* ( c+d )的后缀表达式是 ab+cd+*,它的特点就是遇到运算符就立刻进行运算。前缀表达式:算数表达式形成的树的前序遍历。日常所书写的是中缀表达式, 但是计算机内部是用后缀表达式计算, 所以此程序的用户 使用中缀表达式作为输入,程序将中缀表达式转化为后缀表达式后再进行运算并输出结果。由于今后工作将使用 C语言进行开发,而C语言是一个功能强大并且很灵活的语言,为复习和巩固C编程,故决定用 C语言编写一个科学计算器。本次开发采用 C语言,以面对过程思想进行开发,使用的数据结构有队列和栈。二、模块设计本次开发,

3、使用的控制台输入,并直接在控制台输出。科学计算器的功能组件如下:三、详细设计士宏:#defi ne TEST/表示测试阶段#defi ne MAX_SIZE 100/表达式长度#defi ne LBRACKET 0/左括号#defi ne RBRACKET 1/右括号#defi ne ADD 2/加#defi ne SUB 3/减#defi ne MUL 4/乘#defi ne DIV 5/乘#defi ne INT 6/整数#defi ne DOUBLE 7/浮点数数据结构:表达式节点struct ExprNodeint n;/ 表达式节点类型double p;/ 表达式节点数据;中缀表达式

4、:struct ExprNode infixExprMAX_SIZE;int infixLen; 后缀表达式: struct ExprNode suffixExprMAX_SIZE;int suffixLen;后缀转换栈:int transStackMAX_SIZE;int transTop;后缀表达式运算栈:struct ExprNode calcuStackMAX_SIZE; int calcuTop;函数过程:_inline int get_char( char *c ) 缓冲变量无字符则读入字符 读入成功返回 0, 否者返回 -1 int input_expr( void ) 读入表达

5、式若输入非法字符则返回 -1 ,否则返回 0 int pri( int a, int b )优先级计算若 a 优先于 b 则返回 -1, 否则返回 0 int trans_expr( void ) 中缀表达式转换为后缀表达式 括号不匹配返回 -1, 否则返回 0 _inline int maxn( int a, int b ) 求最大值struct ExprNode calcu( struct ExprNode *a, struct ExprNode *b, int c ) 计算 a 和 b 做 c 运算的结果int calcu_expr( void )计算后缀表达式 表达式计算失败返回 vo

6、id show( void ) 输出运算结果 代码:-1, 否则为 0#include/#define TEST #define MAX_SIZE 100 #define LBRACKET 0/ 表示测试阶段/ 表达式长度/ 左括号#define RBRACKET 1/右括号#define ADD 2/加#define SUB 3/减#define MUL 4/乘#define DIV 5/乘#define INT 6/整数#define DOUBLE 7/浮点数struct ExprNodeint n;/表达式节点类型double p;/表达式节点数据;struct ExprNode inf

7、ixExprMAX_SIZE;int infixLen;struct ExprNode suffixExprMAX_SIZE;int suffixLen;int transStackMAX_SIZE;int transTop;struct ExprNode calcuStackMAX_SIZE;int calcuTop;/ 缓冲变量无字符则读入字符/ 读入成功返回 0, 否者返回 -1/ 中缀表达式/ 后缀表达式/ 后缀转换栈/ 后缀表达式运算栈_inline int get_char( char *c )if ( *c = 0 ) return scanf( %c, c ); return

8、0;/ 读入表达式/ 若输入非法字符则返回 -1 ,否则返回 0 int input_expr( void )char c = 0;int flag = 0, error = 0, s, i; infixLen = 0;while ( get_char(&c) != -1 )switch ( c )case n: flag = -1; break;case (: infixExprinfixLen+.n = LBRACKET; c = 0; break; case ): infixExprinfixLen+.n = RBRACKET; c = 0; break; case +: infixEx

9、prinfixLen+.n = ADD; c = 0; break;case -: infixExprinfixLen+.n = SUB; c = 0; break; case *: infixExprinfixLen+.n = MUL; c = 0; break;case /: infixExprinfixLen+.n = DIV; c = 0; break;default:if ( c = 0 & c = 0 & c = 9 )infixExprinfixLen.p infixExprinfixLen.p*10+(c-0);if ( s ) s+;c = 0;else if ( c = .

10、 )if ( s )error = -1;elseinfixExprinfixLen.n = DOUBLE; s+;c = 0;else break;if ( infixExprinfixLen.n = DOUBLE )for ( i = 1; i s; i+ )infixExprinfixLen.p /= 10;infixLen+;elseerror = -1;c = 0;break;if ( flag ) break;return error;/ 优先级计算/ 若 a 优先于 b 则返回 -1, 否则返回 0 int pri( int a, int b )int c2, p2, i;c0

11、= a; c1 = b;for ( i =0; i = p1 )return -1;return 0;/ 中缀表达式转换为后缀表达式/ 括号不匹配返回 -1, 否则返回 0int trans_expr( void )int i, error = 0, flag; suffixLen = 0;transTop = 0;for ( i = 0; i = INT )/ 当读到数字直接送至输出队列中 suffixExprsuffixLen+ = infixExpri;else if ( infixExpri.n RBRACKET )/ 当读入运算符时/ 将栈中所有优先级高于或等于 T 的运算符弹出,送

12、至输出队列 while ( transTop 0 )if ( pri( transStacktransTop-1, infixExpri.n ) )suffixExprsuffixLen+.n = transStack-transTop;else break;/ 再把运算符入栈 transStacktransTop+ = infixExpri.n;else if ( infixExpri.n = LBRACKET ) / 读到左括号时总是将它压入栈中 transStacktransTop+ = infixExpri.n;else / 读到右括号时flag = -1;/ 将靠近栈顶的第一个左括号

13、上面的运算符依次全部弹出,送至输出队列 while ( transTop 0 )if ( transStacktransTop-1 = LBRACKET )flag = 0; break;suffixExprsuffixLen+.n = transStack-transTop;/ 再丢弃左括号if ( flag ) error = -1;else transTop-;while ( transTop 0 )if ( transStacktransTop-1 = LBRACKET )error = -1;suffixExprsuffixLen+.n = transStack-transTop;/

14、 在测试阶段输出后缀表达式#ifdef TESTfor ( i = 0; i = b ) return a;return b;/ 计算 a 和 b 做 c 运算的结果struct ExprNode calcu( struct ExprNode *a, struct ExprNode *b, int c ) struct ExprNode r;int i, j;r.n = maxn( a-n, b-n ); switch ( c )case ADD: r.p = (a-p)+(b-p); break;case SUB: r.p = (a-p)-(b-p); break;case MUL: r.p

15、 = (a-p)*(b-p); break; case DIV: r.p = (a-p)/(b-p);if ( r.n = INT ) i = a-p;j = b-p; if ( i%j ) r.n = DOUBLE; break;return r;/ 计算后缀表达式/ 表达式计算失败返回 -1, 否则为 0int calcu_expr( void )int i, j, error = 0;struct ExprNode a2, r; calcuTop = 0;for ( i = 0; i = INT ) / 读到数字就将它压入栈 S 中 calcuStackcalcuTop+ = suffi

16、xExpri;else / 读到运算符/ 从栈中依次弹出两个数 X 和 Y for ( j = 0; j 2; j+ )if ( calcuTop ) aj = calcuStack-calcuTop; else error = -1;/以X运算符Y的形式计算出结果,再将结果压入栈Sif ( !error )calcuStackcalcuTop+ = calcu( &a1, &a0, suffixExpri.n ); if ( calcuTop != 1 ) error = -1; return error;/ 输出运算结果void show( void )int i, n;#ifndef T

17、ESTfor ( i = 0; i suffixLen; i+ )switch ( infixExpri.n )case LBRACKET: printf( ( ); break;case RBRACKET: printf( ) ); break;case ADD: printf( + );break;case SUB: printf( - ); break;case MUL: printf( * ); break;case DIV: printf( / ); break;case INT: n = infixExpri.p; printf( %d , n ); break; case DOUBLE: printf( %lf , infixExpri.p ); break; #endifif ( calcuStac

温馨提示

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

评论

0/150

提交评论