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

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

在9月8日那天我特意编写的,给大家分享的,
$ X2 p( Q6 y- U+ l  t: }# [, f+ {" o一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 F* {& @, X. F: p: {( ]6 p只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% Q+ C! x) M" r4 W" N参数解释:
' l  q0 R. m: ?5 y/ s8 {istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ q& d* q, E. g% V8 L! `nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定& r8 e( a7 B: z' g
返回值:
0 d3 J& ~( S$ w* [" X  Z返回非0表示计算成功,0表示计算失败有错误
' K) m8 m$ e5 \. [  D3 Z5 T7 ]2 A8 K, `2 }

! \0 V5 c/ @; c5 J
2 B$ a2 |% N/ {程序代码:
+ h, x; }" Y) o) f) \2 S+ R, A1 r! ^" ]- |
namespace fy_Exp{0 L2 q. {$ A" t& {% X% X
namespace {template <class _T>
8 s# d6 K9 E# i9 b) D! @3 t0 T7 Finline _T GetExpValue(_T t[], char& csym){
3 Y& j! W4 S5 ?( q    char c=csym; csym=0;
) x' r; h5 J; ?/ ?8 F1 a    switch(c){
+ V% b; U6 k$ M8 M5 v9 T    case '+':return t[0] += t[1];
0 h4 K: G* A4 Q* U2 W    case '-':return t[0] -= t[1];
8 F3 X- s' g" z+ h/ @' }9 J    case '*':return t[0] *= t[1];
; z2 o  c, V9 \( A    default: return t[0] /= t[1];//case '/':
& D1 `  }: `( P0 D$ j4 Q    }
: J' l8 o" K8 A}}! z3 _5 Q- x* [7 O* g6 C8 w3 J
template <class _T, class _Tstream>
' X( q8 E+ [( m, a/* _Tstream: inputstream, _T: get return value2 ]7 |3 q* {+ v# b2 @
* Return nonzero if get value successfully */
5 p) |( t. v; G# [8 f& ?; o9 {int GetExpValue(_Tstream& istrin, _T& nReturn){
0 j8 O+ p0 E3 w0 b8 E    _T t[3] = {0}; //雨中飞燕之作1 m2 P: m  \) d, n7 j* }/ k& H& M6 b: Y
    char csym[3] = "++";
" ?' T  T. N4 c* u2 N: x    int nLevel = 1, nERR = 0;% j5 ^4 W: G5 R% H2 k; a4 n) X* O
    if(!(istrin>>t[1]))istrin.clear();
8 }5 r. l4 \+ b    for(;;){
* h( Z0 N, u% p/ u5 ~" j5 D        if(istrin>>csym[2]){
! Y, D! c: q# {: i            switch(csym[2]){
$ A# J0 v' H' f; @2 y* b5 _* R1 O            case '(':
/ {' n/ r' _9 f2 t2 B" N+ [, h                if(!csym[1]){nLevel=0x100; nERR=1;}else
$ ?& K8 V4 Z' O: M: T5 p/ G$ l" |& h                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 ]" S7 s9 o) a- o
                else{nLevel=0x100; nERR=1;}
7 j5 A& B$ G) U2 {, Y                break;
- u9 Y7 r; G3 L3 ^( D1 r+ }5 Q8 l            case ')':
% \4 V" h: L4 d4 c                {nLevel = 0x100;}break;8 X! K* }/ k0 Q3 L5 w
            case '+':case '-':case '*':case '/':
1 f3 z& z: f4 j/ A                {csym[nLevel++] = csym[2];}break;
& d+ w5 O7 i# o9 }' s            case ' ':case '\r':case '\n':case '\t':continue;3 p( a5 B6 R9 s
            default:( e9 _' G: c+ ^, p1 {
                {nLevel=0x100; nERR=1;}; N4 N: D1 u0 G4 ?
            }! w5 k+ T( P( {" @
            if(nLevel==0x100)break;/ ]8 Y1 K9 K! B2 Q. }
            if(nLevel&0x10 || istrin>>t[2]){% I. J% r: a4 U$ u- {( C$ l% h: t1 h" Y7 M
                nLevel &= 0xF;9 \! L  B7 t" b4 D
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& \& y5 v/ O+ i) a2 d
                if(csym[1]=='*'||csym[1]=='/'){
% S0 k' k, O2 {                    GetExpValue(t+1, csym[1]);+ w( S3 F- b7 P
                }) O8 w" d# Z3 i, l5 `- X: b
                else{! u- q' G' k# e8 A
                    GetExpValue(t, csym[0]);
& |2 r8 H4 h/ ]; R8 m                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;& Z1 j3 \# ]9 d9 y4 G* Y. [
                }
/ {7 M" R/ w# g: t                nLevel = 1;
. m0 t% q$ O  K            }
* @% e. ^& @/ I0 A+ `7 @            else istrin.clear();2 }8 @0 n9 |% p& K5 b5 R, l
        }
6 C' {9 M( c& Q9 O6 r1 @        else{nERR = -1; break;}
# M" |- y" a9 `7 G6 Y    }! y1 e: Z% t0 U+ x! H
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: f1 \$ d: h$ J6 h4 p- f6 a; {
    else nReturn=GetExpValue(t, csym[0]);
9 `# ~$ E, |3 r: E% A9 S9 W    return nERR==-1?1:0;
4 [/ {' e, r. _* z- O}}, ~, u; i9 W9 V1 U  o1 w6 O) x* a
9 G/ m4 f0 S7 V1 s! C
1 |, w! m1 K/ {) b. ?: C: Q- p
/ C$ K1 f! l: r& L) A8 R$ C
函数模板使用示例:6 H1 f; E# r0 J2 k5 U! f; ^% r, v
在以上那段代码的后面加上以下代码:
/ Z' n+ n. C- u/ T
5 x- T+ Q$ R8 ` 8 r" H+ K" p1 ^/ A/ N- ^# T+ k5 `# P
% @6 p6 D, ?4 Y1 k8 L& T1 H+ w
程序代码:
0 l, D  K! y' K, u* Z/ E6 J9 @( k! O* b! t6 U3 z8 F, k6 w
#include<strstream>2 v+ a3 ~* S) d+ `4 s! U
#include<iostream>
/ ~5 w% o- h: x+ X; b, W2 `6 V# I) ]#include<string>$ Q' D/ N. V! ?
using namespace std;
2 d( t: c3 y9 ^, y* t9 Yint main(void)- A, r) o5 \  O
{
3 N5 m1 X7 G# Y8 @7 V7 v    string s1;8 [; n1 q8 P. X, n3 X8 ^6 [
    while(cin>>s1), x% x+ X) S, j* Z/ H4 o. P
    {% ?; b; w) T7 V5 W9 O* y
        istrstream isin(s1.data());
1 y; h! v. B5 t6 l+ y        double d;' Y5 [/ M( B' W
        if(fy_Exp::GetExpValue(isin, d))
4 h1 c! I( K% T+ a" D        {
& i2 _) s& C  O3 V6 s% C  f! M            cout<<d<<endl;
' f" C$ n: T( g5 t) g( N        }
+ s; y0 g* o0 h% ~8 n/ U* I        else  g7 m/ L7 [3 z5 a0 a1 ?
        {
% B' i! t& X; k7 K9 `) q# q. b0 I* {            cout<<"ERROR"<<endl;  _' S* f5 j2 Q$ F- ]- p: h( j( |
        }
8 V+ @) X1 h+ ?8 o    }
0 k. |! @% w/ W+ {    return 0;
4 R0 w9 F. J: K) H6 W/ v% {}
; i1 p8 |8 ?* ?! g& f$ |
8 b) _6 r' _( a& ~8 V) Z1 N1 P  i; W( U& E
然后编译执行就可以了(*^_^*)
) V3 D5 X0 a5 E: u6 v4 M9 x. W其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 E( s5 m1 b3 Z8 N+ G5 W! ?5 z
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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