返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,2 s) t. g9 ~! q% q" f7 g6 `4 T6 u
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! o; u' x, p* n6 P& x# S" K
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" x9 P9 q$ Q6 q' x& L参数解释:
% S; o5 j# Q4 u; A$ iistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 W( @3 J# ]- x$ M' a! ^7 B8 _
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; b5 J2 l& T/ U* s
返回值:
. p; |3 H3 [- u7 L7 |' \返回非0表示计算成功,0表示计算失败有错误
; j% i" B; s  W
& v; K* R0 N$ N : b' N1 s9 u* `' J

! Q8 E% g# Q. Y" B4 E, \' q程序代码: & w% Y+ j. C: g& M2 k

( |% r3 p% ~, |+ K: W& E; y+ J: Snamespace fy_Exp{3 n; F2 C3 S% O; _
namespace {template <class _T>! Y' |9 U0 f# }% }/ g. O
inline _T GetExpValue(_T t[], char& csym){' V- T* h+ g6 s, |
    char c=csym; csym=0;4 B+ G9 S% p5 @) W
    switch(c){2 X1 ^8 K+ p2 k
    case '+':return t[0] += t[1];
# _7 s* w, b% @, p; }( @    case '-':return t[0] -= t[1];/ y+ o8 j. ?/ T4 f- q5 \. u4 k
    case '*':return t[0] *= t[1];
# ]+ k; e! _- j7 }: Y    default: return t[0] /= t[1];//case '/':
- p& o8 p. t: u6 C3 P; V    }% j$ E7 e- A, ]$ Z) t4 D
}}- ?/ F- k& I3 B! C3 c
template <class _T, class _Tstream>5 P+ O! _( s! q9 i4 j! e; q4 J
/* _Tstream: inputstream, _T: get return value
7 d" _( S4 J  z* Return nonzero if get value successfully */
: u' l( a$ e6 c  R: f. wint GetExpValue(_Tstream& istrin, _T& nReturn){
: `$ S3 a! ^- l: }- _  Q    _T t[3] = {0}; //雨中飞燕之作
. e2 T1 M8 N' u: e: Q- u    char csym[3] = "++";8 e5 H. k( O2 o# o. m& p! S4 j9 b
    int nLevel = 1, nERR = 0;" P2 D, q9 B4 u' v/ f% K: Y! |
    if(!(istrin>>t[1]))istrin.clear();
' w; \2 ?" N4 `+ a    for(;;){
5 r5 m$ k5 _, [# P7 V6 I        if(istrin>>csym[2]){, Q: e0 H/ @" |
            switch(csym[2]){" |0 d$ c& i" ~0 P
            case '(':
. X: H2 j3 `/ I4 D2 L                if(!csym[1]){nLevel=0x100; nERR=1;}else
/ a" S, q% P4 }8 t/ W% j" n7 G: s$ T                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ ]$ W' G( }' h0 @) t                else{nLevel=0x100; nERR=1;}
+ k( w& A* d, `% [' ^. E                break;
4 U/ T( v, X6 D2 J- U% F6 e( k% X            case ')':- h; o8 _# `$ E# c+ @
                {nLevel = 0x100;}break;
% S7 m8 e: Q5 b9 @8 \3 n            case '+':case '-':case '*':case '/':
$ N7 W4 [* Z. b0 W( P/ @                {csym[nLevel++] = csym[2];}break;) x" a$ \, v* M) ^2 I) q+ C' T3 Z
            case ' ':case '\r':case '\n':case '\t':continue;
$ G' {  W0 Y" N2 e            default:& G% j' X3 P1 ]+ g
                {nLevel=0x100; nERR=1;}
, F1 y- a! S' u7 F9 ]- H            }, r( g' r9 U# w( P3 x7 i# M
            if(nLevel==0x100)break;, @4 p) P) ?0 n, n, S) U9 i3 y! Z5 l$ U
            if(nLevel&0x10 || istrin>>t[2]){
0 A- ~3 ~0 e0 L& u                nLevel &= 0xF;
6 c, [7 |6 h& i& E                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; M% G+ {4 _, ^5 J8 x; Q8 F
                if(csym[1]=='*'||csym[1]=='/'){. Z* C7 m8 m( v! b8 {& ]7 B
                    GetExpValue(t+1, csym[1]);
  v7 i( b$ P. D                }
; u1 O6 p2 }: \/ e8 e7 v                else{
" v* C% \$ ~* V2 s, e! L                    GetExpValue(t, csym[0]);
9 q: x  s" r% E! T! H                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* b* B" g* Y8 V2 @# O                }  ]; ]; |- q  G5 ^8 a& e
                nLevel = 1;
8 L" C, M) k0 U. B3 b4 s            }* `3 J0 [4 B5 n) X& ^" l
            else istrin.clear();' a+ C1 K# f8 a
        }0 ^# `/ _/ u. r8 m
        else{nERR = -1; break;}
1 w% c) {1 O$ f/ h1 N( M. Q) ~- d    }- i! t9 v, u; v( m) a9 I! x
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 R3 r1 ~1 @* N5 R    else nReturn=GetExpValue(t, csym[0]);
% W. v6 T) T1 K    return nERR==-1?1:0;
' j$ o1 m" M& S/ m) z) k}}
& I. }+ U* C' J: y) p6 C, j# l4 k: D1 k% c& i( d

" ?* m0 N/ i: S
' w$ i/ m/ n" k9 M& q- q# o2 I函数模板使用示例:
7 h% O3 _8 B6 m3 F在以上那段代码的后面加上以下代码:
! a; H9 L" E6 U* J6 o
7 Q1 {1 i) R% ?. i! K & Q! Z. c1 x, Z8 v" I1 A
: g6 y, J1 o1 _
程序代码: 2 z* `+ S6 q- W3 d; w5 c" ]
' G' \6 a2 Y, A! v& A: G5 C
#include<strstream>
9 q! a8 X+ l/ f, |#include<iostream>, K% {1 Y: l+ c0 k0 W! ]# M
#include<string>0 @6 K! q) H0 R  I. M! Z- H7 E& |
using namespace std;$ _' ?1 {5 M  Y% W! W; ]
int main(void)
0 n6 l* I+ N' s; P' n6 D{
, i8 s0 N) r; K$ W    string s1;1 W* V; Z& Y: e
    while(cin>>s1)
! q* ~; M; i. w" q0 m    {
8 w9 z$ A2 g3 x        istrstream isin(s1.data());2 Y$ r* v4 I) ~6 T; _
        double d;1 \  l3 H1 \! [9 @0 I8 h( z" Z
        if(fy_Exp::GetExpValue(isin, d))
" z: }% C+ U4 N7 c- D        {
4 ], U9 p1 F9 K3 |( }! v            cout<<d<<endl;; e8 `: ~) c* i  Q
        }
5 i- z! W  ?3 a6 U* _6 X        else
# P1 S& v' v2 s( a9 I7 S        {3 T4 \' R2 T3 F' g' Y8 A$ y
            cout<<"ERROR"<<endl;
) L% @$ E1 q* R4 \* d        }" n( V' d- T0 N; `) ?
    }% H8 S) f$ B; W$ L2 P
    return 0;6 Z" e/ f0 n9 n9 u" x6 ^7 r7 S; w
}+ }; @3 K* s" i

2 r6 u( n/ C2 R9 {% H. A
' R4 L7 p4 F, E& A+ m& p然后编译执行就可以了(*^_^*)0 H% n, P1 B7 t
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 n/ g8 [) }2 E3 P      建议使用VC7或VC更高版本,或者使用GNU C++编译

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