返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,) `# M! o. L9 z! ]  H3 W
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 l; ?5 z, s* S" Z1 W- T
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 l' Z0 Q- `# P" n6 {7 K
参数解释:0 W# x' P' {- j% D/ S" r
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" V+ t! r# i1 ^& @nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
% f; _; l5 ~/ A& S: W返回值:
* ^1 ~& C  q. @6 c  k$ d返回非0表示计算成功,0表示计算失败有错误. g! `! P1 ?, Q3 d, U9 K5 F/ K
. K  I( C, ]2 X' |6 u, g) F2 W
2 P6 Q- R( s' p4 Y* o
* y' F' n# E$ x& D
程序代码:
; @1 y! J$ g7 s* t* y
  ^1 F( O; v% D# r& U8 W0 B( ]- i0 d. Onamespace fy_Exp{
9 k7 }$ S" p7 e  hnamespace {template <class _T>
3 U4 Z( O5 t$ F+ n& l( M/ dinline _T GetExpValue(_T t[], char& csym){' o* w1 Q2 B2 G# w9 M  M* J) r
    char c=csym; csym=0;; c2 N: Y3 X& J/ E4 \2 J6 }: F
    switch(c){
% D$ W& l2 T: N  g    case '+':return t[0] += t[1];
1 U( N/ H8 }) x    case '-':return t[0] -= t[1];& J, J: a; s/ r. }2 R
    case '*':return t[0] *= t[1];) }4 |* O5 t7 r
    default: return t[0] /= t[1];//case '/':) X* Y1 [! s5 w2 b0 B0 G$ R
    }7 }9 @5 I6 f. g- J# J6 F. e
}}
2 R6 ?( V, b$ W; y7 Etemplate <class _T, class _Tstream>
, q. h( Z& m3 g" C- J/* _Tstream: inputstream, _T: get return value' l/ o7 a1 M- C, o6 y! L* q
* Return nonzero if get value successfully */2 U3 E$ K1 F1 `& @" |
int GetExpValue(_Tstream& istrin, _T& nReturn){! O3 Z0 @1 [) x( }+ C4 b
    _T t[3] = {0}; //雨中飞燕之作
2 x( i0 d% Y$ u+ e7 I6 I% a3 d    char csym[3] = "++";
# `; P" M# D9 y9 C; _    int nLevel = 1, nERR = 0;+ ~' N0 L2 }  s& K* d" g& Y
    if(!(istrin>>t[1]))istrin.clear();: q5 u: U9 D& E) T' F
    for(;;){% }, p8 e5 X" K2 C! ]$ `
        if(istrin>>csym[2]){
6 K, g% p" W1 F8 X7 s! l. [            switch(csym[2]){" l# b$ `; \/ p
            case '(':
1 {4 E0 s3 _) i                if(!csym[1]){nLevel=0x100; nERR=1;}else
% Y* w% Q" Y; F# ?9 H! O                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
* b3 j: w$ z2 \                else{nLevel=0x100; nERR=1;}
" g  [: [# i5 ~/ O: f. ~  T* S1 C0 |                break;4 x7 ^  e; j7 T4 u$ U' N  `4 F2 b
            case ')':
: U, o/ {3 _5 N+ m! n                {nLevel = 0x100;}break;$ F, @% F0 r  Q' s+ w9 T' k6 R% x
            case '+':case '-':case '*':case '/':2 E7 Z5 K$ h2 b( ]* S
                {csym[nLevel++] = csym[2];}break;
- H) N2 D: k: i3 \# |) c8 _, |            case ' ':case '\r':case '\n':case '\t':continue;
8 m; R5 ~3 h; A0 Z8 F* G            default:
& V" m4 p+ S1 b                {nLevel=0x100; nERR=1;}
9 Q7 ]0 q: @  D' @# @            }" ~( A2 t3 z% w
            if(nLevel==0x100)break;
* ]: i' X2 R7 K' Y; o9 v            if(nLevel&0x10 || istrin>>t[2]){
9 z5 N. z% A- X9 r: J; ~                nLevel &= 0xF;
$ S3 m; t1 Z8 W6 ]                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: i+ C2 m/ M# P" G  l+ A7 [$ U8 \
                if(csym[1]=='*'||csym[1]=='/'){
- _- ?: z* i$ Q3 f! R$ M                    GetExpValue(t+1, csym[1]);
: ^6 c4 W' y2 `+ I                }
: I6 C% \, j' D/ T                else{0 N. ^' }  x; A" C
                    GetExpValue(t, csym[0]);
