收藏 分销(赏)

科学计算器设计.doc

上传人:天**** 文档编号:2647757 上传时间:2024-06-03 格式:DOC 页数:11 大小:39.54KB
下载 相关 举报
科学计算器设计.doc_第1页
第1页 / 共11页
科学计算器设计.doc_第2页
第2页 / 共11页
科学计算器设计.doc_第3页
第3页 / 共11页
科学计算器设计.doc_第4页
第4页 / 共11页
科学计算器设计.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、个人收集整理 勿做商业用途科学计算器设计(C语言版)学校: 学院:计算机信息工程学院语言平台:作者: 日期: 一、 背景和目的计算器是现代日常生活中使用较为频繁的工具之一,常用的计算器有简易版和科学计算器两种模式.简易版的计算器不支持表达式运算,每次只能输入一个数据或者运算符来计算,而科学计算器除了容纳简易版计算器的功能外,还支持表达式运算,用户可以输入一个合法的算术表达式来得到所需的结果。常用的算术表达式有三种,前缀表达式,中缀表达式和后缀表达式。中缀表达式:我们平时书写的表达式就是中缀表达式,形如(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”的形式计算出结果,再将结果压入栈S如果后缀表达式未读完,就重复上述过程,最后输出栈顶数值则为

4、结束输出结果转换成功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 p;/表达式节点数据;中缀表达式:struct ExprNode infixExprMAX_SIZE;i

5、nt 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 )读入表达式若输入非法字符则返回-1,否则返回0int pri( int a, int b )优先

6、级计算若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,否则为0void show( void ) 输出运算结果代码:include= 0 & c = 9 | c = 。 )if ( c != 。

7、)infixExprinfixLen。n = INT;infixExprinfixLen。p = c0;s = 0;elseinfixExprinfixLen。n = DOUBLE;infixExprinfixLen。p = 0;s = 1;c = 0;while ( get_char(&c) != 1 )if ( c = 0 c = p1 )return 1;return 0;/中缀表达式转换为后缀表达式/括号不匹配返回1,否则返回0int trans_expr( void )int i, error = 0, flag;suffixLen = 0;transTop = 0;for ( i

8、= 0; i infixLen; i+ )if ( infixExpri。n = INT )/当读到数字直接送至输出队列中suffixExprsuffixLen+ = infixExpri;else if ( infixExpri.n RBRACKET )/当读入运算符时/将栈中所有优先级高于或等于T的运算符弹出,送至输出队列while ( transTop 0 )if ( pri( transStacktransTop-1, infixExpri.n ) )suffixExprsuffixLen+.n = transStack-transTop;else break;/再把运算符入栈tran

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

10、g ) error = 1;else transTop-;while ( transTop 0 )if ( transStacktransTop1 = 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

11、 r;int i, j;r.n = maxn( an, b-n );switch ( c )case ADD: r.p = (a-p)+(b-p); break;case SUB: r.p = (ap)-(bp); break;case MUL: r。p = (ap)(bp); 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

12、i, j, error = 0;struct ExprNode a2, r;calcuTop = 0;for ( i = 0; i suffixLen & !error; i+ )if ( suffixExpri。n = INT )/读到数字就将它压入栈S中calcuStackcalcuTop+ = suffixExpri;else/读到运算符/从栈中依次弹出两个数X和Yfor ( j = 0; j 2; j+ )if ( calcuTop ) aj = calcuStack-calcuTop;else error = 1;/以”X运算符Y”的形式计算出结果,再将结果压入栈Sif ( !err

13、or )calcuStackcalcuTop+ = calcu( &a1, &a0, suffixExpri.n );if ( calcuTop != 1 ) error = 1;return error;/输出运算结果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( + ” );bre

14、ak;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 ( calcuStack0。n = INT )n = calcuStack0.p;printf( ”= dn”, n );elseprintf( = lfn, calcuStack0.p );int main( int argc, char argv )doif ( input_expr() )printf( ”请输入正确的表达式!n );continue;if ( trans_expr() != 1 calcu_expr() != -1 )show();elseprintf( 请输入正确的表达式!n );while ( 1 );return 0;

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服