返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
4 }9 F; {  _) _- T! {0 w' h一个很方便的函数模板,可以并且只可以计算含括号的四则表达式* I0 D0 A) C  e" L/ ^8 p7 F
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, H' u0 d  {) f1 C& K3 c2 w( E参数解释:
0 ~  T* S! A6 w3 ~' \( N' tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ U3 k+ V/ C6 J% enReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定9 i$ p7 T( e3 C/ O( h' d
返回值:6 U. h" D. P: k! @
返回非0表示计算成功,0表示计算失败有错误3 n4 [& b" C. J& f8 X* l8 v
2 c$ j' G- P- h- r1 H# G* @

4 V6 m, X' H7 q6 g4 P" p, b2 d! g8 Z- w' [
程序代码: 7 L% ?- C6 u- Q9 D0 k! u! e& F

5 B7 A! K" t( w$ _7 o2 [namespace fy_Exp{
/ n2 v" ]" \/ g* a; z3 H9 tnamespace {template <class _T>
4 z/ t8 m- T: y1 ^$ [inline _T GetExpValue(_T t[], char& csym){
/ d7 I* f1 A/ ]* b    char c=csym; csym=0;9 j9 M' U5 s' \
    switch(c){! w4 W, q7 |& r1 @9 z1 H; E% k" F+ I
    case '+':return t[0] += t[1];
4 C3 U0 c& y' e$ d    case '-':return t[0] -= t[1];7 d' {; {. k) I) a
    case '*':return t[0] *= t[1];
4 M# @) c5 h1 ^5 B    default: return t[0] /= t[1];//case '/':5 i2 \4 x% D6 X4 y+ f
    }  l( r" q+ B6 X1 h: ~) }
}}
7 ?) v& u" I* u. p% r1 ktemplate <class _T, class _Tstream>9 Y7 B' g# \+ V+ S) ^+ }
/* _Tstream: inputstream, _T: get return value' g% T- W+ s6 ?& G) ^4 ~7 `
* Return nonzero if get value successfully */  u% o; H0 j) l6 y5 d
int GetExpValue(_Tstream& istrin, _T& nReturn){# `8 L7 J  K& P/ _8 U+ I/ }- z
    _T t[3] = {0}; //雨中飞燕之作  Q/ f2 A2 I; U  x: y, [9 p9 S
    char csym[3] = "++";1 ^' [7 S' O" F8 f& j
    int nLevel = 1, nERR = 0;, T" R2 N2 ?# r& a/ S
    if(!(istrin>>t[1]))istrin.clear();' l5 a3 L8 k- @0 m
    for(;;){: @8 s& F1 K& @- P9 m0 U! u
        if(istrin>>csym[2]){
, z1 M. ~4 [! _            switch(csym[2]){- ^6 x7 p5 I1 b
            case '(':; H3 G& N( g: r
                if(!csym[1]){nLevel=0x100; nERR=1;}else* n2 @! P. x% E5 R6 T
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 ^* b" t3 R6 f* w% r                else{nLevel=0x100; nERR=1;}
3 T( K' H+ c; g" g* `# T                break;. s* C0 J) Q/ Q1 _5 ~8 H
            case ')':
$ _! N1 i4 `! i5 u$ U0 G                {nLevel = 0x100;}break;
- |4 b9 ?% y- u+ f' |8 `            case '+':case '-':case '*':case '/':- p& S0 O: v+ c% o. Q
                {csym[nLevel++] = csym[2];}break;
3 X$ j  u" p4 `" ?' @            case ' ':case '\r':case '\n':case '\t':continue;; W. G( V  t- d
            default:) f5 [# A4 r' R* M
                {nLevel=0x100; nERR=1;}
5 Y! x& _4 H. }2 k8 _) J+ V' L            }1 @) X# n- f, `
            if(nLevel==0x100)break;+ k. u! s* [; `" t, D
            if(nLevel&0x10 || istrin>>t[2]){
& @% ?$ z" s1 Y6 |% e: r8 K- D                nLevel &= 0xF;
1 Y3 t5 g. \# U8 s# k                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( ^( o; q) v, I! D5 f8 o                if(csym[1]=='*'||csym[1]=='/'){
( S. D7 ~% C, d. Z5 ~* R) _                    GetExpValue(t+1, csym[1]);
0 E, r4 ~' V1 o8 |  Z4 H* `8 g                }6 [  b) _4 l/ V( ^
                else{* N. Z) r3 b2 a5 {( l/ Z4 J
                    GetExpValue(t, csym[0]);
: Z$ w& t2 ^0 y: _                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 x  ^& ^! S3 p+ Z. ~" t                }- g0 N0 [2 W& \8 F3 Y
                nLevel = 1;+ B" h# n* r5 h/ A$ l6 W6 [  N
            }  U# `  H/ N( P( v" W
            else istrin.clear();
' A& E% s- }2 Z4 \1 R        }
1 {& |* j2 ]( C% X. i4 p        else{nERR = -1; break;}* p, w6 ?8 x/ z; _5 q
    }
* ~* u) p: b2 P$ A$ {& R1 Y    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 u' M( h6 q  U5 S: [# r
    else nReturn=GetExpValue(t, csym[0]);# c( G  n" R- c  l1 K3 W/ A* z
    return nERR==-1?1:0;
2 {/ n0 C9 B, y}}
7 D. {, `* N* N' ?+ I
  Y( R$ `% y) S- A7 j) t
9 N. m6 h  M+ U; Y; U% D: G# v- p1 _  L0 b+ l/ R1 g8 m
函数模板使用示例:
: k" i: N; h# w在以上那段代码的后面加上以下代码:6 T' d+ M/ }. [
; m- T2 B! e% [+ U% x) u. n, _5 v9 K
- T8 H( ?! D4 G
9 O# ^6 x1 [% v
程序代码: 3 L7 B: S# F; t& J: u. U3 V) I
4 k6 Y& _: E& \5 L% C8 z9 v
#include<strstream>
- @: e* D1 s& ?#include<iostream># T$ g( r- v1 z+ b
#include<string>' j1 g3 C: R$ `
using namespace std;# G% o4 X2 s0 T0 i, Q5 y$ H+ t
int main(void)4 i2 ~$ e( v7 k
{4 e3 A1 T: V2 o/ i' a. h) m1 y1 t* H
    string s1;5 a2 r: o3 Z: A8 x* [, f
    while(cin>>s1)
$ p0 q3 v3 h- }; t    {
" h7 @) K" n. G! J% Q- U% X) j        istrstream isin(s1.data());4 l% @' y  A( _) Z0 ?
        double d;: P) g6 z; L1 P/ Z. O
        if(fy_Exp::GetExpValue(isin, d))
& N( b. q8 `7 ]4 U* I# J9 p; v( y        {
; R! F+ G- w3 q' T            cout<<d<<endl;
4 z/ m& {9 a) h        }
6 q8 j, r- |8 O# X4 ?5 n        else
& ~6 L5 E# Z( I' [7 C        {6 e; D/ ?6 K; C5 x9 ~: i# E
            cout<<"ERROR"<<endl;
0 g! ?  k6 p4 Y- c) g% O7 u1 }        }
# o( C  L- P1 z5 _2 G- e# T    }/ s8 c6 F- S1 D( k) H* B! Q# I
    return 0;* b6 o6 O1 o8 u9 ]) S0 B0 k. E
}
  y' o9 A0 V) F$ r$ e; L/ j! Y# |5 m
% i8 \) ]' {" M1 I$ j4 g# W
然后编译执行就可以了(*^_^*)
8 F: `- O. D$ q7 _2 i3 U9 T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" @& `) G8 R- U. ^" p  G      建议使用VC7或VC更高版本,或者使用GNU C++编译

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