返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,/ C; I: O  Q0 S, D
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式9 m- P3 ^. p# s
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# O! ~  N: y, n" g参数解释:
7 {! S) o* T( u, P. ?0 y( q% ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( w$ K; X, J& K7 Q7 tnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 Z6 q0 b& u( h
返回值:
+ b7 `, k  A1 l  q返回非0表示计算成功,0表示计算失败有错误
% M& P, z6 j* A& o$ F- g5 {  P" N3 S; R
& F( a: N2 A2 J2 p6 T

# K( j; g0 B9 z) H程序代码: 9 L6 i0 m7 l' M" A3 f! b

. ]( R+ Y) `* mnamespace fy_Exp{+ J  [5 j! ?( d6 E
namespace {template <class _T>
" j9 H  n, x; C. L* A1 a4 C7 {inline _T GetExpValue(_T t[], char& csym){
7 C1 m2 V5 ~0 z/ U4 T+ I! V    char c=csym; csym=0;3 J6 U' b9 P) N! v( ]  \
    switch(c){: q" f$ ?5 _1 o. }2 c( \
    case '+':return t[0] += t[1];' M8 ^6 Y' B, i
    case '-':return t[0] -= t[1];2 f) h3 q6 ^6 ]. D2 f" h
    case '*':return t[0] *= t[1];' s! ~- `4 U- r: G6 q, F, c( V3 M
    default: return t[0] /= t[1];//case '/':
( a+ }# t; I! ^! P    }
/ t6 J6 R1 e6 s6 Z}}: P1 L' r  W1 ?* G, L
template <class _T, class _Tstream>
" n9 [' Q6 A9 e' A/* _Tstream: inputstream, _T: get return value3 n  S, z+ Z; b4 M" W
* Return nonzero if get value successfully */& A- `1 B& I5 S- F. c/ H
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 H% Q' q. X8 i; V4 m% z    _T t[3] = {0}; //雨中飞燕之作
) d5 ?. I" D- P, v    char csym[3] = "++";' m7 h5 x/ N% Y* h" @" n4 D
    int nLevel = 1, nERR = 0;
; ^2 _- K, [: P9 F1 p% m    if(!(istrin>>t[1]))istrin.clear();/ g( D) @$ U) z
    for(;;){
2 H+ t  C& v) i' d/ O" _        if(istrin>>csym[2]){* a, U  y5 v# F! p2 T6 O* N4 n
            switch(csym[2]){
; |) }, \1 p6 q; _( x/ w            case '(':  [, I2 j' R" \' d/ ~/ H8 G/ t
                if(!csym[1]){nLevel=0x100; nERR=1;}else4 k9 \! W# j% ~7 M5 X
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 j: ?' @+ N# R! a0 X
                else{nLevel=0x100; nERR=1;}
3 H  t5 P/ W. b- I& J0 b, g                break;5 }8 v# M' d5 ?! k4 N9 F' G
            case ')':
' l1 o. T1 h& B0 o9 T0 t- d                {nLevel = 0x100;}break;
# x7 d# M" J- i; M            case '+':case '-':case '*':case '/':
% g: K  w  S6 W# v. y) E. J                {csym[nLevel++] = csym[2];}break;9 ~! o1 `4 h' h2 `1 P
            case ' ':case '\r':case '\n':case '\t':continue;0 \/ f, I+ r$ s* d6 ?2 j& k
            default:1 I* r! t1 O  {5 O
                {nLevel=0x100; nERR=1;}: V) C/ H* t. W6 ~! [
            }2 T# K% Y* o/ b( |2 J* R0 ?( ]
            if(nLevel==0x100)break;- z0 H3 }9 p1 z5 K" K$ }6 N
            if(nLevel&0x10 || istrin>>t[2]){
5 ?, P" k1 {* a( i- D& X9 S" C                nLevel &= 0xF;4 n& \4 f" c  t) j& r- R, E
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}2 R2 j6 w, C" J
                if(csym[1]=='*'||csym[1]=='/'){
* r# S& U  W% A. M( g& O9 O: j                    GetExpValue(t+1, csym[1]);* _, I+ O# B: \2 y7 X8 e6 Q
                }
: M8 t0 K. Y" g/ Z5 Q9 D& R                else{+ C$ [% P6 P' Q1 N; D; U7 N
                    GetExpValue(t, csym[0]);& S# f( f$ M- C9 P% n9 ^% U
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;  Q. F! j0 ]  N2 n" ~/ ~
                }; l# g! A; r+ z, l
                nLevel = 1;
* {' y7 ]7 p; A) S3 _            }
$ X( J* u- ~9 k  K0 u2 J: w: n& V            else istrin.clear();
: \6 I5 Y: D- F& m( [8 j        }# F6 T& ~% b* q1 J! D
        else{nERR = -1; break;}7 \9 I4 O, Q% K3 m
    }
7 T8 [, c4 Y3 w* t5 v9 v    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 K, o5 @2 h2 K/ o5 P" C
    else nReturn=GetExpValue(t, csym[0]);- {" x9 _* O* p4 X" R% ^0 R* n
    return nERR==-1?1:0;
+ m+ }5 t" c; c}}" Z/ a: t* v+ s4 @0 V+ `
  o/ X" P8 T  T% S- f0 S
' s4 G2 Z! a! H/ S; A/ f; {0 H

+ J  {% o$ b/ j( E4 A: Y: c函数模板使用示例:
9 k4 s9 X; l* Y" M在以上那段代码的后面加上以下代码:- T. p" v  f7 q$ D. f" p& x5 }
  ^3 y0 v5 p9 U; b

" ]2 k) e: u0 }
" f0 E7 h4 n0 T! r程序代码:
, z/ G! g$ x& @# S) K: y6 S$ q) P. v  J( A( H/ A
#include<strstream>* r/ T1 {+ s; V. u: r
#include<iostream>6 ~. G! K9 o9 u- Z
#include<string>$ M; O9 e( F/ C
using namespace std;8 z2 k( e1 R8 r* _; w+ V6 Z1 s
int main(void)! `# C* K7 Q6 X1 Y3 Z
{
9 Z0 w8 z5 e- e# {$ F, h- Z    string s1;
, a+ \. L6 i+ K% c    while(cin>>s1)1 G; K% }9 R0 m$ o/ G8 P& |
    {
) P5 k; U$ H) c/ t* {8 x# _5 r        istrstream isin(s1.data());0 A% ], j4 \7 @" N( v: P
        double d;
' z; h. n# D* J+ l6 O, O' i! X        if(fy_Exp::GetExpValue(isin, d))
# _3 ^) N8 m, P( K) t8 g2 J, J        {" {2 o1 i. X+ i  k
            cout<<d<<endl;5 R9 K: Z% F9 U) S8 V
        }0 C7 b7 g  E% Q) i: D4 _7 ^# r; x
        else! f3 D; \9 U! l* ~+ B8 W8 a
        {
# w" n% R! R$ Z9 Q. z& ~! ?- c            cout<<"ERROR"<<endl;0 o# {5 ^- g; l' c1 c6 K
        }
$ u5 b, p5 C- |* c, b; m7 q    }
% E6 w$ H/ A( d  y! ]3 J    return 0;* h* k& M) m9 q9 W- U& l
}* `, r) o8 `) T8 V

: G3 H3 V. |: D& o4 P
  J; I0 I, N% w, e然后编译执行就可以了(*^_^*)# G+ N% F; m, M% Z9 H' [/ H
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
  l6 I7 y9 G* B+ Z& v8 `8 p      建议使用VC7或VC更高版本,或者使用GNU C++编译

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