获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
: Y( P. V# G. b6 z一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 F4 B! s1 j* N只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: t9 ?# A6 X4 p5 N) ]参数解释:' F: z6 a4 s3 s$ N% y$ {, Q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; @& k1 Y1 {; N8 u% K5 w6 enReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; F& O. E6 R. x3 s+ G
返回值:
  @% l4 I3 P$ k. F1 ]返回非0表示计算成功,0表示计算失败有错误1 C) j7 ^( D: }  A5 u
# @1 _3 a) C5 f& d; Y1 P
) m* j" o* f5 H" q# R  O
0 t( ^0 {) x' F' D$ @# F( F
程序代码:
- a$ a! m$ S& N0 n/ u
& T$ H# r1 `4 P2 R' w$ unamespace fy_Exp{; m6 N3 f2 r5 J/ [+ l
namespace {template <class _T>
2 `% t) A; j4 d# w" Y6 Hinline _T GetExpValue(_T t[], char& csym){) m  H: o6 Y3 E7 F
    char c=csym; csym=0;
( p: M0 X  F+ I+ Y: D  Y: e    switch(c){
* Q) t" V7 a0 b" ^% p7 T    case '+':return t[0] += t[1];& x3 l* J2 V  U; U
    case '-':return t[0] -= t[1];# c/ T3 K7 @$ b! L' Z
    case '*':return t[0] *= t[1];
! F! \, T. G7 H% C# |5 C    default: return t[0] /= t[1];//case '/':
4 _, ?6 w* N: ]( O$ {% R+ B    }
# ~  {# Z* E3 Z, D}}
1 a3 `% Z! o: S) n$ @, Jtemplate <class _T, class _Tstream>
$ U) E6 Z' w  R, m! Z/* _Tstream: inputstream, _T: get return value
% u3 r" s6 p5 V! V* Return nonzero if get value successfully */) K. {0 I3 Y! w3 K" r- Y, F
int GetExpValue(_Tstream& istrin, _T& nReturn){
- a) \# X& s9 E# H2 G5 @    _T t[3] = {0}; //雨中飞燕之作  Q0 B9 _: r- B" D- M4 C4 W, c
    char csym[3] = "++";
/ D$ S; D7 m5 {5 ^! D    int nLevel = 1, nERR = 0;
3 w3 f, ?3 W& c$ W- R; t    if(!(istrin>>t[1]))istrin.clear();
9 O$ g$ Q' r5 M% U: A; P    for(;;){# r% E  l' x8 L2 M) q$ _
        if(istrin>>csym[2]){
! j( c2 e( E# A0 t- [4 Q1 J6 r# Q            switch(csym[2]){
5 r7 T( N4 I# v  k! F% z: U2 M! A) @4 R            case '(':) m  E; y/ E* r
                if(!csym[1]){nLevel=0x100; nERR=1;}else
) c' k% o5 ]8 K6 `" S                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 Z5 F  c& w! H( l
                else{nLevel=0x100; nERR=1;}1 {' Y$ l; O. l- `$ f
                break;* e6 K" ]! |# k5 R* H+ l
            case ')':
9 k/ p4 L, U6 U2 R) O- P" n                {nLevel = 0x100;}break;
; }* B* N) n* d' h            case '+':case '-':case '*':case '/':
% ~2 G, ^7 c( ^* w4 d  N4 S                {csym[nLevel++] = csym[2];}break;) `* j# q' F; f" n3 R' }7 s6 A
            case ' ':case '\r':case '\n':case '\t':continue;
- u5 y! {* ]1 s; q            default:
% ?/ C& n5 v' y' M; v                {nLevel=0x100; nERR=1;}. G. J$ v: Q1 Y) m- b8 B8 D
            }
, h7 u# T; A+ Z/ _            if(nLevel==0x100)break;
- m9 v. T+ f9 M3 t  i            if(nLevel&0x10 || istrin>>t[2]){
/ g) {' [6 [/ \1 r                nLevel &= 0xF;/ n. F/ o: b7 v2 S# {
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& `0 _- t- c+ h  y2 u- X8 i5 }
                if(csym[1]=='*'||csym[1]=='/'){( W% {' A. q2 z2 x  T
                    GetExpValue(t+1, csym[1]);7 r2 M/ b2 q" Y2 x# m5 w6 K6 ]
                }
. E/ O* o5 d4 L4 e! k8 e/ q' O                else{) s! u5 i4 a# X$ O: J  }" R  B
                    GetExpValue(t, csym[0]);1 N: Y" D6 J  w0 y
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ n% ]* s  X9 ~& c, m
                }