8 T/ k2 H' o- O# j( A, T' ?0 Z2 [$ Q                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;, p, M* v8 ~' t: ]& l
                }8 v1 U* ?' ^: o: h8 G( l8 |- p2 q( Y
                nLevel = 1;
4 Z5 n' ~1 x' m7 U# M            }
: s+ r, ]6 ~) o4 _% X7 ^9 R7 x0 e            else istrin.clear();+ x/ B0 j- [6 A. i5 D2 ]
        }
, b+ t  A+ Y4 e; s5 R        else{nERR = -1; break;}
' @  f6 ^/ S+ N6 I- G0 V  \    }( n/ V$ E- o' r( z; \8 `
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ M* e+ r7 e3 p0 J' j- E    else nReturn=GetExpValue(t, csym[0]);
7 k% |6 Y7 m8 ]" m  I    return nERR==-1?1:0;
+ f5 _) R4 M8 ^$ w}}
2 Z! U7 {. S- u- d! j
5 q3 ~5 R# t$ f: M+ _$ s# |. ~6 T& y, u5 w( ^
4 z3 R$ v2 _+ `; C) Y! k) ]
函数模板使用示例:
' U# @' w& m- w% L8 ^在以上那段代码的后面加上以下代码:) ^0 B  m1 u/ y2 q+ b9 D4 a: I1 n/ i- T

) @9 M" H1 W  [! x0 v2 s   v' i6 W3 }. H  D) s6 K  q% W
# f9 l- [* \+ ?# d% H
程序代码:
+ {7 \* ^1 l" V2 w- N
% p% {3 N6 x- Z+ X  w9 M& x#include<strstream>5 V: a8 ~6 f3 {4 ]
#include<iostream>' I; c2 W. n6 a3 C  Z* s% X
#include<string>9 B8 a+ _  s$ |2 f  f2 P; y
using namespace std;
( P7 h, R% J- J4 T/ E% j0 F' sint main(void)# z% M2 R/ @! P( Y" k/ r
{8 F; K& l  B' ?: O2 M& z
    string s1;0 x  r( ~1 S, b0 q' `
    while(cin>>s1)
3 \& S+ Z- ?0 u( n& {    {: Y, Y8 B: F1 G. q" T
        istrstream isin(s1.data());
& y3 V6 S) r& o6 B5 ?' V( |        double d;
" d! Q) D, B. m% L, [        if(fy_Exp::GetExpValue(isin, d))
/ w! `- [+ Z7 V! W# x- v# I+ C' r        {
9 |* A  _! C7 r' R, c/ L2 c            cout<<d<<endl;- s" u: L3 B0 q1 j) Y+ C
        }/ {  n' X5 H9 _) B: N
        else% f3 L1 V0 I' A7 r( z/ f# H. |7 m
        {$ T* @9 H2 C1 j# n0 t6 m( B9 ^
            cout<<"ERROR"<<endl;
4 {9 T9 v4 K% w9 J+ j1 ?% u; ]        }
# D1 {& I9 L7 G) \    }
2 G3 P& C" F1 C    return 0;6 t/ f* U9 a2 `  |: K7 g5 ?
}
, H, l6 C( P+ I( `5 J& D! j+ E+ Z7 N/ `( o) U' k

" Z" @3 y- R$ @/ A* K3 w然后编译执行就可以了(*^_^*)  G. p7 c* @( U+ n4 `: ~! c& j( D
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 g8 R& G( H# y' x* o1 b  [" x8 m; I      建议使用VC7或VC更高版本,或者使用GNU C++编译

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