科学计算器设计C语言版.DOC

上传人:国*** 文档编号:997901 上传时间:2018-11-12 格式:DOC 页数:11 大小:75.50KB
下载 相关 举报
科学计算器设计C语言版.DOC_第1页
第1页 / 共11页
科学计算器设计C语言版.DOC_第2页
第2页 / 共11页
科学计算器设计C语言版.DOC_第3页
第3页 / 共11页
科学计算器设计C语言版.DOC_第4页
第4页 / 共11页
科学计算器设计C语言版.DOC_第5页
第5页 / 共11页
点击查看更多>>
资源描述

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

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

3、和栈。二、 模块设计本次开发,使用的控制台输入,并直接在控制台输出。科学计算器的功能组件如下:中缀表达式转后缀表达式trans_expr()输入表达式input_expr ()当读到数字直接送至输出队列中当读到运算符 T 时a:将栈中所有优先级高于或等于T 的运算符弹出,送至输出队列b:T 进栈读到左括号时总是将它压入栈中读到右括号时,将靠近栈顶的第一个左括号上面的运算符依次全部弹出,送至输出队列,再丢弃左括号计算后缀表达式calcu_expr()建立一个栈从左到右读后缀表达式,读到数字就将它压入栈 S 中,读到运算符则从栈中依次弹出两个数 X 和Y,然后以“X 运算符 Y”的形式计算出结果,

4、再将结果压入栈 S如果后缀表达式未读完,就重复上述过程,最后输出栈顶数值则为结束输出结果转换成功YN三、 详细设计宏:#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

5、 p; /表达式节点数据;中缀表达式: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,否者返回-1int input_expr(

6、 void )读入表达式若输入非法字符则返回-1,否则返回 0int pri( int a, int b )优先级计算若 a优先于 b则返回-1,否则返回 0int 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 )计算后缀表达式表达式计算失败返回-1,否则为 0voi

7、d show( void ) 输出运算结果代码:#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 infixEx

8、prMAX_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 0;/读入表达

9、式/若输入非法字符则返回-1,否则返回 0int input_expr( void )char c = 0;int flag = 0, error = 0, s, i;infixLen = 0;while ( get_char( break;case (: infixExprinfixLen+.n = LBRACKET; c = 0; break;case ): infixExprinfixLen+.n = RBRACKET; c = 0; break;case +: infixExprinfixLen+.n = ADD; c = 0; break;case -: infixExprinfix

10、Len+.n = SUB; c = 0; break;case *: infixExprinfixLen+.n = MUL; c = 0; break;case /: infixExprinfixLen+.n = DIV; c = 0; break;default: if ( c = 0 return 0;/中缀表达式转换为后缀表达式/括号不匹配返回-1,否则返回 0int trans_expr( void )int i, error = 0, flag;suffixLen = 0;transTop = 0;for ( i = 0; i = INT ) /当读到数字直接送至输出队列中suffi

11、xExprsuffixLen+ = infixExpri;else if ( infixExpri.n RBRACKET ) /当读入运算符时/将栈中所有优先级高于或等于 T的运算符弹出,送至输出队列while ( transTop 0 )if ( pri( transStacktransTop-1, infixExpri.n ) )suffixExprsuffixLen+.n = transStack-transTop;else break;/再把运算符入栈transStacktransTop+ = infixExpri.n;else if ( infixExpri.n = LBRACKET

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

13、StacktransTop-1 = LBRACKET )error = -1;suffixExprsuffixLen+.n = transStack-transTop;/在测试阶段输出后缀表达式#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

14、ADD: r.p = (a-p)+(b-p); break;case SUB: r.p = (a-p)-(b-p); break;case MUL: r.p = (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 =

15、0;for ( i = 0; i = INT ) /读到数字就将它压入栈 S中calcuStackcalcuTop+ = suffixExpri;else /读到运算符/从栈中依次弹出两个数 X和 Yfor ( j = 0; j 2; j+ )if ( calcuTop ) aj = calcuStack-calcuTop;else error = -1;/以“X 运算符 Y“的形式计算出结果,再将结果压入栈 Sif ( !error )calcuStackcalcuTop+ = calcu( if ( calcuTop != 1 ) error = -1;return error;/输出运算

16、结果void show( void )int i, n;#ifndef TESTfor ( 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;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 1

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。