返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
0 K' Z# ^% [0 T1 R& \/ V- Y# l一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 H) i7 i# |1 A: r) t' l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% v$ j- d; N; P8 e# y
参数解释:
! N% q* Z0 o6 x* _1 wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 k# ]: c7 b  z% w% c2 a
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; y7 v8 P( _' o8 {) Q
返回值:
/ |4 v( G$ M3 M% e; d1 G返回非0表示计算成功,0表示计算失败有错误2 D9 T$ y$ B  o' p
) F- m0 o( d% x: ^% ^

4 M' h% x# Q3 C( w
* X3 A; D! o* V& N* r0 e8 u程序代码: / \4 q- e" C; [) g3 f  g/ m

' U( `- z  }$ c8 t: b/ z; r  Pnamespace fy_Exp{
# @3 O) D& c. W9 x, _2 V: a$ tnamespace {template <class _T>1 o4 ?  d. @5 K0 C: |
inline _T GetExpValue(_T t[], char& csym){
( d) i7 W+ ^  z  y+ g+ T    char c=csym; csym=0;4 x6 b7 O' V6 `7 z7 {
    switch(c){% B* A+ i+ ~* n5 @9 S+ D
    case '+':return t[0] += t[1];5 y3 M$ T) \% B
    case '-':return t[0] -= t[1];1 ]2 P- ?, h1 j" k) U
    case '*':return t[0] *= t[1];
. k7 e2 q$ s) P! X. Z8 d; X! R    default: return t[0] /= t[1];//case '/':
/ W& n4 t( c/ \$ i( b8 j- R/ S    }
/ r# J% r5 @; V  \) C" F}}
; T3 {! F, g0 L! h& s1 D7 w  wtemplate <class _T, class _Tstream>  k, N) a1 b: Q; g% G* ^: P
/* _Tstream: inputstream, _T: get return value
- R) `2 w" b  U* Return nonzero if get value successfully */+ s; \( H1 H# z+ S
int GetExpValue(_Tstream& istrin, _T& nReturn){
/ F- V+ I" q/ T1 [. c6 r    _T t[3] = {0}; //雨中飞燕之作
) P6 |9 k0 Q/ ?6 h9 Z. c5 p$ ]    char csym[3] = "++";
* F! N. H. d& ^' I, P$ H/ t    int nLevel = 1, nERR = 0;9 ]6 I- ~' y5 l( @3 Y" V
    if(!(istrin>>t[1]))istrin.clear();
- d0 O9 M5 q' u) X9 E' C) m8 n    for(;;){1 T8 C# ]* M- p5 O
        if(istrin>>csym[2]){
  n8 y7 X9 o4 g; t# F, U            switch(csym[2]){
- K( B% e) w. {+ `  Q' T            case '(':9 h. r* B) J) [
                if(!csym[1]){nLevel=0x100; nERR=1;}else
* S$ M) ^' W( Q6 t                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;& U+ g" V. l& f8 Z! b/ b8 Q
                else{nLevel=0x100; nERR=1;}' @: L5 x' e) z$ N
                break;
5 c8 j5 y5 ]8 g) f0 {            case ')':
5 ?& L4 k$ _5 O; o) C                {nLevel = 0x100;}break;. z, t" {4 ~: p( K8 V/ r
            case '+':case '-':case '*':case '/':! d, ~2 W& j$ k
                {csym[nLevel++] = csym[2];}break;
$ D4 e: H4 R2 p) ~  w            case ' ':case '\r':case '\n':case '\t':continue;; j) R3 Y& X" a1 y
            default:
7 a) K, d$ K. T' I- r! @( ~                {nLevel=0x100; nERR=1;}
1 `, o4 V# B; i# X            }
- o7 B$ F' J  v; _- I            if(nLevel==0x100)break;
0 ~0 G) `# K. y( d; r! n            if(nLevel&0x10 || istrin>>t[2]){
; f- I5 h2 L# ]                nLevel &= 0xF;- n1 x+ d; E* z" r
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; [# h: m9 D# V) q
                if(csym[1]=='*'||csym[1]=='/'){& Y- L' T% h8 c9 b# h
                    GetExpValue(t+1, csym[1]);0 I2 `! c& M; F( T1 Q! k
                }
5 k" v2 W7 {+ ]                else{4 b4 P, _+ B0 S1 G4 d, G
                    GetExpValue(t, csym[0]);& G- I) m- m/ H+ w  s" E
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;7 g! A  Y  ~3 x5 T4 ^/ l
                }8 G1 Q: k6 C4 r" h
                nLevel = 1;
9 K0 z, o( s4 O& L3 b            }
/ N$ K4 a/ R$ D: H4 }, y: F! y            else istrin.clear();
6 [2 {' O: z# F$ e  o        }
! z" W( C: H/ m( s        else{nERR = -1; break;}
8 J. I7 E" J" o$ O6 n. g    }5 q4 m1 f6 D: s, A4 @4 n3 O6 Z
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& a" i! H$ X" U' [3 K. U* I  w
    else nReturn=GetExpValue(t, csym[0]);
& p" i$ y. [3 O; ?& b5 |7 a    return nERR==-1?1:0;
+ f4 @% j' Y( X- A; {}}
% D" @- N& ^4 \# `4 E$ v# p3 N$ j! K" t! p  Y7 {

$ b" Z* P. }; s4 b0 l* X$ x
- G: u3 L* f# ?  U函数模板使用示例:3 m. P4 T- P, G2 V- z1 Q  k
在以上那段代码的后面加上以下代码:
+ p9 L% \* k1 j: r* q6 W' f5 p0 ]% m' _& s! N2 X9 I* N

# N. t* m6 k! V7 f3 f
( ]& @4 u- o, e9 ~2 j  |  v6 m程序代码: 0 @1 U$ `/ b+ u- o: x" Z) p

8 ?% g% Q6 f* g' v/ a#include<strstream>5 I. c7 ?/ r: L4 y4 x/ {, }
#include<iostream>
: \# e8 c) e: J3 a/ b( |. w#include<string>
& o5 p, y3 Q$ ^5 }/ Husing namespace std;
' H: r  D" ^: Y+ S' k, C7 kint main(void)- Z; F6 U. \+ \3 Y# |) l
{
' J8 Z, ?0 D6 m* q  H3 l3 x    string s1;; N) ]- |) {' R% A
    while(cin>>s1)
! N1 ~( Y: `! B    {
9 w* h% S1 U# i6 `9 U. w: W        istrstream isin(s1.data());1 V9 V5 r# ]% }" Z( _/ |/ ^* a, \
        double d;8 Y9 _' v9 O: l
        if(fy_Exp::GetExpValue(isin, d))2 z0 V, b  k& S
        {
0 ^) W# [- j+ m  ?            cout<<d<<endl;; h" s( x: \( U7 S: Z* X0 T. T
        }6 C. f6 f1 z1 F4 \! c% b
        else
- }. f% y: t( Y% e: @, |5 N        {6 ^3 K+ ~& H3 i' \
            cout<<"ERROR"<<endl;0 |0 B7 f5 N" r0 S/ t: V
        }
6 l8 c8 M7 }$ b    }& t- d. G" v  t9 P: `9 ^
    return 0;/ `& q! J% A5 m+ q
}
* a% l# Y# L/ q. I/ n5 ^
! Z: D5 t& z, X  C4 W" \/ a( p  S/ Y
然后编译执行就可以了(*^_^*)* X. m8 j0 [: T4 i; j4 a* j
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: ^$ x1 ?3 ?0 G  Q      建议使用VC7或VC更高版本,或者使用GNU C++编译

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