返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
. M3 C1 C$ P/ {8 J7 p一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 I, `# l( s, N& {6 v只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 Z8 w" Z  N( r( g参数解释:: H# V* c; v) G' x+ b/ S
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% F+ K, ?5 ~8 H0 T
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; }7 Q5 r5 C5 k# p( D# e/ h
返回值:
/ i: x; y6 l/ H, z0 H返回非0表示计算成功,0表示计算失败有错误
% K$ e- X' c. x0 j
8 n# q$ S, E: @' i& A + l' I9 z$ }2 g+ l& b. E) T
& w" l# o* F2 Y  F
程序代码:
# }* e  N/ D3 l7 O8 s7 N, I' ]- }, k+ ?. Q- [
namespace fy_Exp{/ U# h7 b7 q( p' x! X
namespace {template <class _T>, d# H" g" ]- R3 I
inline _T GetExpValue(_T t[], char& csym){% L: C8 i. S9 s3 Y. ?" `" e- f$ M
    char c=csym; csym=0;- A5 o, y- M  C
    switch(c){
& |& }" b% S- d1 ~, f7 X    case '+':return t[0] += t[1];
9 A( c& p. q. t0 |! V1 z8 e. y) _    case '-':return t[0] -= t[1];' h6 ~3 I! a: \& m
    case '*':return t[0] *= t[1];2 @: N; h! l, I+ e/ \1 @% @) G
    default: return t[0] /= t[1];//case '/':: r0 n9 v) @7 |5 O
    }
' e5 N4 Z) D8 f}}
' @4 T, t& D- u4 Q; stemplate <class _T, class _Tstream>. L" _, {' a# _6 k
/* _Tstream: inputstream, _T: get return value  `# b( \( X2 J& o* u, R5 B' b
* Return nonzero if get value successfully */0 u  ]4 b* L  t
int GetExpValue(_Tstream& istrin, _T& nReturn){
" _5 i/ X0 F' W7 ]* b, V    _T t[3] = {0}; //雨中飞燕之作
% c+ d- l+ m7 y5 b0 ?+ Y9 f; Y    char csym[3] = "++";$ g' G; E) M0 W5 s' h2 }( Z
    int nLevel = 1, nERR = 0;
( o2 m/ u# y: K/ R* j( h6 g    if(!(istrin>>t[1]))istrin.clear();
) _0 l- ~# c7 R" }2 d    for(;;){
) z  Z" |) E. G0 F7 e# T' F        if(istrin>>csym[2]){
- `5 J6 N9 v! N- o1 e            switch(csym[2]){  ~! n( {, o' t1 i( H
            case '(':& u' o( i. b" u# ^& F0 D+ K4 A* C
                if(!csym[1]){nLevel=0x100; nERR=1;}else: E% X+ z/ g0 C0 ?' `
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 N9 v- \6 M- b- q* y                else{nLevel=0x100; nERR=1;}# S) b+ w# j% R! U' k
                break;
$ z) {) N1 p; a2 e) j- D3 }( k# {2 p            case ')':
0 h( q/ R& g. z4 g7 p                {nLevel = 0x100;}break;
# R- F, Q% t2 u7 k            case '+':case '-':case '*':case '/':+ l- T8 [7 R- S! s9 i- ~/ a9 I, ?" Z
                {csym[nLevel++] = csym[2];}break;' B5 n) E# x5 E3 P
            case ' ':case '\r':case '\n':case '\t':continue;( @' [0 R5 B, |5 @# m
            default:# A3 j4 P* X( r- O! ]
                {nLevel=0x100; nERR=1;}7 U1 [- R/ q1 Y4 \. V
            }, `, j9 u: z; K+ g$ }
            if(nLevel==0x100)break;. x/ N+ j0 H- d2 [
            if(nLevel&0x10 || istrin>>t[2]){6 b* Y! E- u2 |2 B
                nLevel &= 0xF;/ A7 S! ]/ j, P
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}2 }9 \  }) k$ V; z+ C
                if(csym[1]=='*'||csym[1]=='/'){! B( A2 }. Y. J$ v4 r
                    GetExpValue(t+1, csym[1]);4 v0 ^2 D# r# I% k1 |2 s, o, A5 B. w
                }) c8 d  ]3 e2 N, _/ z
                else{
( j( b+ p% T9 C" n1 L' R* E+ R                    GetExpValue(t, csym[0]);
- ~+ ]$ J$ F- q7 K, }                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- T& x! \( N7 l5 o+ \) S                }7 G# O) l) Q; @
                nLevel = 1;
, \: P) ~5 d/ E2 U0 L; S. }9 T            }
8 e! N% G9 |( C2 U1 Q0 z            else istrin.clear();( g( N3 ]) ?8 |% b6 W& R/ u
        }2 C, I7 S- H; Y# ]$ H  a
        else{nERR = -1; break;}
3 M) b+ q1 e+ ^    }+ x- e3 x3 a0 N
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 v( b2 T# ]$ @$ [$ \( u    else nReturn=GetExpValue(t, csym[0]);
2 d! F4 \0 e- \3 F    return nERR==-1?1:0;
) d+ }; l: w6 M& S5 s, V}}
7 k1 p  V# z  V9 t& l4 l" O) B/ E. y; ^- I  M

+ v% b% G; w9 x1 G7 C
+ E0 _) g7 ^' s" E! i: S! z6 \函数模板使用示例:/ T! Y  V/ c# N3 k0 H$ j9 k/ \3 B: t
在以上那段代码的后面加上以下代码:
+ B2 V. B) D, z7 r5 ~* N! |6 f. k1 F# S/ K: E& f

8 ~$ ~9 T# W1 p  Y/ b. E! w. D3 V2 x( D) `
程序代码:
: Q  w1 P1 H* }/ D6 ~1 \; A7 }) y! _- B; j
#include<strstream>
3 D- T% M& e2 q0 X8 B2 i0 j. L" \% k#include<iostream>, ]7 E8 V+ x1 N+ U& B; J; {
#include<string>, m1 ?# c. ?( r: J& G. N! F
using namespace std;( }7 a- b; a& w/ I6 `
int main(void)* a& X. s7 ~  y% x
{
2 H- m5 I3 N7 C7 {) g+ h4 c8 J4 E    string s1;
# A9 ^' w9 a3 r0 s# ?8 l    while(cin>>s1)
: s6 I" q( y! u7 o* J' R    {9 E9 v# W8 J" W* t" A1 O  k
        istrstream isin(s1.data());8 H* v. g. O4 Q: e4 C6 O2 t8 B5 J
        double d;
( J1 I* D( M3 G* X1 p  M- v6 K        if(fy_Exp::GetExpValue(isin, d))8 J% G7 f# e* ~/ x; h1 Y. H/ K! |
        {: p1 F2 P! r) E; h+ |9 c
            cout<<d<<endl;6 N$ `6 `! v- w. e: P
        }
7 i7 j' J% ~* ?! M" }* r% k* ?        else" `6 b! ]# X. H$ ^* U1 z
        {
* m8 O* j6 H4 [" w            cout<<"ERROR"<<endl;
# M: l( K  a1 F        }
# b  f$ c% M& y! S& q    }! T9 d9 @3 K$ Y9 E- w& @
    return 0;$ D9 S4 J! q, o9 P1 y* R
}0 x/ X% E$ Q  ~% \* J
5 b$ E) _( s, B1 Q

0 V! |$ B# [% b: l, J然后编译执行就可以了(*^_^*)- V4 D  k; I8 h2 A; i* W( @9 r% S
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 m3 f8 Q1 [; K      建议使用VC7或VC更高版本,或者使用GNU C++编译

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