5 ?. C1 r9 K9 s                nLevel = 1;
& j7 K6 a" G: }4 R            }
+ G3 h0 i1 V0 i/ [2 A0 u            else istrin.clear();
7 n4 ]1 Q  L, m( ~( \- ]; V, }        }
) V6 E4 k% D4 G4 ^5 k4 @" x        else{nERR = -1; break;}2 ^/ w( |8 U4 G" I) j
    }) g7 S/ O7 h$ \, |% ?* D
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);$ e0 ]3 w. w/ J6 |7 e( c9 {( r% D
    else nReturn=GetExpValue(t, csym[0]);
# i# C* ?7 G, @9 Q) O7 D    return nERR==-1?1:0;' r# F" v) R- C# D4 I, C7 I+ O
}}
- |4 [: j# c6 Z3 d; ?$ J/ u% @, K' K
; }0 b5 S0 a6 w/ r' q0 Q& f% p5 E, r1 N" ]% C8 j8 a
: n4 ~/ O- E. d' ~
函数模板使用示例:( ^+ }* q8 I8 c/ b8 r! v
在以上那段代码的后面加上以下代码:& ?# g8 P) b9 Z8 w8 h. T
8 `  n$ C% X) k6 R" @( g; \% m' K. `

( S' V! z8 C. l* n: M* R; j( b6 b) r8 @$ B- m# s
程序代码: : y; Q0 }7 l# ^6 B& X
8 V# y8 Y1 y; C4 U# {+ r
#include<strstream>
6 n" m/ K  L( l! z9 W/ w#include<iostream>
( R" `  J9 R% `" C( D& ^+ f9 U#include<string>
$ p$ I  Z+ ~. ]2 q' S, }0 w* ]using namespace std;# f3 i* ?$ F/ t8 v$ N& X5 f
int main(void)
5 R8 C. s8 j* \" \5 ?{3 I0 ?( Z& H' v; t( M, U3 {* ~! Y3 q
    string s1;
) v( ~% r6 {4 D7 z8 L    while(cin>>s1)  u  s/ j( r) W2 r; \- t
    {
! I* Z; ^. H/ w        istrstream isin(s1.data());2 T: T2 a7 {( L, ~& w: j2 \: H
        double d;
2 ?2 b  |+ X7 |. ]        if(fy_Exp::GetExpValue(isin, d))
( p' T" j2 Y! S. g0 \9 F, O; \        {* p7 q  Q) V! R) G( m3 A. _( K
            cout<<d<<endl;: o7 y/ f4 x8 W
        }
+ P5 B; _6 [) }, x- W- h) k        else
9 u2 a! P) j2 V, C6 t& E" W; j3 p. f        {0 y/ i& a# t$ j+ J' _0 u
            cout<<"ERROR"<<endl;5 u& Z, J; T/ F, I* ~  _( D6 w; {- c
        }5 h/ g6 _: S3 J4 C3 X
    }
6 D2 U' G& G) P4 q3 U. {    return 0;
% \+ t: k' n4 X6 A}2 L1 j; {+ A5 L/ R1 E" y- @; G
$ D$ X" B0 I) u4 r( y- [  D

/ @6 k# T: y2 x5 W/ G% D然后编译执行就可以了(*^_^*). j9 L+ V+ {3 X2 g9 f, X
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 A& J2 o# c9 L% |' J# ]/ d! G      建议使用VC7或VC更高版本,或者使用GNU C++编译

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