返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( u* c9 K2 f  E) o: y6 y+ ~2 U
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) I1 c- U$ B  V( f5 i只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 \2 M! Z) v  A1 w- J' g参数解释:  y' B% L4 i/ |! x" v2 V# }6 n4 n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ |* n. c: i9 q! ?4 ]
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" Q! D, B" |  a返回值:1 d& G( |+ C; {6 V' t9 S  Z
返回非0表示计算成功,0表示计算失败有错误
( d8 l4 Z2 X8 p% x6 Z' U/ Y$ U$ [3 {, D$ t  S% x
- {2 M+ ?, ?7 B- B) y- Y
0 I$ H- t4 N: f# o& z# \
程序代码: / Q( @* X! V8 v, }/ S

% j9 f; g1 g5 I4 M2 n- S4 ^namespace fy_Exp{
( n5 b/ R# _$ Pnamespace {template <class _T>
% d, g& n# a, |" n+ `8 `inline _T GetExpValue(_T t[], char& csym){; K; ^$ V+ [' e$ ~1 V) t: {- s
    char c=csym; csym=0;
3 v2 Y" r* N* K2 i" ]- H- u8 \    switch(c){
9 m$ K' M7 w! b- J0 {    case '+':return t[0] += t[1];
, f/ [$ t$ v+ w    case '-':return t[0] -= t[1];8 Q. t* D1 d- D5 [; ^
    case '*':return t[0] *= t[1];
" ~9 b8 h4 B3 ?$ G8 j9 S    default: return t[0] /= t[1];//case '/':6 N" _8 ~) C, x; O: m, P! s+ \
    }
, I  c0 ~6 V! `7 i' U+ k) u}}+ Q% s$ [2 ^- T0 X
template <class _T, class _Tstream>
8 s* d7 t0 U  V$ a9 N/* _Tstream: inputstream, _T: get return value
: F" V0 @% Q8 x% a1 o* Return nonzero if get value successfully */2 z- r8 x5 _+ J3 N+ E7 E; D4 v  s
int GetExpValue(_Tstream& istrin, _T& nReturn){  Q+ H% A# V4 E6 ~6 I+ q4 y
    _T t[3] = {0}; //雨中飞燕之作2 g8 O( W# k9 H# Y$ \/ z0 _
    char csym[3] = "++";( O& ?4 d) b: G; f* A( o. d6 @% ^8 A
    int nLevel = 1, nERR = 0;$ \' s& I8 B( l$ Z0 f
    if(!(istrin>>t[1]))istrin.clear();4 q5 I! j8 B. n$ S  ]7 k6 Q( h2 j
    for(;;){7 ]8 z3 c! z" X4 t+ ^/ Y$ m( P
        if(istrin>>csym[2]){* p- D' s4 e3 r9 ~
            switch(csym[2]){6 t5 p( {' K) s" e% r) n- X
            case '(':7 A/ ^1 M/ T' _" A- C; ?  v" y
                if(!csym[1]){nLevel=0x100; nERR=1;}else; g( |+ v  N* v" `' V* y
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: x0 V5 ?7 u6 t3 G- H, W
                else{nLevel=0x100; nERR=1;}4 G  o* ?5 V; V' g. T0 {, {, K
                break;8 x* X* ^' H/ ^5 Z) m' P" n
            case ')':
3 t  u4 N0 ^9 ]1 v8 ~; V                {nLevel = 0x100;}break;
3 r6 M3 n# ^8 F9 V! W$ a            case '+':case '-':case '*':case '/':
4 p5 Y8 F( U: T, A9 g! e$ i% k% K$ i                {csym[nLevel++] = csym[2];}break;5 m/ Q" c1 x4 s) I; }
            case ' ':case '\r':case '\n':case '\t':continue;
( z3 R1 G! ?# l* _" ^& ?            default:
& _4 p1 D+ r' o. T9 L6 L                {nLevel=0x100; nERR=1;}
4 u& f% T* u5 b$ w, s            }
) i* A0 J* |' E' j# a) t            if(nLevel==0x100)break;
, A2 {, F2 a7 P# k: z# R8 T( a            if(nLevel&0x10 || istrin>>t[2]){
3 {$ {) x8 S8 A7 @8 o2 ?                nLevel &= 0xF;$ I% k0 u  r! b9 f* I
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 ~* {/ `* }- N  D, _. [; l
                if(csym[1]=='*'||csym[1]=='/'){
4 A2 e9 B; @! d, L( ~$ i                    GetExpValue(t+1, csym[1]);
3 J2 Y0 k& r: g6 E$ a1 J  t8 f                }
' V/ e( A, v! F: l. K& ]                else{
+ m( X/ w# V. x. {                    GetExpValue(t, csym[0]);
, b3 d5 X' M& m0 d% C                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- f2 W+ E% j8 c# k                }
- r  I9 @5 G8 R3 n                nLevel = 1;  v5 @9 G* t+ B  i
            }/ w* g% {" u+ D( @) G5 I) J& I; r
            else istrin.clear();
0 E$ o# y! I7 F        }. D4 g1 n: J4 U4 p. X! J3 p. z
        else{nERR = -1; break;}3 `' b; ~3 _1 h
    }
8 E/ P8 Z: Y, c8 d2 D* W) L    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);! p. e% B; c2 A3 I4 M
    else nReturn=GetExpValue(t, csym[0]);
' E% [) D5 y2 a# X% C( a1 z    return nERR==-1?1:0;
# |' t  G& o; n3 c5 E3 ]}}% G' j, A# S$ l7 C! k6 v9 M
; E, n( P8 g1 ^9 o4 Z" r: M
* z, ~$ ^$ m' A6 E# L

/ E( ]+ y# f! c: a函数模板使用示例:3 U$ M3 j: w6 j5 W& O, {( Q  u# y
在以上那段代码的后面加上以下代码:
% [( x. Q4 \0 y  B* |7 D3 _- Y' p. ^6 @4 m! r, y

2 f9 s; O3 E1 Z
% Z8 R" G: f, a2 M  T程序代码:
1 i; U; X3 v- O, O9 \( j6 e" n' c
#include<strstream>
9 e* \+ T! ?: d$ C! v) @) B3 O#include<iostream>
% k3 q2 f9 I8 G#include<string>4 K( |( Q( X: Z: Z( p
using namespace std;7 C7 O+ N8 y! P3 j) i$ v
int main(void)* W1 N% E( A; X, j' S2 O, _
{
1 w  A/ l; E2 @2 V& P    string s1;
3 B( E4 \! R, }  h6 @+ `    while(cin>>s1)
7 y9 A! |: ]5 ?7 ]+ u    {
& |1 V9 l% p; T( v2 ?        istrstream isin(s1.data());1 g# }0 m' V; E5 h
        double d;$ Q. S9 E) w! g
        if(fy_Exp::GetExpValue(isin, d))3 l- ^6 U9 O: L$ |. J( U
        {
5 l( N. S) b8 t            cout<<d<<endl;
5 e8 F, Z0 o! K; D        }, J) Z" r5 f+ d- q/ {1 l& R# Q& s
        else! X* S( _2 N0 H- J
        {
& Q  n8 M' |) |  a) Y( V            cout<<"ERROR"<<endl;
/ N0 N) ]8 O( a# @9 R  {8 ~# ]        }' H4 v/ e* P) U, p, B' p; r
    }
, R3 n$ V3 b7 }2 N    return 0;( F+ n" @5 k8 I; F) ]
}
2 Z7 y- G; z4 O6 n1 M4 f. s9 Q0 }& @! X2 F
! W' y) U& `  h
然后编译执行就可以了(*^_^*)
5 z% H9 }8 c+ K/ R, m; X; ?7 C其它:TC++上一定编译错误,不保证在VC6上也能通过编译* ~4 b" x3 u9 h+ t: f
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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