获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,9 u& h  ?: J' |% I% A" e( f. }
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
$ p* G( b! K2 B) C) X& s& c只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
0 O# k' d$ }5 I2 t" V# F+ N参数解释:& X6 ^' q& Z: o/ m9 t0 p; Z% r6 ]
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 [1 `( ]7 V* M' m: A
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- s! m9 I) t8 x% N3 C, p) `返回值:
  ^2 Z% y4 q( a1 s* u& k$ E. X3 u返回非0表示计算成功,0表示计算失败有错误, A3 m2 Q1 D: R7 Y+ l3 |7 M
- F0 X/ L0 R. G6 S  _: B  ?  K

/ J& V! D, N% K6 F
( K- k: J0 c3 _' k, H程序代码:
$ d8 V) h# i/ e3 x6 q
; k& z. B  X% y/ Enamespace fy_Exp{
4 I& Y; m2 F! w2 S, |" S$ qnamespace {template <class _T>* v# m7 N2 d* {9 E1 z
inline _T GetExpValue(_T t[], char& csym){# R: B8 _. {4 O" v2 p* _
    char c=csym; csym=0;
7 r9 A% [  j4 K5 }    switch(c){
( a: N2 C' d) I; G    case '+':return t[0] += t[1];
) _7 ^, c# p' Y) V9 S    case '-':return t[0] -= t[1];
/ `- c5 ~/ a. F1 O" C    case '*':return t[0] *= t[1];
$ ^6 I& Z( P& }& q( Z    default: return t[0] /= t[1];//case '/':
7 x) x# U% n. f9 S, i; W    }. ~: Y" c3 X' n9 u2 s* M
}}
4 P+ \* [* f& [template <class _T, class _Tstream>
* L; I+ N  w5 U$ A0 S/* _Tstream: inputstream, _T: get return value
, L6 S3 q- v7 j& D8 m  m* Return nonzero if get value successfully */
6 V+ V* Z3 j$ Y+ V. j" u% k* y4 qint GetExpValue(_Tstream& istrin, _T& nReturn){1 J. W* `& _7 e' |- |* D9 W
    _T t[3] = {0}; //雨中飞燕之作
% I# T, a3 y, w& y+ p    char csym[3] = "++";
2 r3 ?8 P; A, |% K    int nLevel = 1, nERR = 0;
" X4 [  p8 G4 w* W/ P$ K3 ~    if(!(istrin>>t[1]))istrin.clear();5 Q" c7 r) }: p2 \
    for(;;){& x' g% W2 n  F, E
        if(istrin>>csym[2]){
4 |$ Z& H( V4 |4 v            switch(csym[2]){9 q# i$ z* `( b# B- C: s
            case '(':
( d0 [* P3 V$ E' P                if(!csym[1]){nLevel=0x100; nERR=1;}else
% f% v8 E% C$ j" u7 w  c  R                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;& i$ t0 f0 A9 l. I* Q
                else{nLevel=0x100; nERR=1;}
5 Y; z( m- f* F. S% b                break;
- X: E: `; l) S            case ')':# d6 D4 r+ _4 ]- U2 J  Q
                {nLevel = 0x100;}break;1 |+ j1 h# K0 n7 |5 @/ {  i3 d
            case '+':case '-':case '*':case '/':) t: r8 X- k6 D+ M
                {csym[nLevel++] = csym[2];}break;1 v8 k: l, N! c5 \; i0 i
            case ' ':case '\r':case '\n':case '\t':continue;
0 O! @+ S1 M. B3 Z* \            default:# p+ N5 V( ~- I. Z+ A
                {nLevel=0x100; nERR=1;}5 R+ t/ K) t7 o+ h6 T
            }
2 f: f3 n9 h/ {' w2 s            if(nLevel==0x100)break;
, J6 y& N$ q* I4 c; t' ~            if(nLevel&0x10 || istrin>>t[2]){
1 e  Y5 H: N" g5 _. a                nLevel &= 0xF;
) D8 M- B) t" Q5 q" E" y# R, @                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) X3 e. \7 x: D% H2 D
                if(csym[1]=='*'||csym[1]=='/'){
+ _' U5 e1 U% H  \! T, T                    GetExpValue(t+1, csym[1]);4 n* q( Q2 E+ C8 r9 O6 T+ n
                }# u* G8 z! E$ S, w& l
                else{3 m+ S  O% i2 d: c0 a
                    GetExpValue(t, csym[0]);/ [& A' G4 X3 C) y* n2 D
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;2 N  v' e& `7 ]
                }0 ]; c1 \" g3 m/ k
                nLevel = 1;
7 B# z. C  ]8 W+ i" G) U            }/ r" b/ d* t' U* v9 p
            else istrin.clear();. G) f2 q$ J$ q3 l! ~! h) f
        }
4 a1 M, c* Q$ r5 |& L        else{nERR = -1; break;}
2 M4 Y( m( t- l/ X$ H4 ~% V    }
8 S* T8 g3 A/ `. k9 Q$ s+ q    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
% E9 ]! w: ^* x" s; h    else nReturn=GetExpValue(t, csym[0]);
9 E9 B/ y& P: A8 H' `; a    return nERR==-1?1:0;5 A/ B, K+ R0 k  @* L$ D, S
}}
4 c& G! C5 V, X3 {5 D# s1 I: Y0 v2 P: ^- ^

7 T+ R4 s/ [. t' F
/ D* z5 w, `+ {" |( Q函数模板使用示例:
" f3 F* R" J9 \: P3 p在以上那段代码的后面加上以下代码:/ q% x$ J1 L  X8 G1 ?) o

; E" L4 E. I! ^" _$ h% N $ _1 e3 [$ `7 V, K: q& K

# K! J0 g# y. n, o- s' t) L0 g程序代码: 8 T, D) J. V1 |3 S7 |+ Y
% R& v; A. H6 s4 j  Z; p/ f7 x
#include<strstream>2 U7 n+ N8 {$ O' ]- ?8 o
#include<iostream>
2 t9 p1 W! N  ~  {, S% z/ v& H7 ?#include<string>
$ m8 i( C# K- R0 a' z1 dusing namespace std;
1 X. d$ }3 n' v# ^( k; sint main(void)
* o$ B2 F' K# _{7 i/ L2 L: @) C
    string s1;: U* G9 D7 u5 m( q8 j
    while(cin>>s1). ]2 {- k2 A$ ]: A
    {
: Z0 \1 V; u2 C& m2 X" N% G* t        istrstream isin(s1.data());
0 |6 E: B; R3 X+ q        double d;
2 }9 U9 E6 u9 H; _+ E        if(fy_Exp::GetExpValue(isin, d))& R/ A& y$ N/ J  P
        {, G7 H1 H/ s6 k- B. a6 z/ l
            cout<<d<<endl;1 j/ |3 H. u4 y: ]! X* p
        }/ ?0 {# D5 x8 t
        else9 f1 u$ m! ?7 ]! {4 a" Y
        {8 {: @+ d9 Q& t7 V9 l7 U5 A
            cout<<"ERROR"<<endl;
4 L0 W" X0 v; P2 C! [. |/ @5 I        }
9 G3 Z! [5 M; Q! X6 i    }5 g7 U8 N" d7 E8 P
    return 0;# y- Y8 m" o' Y5 \) g# _0 n! m8 J; S
}
  R! g' Z' U. A$ K$ ?; i- t
" _9 I/ }  W  w+ a' ~7 ^- `5 S" ]4 V9 k% D# x4 O3 V$ ^; W: ~3 I) f
然后编译执行就可以了(*^_^*)9 ^" Z! e2 S) `% {2 T
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: G6 A& p( x6 |) x      建议使用VC7或VC更高版本,或者使用GNU C++编译

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