返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,* `3 z/ k8 J) e1 ]
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0 I2 y' _! X- R: l" p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)) W( U5 p+ ?) ]% ?% v4 w- ~+ V
参数解释:
( ~* W/ K( H4 D" E: E; F6 c/ Distrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: ^2 f7 x2 t7 c$ fnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ N  e. u# s* y* r1 f& {2 |+ t7 N# H返回值:: c& i6 n* c0 |+ Q) s6 `5 M
返回非0表示计算成功,0表示计算失败有错误3 i+ l1 O4 d; m) {
3 S3 O2 J( ^. l$ F+ e
. U$ g& r/ R$ \
  z/ k3 W7 b9 x- P: w
程序代码: 7 u- r  v! x" {* h
5 X9 R1 c, v7 F; U9 ^! |- s# s! S
namespace fy_Exp{/ e- q! |( G2 N; o
namespace {template <class _T>
1 y+ ]0 y0 n" w6 x7 ginline _T GetExpValue(_T t[], char& csym){
" w8 R! ~+ W, _    char c=csym; csym=0;5 x  _) @2 i2 @7 c$ S, R
    switch(c){
# F3 f3 Q, r. |, m' f    case '+':return t[0] += t[1];
" B( @0 A& ]3 J    case '-':return t[0] -= t[1];
# i0 r4 O3 s2 x! h$ f    case '*':return t[0] *= t[1];/ V, R1 n8 V  R1 W# I
    default: return t[0] /= t[1];//case '/':
  `! b" @* n) z8 d, r% \    }- M2 K0 t7 L5 v# R9 {6 W$ U- F
}}+ p! P# n- ]1 p, a6 Q
template <class _T, class _Tstream>
' _3 k4 j3 i. w2 I, B* `( Q/* _Tstream: inputstream, _T: get return value8 N& r' b% J# l% m' R
* Return nonzero if get value successfully */$ \) a/ ^( B; i; o* |
int GetExpValue(_Tstream& istrin, _T& nReturn){0 y+ o6 l4 A: @- R7 W
    _T t[3] = {0}; //雨中飞燕之作8 S$ @# C% b, C/ w
    char csym[3] = "++";
& \' D* ?$ X7 S  k1 _    int nLevel = 1, nERR = 0;
% A) c  s% G, T    if(!(istrin>>t[1]))istrin.clear();
5 I6 r+ H3 ^; Y4 Y4 K    for(;;){
3 a" |+ N# Z& c' j; F) ], y  }        if(istrin>>csym[2]){# e7 H9 M' n0 E- W
            switch(csym[2]){( ^" T) V8 H5 {. v
            case '(':8 S+ h# Y9 T& V; H; ~" C" `6 u# W
                if(!csym[1]){nLevel=0x100; nERR=1;}else9 T/ o. N' d+ A; r
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;$ U# U- {, T7 k6 F
                else{nLevel=0x100; nERR=1;}
+ V6 E/ B6 I: J3 S                break;7 w; \6 F; J( f! Z2 X
            case ')':7 W# L1 I4 {  b& W* e
                {nLevel = 0x100;}break;
; o4 b+ e/ K$ e, d& S7 m  Z! _            case '+':case '-':case '*':case '/':# I0 h! B0 l. u& i# w+ g: Y$ `
                {csym[nLevel++] = csym[2];}break;& _2 u* m8 F/ }! O, I
            case ' ':case '\r':case '\n':case '\t':continue;
* p! O( w! [0 ]( E" N7 K            default:
& x( `4 y' g8 R5 M                {nLevel=0x100; nERR=1;}* r/ I! }  L. U! \; a; V1 o6 T& E7 e
            }
/ B$ z/ y" @$ E- A1 e: ?3 i            if(nLevel==0x100)break;9 [# x! g' E9 \! i) O. D* Y
            if(nLevel&0x10 || istrin>>t[2]){$ ?" T9 l2 c( t1 [# d
                nLevel &= 0xF;5 f# C" m+ R; K
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- i  F1 p5 g/ S8 z1 E% C, D
                if(csym[1]=='*'||csym[1]=='/'){3 ?# o$ y6 ^8 F+ t
                    GetExpValue(t+1, csym[1]);" i0 c" @0 {5 E, t9 W
                }6 V( h* U& |2 M3 [5 K
                else{- V; X0 P; a5 l$ d4 z+ ~) o
                    GetExpValue(t, csym[0]);
8 ~# Q$ r, J$ `/ {                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;' D7 \% b6 Q) A7 Y3 B
                }
' _; Y$ T  z8 U+ Z) m                nLevel = 1;
" g9 n7 m. |& c3 _. Z6 E            }; o8 X; {. R- O
            else istrin.clear();) T6 }; S0 ~7 p/ |. W' V% e; D
        }
. d8 ~$ r7 C5 i# y2 G3 ~9 p- m        else{nERR = -1; break;}
+ J1 O' H. a# g+ [! e3 I( P4 t    }8 Q8 C+ B4 n! C
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 a/ e0 [. Q9 `. Q: d( |4 m) K) C" j
    else nReturn=GetExpValue(t, csym[0]);* f0 V* W; L0 V
    return nERR==-1?1:0;
3 M. E: B& L. G}}
; l( d; m  ~3 B9 ]$ r* i0 q! @$ K3 R

- d/ D! R& c) B$ G7 x/ v* K* M
  M3 `! B9 ^/ N. T函数模板使用示例:
2 b  y# B! D/ D/ b& N6 ~在以上那段代码的后面加上以下代码:: G$ n- |3 ]6 ~
* B/ _% t. e) S) |* j0 E
- P  k- z+ |. f9 y! ~1 x

+ v4 v+ U6 z  x: F; y& [0 I程序代码: ( ?# r& q6 f: ?% V
5 C, c8 L; D/ O& J/ ?% U3 |7 [4 a
#include<strstream>: f" V8 f+ y( b8 A' N9 U8 C. j
#include<iostream>5 F3 n5 S4 J$ E5 i! \
#include<string>
) N1 E2 f/ X% q1 m) Yusing namespace std;; u, E* q# V0 K0 j( Q, a. o
int main(void)! ~; H  I# l# _5 G6 S+ K
{
4 }9 T% ^1 U! h3 y) t, K    string s1;: c' @8 U/ @* i
    while(cin>>s1)' s) }2 j4 ^7 S" T* d
    {& G$ `8 b* W1 ]- C
        istrstream isin(s1.data());
9 K6 S7 x( v; K# X  V7 n2 I8 i3 e. e        double d;
4 g$ ]: d( D8 u        if(fy_Exp::GetExpValue(isin, d))8 T+ j( {$ Z6 P' x
        {9 b5 S0 {7 D, P9 I* u& g- l0 Z
            cout<<d<<endl;) Z$ }- L: |2 ^5 }' T
        }
' Z# \* @0 P# ~' ~; Z- t; ^4 b        else$ l6 I+ Q0 f3 i4 G, I+ m$ Z4 q2 d; m
        {
4 ?. ~: z7 l' }& K$ G            cout<<"ERROR"<<endl;+ a0 p8 w$ ?( H3 D1 B) H% D
        }2 ^4 w9 m4 Z, B
    }$ N( {: w& V; R4 {5 d( a- H* d
    return 0;1 k# `9 d! b  F
}
  @2 u  O2 ^) [, M& C4 L0 Q  T9 Z, y# u
& Z1 G4 Z, L! t1 |. p: g
然后编译执行就可以了(*^_^*)
$ _  w+ L. Z+ X) B2 f$ s( \2 B其它:TC++上一定编译错误,不保证在VC6上也能通过编译
7 w/ F' E; [5 A      建议使用VC7或VC更高版本,或者使用GNU C++编译

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