返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
0 I, J; q( D6 V一个很方便的函数模板,可以并且只可以计算含括号的四则表达式9 O6 |  ^6 v( r
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* G+ g3 u; T* Y: }参数解释:
* I1 a4 X. Y* F- j  _" R/ {, u' \9 uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 j5 Q( m; O8 S  }
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 O- ^8 C! C4 {0 Z9 x
返回值:
/ X% c7 P& M1 L* z  w/ F" o4 _返回非0表示计算成功,0表示计算失败有错误" ^7 O) E5 H# r$ _2 j4 l4 ?# S) @0 r
  B; C# L3 g  L7 ^+ k1 A% ?
- q. l( D6 F: `, m% c5 B$ H
* \4 K9 {- m/ i0 T2 g
程序代码: ) h* v% c4 [8 d/ c, M

; G6 U2 V9 f3 M' d, z& y' N/ o2 Inamespace fy_Exp{) y; I8 O* g0 r+ [4 R* e* d
namespace {template <class _T>
9 j* v& }2 t- Y2 ~inline _T GetExpValue(_T t[], char& csym){* ?0 S: ?+ t" B
    char c=csym; csym=0;2 c% O0 o* }5 C9 C
    switch(c){3 c( x( w# M7 r( O, P3 K# E( @
    case '+':return t[0] += t[1];; `& Y: c# r- B$ ]: l
    case '-':return t[0] -= t[1];5 @5 ~0 _& c" v" I
    case '*':return t[0] *= t[1];! y) G2 r" N+ T' u
    default: return t[0] /= t[1];//case '/':7 z9 W% @2 x* P" c
    }- o. K' {( O$ D9 [8 _+ q
}}  q5 K8 L6 r$ e! j; E$ p# ^
template <class _T, class _Tstream>
3 `* B" J$ t& u$ @5 v/* _Tstream: inputstream, _T: get return value
2 E# a1 x. K. q1 x( [8 A' X# m1 z- p* Return nonzero if get value successfully */
" _# D+ Z- n  P, ?9 @int GetExpValue(_Tstream& istrin, _T& nReturn){
6 u; Q: |% g- u" L8 `  A( m5 k: F& @    _T t[3] = {0}; //雨中飞燕之作+ n7 J9 P0 z( j! ^$ I9 n
    char csym[3] = "++";
9 K2 I! C- P% |- w' N1 n    int nLevel = 1, nERR = 0;/ P" S! W( F) Z; y2 E) a3 q
    if(!(istrin>>t[1]))istrin.clear();
( @! e7 n3 ?  v$ [( s0 K" ^) I2 o    for(;;){
% A2 E; @" K# B$ _, P* l        if(istrin>>csym[2]){0 @' u/ |$ L2 |' C' u3 {2 s* U
            switch(csym[2]){. }0 `4 r* j- A3 b. \7 Z2 E2 x
            case '(':- m- G# S1 v7 X  l/ T1 h% t/ k, n
                if(!csym[1]){nLevel=0x100; nERR=1;}else- V$ p% K5 k" }7 ]3 L- ~0 t+ B
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 z+ h, m1 M2 t0 g4 ]
                else{nLevel=0x100; nERR=1;}# Q, G+ `! I: m$ u& ~" |% w
                break;! J/ o. R% d+ {, ^2 C5 t
            case ')':
8 Q3 E  s* L  I6 [- D                {nLevel = 0x100;}break;2 z) Q4 |0 S3 J* B) S! F1 R
            case '+':case '-':case '*':case '/':
* O. l* b4 F. J9 j! I8 L) t1 [                {csym[nLevel++] = csym[2];}break;
+ H& J9 b# m" @5 [% C3 }  _            case ' ':case '\r':case '\n':case '\t':continue;
- \/ [  J- C% p) ~            default:3 v7 T# F0 s! n% r, i; t* m
                {nLevel=0x100; nERR=1;}4 ~0 Y4 @  Z8 _( h
            }
$ `/ Q; c7 k' E9 h6 b% W) r            if(nLevel==0x100)break;: e0 b) |/ R& s9 e1 ?! M1 G
            if(nLevel&0x10 || istrin>>t[2]){8 c8 R% `/ D' O) ^
                nLevel &= 0xF;
1 h3 e' ?; Y: E& V/ Q                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 n/ m0 J+ j: ~! J                if(csym[1]=='*'||csym[1]=='/'){! m- \% F& N( J  d+ X
                    GetExpValue(t+1, csym[1]);
! M* y. [7 e5 h1 k  F                }' n7 K; B; p# ]2 r; P3 v, i) k, _" w
                else{
. Z: I' f' i  o) g6 i  T                    GetExpValue(t, csym[0]);
9 n& ^" _1 E* u9 f) l                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 a8 f3 x8 a: [7 t9 d                }" \; D4 v% N" X$ `4 \
                nLevel = 1;
6 [& s9 w7 T. |- D            }& Q3 M/ A" m- n( {8 h
            else istrin.clear();
- L0 y. t8 T3 t8 E* [* s        }
) u/ w% `0 q/ F/ b# u        else{nERR = -1; break;}
6 S6 T8 x: c/ D; x  e. P) c    }) l% i$ n( w' ?  @5 b0 A# `9 t  s
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: n& v9 \8 Q# \4 R    else nReturn=GetExpValue(t, csym[0]);4 g' a% u. T- V( @  O" ~) c' m) G
    return nERR==-1?1:0;
2 e9 N( n) {4 Z$ V3 s}}
( g7 Y3 |3 Y! r1 L2 s: l. E3 G5 X6 k( b* a5 d3 @+ Z2 c0 j

/ ~# _& a+ a0 b$ J% _
- F( M5 F/ B$ f2 Y% p函数模板使用示例:
# }7 H+ d% t% b: b& u: O在以上那段代码的后面加上以下代码:
) U: z3 n3 f4 y" E7 Y/ H
5 a6 e* M6 X" X4 Z % X; ?/ e# ?1 ]) c2 U/ H

& h- d' \& O3 }3 {, J程序代码:
6 o6 }. C/ I' @: p+ W
& G8 U, r" J6 w#include<strstream>
) g0 b# V0 G% @8 k#include<iostream>
& G# T, A! X" O7 s0 b1 {#include<string>
5 q$ W7 ~' e. ]5 Vusing namespace std;, u. G4 c! Q( q: `
int main(void). o# U5 j+ i9 `3 D  \2 @
{
$ z3 i$ Z! |9 g- h2 C; G$ l    string s1;$ m9 V0 C- h$ d  M* |9 W' O6 m
    while(cin>>s1)
2 U" H4 |: V  T$ P+ z9 ~6 }; i. F' _    {  o  j3 z! a7 q
        istrstream isin(s1.data());
% c& S+ v, ?9 a( @        double d;
5 ]* k% k( Q5 I1 d" X4 x! T8 x/ S$ l        if(fy_Exp::GetExpValue(isin, d))) v/ Y  H, D8 Q0 |  |" [% ]2 I
        {
& W: H1 Y2 B4 P            cout<<d<<endl;' x- _. k3 ?/ t: V
        }& a, i6 @% x0 Y$ J% E6 e
        else0 Z& j% s9 |, j0 a
        {
) {+ Z' k5 Z- X3 ^+ P' c            cout<<"ERROR"<<endl;
  n; q+ e8 x, K! T: q2 i        }' p/ T7 m: }& S$ z
    }$ G' e% X$ \, g/ A0 K
    return 0;
! Y3 [. ^7 r6 |}
. O+ m. `7 p( g- d8 |' J4 O( l3 O4 f! n: P

8 B+ R& `* x# o$ J: u然后编译执行就可以了(*^_^*)& {9 R- z. |  V& X* Q
其它:TC++上一定编译错误,不保证在VC6上也能通过编译* f1 a9 M8 l7 @) {4 [. |/ n
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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