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

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

在9月8日那天我特意编写的,给大家分享的,
4 U. u* v9 Y5 u2 f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ j2 |( V6 K0 n$ k  V7 T/ H
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! V( {; R8 c) u. }7 I% M
参数解释:
$ Y- Y. a7 i) T% e9 ?istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" s, C# Y2 i$ ^* X
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* C. y4 r. L8 ^
返回值:
7 U0 A1 T; ?* L0 a" G. E返回非0表示计算成功,0表示计算失败有错误5 W9 E/ d6 c  u& m. a( {
& u* k% n# A. u( P0 S/ [, f$ x- ?
* p- g4 L+ c/ w0 W

& T6 [) f. j: A# P6 y# A程序代码:
8 S; U% X5 _6 h/ O9 l. r
" M$ L' ]6 m/ wnamespace fy_Exp{8 P. v/ y0 h, C4 f/ F8 a. J2 V
namespace {template <class _T>9 F$ P, S+ Y. I
inline _T GetExpValue(_T t[], char& csym){1 w, ]. q# S8 J, N$ ~. k4 q& b3 Z: k
    char c=csym; csym=0;& \- m. d; o. h  F5 O/ I
    switch(c){  ?/ k1 \* C4 }( k" E! K
    case '+':return t[0] += t[1];
* ^4 t  e! t8 |2 G- H8 K9 v- a    case '-':return t[0] -= t[1];) V. {% _6 a- i. r$ M! H
    case '*':return t[0] *= t[1];: a; |6 e3 W$ j- W
    default: return t[0] /= t[1];//case '/':. O) ?5 p* M: k& C% J" M6 h
    }* Z& S6 z8 v4 `; {
}}
8 v0 L9 _! b0 W/ Q2 Jtemplate <class _T, class _Tstream>
' M" o" k9 x; j! l/* _Tstream: inputstream, _T: get return value/ U( \9 m7 \- I; U2 }0 W( ]
* Return nonzero if get value successfully */
* u4 U9 a- d! \2 R% zint GetExpValue(_Tstream& istrin, _T& nReturn){
5 ^$ K+ o8 r) S% \9 B    _T t[3] = {0}; //雨中飞燕之作# B' S  Y  U* e* B
    char csym[3] = "++";
, A/ I) @# q6 J8 }) J    int nLevel = 1, nERR = 0;
8 ^2 h! y6 z$ @    if(!(istrin>>t[1]))istrin.clear();7 L5 U$ `/ R* r# L- [* g0 j
    for(;;){
1 Z! g4 H: C6 T: b        if(istrin>>csym[2]){9 a; y7 K- ?& L. N2 q
            switch(csym[2]){4 x4 A( R; N% q1 W, ?" K( ?
            case '(':% g9 Y. }* I: b& N* B/ ~& L6 I0 i! I
                if(!csym[1]){nLevel=0x100; nERR=1;}else
- h& T/ L: v( T% K( o" t                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, l( O& k( f8 B! W                else{nLevel=0x100; nERR=1;}
6 {6 ?' M+ l$ J1 T0 J2 S5 q% l: Y                break;
0 u/ P0 A) d3 |. }/ ^, N/ B9 D, B& O& `. J            case ')':
. I6 O4 Y* T0 K: ^                {nLevel = 0x100;}break;7 B7 f  _' h1 {/ W& C+ K! T
            case '+':case '-':case '*':case '/':# N! ]8 }" y/ r6 t/ l7 F  ~% q% T
                {csym[nLevel++] = csym[2];}break;6 c9 |5 k3 C3 D* t$ \3 h) L2 B
            case ' ':case '\r':case '\n':case '\t':continue;: B& i, `; L4 F8 R& n; j
            default:9 n( p2 J8 {6 L/ G: q
                {nLevel=0x100; nERR=1;}: P, |# S# Z* @
            }0 B+ n. [, r% B- v+ B; }6 q- u
            if(nLevel==0x100)break;5 Q  p( J$ W  I8 h0 F- w3 D
            if(nLevel&0x10 || istrin>>t[2]){
# X# Z  G9 g9 Z                nLevel &= 0xF;+ x7 d6 D% O: k- Z( Z
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: C. b/ j6 Y- j& W, p( B
                if(csym[1]=='*'||csym[1]=='/'){5 |) Y5 \' s/ P: i" {
                    GetExpValue(t+1, csym[1]);
0 N# K! n9 V2 [, r3 K) f  R& k" G/ s                }9 w/ c9 G  ~; F
                else{
$ M6 s; A: o0 w6 E3 C' B                    GetExpValue(t, csym[0]);
" T3 L- P' l  U1 z0 D8 {/ Z                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 F' x0 g* i$ S( O3 e. Z
                }
# q9 B! v7 ?( e7 k0 F0 s                nLevel = 1;
3 A' C$ v9 _* Z2 X! Q- k5 v' u            }
' z. |& @( c4 G+ v            else istrin.clear();% I( n4 X. i: Z0 T$ E/ w
        }" Q2 r5 g* f6 a! n3 E1 E" M- O6 T5 G
        else{nERR = -1; break;}
. }4 q3 v& ~) V. m! K    }
' g5 g- o* S( z: I. n* j' n    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) d; Q  p5 W( a! Z7 [
    else nReturn=GetExpValue(t, csym[0]);1 g, }% P& a; Q- S2 c" }
    return nERR==-1?1:0;9 S9 v% F; V7 a+ _; I! ^3 B
}}: R& e4 W! |- E, G% o( \5 n9 k+ Q

' S$ Y( ]- l; j3 S$ o
: l0 x( w7 i7 x& ^/ j
1 T( g/ k! d* a$ v. ?函数模板使用示例:3 Z; O% s! J6 r, p
在以上那段代码的后面加上以下代码:' a( |9 f% E% |8 ]* D9 \! F; N

, k/ S2 ~) G4 m
, Y: I/ D) i  @1 j( I
" \& ]( m/ L) N5 N5 o0 ]程序代码:
' v! }' m) v9 e* H4 a. C' M% W/ c7 X, y
#include<strstream>6 q% P+ g% C7 J# F# V
#include<iostream>6 X$ d6 A3 I- t2 O  o; E" A& x( n
#include<string>
+ E" I. h6 t7 t. Wusing namespace std;
0 P( d" L/ [3 w& v. dint main(void)1 j, y2 w8 }. u4 T2 Z7 h. \3 _; Z
{
9 F0 T& D. s4 {- c' X! V, G2 n    string s1;
5 H7 v! H7 s1 q( _    while(cin>>s1)! b$ {4 z7 ^) w
    {0 d5 C: I, x2 `( F& E. r7 u
        istrstream isin(s1.data());
6 E1 y2 y; Y: O  c1 d        double d;
3 Q" ?9 f/ R  f% c; T        if(fy_Exp::GetExpValue(isin, d))0 j# \. Q4 O1 i8 I
        {# x/ ?, h- N! v" n) i
            cout<<d<<endl;
7 {. L; N) y! e        }) c# ?- R4 C* F% k
        else
( i/ ?5 J4 @3 ]* B        {
$ Q0 u  M" m" M9 r6 O            cout<<"ERROR"<<endl;
$ m1 F* H9 C( W        }
" ]/ H) j, Z6 z    }' f- n, o: `! d, x5 B
    return 0;
) H% o7 h  I$ i5 y, w2 D}
) r$ {. |0 {: t9 }8 x! K" Z, n3 H0 ?. R

3 y7 q7 W+ I; y2 x& U6 \5 x然后编译执行就可以了(*^_^*)
* |$ A* ^1 ?, a2 s! N7 V. u$ s! T/ s其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 r3 v( h* W" e4 V3 E# O. K( E
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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