返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,, ^6 X1 O- r/ ~8 ?
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) C4 n/ U! ^3 ~6 y" X% B7 o* H
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 \5 l" q9 z) S$ v+ O. Q: W8 C
参数解释:
( u& b7 f5 n5 n7 N) u  {! ?4 D2 |istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 ]2 M- ?: |+ S5 \. b# n" }1 \
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 g, B$ I/ D3 H
返回值:3 W/ r8 @/ h. V; m
返回非0表示计算成功,0表示计算失败有错误6 [/ W7 ~: l' `* Z. W4 ?% ^) \
3 w3 {, N$ w0 X& ^9 A, W0 E. ~$ g3 w
( l2 ~5 _& j( j6 T& T; \2 q5 A1 S
6 [% ~6 p( E' x1 y+ U8 m7 H
程序代码:
* ^* S) i3 X( \+ a# I4 ?7 a7 A) y" T9 n  X5 n5 H1 |! v
namespace fy_Exp{
. ?; q5 p& s  E" b* Lnamespace {template <class _T>
  j" K: w' G! W3 Xinline _T GetExpValue(_T t[], char& csym){& Z0 E$ T* C& B& e
    char c=csym; csym=0;
" v- e4 E) b2 T: t6 f    switch(c){
8 ~7 t4 ]! Y7 I- j  p' \    case '+':return t[0] += t[1];
( G- v. R6 ^- a" ^2 P2 E    case '-':return t[0] -= t[1];
/ v4 h# F$ T( B/ V, e    case '*':return t[0] *= t[1];
. F+ ?/ g/ I/ B+ Y1 z4 [    default: return t[0] /= t[1];//case '/':
/ @8 Y" T/ |7 r& |8 g! s; c# R    }
% s& l+ |0 g# N7 }4 k2 y1 M}}: q/ |+ I( D5 u
template <class _T, class _Tstream>, r% \: A$ L7 s: M
/* _Tstream: inputstream, _T: get return value
& l: e# G' j# |* Return nonzero if get value successfully */5 s  K" v! t$ R5 F
int GetExpValue(_Tstream& istrin, _T& nReturn){: m7 X1 [* {4 R0 s3 a
    _T t[3] = {0}; //雨中飞燕之作
. N: q1 ?% b2 X    char csym[3] = "++";
$ R! g; e2 a4 f& x7 n: Y    int nLevel = 1, nERR = 0;
9 d% W# z: `3 ^    if(!(istrin>>t[1]))istrin.clear();- p( Z0 p0 ^- M+ F0 u' z: I
    for(;;){
' @3 j. P3 v4 I5 H        if(istrin>>csym[2]){; M) g( u- k. z, ~% f& e
            switch(csym[2]){8 @& z2 o+ R, e9 s; r% S) v
            case '(':
+ H( n/ U% o; Z- a  ^" y! y: |3 O                if(!csym[1]){nLevel=0x100; nERR=1;}else
0 U: @/ M2 U7 Z& U4 C  i9 _" [9 [0 a                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- d+ L2 A9 S$ Q, J5 F) m) U                else{nLevel=0x100; nERR=1;}$ [* E6 j: a$ V( _- a
                break;
3 a+ q' T0 o- t4 T" z4 E            case ')':
  I& `2 O, o1 v, r. q                {nLevel = 0x100;}break;' o8 b# x$ |2 C+ y
            case '+':case '-':case '*':case '/':6 r- y- V+ T3 Q3 v
                {csym[nLevel++] = csym[2];}break;3 e1 `; Z3 e: \& R7 ]: Y7 p
            case ' ':case '\r':case '\n':case '\t':continue;
/ W' M+ n% b: m7 G7 `0 d3 H            default:3 r* Q2 N, L+ I7 \
                {nLevel=0x100; nERR=1;}
) k1 n: J* S* y9 `# k4 ?1 _: D            }. W# k( v& z" F* }$ y! Y
            if(nLevel==0x100)break;7 C' a0 L9 [: t7 H' S6 P
            if(nLevel&0x10 || istrin>>t[2]){3 r8 p( c) B! F5 R( W$ r) U
                nLevel &= 0xF;
1 o, g$ y8 U  Q0 O                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 b# E. j! [3 k3 r# m$ d  g
                if(csym[1]=='*'||csym[1]=='/'){; A: E7 N* I; s* i; _3 M
                    GetExpValue(t+1, csym[1]);
- I1 p: m2 W0 j1 q/ M                }
7 v: Y6 |" X. @9 s6 q) Y8 H                else{
) ~8 i  r3 S6 r1 U/ @                    GetExpValue(t, csym[0]);
+ T/ Y" M5 K. }: l% d$ }$ j1 r                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;; Y5 K" F" o& F% D; ]/ G3 f+ h) I
                }$ E4 R+ V" H, A% `+ ~4 o0 [! g* ~& ^
                nLevel = 1;
* E+ V/ f- [( h! q* {% h6 c3 f            }
$ K% H+ [; K2 \5 w) z            else istrin.clear();
- a# j# G! U: I  R        }
' e* q- Z+ z" I, f$ a5 \        else{nERR = -1; break;}
. P: V+ w! l  D5 l1 I    }
: z0 z! j& f4 N! A3 p& e    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; I5 ^6 Q* g* B4 j; W- @
    else nReturn=GetExpValue(t, csym[0]);
* U: M" N2 R8 \8 Z    return nERR==-1?1:0;
% u3 g4 C8 N( X. g& U/ W}}
1 z9 ~8 e* E" @* y9 Z% J9 e, t% S$ \& F  f6 a
! z4 d2 l& V3 G4 n% p7 Y" }
1 D% G/ p5 _" m
函数模板使用示例:
& S6 Y* p  a/ Z  \7 \6 m$ K在以上那段代码的后面加上以下代码:3 x; J( }6 |2 H& S# ^

2 o1 s3 ^0 t" k# n2 j1 ] * V. ^, w$ A+ S7 g
. l( W' g& _# i& ^
程序代码: & B, a( n9 V" c/ ]9 J$ Q
5 X4 a* X4 W; V: k9 C
#include<strstream>$ r5 k* {/ j6 r6 s
#include<iostream>
# A4 c5 t6 f9 ?7 X( `7 F#include<string>  u2 e) ~( K' ^1 k  ^
using namespace std;
! a, E0 {( ~& D( U4 S% V$ Sint main(void)
, F* }* M' [$ o( E1 Z1 u{* Y  y& q6 D! ^8 y# N! o/ R
    string s1;9 g8 N5 a0 C2 f1 K. V' y0 m3 y
    while(cin>>s1)$ C' W. B) ^% r1 ], o. A5 @1 ?
    {
# b% f! G2 C7 u& W! l$ r        istrstream isin(s1.data());* S4 Y/ P6 I' P
        double d;
* n. r$ U$ y) a3 ]7 `- \7 T        if(fy_Exp::GetExpValue(isin, d)); q+ s& a) G/ v" m" i
        {
$ o# w1 r. \7 j8 s- k            cout<<d<<endl;: f6 a: u2 d' t7 t/ r
        }3 K" l/ K2 C/ Y0 g+ @; A
        else( b$ E+ P1 h0 c8 {# F- g
        {  p* R% \- w; }' F
            cout<<"ERROR"<<endl;. j7 [5 \1 P# q  I* C
        }) U" B+ i1 A, a! Z
    }
7 i- ?0 O8 C. x    return 0;, U/ A1 P- l6 w# P7 w
}
* f( o4 g, {  V! r& e. \) C3 Q2 i9 S  ^1 q# k' o7 V% P
3 ^$ t, l$ J- m. `% y) M
然后编译执行就可以了(*^_^*)' g' R" V. S) K( w2 T. H
其它:TC++上一定编译错误,不保证在VC6上也能通过编译) c3 R9 y# Z6 p  l: D3 L9 F
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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