返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
# S6 O; h2 Z& a一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 t9 w% A! D! j( F+ G' F! j4 G% @只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! L6 v; D) |3 r* ?/ z; a参数解释:/ l+ m7 a  w4 `3 j' X# i
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' q, Z8 j- ?* G7 L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
  L3 H* U- s! i# y3 O返回值:6 r' c4 @, D* g) B" L1 q9 N
返回非0表示计算成功,0表示计算失败有错误0 J& m; M0 J* R- z7 \- Q' E

4 C; L; h- y* v6 S! j6 P/ o4 o 0 B" |0 y+ I3 j6 v" n- ^8 C
/ ?/ Z3 o  q" n' }
程序代码:
- _' X7 J8 B) b: j  p- O9 a" e
- |; r6 i2 }1 fnamespace fy_Exp{8 o9 m/ i) \; g5 [3 \8 C
namespace {template <class _T>0 n3 l* g9 h  i+ P. G
inline _T GetExpValue(_T t[], char& csym){
- Q2 f3 N8 q+ I4 g6 `    char c=csym; csym=0;  F+ J+ x4 J3 y
    switch(c){
- b2 p1 \  o" I; F4 p+ e% T    case '+':return t[0] += t[1];
: {. C- J7 n7 p2 p" G- p    case '-':return t[0] -= t[1];
' j, y% @. E. g8 I" {+ K    case '*':return t[0] *= t[1];6 I" H* E6 l7 a0 r% G, O1 `" p
    default: return t[0] /= t[1];//case '/':
2 y& e" [  P5 d, G& j- |    }2 @9 W+ v! \: R4 ?
}}% Q8 S5 r" [7 m0 y
template <class _T, class _Tstream>
8 D% `7 p3 w* `8 n4 {! ?/* _Tstream: inputstream, _T: get return value* `. Y) j, A/ T- R! d' @  `5 F
* Return nonzero if get value successfully */! p: S: B5 o  E) @* X+ ?
int GetExpValue(_Tstream& istrin, _T& nReturn){
+ O+ c5 O# e# D: D" {    _T t[3] = {0}; //雨中飞燕之作) V) c. s" z& O" k5 ~8 _
    char csym[3] = "++";; `8 x3 z$ }8 d! S) w% K% A
    int nLevel = 1, nERR = 0;
' i' w8 N- i" c    if(!(istrin>>t[1]))istrin.clear();
/ U. D, V2 ?. J    for(;;){1 r6 U- `: K# i7 z0 c; W, A
        if(istrin>>csym[2]){1 y0 f- X7 K* C& N' N, T
            switch(csym[2]){
2 q1 n# f3 h# c            case '(':
+ T  [1 T0 A% V0 `( p                if(!csym[1]){nLevel=0x100; nERR=1;}else! p# `/ j! `9 ]3 ~
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' z5 @0 L7 O9 V  a2 O7 j7 d                else{nLevel=0x100; nERR=1;}
  \3 u4 m$ t0 s5 B+ D2 v0 c                break;1 N" J( W( Z8 a* `. i& b, g/ a9 N
            case ')':
6 Y7 u5 F) x3 @# P                {nLevel = 0x100;}break;
* F9 M. W8 |0 ~7 r6 ~            case '+':case '-':case '*':case '/':
( S( y% l" `1 N                {csym[nLevel++] = csym[2];}break;
& m" R7 J7 X% o! o$ R) ^            case ' ':case '\r':case '\n':case '\t':continue;! c7 i! F; k) s
            default:
4 ]/ S# V$ b5 k3 u                {nLevel=0x100; nERR=1;}
# P$ R' T. Z) g& @# g            }
$ r# L6 L2 i# E$ Y8 C            if(nLevel==0x100)break;0 k: _6 t+ S" l5 Y
            if(nLevel&0x10 || istrin>>t[2]){
2 b) l( ]. b  W                nLevel &= 0xF;, l; y5 q+ K! p
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ U& M& T+ v6 T5 Q2 m, M
                if(csym[1]=='*'||csym[1]=='/'){! p+ r# I9 ?0 o  J! f, b
                    GetExpValue(t+1, csym[1]);
  w  B. v; ^4 x6 }! B# M                }( H) m7 m; J1 B9 V) L  L, ~
                else{
8 z* v4 I% E6 q8 M5 m                    GetExpValue(t, csym[0]);
* u- `4 \( r4 n1 ~                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 C) w1 T4 m$ ^) @
                }; D( V6 O0 f8 A$ |, r, W
                nLevel = 1;0 n2 j* W0 |% p$ n
            }
# o" q. V9 ~. J& q            else istrin.clear();
6 z  [# z2 q, _) D        }7 ~0 t/ [; N8 |" @
        else{nERR = -1; break;}. y/ R1 x" A' r, B
    }  l( ?# q8 P+ [8 o! D8 h% e. K
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
- t6 g! K9 l; R4 N; T6 S    else nReturn=GetExpValue(t, csym[0]);( ?' }; |* C* k  }, h  W" z
    return nERR==-1?1:0;
  s' t9 P( R' b6 `/ w* E) F) d/ }}}! G/ f: l. G& C) C& A1 m

' o* Q; D  I/ Y- h+ n( Z+ E( o: E1 K/ |1 @4 R
9 f/ x- b! ]5 i7 P0 }2 T4 L9 Z- o
函数模板使用示例:
# \  t5 v% u( x( e在以上那段代码的后面加上以下代码:
7 V5 {8 e3 y0 [4 e1 G/ N- n" l. j& w7 G4 I/ _6 W
0 Y) u+ t5 d$ Q* @

6 ~3 `% E6 Z' q程序代码: $ q( d. G. {/ H* R; x- r
) ?- }+ |! S; X3 ^! g8 E! O9 B
#include<strstream>% `3 p( ^6 n& I, ?1 B
#include<iostream>7 n7 M+ F! Q8 s6 P
#include<string>; i9 C/ `9 x( q# u' A: \
using namespace std;' S, n5 `4 X, I) k7 j
int main(void)* P! E" }+ D2 r, m
{+ P. x( `/ k0 M2 e5 q; {
    string s1;
3 y& |/ Y2 b! |7 W  J, ?    while(cin>>s1)( Z4 p; X0 D& ]* x; C9 H2 r3 _6 G
    {9 G2 f( `8 C2 a8 Z
        istrstream isin(s1.data());; P# s8 W* G- K; t/ ^  _
        double d;( y1 ^. S4 X) o0 ~
        if(fy_Exp::GetExpValue(isin, d))' i" ~: V* m* k
        {9 v( q; ~2 n; x+ t4 X3 {
            cout<<d<<endl;9 }, Y6 ]/ Q& w1 {4 K3 f
        }& k1 j4 U6 s7 B0 G5 t" q3 _, V
        else
( g! o: O6 Q2 ^  ~/ i( [8 R' j- A        {
! g! p; Q& C/ ^0 N            cout<<"ERROR"<<endl;. \3 }0 |! }# D4 o3 _/ D9 K1 j
        }& m. Q8 C+ Q) g
    }
( N& T9 y4 t. s    return 0;
! a: e2 ]  _- }3 ~) D3 Y/ N# @+ |}
1 M! W0 s- J, y3 Y0 m
& E8 j$ [7 ^* E: R: x: `. c5 f6 \- q$ T( p8 O+ @8 U# B1 E
然后编译执行就可以了(*^_^*)
# M- u1 ]; Z7 {& e其它:TC++上一定编译错误,不保证在VC6上也能通过编译; ~; L0 ~  h/ Y) i
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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