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