返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,  x, y; K' [1 H- Z
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) x# s9 o6 O# U" c8 q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 r- y* h' Z- s2 Y- L参数解释:6 x5 h) |/ g4 F0 B
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! K: i3 i* ]9 j6 G$ Q! t5 c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 r/ V+ k2 l' ]6 c0 `' I返回值:2 l1 i0 |& b( ^  G6 R+ G
返回非0表示计算成功,0表示计算失败有错误
6 c9 T, k$ P1 {6 K3 y4 J! W0 X- W3 [3 m

8 Q& d  o" N! W! b  ]$ ^  a  w+ ^* B$ z5 L- _) m
程序代码: 6 c( d7 ?$ p; ^* E
0 M2 j- n4 T; I! {+ q& {% L6 B1 k
namespace fy_Exp{
: n4 v! r. |4 Znamespace {template <class _T>
# e  f0 q' Z$ r) l5 V3 }inline _T GetExpValue(_T t[], char& csym){( t$ x) q- V& K( A* w6 n% S. h
    char c=csym; csym=0;
6 F8 A. o: O$ d" m& ~    switch(c){
3 G0 X+ B- Y( n0 m    case '+':return t[0] += t[1];
5 h) A( j! G: p3 f) X7 a) x    case '-':return t[0] -= t[1];
; \; J1 M) A+ a8 U% G1 ^    case '*':return t[0] *= t[1];
( F* V9 h/ Z+ ?8 G    default: return t[0] /= t[1];//case '/':
2 P9 k0 L1 ^7 I    }2 h! I6 ^+ Q" k9 E4 A! l
}}. ~1 G! U& G, q" A2 ~
template <class _T, class _Tstream>
  v* ~# |6 s" |/* _Tstream: inputstream, _T: get return value, P  }( |0 {3 Y; Y
* Return nonzero if get value successfully */
& w& z. a" \# Xint GetExpValue(_Tstream& istrin, _T& nReturn){
3 c( h6 ^  E# K6 K* z    _T t[3] = {0}; //雨中飞燕之作9 s+ H, y: X( l+ o  n  K
    char csym[3] = "++";
8 ]- ~- _; V: P$ C+ V- b. j    int nLevel = 1, nERR = 0;9 u' Z2 \0 J+ {( y; C5 v, @1 M
    if(!(istrin>>t[1]))istrin.clear();6 l0 _3 U0 V) D! F' O: L: ]5 _
    for(;;){" G* Z8 L0 Z# Z/ A
        if(istrin>>csym[2]){
1 F: @% p  D# k            switch(csym[2]){
% ^1 m' S* Q1 C            case '(':
+ W7 K+ v3 v) `0 }3 q1 F5 [* K' j                if(!csym[1]){nLevel=0x100; nERR=1;}else6 F' u6 W5 Y& B5 c: J5 I$ x
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
; R! }$ y" _! \! z                else{nLevel=0x100; nERR=1;}* Z, s4 m) w- d$ h: r
                break;* x/ A8 `$ h: U9 z/ L- A% [6 K
            case ')':; Q) F3 `/ s0 ]& Y2 B* l% Q
                {nLevel = 0x100;}break;
9 i' e9 ^' A' q2 ~. m            case '+':case '-':case '*':case '/':5 h) S& K6 G" x4 F) u' v; f
                {csym[nLevel++] = csym[2];}break;
) ~9 d4 k' |6 E( r! `) I            case ' ':case '\r':case '\n':case '\t':continue;
2 B" j2 O$ @' A6 D9 U            default:. E0 U& T# C2 E. @1 c" u- q
                {nLevel=0x100; nERR=1;}
0 f# @: g% D. Z! w/ ]            }
5 ~. A) r" M8 N: K* I6 }            if(nLevel==0x100)break;9 a- B' D( b  g
            if(nLevel&0x10 || istrin>>t[2]){/ Q9 M. f/ k1 Y% X4 q
                nLevel &= 0xF;
  z- U! t8 U- s# F" h                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' `: n4 L  T6 Y" n4 W* N. ?                if(csym[1]=='*'||csym[1]=='/'){. G  `/ x" j+ _: \
                    GetExpValue(t+1, csym[1]);
( g1 l" v5 j" \$ z6 F! I  y                }, w( c+ B. ~& y$ L% j5 t8 N
                else{/ G2 x# J6 {' u# c
                    GetExpValue(t, csym[0]);
7 ?3 @2 I! f- \& ?* p                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 c! t9 b3 R. A: Y2 |/ S6 H( S
                }  @! F# h. i7 b  `4 B
                nLevel = 1;$ N2 t6 `) Y/ [$ G# i5 S* X
            }
( A$ i7 F6 M0 O0 {+ F' c            else istrin.clear();, D; r' @6 N+ ~  G  O. P4 `
        }
, P8 _2 R8 L. f) a9 M5 O9 X6 B        else{nERR = -1; break;}
# E- E* S% g& C2 W' O1 U6 ]8 u6 J- _3 r    }/ @; x$ v" m% ?8 x0 S. T% H
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 i* ]( g! Y) a# m
    else nReturn=GetExpValue(t, csym[0]);
0 W" n6 J: I* y0 `6 d& T    return nERR==-1?1:0;1 X; R4 ^! x8 o+ O. V! ^
}}
6 g3 D& ]/ |; ~( u
8 d% k8 V: n( f
7 Q$ m3 t. Q+ s' B! U  T! y1 B5 V$ B
函数模板使用示例:; a& p: ^; v5 L8 k8 ?/ a
在以上那段代码的后面加上以下代码:
$ G) ^- s  \& R% _4 y7 w
% X+ R% l& c! U" Q 2 v; F+ ?  X+ |# w# M# j& o5 M
7 l/ {; ?+ [! A8 F4 _# i, a) W% [% Z
程序代码: , [8 Z9 x8 H* X' [8 a. H

/ N6 R7 z$ H3 Q9 ]$ s. i" v#include<strstream>6 N8 ]4 r0 g7 w$ x
#include<iostream>' w9 g( g, o6 U
#include<string>
; X% @! m' o8 h' a/ h( dusing namespace std;
" O( K0 ^+ l: e( K; jint main(void)/ }1 H2 l) j- }, z4 O& R  {7 e
{
  o% ^5 Q+ c) M3 ~' i  R    string s1;
4 `% s- P  W5 L, Y/ m    while(cin>>s1)
  N% J0 }5 z, @5 U/ `( k# r    {
% J' Z  H( v# J        istrstream isin(s1.data());. @. a  j$ x( }* _0 j: p4 i
        double d;5 c0 L( P5 u; \0 n- g
        if(fy_Exp::GetExpValue(isin, d))
( l/ S+ F7 _5 P, Q7 |7 u/ L        {
* v  c+ O) X. k8 q& ?' d8 q            cout<<d<<endl;  H7 o6 x9 N. d' h6 s4 z) r
        }
" R- E* Z1 x4 A+ |4 Z  w4 ~        else; [* n! r) d( U. J5 q2 |
        {
4 [" ]/ p4 E, U" {  f. k/ u            cout<<"ERROR"<<endl;
* O) p3 k4 n) @: |! y6 o1 y; ^        }
. G5 Y! x* ^3 E; N    }# A+ q6 G, H3 Y' r
    return 0;: h* v; g. d) v3 N) |: H
}( w; K9 V! A4 I' T6 j6 [
$ c2 Q! k+ U* [. ~/ {( J& z) o$ o! c
' g+ g8 K8 @& Z4 L# y  e
然后编译执行就可以了(*^_^*)
& C) n! P8 d7 X& \% Y其它:TC++上一定编译错误,不保证在VC6上也能通过编译. [; P6 a" |  c2 H4 o  q8 C
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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