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

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

在9月8日那天我特意编写的,给大家分享的,
; r0 \2 w8 |. V1 M4 w8 P2 I! D一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) i: s( }. o1 {只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 x6 r1 R  G% `# F# d5 V/ x
参数解释:* e3 q) i; ^3 z% i7 Z2 `
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 S- B5 K& Q! p2 _7 ~  [+ `, t
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定, |. b7 H: X7 ^3 ~: p1 |
返回值:5 X" c( B0 ^* w0 g! e- ~5 ]
返回非0表示计算成功,0表示计算失败有错误7 ^; o% O$ w) y" y( K

" A/ F$ q( a+ \
; m7 p" W8 M; E! X) k1 f' H! L. ^0 a# W5 T* o! G$ {6 ~
程序代码:   i" p  d) _+ t

: ?+ N: m- E, A5 l& Mnamespace fy_Exp{8 K$ k, F& s* @: }9 i" i
namespace {template <class _T>/ I* ?0 H- I1 ^4 R% W/ b6 \
inline _T GetExpValue(_T t[], char& csym){  W! V2 l& T( x
    char c=csym; csym=0;3 {, a$ @* w' w' D$ r
    switch(c){
! E$ i% G9 m4 L" f    case '+':return t[0] += t[1];" u  l) h+ f: A" x  |. w
    case '-':return t[0] -= t[1];$ p4 ^" i1 n. j! D! t3 F' {6 ^
    case '*':return t[0] *= t[1];1 m' Q; B# w) ]' `& A$ T
    default: return t[0] /= t[1];//case '/':3 w5 i) V/ N: p( Q
    }
8 w! G! l6 n2 Q' p}}
# _0 x9 k1 N6 otemplate <class _T, class _Tstream>1 @' `6 o/ m& g$ Z( P
/* _Tstream: inputstream, _T: get return value1 D/ [2 L" r# ?# ]  j
* Return nonzero if get value successfully */4 [- X6 j9 ?. @: C
int GetExpValue(_Tstream& istrin, _T& nReturn){0 f5 q" t/ Q% |- t0 b
    _T t[3] = {0}; //雨中飞燕之作
# J, l# ^  t# F    char csym[3] = "++";
) J; N0 K# o7 n/ C" w: h+ B    int nLevel = 1, nERR = 0;8 K& [' C- i( i* [+ u
    if(!(istrin>>t[1]))istrin.clear();" K; T$ Z4 S+ {; e: F1 p1 m! w
    for(;;){  H% d2 V% I9 E6 c2 d/ m+ o/ z
        if(istrin>>csym[2]){
- a- C" S( p$ Q$ Q            switch(csym[2]){
1 S7 H1 X/ u& y/ p& F0 j% n8 e            case '(':
3 F: U1 y+ v4 L. n+ F8 a                if(!csym[1]){nLevel=0x100; nERR=1;}else6 s: @  }- G2 [! N" N( c
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 g0 u) X' R! B                else{nLevel=0x100; nERR=1;}
' T: F% Y; D4 R$ U: s                break;
/ N5 o- d, ~) j. Z" f4 {            case ')':
; v0 ]+ J0 G4 i: }4 H) O: b7 U                {nLevel = 0x100;}break;
3 x4 h0 d6 Q6 J            case '+':case '-':case '*':case '/':
: A' [' B* D: H* x- P/ M                {csym[nLevel++] = csym[2];}break;
" \4 B" ?$ Z- F, d" v5 }- w            case ' ':case '\r':case '\n':case '\t':continue;6 s+ F: U1 @! d# i, S2 X$ x
            default:) [7 s+ G" q+ I9 `$ Q% Y, U
                {nLevel=0x100; nERR=1;}( {! q& z! \$ G# R/ _) m4 N& A
            }& e$ Q% O/ F. g$ `
            if(nLevel==0x100)break;
( w" u! q* j/ l) h4 c9 F            if(nLevel&0x10 || istrin>>t[2]){
. p* L2 l* {9 X  j  D/ C( D# S                nLevel &= 0xF;* {: x% b5 _7 R
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, @0 U) J. e8 }' ~. K- H
                if(csym[1]=='*'||csym[1]=='/'){: t* ^( A( Q4 \: Z% q' I9 m. M
                    GetExpValue(t+1, csym[1]);% v! P! s+ s, z
                }
- Y/ P1 |2 j- z' }3 r/ w9 H3 \                else{$ h. T. u* B: Z" X2 Z/ g, O( }6 e
                    GetExpValue(t, csym[0]);; ~: [. C; H. g/ @+ q4 [/ n8 o; I
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* S5 ~" J' _2 F2 Y; S                }
% }6 d3 H# P  g0 t+ |                nLevel = 1;
9 X* H$ ^& r7 p* A! |8 q& U* [( _0 w* ~; M            }
4 h( q: D3 ]# ]# h) E            else istrin.clear();
3 g( U1 Y3 J# f6 u) G& u        }) M- E* t3 {6 p2 o* W' C
        else{nERR = -1; break;}
8 V4 O: h: [, M4 }' N3 f    }  f" q, p  ^2 i7 J! O  S& Y
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- ~9 `" W9 s4 w# T$ C0 G
    else nReturn=GetExpValue(t, csym[0]);2 }+ _2 S" V& S2 Y' b! R! c
    return nERR==-1?1:0;
; d, f2 }/ l5 C! j3 k: Q  P6 j}}7 U4 M' ^2 ^" b3 h% M
* }. g; H; H) s9 g# K" S6 {
0 F# ^  }# {0 [6 u" ^
2 I' i3 f& }% c$ {
函数模板使用示例:0 V4 a2 w! n+ p0 T4 F# T& c) i
在以上那段代码的后面加上以下代码:
9 L8 n9 @4 r' H9 x% N2 T
  u9 ^1 }3 P9 k
