返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
' a- p# E+ b* L4 d" b1 [' `( A, a6 Q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
* N9 |0 H+ _, m. h. b只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" l  G0 F( x, o+ O参数解释:
5 j' s* \6 W' mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 O  g0 |$ c& B! n0 ]* AnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
6 U0 M( _$ t- d返回值:2 K7 K) M0 `- N
返回非0表示计算成功,0表示计算失败有错误5 z: e3 Q4 y# m5 [( |' z
, @  a7 F  S) C  h2 s
' j# p! j$ ?6 X# p- ^& u
5 Y' i# m1 M+ s' M" G! N
程序代码: 3 f7 r0 k- n! M

  h6 e  ?) S# Z) G7 u2 w( unamespace fy_Exp{
+ x& S7 y7 `' L/ B& Mnamespace {template <class _T>
, G  ]' l8 T  N! |# ?! p" O/ }. X) ainline _T GetExpValue(_T t[], char& csym){
4 Y- r5 Z& G1 c- @# b! c    char c=csym; csym=0;
$ D" L% W0 L* v4 u* P% I5 k3 k6 ]    switch(c){5 y; _9 q4 {2 `" }6 u
    case '+':return t[0] += t[1];7 X# V  c9 Q9 ~) \
    case '-':return t[0] -= t[1];+ k2 G4 T* b$ M6 ?% A) g* Z
    case '*':return t[0] *= t[1];1 L' B! {3 P6 \; U  D- |5 C
    default: return t[0] /= t[1];//case '/':
7 b- l, C. k% [# O& \- Z    }/ N; L/ x: q5 E0 Z7 @
}}
4 F% b% L6 T- r/ Etemplate <class _T, class _Tstream>
2 j4 N. z$ f+ X, l" _/ d% \" H" w/* _Tstream: inputstream, _T: get return value/ i: ~6 {+ K  _9 O0 q$ h+ @
* Return nonzero if get value successfully */
8 K8 g+ Y$ M& s# _% x9 M# dint GetExpValue(_Tstream& istrin, _T& nReturn){
- I! u. M& w7 _9 m) h  M, I    _T t[3] = {0}; //雨中飞燕之作' b) M) |, m# y+ v8 X; |3 {4 p
    char csym[3] = "++";# v3 s  n) \6 I9 v
    int nLevel = 1, nERR = 0;
8 ^8 P- b  x; ?& ^4 v    if(!(istrin>>t[1]))istrin.clear();0 C1 A9 p  p: Y
    for(;;){
0 L1 ^8 C1 }5 t) X; J& \        if(istrin>>csym[2]){0 C6 h/ g' C5 {3 A' }
            switch(csym[2]){
( n  f; T' ~0 B* m1 s3 E4 k            case '(':- }! f4 d4 J/ `" B
                if(!csym[1]){nLevel=0x100; nERR=1;}else
, u7 S( M3 J; V6 _2 B( Z                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 z! M! w# V9 ~+ F3 Z% _
                else{nLevel=0x100; nERR=1;}2 y5 y. Q" p" p' k/ s
                break;( i1 A* h  s8 e% q" ?
            case ')':& F& r1 Z; ]& y
                {nLevel = 0x100;}break;
6 [& }# ^4 ]1 P5 l8 S& X+ V            case '+':case '-':case '*':case '/':
. p9 V- a3 i7 W                {csym[nLevel++] = csym[2];}break;- c- ^) z3 l' N8 ?/ H
            case ' ':case '\r':case '\n':case '\t':continue;
' H+ j1 n+ T. m3 k/ @/ Y) F            default:
* D- r' x; K  H! K7 c                {nLevel=0x100; nERR=1;}( m) J. Z  `' J- V9 g) n! C
            }
! ~! e8 W& {, a# w            if(nLevel==0x100)break;
+ L: f0 z. h# _4 w            if(nLevel&0x10 || istrin>>t[2]){7 G" W5 `* ?! H- M
                nLevel &= 0xF;( I% y% L0 [6 b8 r7 j
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 v% d& d+ A" w' g+ {5 M
                if(csym[1]=='*'||csym[1]=='/'){
; V- z1 K) K: H2 C- a2 R                    GetExpValue(t+1, csym[1]);" o* c% E. G! e5 p* s, y1 f
                }4 x  L% r& c. `0 u2 V
                else{3 \/ ~8 \! {# _2 O7 m# b
                    GetExpValue(t, csym[0]);5 ^( V# J" R3 ~" k
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 V) |" V3 E5 h1 t' }3 `* M8 d' m
                }
" I* R  Z3 y9 t, i& B, R                nLevel = 1;* a% ~' J3 h  C' l
            }# c, w9 B1 |# {
            else istrin.clear();$ \2 w# ~  ]$ c& j
        }
* i6 p1 Q. J' s  w- _        else{nERR = -1; break;}
3 M% C, n1 p. ~) A4 G# f* f    }8 g5 w8 p: V; v
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% [0 _$ t/ G. O5 N" A; _5 ^
    else nReturn=GetExpValue(t, csym[0]);
" e* h& Q$ s2 z0 X    return nERR==-1?1:0;8 z2 n$ |# ]# x6 }5 A
}}
' U# o3 t% B0 I( T3 _, z0 M. ?9 R

! Y  e5 p+ G4 h1 z
: I( i  I# _* ?5 }4 Y函数模板使用示例:3 |# d, m3 |% @& Q0 m
在以上那段代码的后面加上以下代码:
+ G! h: k/ d2 M2 T! B' q
8 w( N) x7 f6 J- n# E0 X4 d0 ` * e& e5 @' _# k' ^) F8 N
6 }  Y3 z" [; R9 v
程序代码: ! u, u0 z8 O& D) y+ e% T" _0 N

  e, I  C/ o7 K! v4 s% b#include<strstream>
- T$ }  q' o  v1 Q#include<iostream>
; V  K9 ?/ E  X1 q: a#include<string>
5 r6 P/ n) B5 b; B) v) Uusing namespace std;+ ]1 Y) g6 k6 Y  K( I. @* i
int main(void)
' i$ _1 j( i" A; ]/ n{7 X7 D4 [" b0 t  k& l, s  C
    string s1;
5 x" G6 G5 c% P; _# l5 F    while(cin>>s1)/ w! G. h( w+ w) {! Q4 U1 V/ l+ D
    {/ L" r8 s8 P& E5 a; \6 ?5 W
        istrstream isin(s1.data());+ J! Q% \7 \" B
        double d;
3 C4 i# ~3 Z; M& f' j& i6 V        if(fy_Exp::GetExpValue(isin, d))0 b& b- ~5 F& @$ y
        {1 E6 A  \7 o, N7 N7 [, z% M% x1 R
            cout<<d<<endl;, u- ^  V* J! Y1 m" h$ z
        }( @; l7 Q& [7 ^& y, ]- Y& O
        else
5 h5 u; a' O# s0 Q        {
% t' j& E6 F7 P8 X: k! k            cout<<"ERROR"<<endl;
  k; }( i1 Q9 |: V3 O+ a. _        }( v; a' h9 a, |$ j
    }; D8 u, ~1 O4 Y6 Z% y- W6 T1 q7 l
    return 0;
- z4 w5 u# ^' a# Q0 T}8 V% G; z$ V" Q, r0 B/ R

% g4 G7 a+ l; T/ ?' R4 o! f: B* h3 d2 Q# f5 E
然后编译执行就可以了(*^_^*)
/ V" w! Q* H" `7 I其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 ?! X+ b( W9 @      建议使用VC7或VC更高版本,或者使用GNU C++编译

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