返回列表 发帖

一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,; @5 r7 X2 F/ |
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, T: a" o6 h2 x$ F8 Q6 G- n- ?
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- |! l4 ^5 F9 y8 N# C4 @
参数解释:
$ X- \! J0 g3 O- Zistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 Z0 \6 B1 u4 ^. [nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ i% B+ B. k7 @$ P返回值:  }4 J/ h# R! ]5 X+ S
返回非0表示计算成功,0表示计算失败有错误1 y+ h' F* ?$ [) y( e0 ]

9 h3 E# F3 t, ~+ K8 }9 U
7 ~7 m( T# S8 v! ~, j( ^9 e( @9 p4 B  Y
程序代码:
/ x& ~8 ?7 `1 d* T4 y
7 a( H" ~2 ~& e# g% h$ `8 Qnamespace fy_Exp{
% x$ U# s2 U( ?4 s# D2 v" Wnamespace {template <class _T>
1 P8 e" A) K* x5 N3 ^( v- s) y- ~inline _T GetExpValue(_T t[], char& csym){7 d6 }; N) F1 Q5 I
    char c=csym; csym=0;
& {: b& V- @! |8 D    switch(c){
" a. F5 g0 J- k: y4 z; H    case '+':return t[0] += t[1];
$ ]5 z  G. J1 h    case '-':return t[0] -= t[1];1 ^0 c# K# x1 q/ i1 J/ I! N5 l
    case '*':return t[0] *= t[1];, F/ H& A* C4 C% E) S$ v
    default: return t[0] /= t[1];//case '/':$ S' |5 l9 C: Z
    }
3 o; q- U% D! t1 K" Y# o2 l}}* @# h; i0 E# B- V6 U7 Y4 C
template <class _T, class _Tstream>
9 @( e9 N! D6 L$ T7 `% Q" ^/* _Tstream: inputstream, _T: get return value
' {4 S% g: H; _. p' ~7 K3 J* Return nonzero if get value successfully */
5 q' |# B# `" Mint GetExpValue(_Tstream& istrin, _T& nReturn){
! S  a# w9 [  D    _T t[3] = {0}; //雨中飞燕之作! J1 o+ f- s+ T6 r; W% N3 t
    char csym[3] = "++";& }- C- N- M4 K  W3 ?3 ?' q4 ]! q
    int nLevel = 1, nERR = 0;6 I) R$ r7 p- u# x- Y% n
    if(!(istrin>>t[1]))istrin.clear();
" v7 [0 t/ O( w    for(;;){
) w2 F2 F* o4 [% z% R# j( Q        if(istrin>>csym[2]){$ Z0 Z6 a+ O. d9 O/ s- c& i* t
            switch(csym[2]){
9 K. A; J% u0 s3 C; `7 F            case '(':
' c0 }1 ?  s% ~                if(!csym[1]){nLevel=0x100; nERR=1;}else
* s4 L6 N& j+ k3 j1 r1 k, u: }                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 r, x% p7 E4 [8 P                else{nLevel=0x100; nERR=1;}3 A8 S5 k& {. v- L) ^
                break;/ P. a$ @8 v8 J2 U
            case ')':
. u2 p0 X5 W# y- \: z$ m2 \  g                {nLevel = 0x100;}break;
$ u" S8 L0 G0 w' X            case '+':case '-':case '*':case '/':
' X: L  ~9 p2 G+ C# `                {csym[nLevel++] = csym[2];}break;
! S- k& p8 u' A( ~: m. @$ ~            case ' ':case '\r':case '\n':case '\t':continue;2 L( ~$ u3 d) M5 f
            default:
& A9 k2 k1 W4 v% j                {nLevel=0x100; nERR=1;}
, z0 O: N3 o" M" \            }) \! X# A- @: n: A% j& x
            if(nLevel==0x100)break;
, f: C% Y# U+ g% V* c- _! z5 e& J            if(nLevel&0x10 || istrin>>t[2]){: ?3 @+ m6 @6 Q( \
                nLevel &= 0xF;
6 _% h2 A% c( J                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}5 v* I. n: a5 g# I
                if(csym[1]=='*'||csym[1]=='/'){
+ `+ U. \! o) k0 r9 o/ Q                    GetExpValue(t+1, csym[1]);$ H/ r. D" g8 K, v# Q% l* {* b
                }  f7 y7 ^8 E' t- Y
                else{3 u2 ]. S) ~; a/ \' `( m+ W' g
                    GetExpValue(t, csym[0]);$ e; E- W# g# _+ e
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;; T- I; x8 A( ?) t; c8 u+ a
                }
& }+ d4 P2 X- V                nLevel = 1;
6 S( c9 Y+ s4 J5 ?% H( \            }
1 q, G- S" D" z  a' N6 t            else istrin.clear();
6 `6 Z' P$ e3 x        }6 g: N. Q1 I. _% s
        else{nERR = -1; break;}
' u2 @4 x! r3 d2 Y! E/ t+ l    }" {5 v' s0 S' Z0 Z
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. O& @  r8 A  D& G) \  |    else nReturn=GetExpValue(t, csym[0]);
; Z4 L' N. k& \) q) F8 U- h    return nERR==-1?1:0;& L3 D4 b- D% |* h  X4 P
}}
8 k/ a. j) i3 V. t
) _2 t" d1 Y) ?) I. W- |. U( |8 U: p) s
! p/ a5 E+ ~) T, \4 s4 q
函数模板使用示例:+ t6 z2 f% ^. a
在以上那段代码的后面加上以下代码:( }7 F# Y, }% [3 h

5 v( ?6 v. Y  F
! a6 q2 w* K9 W6 F/ R* Y8 D$ L% i
程序代码: 5 I( D6 i7 \0 U; ]+ U+ {+ s
- Y: L7 f. n# J# z3 k) N4 P, M
#include<strstream>
. G  r9 H# P6 B: l- ]#include<iostream>) Y8 ?' I0 _1 j# t- t
#include<string>
, _3 l9 X5 I) s7 F2 X8 iusing namespace std;* q7 v: Z; Q9 ]. ~  V* n5 l
int main(void)
# s8 T; [  ^0 r( b{
  {0 J6 s+ E8 K+ x" q    string s1;
' C) j. q- }: y4 ~* y+ }/ ~  m9 ]    while(cin>>s1)
# }4 f5 S0 L# c1 D, I3 }% y3 K! D    {
# u4 r# I! I, c        istrstream isin(s1.data());3 p" E  w' c1 T
        double d;# z7 T/ P$ S) y' d: i# Q; D
        if(fy_Exp::GetExpValue(isin, d))! L$ w8 g5 k7 ^
        {
  t# {' g* I. }            cout<<d<<endl;0 |: s( w2 @! Z# b0 Q
        }
! U3 v1 Y( k& N        else& U9 x+ C, }% k: ^: l; d2 R
        {
2 I, q  e# |5 [$ W+ r! l            cout<<"ERROR"<<endl;
( C9 A+ K5 B" [        }
0 w: \! }/ |. C& _    }+ e1 ^0 \0 @# ?
    return 0;
# j* x" F& N# P$ w}: ^) [4 G# c7 ^9 b
1 K* Q9 ~8 |  t" U' h* m; [

% N) {' u' r7 d3 v% y, @然后编译执行就可以了(*^_^*)+ \" T0 G0 v4 z8 A# h3 y' F6 e- E
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* P8 q% ~1 i! C% _$ E5 A      建议使用VC7或VC更高版本,或者使用GNU C++编译

返回列表
【捌玖网络】已经运行: