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

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

在9月8日那天我特意编写的,给大家分享的,* A$ [" B; u0 v* s0 m! F
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) `. y- j* m5 V& q* a6 q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( h0 g. T& |) E4 l参数解释:% V+ F2 y( @% [- _+ I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: j1 [9 f3 i1 N' AnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: s' U* f8 p7 X/ F5 _( i返回值:
: s9 P# P6 v  u! d7 L8 q9 O; r返回非0表示计算成功,0表示计算失败有错误1 B; {2 ]3 u/ |0 O  D7 _

5 |  D0 L6 R7 X1 \1 a. Y- ` 2 t' T5 M) T+ g

9 I+ `, ^) j+ A! n+ P程序代码:
0 }5 q: [" D! Y% N0 l! x6 \
4 u' L/ q* Z9 T7 mnamespace fy_Exp{
6 R* W+ K  p/ c8 e& ?' C  `namespace {template <class _T>+ E0 p* Y9 v3 N- {) X3 W. B
inline _T GetExpValue(_T t[], char& csym){( ?/ n; q! ]8 h6 u) y
    char c=csym; csym=0;
, X/ N# A" i- F9 U+ c    switch(c){3 K: Q  R, n' F* w7 `. R' g5 w0 |
    case '+':return t[0] += t[1];
. I8 V! }' p; Z8 R( w& Z1 q    case '-':return t[0] -= t[1];% ?8 ~0 y1 E" z$ S) g  B8 p
    case '*':return t[0] *= t[1];
/ `& S9 ?. X. H' i# _; a; a    default: return t[0] /= t[1];//case '/':8 D! n8 }/ D4 s" R  s$ G
    }: V7 j6 Z" m0 S- f
}}
0 U2 u: z* u& l4 o1 ~" h) ^template <class _T, class _Tstream>/ f, k9 D1 B9 S+ c/ S
/* _Tstream: inputstream, _T: get return value
/ u5 n- I' s& q. j* Return nonzero if get value successfully */2 @# y+ p- {5 E6 d* y
int GetExpValue(_Tstream& istrin, _T& nReturn){
+ M0 P5 D6 ~( n: {+ ]0 M2 h/ ]    _T t[3] = {0}; //雨中飞燕之作
4 `4 p! s8 g, x9 w    char csym[3] = "++";
# _, v; B% H: Q) Y; s! P/ s    int nLevel = 1, nERR = 0;: K: j: h3 r$ S% |* Q
    if(!(istrin>>t[1]))istrin.clear();
3 z0 o% J# ?$ t9 N2 O1 Q5 E    for(;;){, ?) q; K: Y% H( S5 J  f# j
        if(istrin>>csym[2]){
2 f, n2 V" C% i3 D            switch(csym[2]){7 H( n$ a+ i& U+ H. Y+ `, E
            case '(':  u' K, H2 }  ], ^
                if(!csym[1]){nLevel=0x100; nERR=1;}else
3 L6 J2 l* v+ E6 w7 ]1 Q                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;* b0 v& @3 S1 C" B! p
                else{nLevel=0x100; nERR=1;}* K3 k7 |% C" P6 m2 x
                break;
& y- O6 B$ w, k% I            case ')':
- ?% ~# r8 w% S. G" P1 a' M                {nLevel = 0x100;}break;' E4 [) Z3 h6 s' u" V% {& x! l2 A
            case '+':case '-':case '*':case '/':
* n" v8 @! I. k% g                {csym[nLevel++] = csym[2];}break;
0 o3 _* |4 X, l% _            case ' ':case '\r':case '\n':case '\t':continue;4 o& v3 I7 V$ @# t# r+ J' q
            default:
- f2 z3 r% Y8 Q& I                {nLevel=0x100; nERR=1;}# W  w' J" T: p! l) h
            }
