返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
; r) f4 I9 J# q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% Z* }: Y: Y# @  I+ Q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 g/ c! {4 Y/ a& j: }; w
参数解释:/ O7 [# @  f! [. q$ K. l' K
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- ~! @! T( `. T( knReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 I# s' A! j) |& R# ]4 A! n$ f返回值:
, H% ?, t* b0 `7 i: g0 d返回非0表示计算成功,0表示计算失败有错误: q: a+ K# b/ c9 ~- ]# W) Y0 h
. v, k: D4 p- }* S7 c' D" N6 j

, I8 G. j' m$ q) \
6 F2 F4 A7 t; W& L$ u9 H3 D4 l% Y9 T程序代码:
5 j$ k8 g5 b& b7 l8 t/ c) N
; L, e- r9 u/ F$ r  g2 O( C, nnamespace fy_Exp{2 I; v; y* c  l' y+ _/ b
namespace {template <class _T>3 H- b: ?7 p  |; c
inline _T GetExpValue(_T t[], char& csym){/ @; C5 L0 H7 y& l8 y
    char c=csym; csym=0;
1 `+ {5 C: [4 v( s  K    switch(c){
' C) Q0 L; Y4 R' Y  Y! @    case '+':return t[0] += t[1];
6 B- }5 X; i% |1 {3 J) m! H    case '-':return t[0] -= t[1];0 a/ Q# E' I8 |# \0 e
    case '*':return t[0] *= t[1];
( }& @/ N5 f: R' X    default: return t[0] /= t[1];//case '/':
6 \6 {6 z& k3 M  W' z" B    }
7 s' F) l- s+ S: x/ i  R}}
! Y! ?) `# r; N2 h1 I* Ytemplate <class _T, class _Tstream>+ F* U& o; m# t+ v, v5 h4 Z) q
/* _Tstream: inputstream, _T: get return value
- `) _" T/ o7 g* Return nonzero if get value successfully */
& F( |* c4 @! X" D3 \int GetExpValue(_Tstream& istrin, _T& nReturn){5 \- s) X, g% s. q1 }' F, Q# D- A- C
    _T t[3] = {0}; //雨中飞燕之作7 u$ |. C7 u0 Z; ]& |, _7 b- Z
    char csym[3] = "++";5 b- n3 [4 q0 j+ w: s, G
    int nLevel = 1, nERR = 0;0 A* l6 `) f0 y, p% `- U  r
    if(!(istrin>>t[1]))istrin.clear();: V4 ]. _. V+ q2 G8 m  V4 N2 g
    for(;;){# w) H! D# E) V) q- a! r  G
        if(istrin>>csym[2]){% G3 {/ Y6 b- j( k) Q$ H
            switch(csym[2]){
, F2 k! e' U  U/ Y! k" |" C            case '(':, q9 {2 a% [+ x  }6 V
                if(!csym[1]){nLevel=0x100; nERR=1;}else# O- |1 G! @3 p/ y
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 ?) m$ C7 R' M; O, q' Q! X0 r  c
                else{nLevel=0x100; nERR=1;}7 t5 _5 U& o" d" g- s, H7 g
                break;
2 B4 e' e. N, ?) ?; f1 O0 E" q3 d            case ')':
2 L- S6 u3 n9 W5 `% C& ~" @                {nLevel = 0x100;}break;
; q, a8 V9 ~# O4 k# z7 _. w            case '+':case '-':case '*':case '/':% K# K2 `2 F- n' o, f
                {csym[nLevel++] = csym[2];}break;! j; Z1 L) X" y/ O- w4 y( C# w0 j
            case ' ':case '\r':case '\n':case '\t':continue;9 Z/ f- G. t: d/ Z( `
            default:
* b- N) B0 c1 J( y                {nLevel=0x100; nERR=1;}+ [. i* P8 |; h( S2 ~# s$ f. ]& J
            }
; H/ K  X0 b3 w            if(nLevel==0x100)break;1 R( x! ^4 J: s5 u
            if(nLevel&0x10 || istrin>>t[2]){
! h, V0 r" k: a, f% o9 p                nLevel &= 0xF;
+ n+ ~  u; W/ e* ]: p* V                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}/ ]* S! |$ V/ `5 ]+ V7 L
                if(csym[1]=='*'||csym[1]=='/'){( ?% O' g# n  O8 d9 q
                    GetExpValue(t+1, csym[1]);
: e6 u, T3 t( C                }* E- e# U( m; Q
                else{
$ E/ l) H9 M' _( l1 d& h                    GetExpValue(t, csym[0]);
. d- i% l7 E3 p( D4 V                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
5 R' K3 o: Z: q9 y                }
0 M/ N, Q/ g# V0 g) c                nLevel = 1;2 S% ]: M4 A# @6 A( b0 ?  R; Z) w
            }. C" @5 t- M, \% U% p
            else istrin.clear();
/ T$ v8 U) W. l. }6 u6 Q        }
( z' X( T2 B$ ?        else{nERR = -1; break;}
' I2 r. p0 Q" t1 x# e9 v' s    }+ G6 L( ]* {/ s( z1 }+ h3 y
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: J9 G% O% D3 C
    else nReturn=GetExpValue(t, csym[0]);: i1 |  _8 Z( A9 n3 h; W( s, d
    return nERR==-1?1:0;
: o6 B# N0 D( `' @2 R, G  V# k9 `}}: \9 K% t; {# k  ^$ @
4 D" ?9 s9 \" \) g1 w8 }3 w8 V

" R( D" Z# K( P8 B" S3 q1 c/ G
函数模板使用示例:1 Z# W. s& F' G$ |( c
在以上那段代码的后面加上以下代码:" d+ y- b% U, b+ w

& E. R1 l4 E1 O, c/ ]' T  `% y7 x 4 h# g1 Z" n( j5 j0 w% ]& o
; w! Q/ [: I. R5 r2 R
程序代码: # y" E3 x( J( H9 i5 i. {9 C* Q

% b# h2 b& G- ?#include<strstream>; b& d0 G1 W% y! b
#include<iostream>( W! i9 p0 ?: R
#include<string>" i; V- r# ~( N8 D: O. w5 M$ i
using namespace std;! b; E& J6 k3 O: u
int main(void)' t4 u  g% X, A- p2 V, k: e- B
{, b' p) S* Y' F- r/ ^
    string s1;& M8 M: H: z8 a  w( Y, A
    while(cin>>s1)+ X$ V* w6 F( ~3 V" n4 i- c+ f
    {
- d+ _. O" \! V( w# k/ Z4 i5 P        istrstream isin(s1.data());
; Q9 E- C# Y. i- o- ]8 P        double d;
4 T" Y7 @5 ^" Q        if(fy_Exp::GetExpValue(isin, d))
3 w9 T9 c' M" t( N8 ~7 Q$ a        {- b- k! v$ b; {( w, S
            cout<<d<<endl;$ O; S8 A1 t/ H9 f# M
        }
) d9 J' n+ z  M) @1 C4 x. [        else
3 S/ _5 g  W; M) M        {
5 _  o; S; L3 ~% Z1 Z) k! x            cout<<"ERROR"<<endl;& A) L9 g' Q7 v- v
        }
- u$ A% S; S! L5 E* g4 U; [    }! C, R$ M: J% _  }) {
    return 0;
) i: t- v$ c$ G. b}
+ Q/ Z( l: m# A, N% y; h$ d4 k# P3 s2 v& n4 [
! k# o( ^% P0 p. i7 G
然后编译执行就可以了(*^_^*)( s, }1 m# M6 O9 u" {3 N
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; ^, K; g( j9 S- [. ~* p& _/ p  R% d      建议使用VC7或VC更高版本,或者使用GNU C++编译

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