返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
; o2 [5 e% R$ h一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& }7 L" x5 W0 r$ i( g只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% `. W& B% o! K3 g" `4 L3 [) S" h
参数解释:
. t9 d2 J$ J" }4 Fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ [2 `) T2 e* {3 j
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
' {* E& |' C4 z. D) ]% m返回值:
6 R9 a5 Z# `4 g: W& ~2 W返回非0表示计算成功,0表示计算失败有错误/ Z: y; n1 E8 W
3 R1 A" ~6 n+ E- q" ?9 Z3 s; k# C

7 m" p# O) l, H! C6 G. T  d
2 R0 n$ E0 H1 F  f0 G! y程序代码:
. J/ @9 E# Q) j. O- C( l+ T" K; ]3 W! V3 b
namespace fy_Exp{
( o. ]- D0 ]8 Enamespace {template <class _T>" l% r& _# ^# a( f0 h+ ?' r5 R3 R
inline _T GetExpValue(_T t[], char& csym){
$ U2 d' l; M& M& M    char c=csym; csym=0;0 g1 @. f2 M: M  [$ Z
    switch(c){
! }4 e5 _) B3 ?* [$ z' F$ M/ f$ u9 A    case '+':return t[0] += t[1];
1 B) e2 ]& Q+ A' B    case '-':return t[0] -= t[1];) S: ]' ?2 t9 w- c8 o5 w& N4 G0 ?  M
    case '*':return t[0] *= t[1];
; m4 H; ]8 ?1 V3 q# H    default: return t[0] /= t[1];//case '/':# S, B7 M3 ^! K8 P. p7 Q4 W% ?; P( B/ N
    }: U- E  b5 ?& O0 I5 |7 U
}}, h7 s2 `- F7 B9 u$ F; y8 m
template <class _T, class _Tstream>* E+ D7 C; d$ G- ]
/* _Tstream: inputstream, _T: get return value& j* g4 ^$ n" c7 Q3 ~. b
* Return nonzero if get value successfully */* ^; a  V+ I; j3 K
int GetExpValue(_Tstream& istrin, _T& nReturn){! a( u. J: c) n! d( E1 L9 F! q
    _T t[3] = {0}; //雨中飞燕之作& @% Y9 x- ^  e1 g; U2 J3 i' N1 b. @
    char csym[3] = "++";6 Y- W; Q6 E# P* }9 E
    int nLevel = 1, nERR = 0;
; ]' r+ D# n/ Y; g, S" `5 }5 ^    if(!(istrin>>t[1]))istrin.clear();
$ Z! z: E9 v- l$ k* [/ F3 m' Q    for(;;){
) u/ {4 p2 E) L& w+ N/ x        if(istrin>>csym[2]){
) B- u# O0 R: x7 Y) o7 ~            switch(csym[2]){
& i3 n- `# E, U6 u9 d& X6 n            case '(':
$ N0 l6 u! x: Y1 D& K& M                if(!csym[1]){nLevel=0x100; nERR=1;}else: s- U, a6 O/ h( T) }+ p7 S
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 I: r, F! G5 K3 p8 E+ B! e, a                else{nLevel=0x100; nERR=1;}% k  w1 m$ g7 X
                break;* e6 J4 \& Z, q6 v! P5 T
            case ')':) @& R7 y+ r- M$ I. S/ x
                {nLevel = 0x100;}break;
8 G* N- g: Z' |) J# m. s: {            case '+':case '-':case '*':case '/':+ O. ?7 M+ b9 u" c
                {csym[nLevel++] = csym[2];}break;$ n' H6 M' P5 K2 \( M9 P
            case ' ':case '\r':case '\n':case '\t':continue;
: I2 m( f0 B/ W# c" G$ q            default:9 Q6 ?5 R/ q7 i( \& U1 w4 d" n( @
                {nLevel=0x100; nERR=1;}
, T# h! F! d5 [+ U            }
  Q& f' q# T! I8 `7 t! X+ o5 q            if(nLevel==0x100)break;  ~. i- a+ D. t; z3 M
            if(nLevel&0x10 || istrin>>t[2]){2 A2 _6 O% e/ e& f0 L
                nLevel &= 0xF;
4 u" d4 \0 G9 n/ Q# U! {5 N9 J# l                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
5 o" C+ ?* R" w' H6 q                if(csym[1]=='*'||csym[1]=='/'){
5 N8 O1 d0 h% C9 A3 K( R  @  J                    GetExpValue(t+1, csym[1]);
+ K) |3 D! f" l                }; i6 p0 C1 G* x
                else{
/ A* E9 R1 T9 s                    GetExpValue(t, csym[0]);
# q, ]- \6 Y' H- }8 U* Q8 f2 _0 c2 V                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;" R; I  Z2 {* j. I7 e
                }/ Y& H/ u) u+ Y9 p
                nLevel = 1;; o# m( v  b5 b# x1 ]
            }
