返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,5 P, N! Y( m6 E/ h
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 V' q+ T+ ]' \1 z5 o- r
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ v4 Z5 m: C$ ?$ M7 R; t参数解释:
/ g# ?7 _- @& I9 nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* O& E3 N/ K9 q0 C- J' W
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% V3 h+ N$ p$ q5 T- ~
返回值:
# K& O3 c2 V% B; q# \返回非0表示计算成功,0表示计算失败有错误2 G$ y* c0 d, |9 L) [6 q, h$ o

9 Z& R+ p$ R0 s/ ~' P 1 w6 |( [# L) @( f  }# o5 ?

0 ?& `1 O" y$ F9 T程序代码:
8 L' z6 X. W' {: |0 c+ {" m8 @4 l% W, z3 q& `  a( L
namespace fy_Exp{
5 n7 f2 l7 ~8 gnamespace {template <class _T>
4 g& P5 |; J8 t0 ninline _T GetExpValue(_T t[], char& csym){
! [3 ?0 e; M9 v4 @! s    char c=csym; csym=0;
( F( ~8 [) m- [    switch(c){* M9 v- `2 |. l0 L
    case '+':return t[0] += t[1];
% l% u9 M$ S2 I9 l3 Y) Z    case '-':return t[0] -= t[1];' L' e4 E3 u5 N6 [7 }" s
    case '*':return t[0] *= t[1];$ c2 H1 V7 @) m
    default: return t[0] /= t[1];//case '/':
7 ~- ^8 i" A1 a; v* Y0 Y    }
/ z$ P! H6 r  X1 j* q" w0 w}}2 i5 ^! m! S4 v& W" N
template <class _T, class _Tstream>9 d6 B; s( I. S1 d
/* _Tstream: inputstream, _T: get return value
  D$ \$ C! J, R) f. H- v+ ?3 V$ j* Return nonzero if get value successfully */
, q- |7 b8 W& Fint GetExpValue(_Tstream& istrin, _T& nReturn){
9 Y7 X" i% p: \0 t/ Z    _T t[3] = {0}; //雨中飞燕之作6 h- T6 B# X9 H' }8 H; Y8 v
    char csym[3] = "++";
' t; o7 r4 d* N  w8 b    int nLevel = 1, nERR = 0;
5 w' x% o6 `0 Q+ N) a. S4 V    if(!(istrin>>t[1]))istrin.clear();! ~! M) ]6 \( G& I
    for(;;){( ^  _; Z) p5 |) _
        if(istrin>>csym[2]){* w- J1 R5 C. j9 k
            switch(csym[2]){& j9 k5 G! @# V
            case '(':" P$ Z  D' y, `9 `! N
                if(!csym[1]){nLevel=0x100; nERR=1;}else  d" q( M' ]9 m( T( A5 t
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; _2 d% S3 I! n! v
                else{nLevel=0x100; nERR=1;}8 T; E" T1 J8 U7 a
                break;( r; r6 B# W8 H9 d/ b) i
            case ')':! B1 _; ?( s- x+ y) ~# ^. Y9 G, v
                {nLevel = 0x100;}break;6 y- ]4 w! D4 g2 m. C7 u! @9 u
            case '+':case '-':case '*':case '/':
7 f& z' t/ r7 e4 S  [" i% y1 u                {csym[nLevel++] = csym[2];}break;5 u; D/ z2 Y3 `! n2 b" ~8 q% L
            case ' ':case '\r':case '\n':case '\t':continue;
' T1 {& T: B& U0 c% ~* m4 i            default:; q1 _# M* T0 w8 ?& _& \0 j: {1 F: X% o
                {nLevel=0x100; nERR=1;}6 |$ A1 _+ `/ ~, g$ ^3 q  X- Z
            }
% R$ N- O& F" x            if(nLevel==0x100)break;
$ R8 K7 [: l% E1 ]5 P/ J            if(nLevel&0x10 || istrin>>t[2]){2 [, @  G* d1 k: x" Z6 p8 m
                nLevel &= 0xF;+ l2 l! v  U- J8 B' ], a  w' C
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& o/ r9 d8 L' ~5 |                if(csym[1]=='*'||csym[1]=='/'){
1 ~4 t7 F8 n5 I! x# x                    GetExpValue(t+1, csym[1]);! Y6 j7 V$ u! C2 _
                }
& x# F% ^. _8 {                else{
- E9 S& b6 F: s1 K  n                    GetExpValue(t, csym[0]);7 a* A( b3 o* G8 A: \
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 |  b% y4 K% m% |$ s6 P3 r. Q
                }0 r5 C# r; Z7 _/ K, \* t+ e$ d
                nLevel = 1;
6 Z& s* x: h* J4 h* z% n            }
# T! _/ G9 e% R7 s% z; m: q            else istrin.clear();
5 J5 O" ~0 p/ M7 J2 u6 _        }
; T0 `: j3 g! V( L3 {' b        else{nERR = -1; break;}
( z2 h! o5 H: z3 m. N2 x$ R. W" n    }
) l6 W# s8 i& S( s, w: N    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- k# ^1 k: j! r  ?0 H* X2 Z& v
    else nReturn=GetExpValue(t, csym[0]);
" m8 }! X3 ?* F7 Q9 Y2 t. a    return nERR==-1?1:0;; k+ i0 L  s% s8 V. @7 {* M' c! A2 F
}}
& ?6 W8 l* n" ]7 A( e  `" _  T6 a
! Z& T4 I. B- r9 \. w; E$ \+ C- B9 c0 _  j
$ t, B) K: [0 E+ I! n
函数模板使用示例:. L/ H+ W7 O/ ]% h, K" l
在以上那段代码的后面加上以下代码:2 m$ p4 S5 B1 F$ Z

' S3 M( ]* Q' z+ f+ C1 }- V 0 W  t' O  A: Q% f. x

: ^# c+ V1 S% g- ?1 F2 Z8 B4 l程序代码:
# R9 D8 L: U) ], I# k0 [6 T0 m, T: t
#include<strstream>9 P# k" I- p! X# S, L! A6 G/ q! X* A
#include<iostream>
3 v3 }5 L' l# G) [6 r#include<string>
& N9 Q: }; W% z9 E- [using namespace std;
# o3 Z; ~6 ^3 fint main(void)( X  j; e7 M  O8 n
{
8 d: ^' z5 X: J( V/ |2 E    string s1;- @9 d# ?# b; j, S
    while(cin>>s1)+ R% c  o% t+ s
    {
0 R2 `& y! U/ P8 n- J        istrstream isin(s1.data());( f5 O' U& z1 L
        double d;3 }, a  @8 |8 e  ~4 i) [4 u& _
        if(fy_Exp::GetExpValue(isin, d))/ O' R- P+ z4 N* B. J1 z
        {- u, W" @" U8 [8 v% G6 R
            cout<<d<<endl;2 ?# w3 Q( X& \1 L" m" w1 p
        }
' w1 P6 k9 }$ y* j+ A" K/ M* y        else2 Q" {  E4 m/ ~2 x  O
        {; r% `; v, z: F" |; ~6 E
            cout<<"ERROR"<<endl;
; }6 ~) b$ g* j. C        }5 h! j. r+ ^9 c% L" e5 a2 \
    }. R& G, b( r( m: e+ H# b( Q+ j
    return 0;
2 J1 T: x7 _" F$ C}
- y" D2 C' V0 m1 e" i8 V) s* M, Q0 E$ p# i/ H9 S

  B8 M( R9 \% {然后编译执行就可以了(*^_^*)
2 |- O6 J# t$ Z/ X  `6 G5 }; u其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 z7 p" z. j* c- u2 I7 J2 H
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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