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

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

在9月8日那天我特意编写的,给大家分享的,
: ]+ ?3 f6 |9 O, N0 o. t# x一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% d8 K6 I4 z% S8 t只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% O2 h' f; F. z9 w7 b* {
参数解释:
7 e( b; c2 i/ sistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 t! \5 K. L) `; ^; _9 j) P6 Q3 x
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 N3 ?6 l4 Z2 O- B2 m$ F
返回值:. g: z( g6 C. e: R! L. r  {' i
返回非0表示计算成功,0表示计算失败有错误
9 y) o- D0 E0 N. E9 I% t1 a& C8 g1 g" L& m# R" G

8 S$ x+ W! {" m3 k
& u( r4 g6 f1 @- ~! t- k程序代码:
  a. s! F7 M" R; c! w8 ]
0 R6 h1 O, P* B7 m  U- Wnamespace fy_Exp{: ]2 s- H2 I3 F' T! I8 P
namespace {template <class _T>; b9 w( J; ~# F* B
inline _T GetExpValue(_T t[], char& csym){
5 D. T( O9 {6 z0 d    char c=csym; csym=0;
; G- v. ^- ]+ w4 `( \4 q    switch(c){0 w  B* Z" k; J9 }( e: v2 b
    case '+':return t[0] += t[1];. y% m/ L2 j7 |0 r9 x
    case '-':return t[0] -= t[1];
' B8 F& d5 x+ C- o4 a' U- _    case '*':return t[0] *= t[1];. P  ]: b5 I7 D7 H
    default: return t[0] /= t[1];//case '/':
+ T0 p1 d6 X( Y5 ?, Q! |    }
% a* Z5 V! \& @: b: i8 G6 m}}, J6 L7 o8 K/ k. C0 f( D
template <class _T, class _Tstream>7 @- o8 J" J9 N0 G
/* _Tstream: inputstream, _T: get return value2 ^( r7 ^3 C9 C2 F# o& J7 o
* Return nonzero if get value successfully */4 v& ^7 i% ?5 q& h. r! [
int GetExpValue(_Tstream& istrin, _T& nReturn){# v. N, x8 V* g1 `# M0 l
    _T t[3] = {0}; //雨中飞燕之作# O) I4 Y1 r- |* q- G
    char csym[3] = "++";
6 |$ i/ ?$ r! G* s& M6 o6 q  i" a' r    int nLevel = 1, nERR = 0;# \% t2 ^- }8 r  U6 k* x
    if(!(istrin>>t[1]))istrin.clear();
; j" V2 @5 N9 z+ W$ t    for(;;){
8 B7 Z0 C1 I% w; {, ]" Y) O        if(istrin>>csym[2]){/ B, q, g% q% X0 z; `! \
            switch(csym[2]){+ [  N3 b! ?: O$ T2 Y
            case '(':
* ~$ E6 C4 N$ p  }: }                if(!csym[1]){nLevel=0x100; nERR=1;}else
: Y# Q/ y- V% P% b) A                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- L3 O* `9 \2 z4 |4 u+ f, V                else{nLevel=0x100; nERR=1;}
" L/ x' A- q  K) ^( m7 b9 x: ?                break;
# D6 O) Q8 g! {            case ')':
3 h9 l( h- O$ j                {nLevel = 0x100;}break;
6 s  N3 K  H' ]; q+ P            case '+':case '-':case '*':case '/':2 c. F/ N. g  B
                {csym[nLevel++] = csym[2];}break;5 y3 v  g& J- S- t
            case ' ':case '\r':case '\n':case '\t':continue;7 @/ n( u" z5 E1 v7 A* s
            default:
- }* d2 w: u6 |                {nLevel=0x100; nERR=1;}4 L: R. j' g8 Q8 X5 _: p
            }
2 S! G) z8 a) K# G            if(nLevel==0x100)break;8 n2 N$ {' C$ A# M6 B' q5 P
            if(nLevel&0x10 || istrin>>t[2]){
" ~% X8 M8 L& V$ T) N                nLevel &= 0xF;
! y. o8 v# c1 X/ N                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}4 w7 w% r! v$ U3 O7 ]
                if(csym[1]=='*'||csym[1]=='/'){% J8 M' B7 I0 ^! D& L- R
                    GetExpValue(t+1, csym[1]);
0 Y+ D5 o0 @' L3 P" R# z                }
1 Y' j4 Y* h( A  v5 Y9 h, y3 _; L                else{
1 D3 B4 P+ Z+ Z9 Z9 u                    GetExpValue(t, csym[0]);
! m, B+ w7 W2 [4 \$ U% s                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;! }5 m7 c# T; Z; B, r% Z9 U& T) s
                }
' ]8 I; ]' N3 i- B                nLevel = 1;
8 D! m- J2 B8 T            }
/ m3 B3 J" y) d            else istrin.clear();
9 D3 a! E2 t+ s1 ~4 @        }
2 t9 {* r- f- g5 q        else{nERR = -1; break;}
! l0 y2 S3 b( y- K    }
$ H; a/ b7 [4 D0 F" I1 _( g; E+ F    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; C; T' l2 m) }( S. h
    else nReturn=GetExpValue(t, csym[0]);
3 h% C7 F# ]7 q- ?    return nERR==-1?1:0;
0 K9 e( C8 j; [8 x* N4 R8 V}}
7 x  z8 }+ q% x- F, ?  X+ j' ?) k- K/ X$ N+ q1 J' b0 Q

  {1 Y, L% O& \( |6 ~& p+ W: i, h+ X/ `% Y. ^
函数模板使用示例:% k5 t0 V; F: o6 N7 k- A" F! |
在以上那段代码的后面加上以下代码:
5 T; w9 [* X: K. L6 W& S% e2 Q  C
' A" ]; r; @% k2 f( I+ ]  u

6 @9 x# q1 f2 z0 J* b4 ?程序代码:
/ ?* h8 L" e3 L" s- s3 C: k: n. m* @% H8 ~" e5 T7 y+ Z
#include<strstream>
" Q. b3 W( e6 O. F% u  T#include<iostream>
2 t$ y5 w  \7 I  O#include<string>3 k: P5 a8 h2 M8 R$ m  L) ^
using namespace std;8 c3 _( }4 d3 H1 A- Y
int main(void)
* P2 n6 u8 t- _% W{
4 s$ E0 s. I+ k6 n; r0 M    string s1;
+ R/ J1 e5 D" x+ T3 I    while(cin>>s1)
: a$ z; q) u: L( B" n1 w0 M    {6 ~& y- w0 X, c  }4 s
        istrstream isin(s1.data());; M; T+ M, j% e) ^( I
        double d;8 \( V1 Z$ R5 e& c. ~" B
        if(fy_Exp::GetExpValue(isin, d))' c8 M5 H: H1 X, N
        {
3 W# }6 i, O# `, I1 B6 z* M6 X  x            cout<<d<<endl;
7 u) a) z4 j2 o$ I9 Y        }
6 v( g# n  z. `" F- v' }) m        else
7 x" F  i; ~" P5 l% a& P4 p9 a        {0 u5 [" {  j# U
            cout<<"ERROR"<<endl;) E1 |6 P/ Q3 {& }/ L/ f/ `( A
        }
2 U# ^: B3 p9 F0 y0 @* r$ z9 E    }3 {& h/ G2 l6 h+ G
    return 0;  |) u% e* u+ v  n9 D" g
}% C6 [  }2 L" t2 t2 {+ n
/ P: ]) D' s5 x1 J; v7 z, c, s
; h5 y; c0 L6 D$ P
然后编译执行就可以了(*^_^*)
0 D# [7 J% Q' w: d, V. u其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 _' v3 }# ?" d5 i3 n' Z2 X
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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