5 {% ^) Q+ n; R* E            else istrin.clear();
# ?) c+ [' D  ~. {4 M        }5 x* ?. }, B" g
        else{nERR = -1; break;}
" [* \9 f2 c& u, \/ w$ Z* {: G    }) q5 u3 K  H3 q
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( y3 q9 P/ I% U6 G! F: |* ~    else nReturn=GetExpValue(t, csym[0]);
0 K6 B, T8 m0 V; w    return nERR==-1?1:0;2 S7 T0 c' a7 |2 s% G
}}, P7 `! u3 \, k  q
  e. J# _( C- v5 z8 _; U

7 @# v0 ]. ~; I% M5 A6 q; D  U  y1 ]0 w5 K1 `* _5 [
函数模板使用示例:
4 ~. [0 l; N: Q! B  P在以上那段代码的后面加上以下代码:6 Z+ K! e" p/ l% B7 C) j* f6 \$ W
2 t% n7 R* j& Y8 M2 E$ F4 {

/ p7 y5 y. D# J- J$ g' X* P/ Y" }2 p) i  Z( K, K
程序代码:
- [$ M  O; G* F- c$ j# d6 d+ F+ W) e+ d5 O2 ]' _5 s0 ?
#include<strstream>
) p1 ~. p5 J3 F4 p( r" y' V#include<iostream>5 |% w9 Q) O7 Y7 l3 L  j
#include<string>
7 c' h1 ]. ?; Q# \using namespace std;
1 d! z% |" N5 q' G) F* }" f% k3 a7 Fint main(void)( i' _: o' B' ?, F3 h& O( T8 I
{
6 t- a- Y$ p8 c; {6 M/ z/ D    string s1;
2 z1 s3 |7 F7 ^1 Q    while(cin>>s1): `" {' Y9 Y* ~, U5 q: k
    {4 C6 b& Y% K: P; T  D5 y! P/ b* C
        istrstream isin(s1.data());6 z) X, m' q& I" w* `1 A% N
        double d;* ?: Z/ f- G6 a7 R7 j) k* l1 f
        if(fy_Exp::GetExpValue(isin, d))& d4 y% y2 u* `" F0 x8 G4 D
        {* C, l2 k9 N2 F/ }3 M
            cout<<d<<endl;8 O) H) O2 X7 `/ P  S- g% p
        }9 Q! T/ A* j# Z1 a1 A+ T
        else
3 ?* N- ]! s( s0 O9 |        {  L$ P% j+ Z) w6 p. K1 X) V
            cout<<"ERROR"<<endl;" ~! x# }% A4 G' h1 Y# T" K  t5 J
        }
0 d* n! F9 I) Q' ]7 ?* m9 O0 p    }+ @; W& l5 F; G  |1 c8 b
    return 0;
2 T! u1 h. R- Q) H1 G7 m2 {6 ?+ j}
# D4 L7 n% G2 n( x9 N' M
- n/ V" T  t2 Y9 Q+ D- a. X5 O+ _9 X6 {
然后编译执行就可以了(*^_^*)
' m$ c- y! F3 y1 U4 L其它:TC++上一定编译错误,不保证在VC6上也能通过编译1 p0 Y3 X5 T: f+ U4 @! {$ j
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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