* F6 i& M. U/ ]1 j3 q! e+ A, H
+ S3 w. a* ?8 b+ b) H2 m程序代码: ' _- L: F8 v0 D( i. E4 b
' {+ p) W# {. b! q* m: B0 P2 j! X
#include<strstream>* d' Q' `, c$ G
#include<iostream>* P: y$ h, Q- z6 u
#include<string>
/ G5 f6 k# V# x4 O* ~using namespace std;+ @# b" l& {3 T
int main(void)5 l0 S8 P5 t5 N3 H  B0 f1 S( H
{
- C+ L0 P# o: O: A    string s1;0 A# y3 R, r  Q8 `5 S3 q
    while(cin>>s1)( X, e/ U2 `8 E! `/ x
    {
3 w& V8 N& t9 E8 S6 e) r        istrstream isin(s1.data());
8 [  d- S9 [  m& K$ i        double d;* I' u+ u7 f( o5 ?* J
        if(fy_Exp::GetExpValue(isin, d))
* b; `! F- a* y  D+ \        {
; ~" A1 S+ P# Y; t2 F            cout<<d<<endl;  Q! g( z; |+ \; k; N" M5 k+ M2 ^
        }0 ]" |+ l' |0 q) a/ \) ~
        else
& o) e6 P" B0 ?/ w6 @        {
+ e+ A; f. m& ^8 y$ e1 i3 R4 u            cout<<"ERROR"<<endl;
; u. k& k4 m2 Y( I& w        }8 Z/ ~1 j( y  m7 @3 ^5 s
    }) f" m; W$ K! Q6 h; w
    return 0;
% o+ e; J9 P& p6 y- {}- H( o7 J6 }) G  q0 w
% d+ ^* F! P2 X" y3 _$ T' X) {, V
& E+ \8 Z! \0 z! c  k" K; Y" u
然后编译执行就可以了(*^_^*)+ C* K5 B2 {: f4 E* X6 V1 M
其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 g, R+ c! d" m5 G( m. q
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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