ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:68.48KB ,
资源ID:4317200      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4317200.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言版科学计算器设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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

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

3、器的功能组件如下:三、详细设计宏:#define ES/表示测试阶段#efne MAIZE100 /表达式长度#efin RACKE 0/左括号#deneRBRACKET 1 /右括号#deine DD 2 /加defnSUB /减dfine MU 4 /乘#efineDIV 5 乘#define IN 6 /整数#deine ULE /浮点数数据结构: 表达式节点truct ExNode it n; 表达式节点类型 duble p; /表达式节点数据;中缀表达式:trut xprode ifixExprAXSIZ;in infixLen; 后缀表达式:sruct prNod sfiExprA

4、X_SIE;int suffxLen;后缀转换栈:t ranstackA_IE;it tranTo;后缀表达式运算栈:struc ErNodecalcuStckMAX_ZE; in clcuTop; 函数过程:_ili i gtha(chr *c )缓冲变量无字符则读入字符读入成功返回0,否者返回-1 t inpt_expr( oid )读入表达式若输入非法字符则返回-,否则返回0int i( inta, int )优先级计算若a优先于b则返回-1,否则返回0in trans_epr( o ) 中缀表达式转换为后缀表达式括号不匹配返回1,否则返回0 _inlieintmaxn( nt a,in

5、t b) 求最大值ruct ExprNodecalcu( suc ErNde *, strucEprNode *b, int )计算a和b做c运算的结果intcalu_exp( oid )计算后缀表达式表达式计算失败返回-,否则为0void ho( oid ) 输出运算结果代码:#ncludetio.h/#efine ES /表示测试阶段#ine AX_SE 100表达式长度#defne LBACKT 0 /左括号#dfn RBRAKET /右括号dein AD /加defi SUB3 /减dfneM 4 /乘#deieDIV /乘#define IT /整数#defneDOBLE7 /浮点数

6、trc xpre n ; /表达式节点类型double ; /表达式节点数据;sruc Expode infixExprM_SIZE; /中缀表达式in infxen;uct Exode sffiExprMAXSIZ; /后缀表达式nt sufiLe;nt trasackMA_ZE; /后缀转换栈nt transTop;structExpdecalcuSackMAX_SIE; 后缀表达式运算栈int calcTop;/缓冲变量无字符则读入字符/读入成功返回0,否者返回1_nlin int et_char( char ) if( * = 0 ) etr scanf( c, ); return 0

7、;/读入表达式/若输入非法字符则返回-1,否则返回0int inpu_r( void)carc = 0; intfag =0, eror 0, , ;ifxLen= 0;whie ( e_cr(c) ! - ) switch ( c ) cas n: fa = -1; brek; cs (: infixExpfixLen+.n=LACKET; c= 0; bek;cse ):infxExprinfixe+.n = BRACT; =0;bea; ae+: infiExprinfiLen+.n = ADD; c = 0;break; case -: ifxrinfiLe+.n= SUB; c =

8、0; ea; cse *: fixExrifie+.n =L; c ;break; case :inixExprinfLen+.n =DI; c 0; bra;defat: i ( = 0 & = 9 | c = ) if( c ! . ) infiExprnfixLen.n = IN; nfiEprnfixLen.p c0; s =; else nfxxprinfixLen.n =DOUBL; infxExpinfixL.p ; s ; c 0; hil ( gt_char(&c) != -1 ) if ( c 0& c 9 ) infixExprfLe.p infixpinfixenp*1

9、0+(c-); i( ) s+; c =0; lse if ( = . ) if ( s ) ror-1; els infixExrinfixLen.n DOBLE; s+; =0; els brak; i ( infixxpriiLen. = DOUBLE ) f ( = ;i s;i+ ) nfixxpriixLenp /= 1; ifxLn+; ee error -1; 0; brea; if (fag ) ak; ;eurn rro;/优先级计算/若a优先于b则返回-1,否则返回0it pr(in a, it )i c2, p2, i; c0 = ; c1 = ;for( i0; i

10、; i+ ) switch ( ci ) cse LBRAKET: pi = 0;brek; ase ADD: case S: i = 1;rek; caMU: cse DIV:i= 2;beak;i (p0 1 ) retrn -1;rrn 0;/中缀表达式转换为后缀表达式/括号不匹配返回-1,否则返回0nttrns_expr( void ) in i,rror 0, fag;suffxLen = 0; trsTop= 0;for(i= 0; i N )/当读到数字直接送至输出队列中 ufiExrsuffixLen+ nfEri;ele f ( infEprin RBRACKET) /当读入

11、运算符时 /将栈中所有优先级高于或等于T的运算符弹出,送至输出队列 while ( ranTop 0) if ( pi( tansScktTop-, infixExpi.n) ) uffiEprsufiLen+. = transtacktransTop; ese beak; /再把运算符入栈tranStacktransT+ iixEpri.n; eseif ( fiExpr.n = LBRACE )/读到左括号时总是将它压入栈中 ransStacktranTop+= nfixxprin; el/读到右括号时 flag =1; /将靠近栈顶的第一个左括号上面的运算符依次全部弹出,送至输出队列wh

12、il ( tanTop0) if (tranStaktansTo- = BRACET) la = 0; break; uffixprsffixLen+ = trasStac-trnsop; /再丢弃左括号 (fl ) error= -1; else transTop-; hile (trnTop 0 ) if ( transStakrnop-1 = LACKET) eror =-1; suffixExprsufixLen+.n rsSta-asTop;/在测试阶段输出后缀表达式#iff ESTfor ( i = 0; i b ) retur a;rernb;/计算和b做c运算的结果sut xr

13、e cac(sruc ExrNode *a,strut ExprNod *, in ) strct ExpNoe r; nti, j; r. = maxn( n, b- );sitch(c ) cse DD: . (a-)+(-);bak;caseSUB: .p = (a-)-(bp); brak; cae MUL: r. =(-p)*(b-p); brk; aseDV: r. = (a-)/(b-); f ( .n = INT ) -; j = -; if ( i%j ) . = DULE; beak; eur ;/计算后缀表达式/表达式计算失败返回-,否则为0it cacu_expr(id

14、 ) i, j, erro = 0; strcErNode a2, ;calcuTop 0; or ( i =0; i = INT) /读到数字就将它压入栈S中 lcuackalcuTop+=sufxExpr; se /读到运算符 /从栈中依次弹出两个数和Y or( =; j2; + ) ( clco )a =calcStak-cluTp; else rror -; /以运算符Y的形式计算出结果,再将结果压入栈S i( !eror ) calcuSackclcuTop+= calcu( 1, a,uxExri.); if ( alcuTop ! )eror = -;retunerro;/输出运

15、算结果oid show( d)i, n;#fdef TESTfor (i 0;i sfixLn; i+ ) switch ( infixExpri.n ) ase RAKET: prnf(( ); break; csRBRAKET: rntf() );break; aseAD: rin( + );rek; cas SB: printf(- ); bea;case MU: prt( );bre; ase IV: prit( );break; aseI: n= ifiExpri.p; pint( %,n ); rak; ase DLE:printf( %f , infixExpri. );brk; #endif f ( calcuStack0 = IT ) n calcuStak0.p; rintf( = %dn, n);ele printf( = %ln,cacSack0.p ); int ai( int argc, ca agv ) do f ( nutexpr() ) rit( 请输入正确的表达式!n );continue; f ( trsex() !=- & lcu_xp() !=- ) how(); ese pinf( 请输入正确的表达式!); whil ( ); rtr;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1