返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
# e9 S' f9 ~3 J- ^  E, D一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0 m. F: Z/ q: @* j2 y& v5 k7 I
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)  `+ T, U4 b* ?( c# e) h. J) g; C
参数解释:0 n) Y- i; F# M# j& h5 _
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: X3 F; I2 g% p$ G, h/ m) w6 }9 ]1 b
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 i% R; a3 X/ B' [7 ~返回值:0 i4 J" J. c! l
返回非0表示计算成功,0表示计算失败有错误
& V( A2 J* A7 Z$ e: R/ l* Y6 E" D! J$ n; i/ }) y9 \2 ~- M

3 _2 b* c/ ]& o. b' E0 }' F+ a4 Z3 i! w2 H2 i
程序代码:
$ C9 Z/ u- c. W& n8 \* v, `+ X: {$ g+ b! a5 J
namespace fy_Exp{3 M/ T( z1 {/ h' o" a
namespace {template <class _T>
: L5 ?; ?9 n  D6 K: |3 J5 tinline _T GetExpValue(_T t[], char& csym){/ _0 Z+ f, t! c* z0 c# y# [; j
    char c=csym; csym=0;
0 Y8 Y: l" z: s! m0 Z    switch(c){! l5 ]; a1 Y2 t6 i- X/ M1 u
    case '+':return t[0] += t[1];5 `$ g; R' p; K! e" _9 i: N
    case '-':return t[0] -= t[1];  U5 O% T4 h* z6 V0 X
    case '*':return t[0] *= t[1];3 \4 ^2 l! P: [$ m  a/ H" p% J
    default: return t[0] /= t[1];//case '/':
+ `; m& f' S# D  U: A    }
% _, @6 ^" g# i0 n- m1 p( c}}
/ ^/ Q6 S) b! L$ j% V  p' V. _template <class _T, class _Tstream>
  s& a# j. l- G: V  `8 Z, R( J/* _Tstream: inputstream, _T: get return value8 ~$ ?) F, H  h
* Return nonzero if get value successfully */
0 C% [7 |' r; L- k+ B& L# v3 M+ _8 iint GetExpValue(_Tstream& istrin, _T& nReturn){6 }, P6 j' V$ y: N7 Z; B1 X
    _T t[3] = {0}; //雨中飞燕之作
" }1 m# x" o( ]' [: u    char csym[3] = "++";9 R  p3 \, u7 J/ X5 E) a
    int nLevel = 1, nERR = 0;( i, X) f* q% Z7 d  C7 T: q
    if(!(istrin>>t[1]))istrin.clear();
2 h5 X4 H  Y- Z# P4 ^$ K# t    for(;;){
5 O2 w5 Y- i" u" Y' G$ x        if(istrin>>csym[2]){/ H& [  f) W$ a5 {
            switch(csym[2]){
/ c3 I* S4 P3 a$ x            case '(':
6 F+ G. s( j  B- u                if(!csym[1]){nLevel=0x100; nERR=1;}else
+ ?, W. x9 ~8 O# K; Y/ |                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ r: B) i. p7 E4 K% ]+ @* v                else{nLevel=0x100; nERR=1;}
1 {4 B# t! Z0 X3 R1 d3 @                break;$ A# A) `6 N) K
            case ')':
. J* z5 k6 e' G8 e+ v3 b, n                {nLevel = 0x100;}break;
# P, ]( a7 A6 l8 B            case '+':case '-':case '*':case '/':0 a$ D# ?" j2 O4 ]9 V' }# \1 h
                {csym[nLevel++] = csym[2];}break;
0 K+ Z4 D) G. z. |& X  U2 v            case ' ':case '\r':case '\n':case '\t':continue;
4 j/ {' C( M0 X1 @            default:9 p6 q$ Q% u2 t& I0 y$ ~- P9 d: C3 ~
                {nLevel=0x100; nERR=1;}
4 g* m* F1 V. `. e5 W3 o            }
& C/ i8 l5 |+ t" {2 }            if(nLevel==0x100)break;1 b: Q/ s& J/ @" T# l1 D
            if(nLevel&0x10 || istrin>>t[2]){/ c+ h9 h. S$ R) O& Q1 ~3 _( _
                nLevel &= 0xF;! H. ~# G' ~, |! i! U
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& U* J7 J0 \1 a' ?( e) U                if(csym[1]=='*'||csym[1]=='/'){
* {/ Z, a; m8 E: F                    GetExpValue(t+1, csym[1]);0 k  r6 _8 j# _& ~' `& G) T
                }2 N2 z6 m, w/ ^+ J) I
                else{
" M; k$ d0 s5 a3 I' S0 q0 B. K                    GetExpValue(t, csym[0]);" p/ O: z4 G. C
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 S0 Y2 V+ C( l. N- `3 O' N7 p
                }
- O0 Z& R2 [' f/ }7 [                nLevel = 1;7 I9 k& x" B# D( d- ^4 a
            }
6 u8 G) {$ g' e6 U# }# g6 l' v: ~; C1 R            else istrin.clear();/ ~! j6 N$ }' [$ R5 q* u
        }; |. N: i/ [4 A; |# k2 v" O6 p
        else{nERR = -1; break;}
( d7 Y: [9 X& B6 P9 b7 D; D6 M5 d* g2 o    }
( `+ R3 x, C5 `. p8 {    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 ^; l, y- H: {
    else nReturn=GetExpValue(t, csym[0]);
# ^' Q5 t8 b) ~3 Y9 D5 B. J    return nERR==-1?1:0;
+ B2 _8 G! v5 f8 e: J}}/ o" {; |8 T* V5 `4 w( ~9 I

0 r- S8 Q9 l8 h6 P4 e0 F; }" p* T& o7 I8 p, f

7 [* {( Z( N2 R) Y函数模板使用示例:4 N4 @: E* k* q2 }
在以上那段代码的后面加上以下代码:
3 e- o# U7 a- ]' F
6 y# p% [) @- r% e, k. T1 d 5 x# R$ d  z3 y/ e) ]
, T6 g) K$ T* }4 m) H
程序代码:
& G! h5 i& ~1 _- E  \- M2 V+ A3 p6 U9 U  E: n* q
#include<strstream>
" D( W, R5 n/ Z5 `/ \! t#include<iostream>
& }9 f! ?! W  ^# m2 `6 j# m" A#include<string>
9 d  i  F1 A$ F" Xusing namespace std;* L, _. y( N" ^& I3 u
int main(void)
6 ^* ?) Z) l4 J, c: X8 d: G{) a9 r7 ?/ p  W! U9 z* I) U0 \
    string s1;* A, e: u  n. {) ]  s0 d& i
    while(cin>>s1)
2 ?0 e# @2 m' E" ~8 ?    {( |5 i2 _  d$ R/ M% W$ k- N
        istrstream isin(s1.data());
7 u  P8 r8 X5 i( h1 B: e. F9 v        double d;
1 f# l" B7 ^" j* B, ?        if(fy_Exp::GetExpValue(isin, d))- }' v8 {" g3 C- `
        {
+ |7 M3 f% U7 m            cout<<d<<endl;$ i7 z; B% U4 n- q$ {9 T
        }
' z) ^& r# f) c6 l6 T3 L& k, p) h        else" o! j  P3 E$ I7 U
        {
! m" y8 b' t& c! y2 P            cout<<"ERROR"<<endl;, d7 s/ R, F5 \3 e, ^5 }( w9 h
        }  ]0 j, J' `; n  B4 _
    }
6 {' f4 i, {6 M1 \/ z    return 0;' z* R0 ^; A+ _$ X( R
}
" Z. F3 A, ~4 H+ m% T+ C8 h2 o
1 T( c  i# W5 z- N3 H
7 s/ B7 y0 A8 [% O. m然后编译执行就可以了(*^_^*)# O" V) x9 y% D8 ~7 {
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ d% F* I' V; b5 F8 x* @      建议使用VC7或VC更高版本,或者使用GNU C++编译

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