, s/ ?. e* s3 s) v' w0 x            if(nLevel==0x100)break;
, t9 ~4 f! f7 }5 l' t            if(nLevel&0x10 || istrin>>t[2]){
2 |% M: ^; G% `$ F: Y$ z$ H) i                nLevel &= 0xF;$ O- K4 _  s+ n& ^5 O, P; y1 t
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- M3 C# j+ C- K$ J3 x9 O                if(csym[1]=='*'||csym[1]=='/'){
. {  ?8 n+ M# f5 C9 T, @) d                    GetExpValue(t+1, csym[1]);% [4 n5 d5 D  e& h. E$ g" I( y' D) y
                }9 b& M* D; n# \' ~: F! U
                else{
" k" x$ B. W! n7 ~7 a  g                    GetExpValue(t, csym[0]);
" N- j- S+ K( X/ b                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;: }2 x6 z$ [5 S! ?9 s6 c% z& x
                }9 ?# k! y* v. @3 W5 e6 ?6 c
                nLevel = 1;! N$ v' n; V: W: Q+ ~4 s% V; ]! |
            }" {2 @3 [6 [2 ?* I+ v
            else istrin.clear();
0 H5 z+ T8 b! h        }/ J8 S9 h" W. }* z: u, y
        else{nERR = -1; break;}5 \8 P, J; f4 o1 q: k
    }
* l6 ~+ I: o' j! ]2 C$ s7 o. @3 G    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ q- j& ?& ^( a' n/ r5 G0 U
    else nReturn=GetExpValue(t, csym[0]);% V6 x' d) j  R! C+ \4 t
    return nERR==-1?1:0;% H9 z+ L& e9 M! {: L9 l
}}
2 a6 U4 {6 }  b, H" k. ^& Y' l) N
8 P9 z/ |$ R4 d
+ O5 x& G& M& q2 {# A
函数模板使用示例:
/ O; n1 W( n; p6 O5 z( j在以上那段代码的后面加上以下代码:: ^' u) ?( A- m: x; C/ ]

7 N2 U$ n( [% j& q
: }& z) I; I2 r- B- i1 N6 _1 N- I
程序代码: / [9 e3 \8 w4 Z4 U9 l5 R0 M

# j8 d% l  |  V/ P  i#include<strstream>% u& i/ `( s* d; y
#include<iostream>
1 i( ~" \  ?7 \- m#include<string>3 M! j+ T- H; n  c0 [
using namespace std;0 z/ R, E2 y; g  J, t: l' a, [
int main(void)# c# U8 }* g- H3 C, ~
{5 x: }" t& L  H5 _
    string s1;
0 B$ J8 Q3 N% O' `! B# m    while(cin>>s1)
- S  B+ b  X; G* }    {2 K. w% g) f; L' E" q' v
        istrstream isin(s1.data());3 G( ]- R) g, G; x* `1 u3 [* H
        double d;
) D- Z( _& ?" i9 b9 b; l        if(fy_Exp::GetExpValue(isin, d))
# T0 T# p5 f, T6 E% l7 l        {
: Y3 z! P5 u3 e5 p3 b# N6 y( l            cout<<d<<endl;
  T! J6 j/ A5 b  F8 u+ n        }
" E* [9 \; W1 f. H6 @: p* K        else! Y* A+ @8 B  w. i7 k
        {
% N0 X1 ^( O! O* z' t2 k7 b            cout<<"ERROR"<<endl;% H) D7 l7 w  H6 j: D, _0 A
        }
* X0 \/ Y% K: z7 R/ y% Y    }1 ^* P4 Q3 x0 T, X7 ]* T
    return 0;- f/ Y+ t! \. Y; k  L
}
1 Z, O5 {2 j7 E0 T( {0 [4 N( J! g7 z6 G6 y' r: U$ S
" V5 p3 a$ L/ p8 u8 k4 Q  N! h: B
然后编译执行就可以了(*^_^*)
+ B+ |3 ?- u9 S- r其它:TC++上一定编译错误,不保证在VC6上也能通过编译" s: |9 P$ W( A4 C" H9 q: ]9 t
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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