返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,4 y" E0 c9 h) o3 }" E$ x
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 H: X; A# g; i' P$ R  b! C. ]只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): |% }; X4 p1 O% E" A! z7 J7 a
参数解释:; H- e5 S* y. C4 U2 h" a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流  d: Y5 X  [- d# u
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ J. Q( |+ R" Y# {; N1 ], V
返回值:* ^9 F& I8 @5 H) }
返回非0表示计算成功,0表示计算失败有错误, L; [. s! f) `) O" q& H# m9 ~! F

) n- H0 }! z% a# e
# {- d4 ^% _" X' C6 p
; n, I7 {: u8 c0 C" H  C程序代码:
- P* T. W! k% r* C6 t
) N' D' ?, X1 b$ J5 T0 m! R' mnamespace fy_Exp{
/ Q' {- o8 e  y8 A9 w! K4 m  Qnamespace {template <class _T>1 Y) k3 Z# |  X& P, |7 F! u5 I- W
inline _T GetExpValue(_T t[], char& csym){
. A0 S; r0 h) R* E3 p# r/ O) a- x    char c=csym; csym=0;/ n! f! e  x9 b0 a
    switch(c){
, }$ M7 O. s/ _9 c    case '+':return t[0] += t[1];
6 U# S! h1 G! {8 n    case '-':return t[0] -= t[1];9 b# l$ b6 N$ G
    case '*':return t[0] *= t[1];
/ z7 C3 S- L2 v! M: [- M- I    default: return t[0] /= t[1];//case '/':
* L6 E1 U3 R: A; _! C    }/ W: r( f0 B! M; N1 C! k- L, s
}}
) q# c) A7 B* ]# v1 ctemplate <class _T, class _Tstream>! m' q% k6 N! b1 M- W5 e/ t0 j
/* _Tstream: inputstream, _T: get return value
& _2 x3 ?% Y/ ?0 i# |, M) m* Return nonzero if get value successfully */: F4 O0 ~6 u7 k( A  q6 k
int GetExpValue(_Tstream& istrin, _T& nReturn){3 y  F8 o: b# y7 t! s. Y& B
    _T t[3] = {0}; //雨中飞燕之作
0 c0 g; J  d/ K  g    char csym[3] = "++";" G# B" W' }4 V2 j
    int nLevel = 1, nERR = 0;
! M4 c1 @' G7 z" R% [    if(!(istrin>>t[1]))istrin.clear();; g" `) o, {& j/ i' j
    for(;;){
$ x1 g7 X1 S" w/ g        if(istrin>>csym[2]){
( t1 [7 V8 Q: P3 e, w6 @3 K            switch(csym[2]){
8 Z* v; S% I% ^" Y. v  T% |            case '(':
7 Y; C+ ~8 d. N0 |( Z! s! L% h                if(!csym[1]){nLevel=0x100; nERR=1;}else' ^0 E$ E) h, [4 G
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' e5 v) S# L% g8 f
                else{nLevel=0x100; nERR=1;}
* [& x9 T4 \  \' |8 K9 G                break;" m; i- _7 i3 R( S7 k1 a( B
            case ')':
/ b" I# H. b% `" `# b! J4 g' N                {nLevel = 0x100;}break;
, U0 p) r) c6 W2 d1 A) Z            case '+':case '-':case '*':case '/':$ \( B" E9 S! V6 q8 i# f8 X* K% c
                {csym[nLevel++] = csym[2];}break;
+ m$ w' R1 Q, F! Z  H            case ' ':case '\r':case '\n':case '\t':continue;
' p6 ], G. K. n+ q3 _            default:2 C  ?; ~7 R; b* {
                {nLevel=0x100; nERR=1;}+ x+ d: ?5 V" N% j/ }0 b
            }: Z1 M& H" E: J* W1 N: j) K. [+ f
            if(nLevel==0x100)break;4 H7 Z4 [- B1 v$ R. \% P' t
            if(nLevel&0x10 || istrin>>t[2]){
2 Y' N$ @* ]8 F+ |5 m9 P. s& X                nLevel &= 0xF;( t. f- |4 u" w5 Y9 G3 z
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}  Z& M' D, B) ]( ?- W6 v, N
                if(csym[1]=='*'||csym[1]=='/'){
# Q( l/ C6 U9 q; g' D                    GetExpValue(t+1, csym[1]);
- P8 p- l+ u- [                }* G7 V2 ?) j' x1 A9 w3 k
                else{
7 t9 [" u" o, c' U                    GetExpValue(t, csym[0]);
! x) r8 t6 f" J5 [5 q# \                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;" N2 y7 y" ?4 n) ^5 p# L8 F# a
                }) H' [0 @: F1 u6 v$ }/ x8 V
                nLevel = 1;5 ]0 c3 @8 f8 M- J# F. W
            }% b9 N1 ~+ I+ o
            else istrin.clear();
& @  s  c9 Z3 S8 m        }1 t4 ^/ R) @& ^: w$ v
        else{nERR = -1; break;}! W( |) }$ i6 X4 R  x. v7 w7 f1 Z
    }
( I- o" S1 e  G  ?" ?8 j    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 K! [% q1 q8 F8 X0 f& v6 ^
    else nReturn=GetExpValue(t, csym[0]);: }  z. O6 K3 |) k
    return nERR==-1?1:0;
' F. q) N* }2 A% @1 X+ {}}
6 b0 ]* z) J$ u( A% x, k1 B( }" z/ v/ L/ N2 E! ~
: n1 e: Q  S+ S* b" b

3 _9 `4 f9 m2 U9 N9 z& x0 O3 G函数模板使用示例:
7 E2 w, p/ y2 a; {) }4 g在以上那段代码的后面加上以下代码:. x$ B5 r8 M- |  J6 o
; U8 s% s0 ~/ N
9 }3 R) ?3 R* ~5 ?; K

5 I/ @2 A/ ?, {" x  I程序代码: 0 y/ A" ^6 g! k7 Q' b; J/ \1 M. M/ m

: y1 s# V9 R2 h6 w, K#include<strstream>/ R5 l3 V- ?/ n" r. y  L1 E
#include<iostream>; P" h. R# G4 V  h) ]4 d" V
#include<string>. v; I' d9 b! M* {
using namespace std;
  t( a% j2 m# I4 ]  Q% I7 d( y. V* [int main(void)
4 e+ n" m; [& U+ `/ p( V, P6 \1 {: r{" r! n9 y/ ]3 u' u; \
    string s1;& |2 ?4 a$ t$ v  u
    while(cin>>s1)0 K* Y2 x% r8 j
    {: |  T" G. x' B: A$ z! V
        istrstream isin(s1.data());: \2 p: D; j* w! V
        double d;1 H, R0 _% E2 {4 L  `$ f9 B
        if(fy_Exp::GetExpValue(isin, d))
' c6 i! q9 a* O7 q9 N        {
6 Y+ `( Y# u, s0 u; M. X/ O            cout<<d<<endl;2 W  z5 r  Y$ o% {: k+ O5 o
        }& v# G1 a2 K' J
        else
+ W7 I. y9 ~: S: E' I* u! _9 h7 t        {; H) Y. T& ~: J4 B9 k4 {) y
            cout<<"ERROR"<<endl;
7 o+ Q0 p  o* y! K+ [; M        }
) c+ F) }+ d. t' \    }
! m( h) `) C0 [& {3 H1 @; s    return 0;! F& ^8 `8 }! ~
}" X1 n! d, t) z0 ?% p/ k, O

" \$ J; e5 K& l. H, s# s% _$ S% v( T8 Y, I  m# Z
然后编译执行就可以了(*^_^*)) r* \) H- \5 j& B9 j  I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ N5 S8 H6 @1 U# L+ ^" x* W$ o      建议使用VC7或VC更高版本,或者使用GNU C++编译

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