返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,& D% E( j! n- B$ t+ E' j
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ a* Z' O) F. ^& i+ h2 s! l2 V只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 G0 I7 w5 h" j9 {& l8 A' o& A参数解释:8 ]2 |6 d5 }+ P- q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 N( l4 b% Y( G3 h# c: onReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
  T4 H% i! w$ c- v$ A; i: D返回值:3 S  P0 y' J! s5 s  U5 Y
返回非0表示计算成功,0表示计算失败有错误- L: z2 d) ]! I) J; }

* ^$ l4 f! l% E" ]# r) I+ `* L7 L5 w ' ~) O, n4 y: ^3 i
% d% r) U* l% k. X0 w  B* ^) b% H
程序代码: 1 Q7 X8 B. [* W: h, g
- R! ]! R+ t5 f
namespace fy_Exp{
! S, v& T3 |6 ]$ @2 y' u1 lnamespace {template <class _T>
* T) N& b& V% q4 `inline _T GetExpValue(_T t[], char& csym){
& c$ u# f3 n3 F- ?" c  P/ W2 S    char c=csym; csym=0;( ~* A: u" R, u1 q; b
    switch(c){
" z% S& q1 K0 K    case '+':return t[0] += t[1];' h) ?% Z5 }+ z
    case '-':return t[0] -= t[1];
- z, t! m( X! a  i/ }    case '*':return t[0] *= t[1];: z3 z6 D" N9 ^% ^- |" C& |
    default: return t[0] /= t[1];//case '/':0 G9 x/ A, q! {1 |) ~- C
    }5 l# S- J# H6 {7 `) b0 f2 M3 L
}}
% M' ^4 y, c8 E; Etemplate <class _T, class _Tstream>
- o/ k7 {6 D+ U# x/* _Tstream: inputstream, _T: get return value# i. }: p3 Y; P, O3 w% {( Q. p. F; H
* Return nonzero if get value successfully */6 j  w1 Z4 d2 I: E
int GetExpValue(_Tstream& istrin, _T& nReturn){7 A9 ~* R2 B7 A# E  w0 M7 Q
    _T t[3] = {0}; //雨中飞燕之作0 b5 d5 P& [9 w% p) O
    char csym[3] = "++";9 [* u& C! n8 w( g; [
    int nLevel = 1, nERR = 0;
' Z" S& Y( y! e    if(!(istrin>>t[1]))istrin.clear();6 M7 G: ~1 c+ p6 g/ a- y+ C
    for(;;){( v( [' Y" I( s; g( a9 K5 \
        if(istrin>>csym[2]){
- w, T& u/ p7 T4 w3 m8 J8 W            switch(csym[2]){+ b  W  X1 s& y
            case '(':
" P5 I2 V& B+ q7 V2 D/ i9 I3 q                if(!csym[1]){nLevel=0x100; nERR=1;}else
; K! t, d! p" L/ Z* E, G1 K* ]                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;$ n" \/ L% R* P4 }% r# U
                else{nLevel=0x100; nERR=1;}
# |& s& U" S' I: q7 T. p                break;
, f- J0 U! j+ y7 @. y            case ')':
# ?/ e1 u4 ~8 Q: V" C6 @( N/ D                {nLevel = 0x100;}break;
. D9 L' d0 W* y* [8 c* J            case '+':case '-':case '*':case '/':
# N! L6 ~9 m8 N) o: a; s. l                {csym[nLevel++] = csym[2];}break;8 @% `) V$ V% i: T' q9 x$ F: D8 K# @# W
            case ' ':case '\r':case '\n':case '\t':continue;7 h( b" _( U9 n4 i
            default:$ ?. j) R0 G7 S& W
                {nLevel=0x100; nERR=1;}# h% i: f( q0 M* [
            }
- v2 E7 Z& Y. G1 L% S6 S( B            if(nLevel==0x100)break;
% A" M/ o% g; n            if(nLevel&0x10 || istrin>>t[2]){
, z: m5 S/ L" c% _; g8 S                nLevel &= 0xF;2 D& Z% ^+ Q7 t2 S" w" E# d( Z
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 S" {7 q6 f- t2 {' d" N                if(csym[1]=='*'||csym[1]=='/'){' y* P! I0 Z" F8 w/ n; a
                    GetExpValue(t+1, csym[1]);
: H; Z# F- n- L                }1 b3 m, V. H( H' Z: F3 J% ~
                else{
$ C' V( I2 t6 D$ X: i' |! @                    GetExpValue(t, csym[0]);  U$ H% j/ G9 @0 T5 V* h0 u4 l; |
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 D! d0 e. D5 K3 W8 S
                }3 P! G8 K: K: z1 B+ ^
                nLevel = 1;) A2 k" Z5 m4 O/ G* C
            }
0 {# ]4 d& W* u. L            else istrin.clear();* D  G8 g" v" Q
        }
1 G. Y9 c  d$ k6 |+ K        else{nERR = -1; break;}1 h" [5 A, \  I7 b( S& u7 i5 w
    }
, g0 L, |8 z& D    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ o# V4 V( U5 B7 [/ y9 T0 W
    else nReturn=GetExpValue(t, csym[0]);. p+ T4 c4 S% [) k$ Z6 f: Z6 ?& l$ \
    return nERR==-1?1:0;$ n) ]8 H9 J# }6 G' h  x
}}
' m9 a( E* f& V# w' [; V7 _- e
. t' @  H5 o5 S) X
" L; {0 o! o) g4 h: ?+ B9 `* b- y6 i" `# @6 V  d
函数模板使用示例:* y& t& A) x5 Y3 ^- s& C; }$ {
在以上那段代码的后面加上以下代码:
, K/ Z* K3 G. t& ~$ v0 M( F. q& J4 I  O  v! ~0 R

( r& `: {# p& J2 X# P8 F# v
& v3 w& W* O8 x8 }' ~4 S' X程序代码:
& C5 x6 c4 t% ~5 F
: {0 W2 J, x- a6 O#include<strstream>
4 z6 v  t2 z/ q; n#include<iostream>
' b! V3 ?! a* [- u: y( R$ E  n#include<string>
6 O$ U' X7 n8 C3 u0 X- pusing namespace std;
: S: @" {/ I( r5 Y+ K2 n+ p- Vint main(void)0 @0 z. x" U, p$ O7 ^0 Z& }5 V  v$ p
{
1 v" N# K9 m( U& J! ]( U    string s1;
9 C4 @" q# V  C) ]! \    while(cin>>s1)
4 y! C. \2 x3 F    {3 z2 T% f3 h$ M8 j) X4 |
        istrstream isin(s1.data());
& C* A3 m7 H! c6 j        double d;( r) a9 P& N, `5 `1 [8 ]
        if(fy_Exp::GetExpValue(isin, d))0 y$ X+ Q1 K' F2 O: {" r
        {, \0 o' I4 v& p, m* r, }6 A& i3 |& J
            cout<<d<<endl;* F+ |" D5 S3 W# ?# B
        }1 f& N5 I% P0 ?0 s
        else
& x! V) C8 q& ]0 W9 t) A+ l        {* u, p. E) @( k5 `9 x
            cout<<"ERROR"<<endl;
# E% c+ r6 r6 p: a4 ~0 ^. R        }
- |% @' i+ S' Z. `% i# Q0 b" q    }; v$ B0 |) V3 ^0 k, G, o! F: d
    return 0;
3 ]/ q5 T) L/ S; z, S7 J) _* c}
9 ^  P' b4 g5 p; z9 E" D
2 {) n; w: |1 i! J; |; x) p4 o, c, j
然后编译执行就可以了(*^_^*)3 v' c) U- G; L  |! E
其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ T; K/ L# i& U  L+ [
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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