返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,) c& t; ~& g1 |! h" z; o
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& l1 |# o/ v/ R4 M$ ?+ a只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( l4 b5 z7 ~7 [, ?: r. Q) J$ U参数解释:! {% v3 s8 {* _1 v3 X, V. v6 a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# b+ Z2 K, n/ S) @* ^nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
6 P# V; B$ q. n. v返回值:
5 O& ]( W: n, X$ a% o# a( x返回非0表示计算成功,0表示计算失败有错误
, k- z- [: i' W  h( ]! m2 C. x% Y0 {6 |7 \+ v/ N1 [# R

% h  O8 ?6 M& M2 a7 {
' c( G* t* K) G. n9 ^& f& Y程序代码: 6 R) n1 j0 a: M4 X% K8 S6 |: l

/ O! L( i6 [+ R8 u3 unamespace fy_Exp{* x: F  J2 H  R6 ?5 X
namespace {template <class _T>. N; {: w4 z$ v
inline _T GetExpValue(_T t[], char& csym){
; X- ]- P1 ?7 o' q0 T% @4 V    char c=csym; csym=0;; [' S. t6 m( A
    switch(c){
. @' P1 z- X* b0 `4 k+ P0 ^    case '+':return t[0] += t[1];
; t6 N6 R: L8 Y, x    case '-':return t[0] -= t[1];
9 S1 ]4 x% ~" W* R    case '*':return t[0] *= t[1];9 D, T- n+ T" T4 t" c
    default: return t[0] /= t[1];//case '/':
0 |3 d( |; r" O1 O1 J4 b. C    }- A! [# |- d, C% G
}}, \5 Z2 q  ^1 u
template <class _T, class _Tstream>( w" Z* P8 B; a4 x* h5 s
/* _Tstream: inputstream, _T: get return value
7 M6 i" E* X( j- D* a- l$ Y2 o* Return nonzero if get value successfully */% K, c: I, G/ V/ c5 ?, j
int GetExpValue(_Tstream& istrin, _T& nReturn){& r- j5 k3 C+ s( ]
    _T t[3] = {0}; //雨中飞燕之作
. Y$ A' x5 k9 Y# h" R    char csym[3] = "++";
, e! b' q/ v% X! _5 |$ R9 O* e    int nLevel = 1, nERR = 0;: V+ m! }* V7 J+ Q! N! C% r
    if(!(istrin>>t[1]))istrin.clear();
$ s8 Q2 c4 N) y* N* h! h/ X$ m    for(;;){
! x* y, J4 i" }6 z6 t( ~, t        if(istrin>>csym[2]){% c2 o9 z% n' W# N' ?& }. Z) W
            switch(csym[2]){
  a$ ]& X3 }! C+ b# a9 O            case '(':) T2 L4 s0 \  Y$ ~. K3 l
                if(!csym[1]){nLevel=0x100; nERR=1;}else
7 l! E7 q0 ?& t+ O# ^, K                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: W, Y- b8 f4 [& g! K6 q                else{nLevel=0x100; nERR=1;}9 D: X1 S" K( s4 q7 |: w
                break;
( Z% r# u" v8 L  q% M+ U# ]- N9 f5 Z            case ')':
$ ]( z& N7 `6 h* R, ]                {nLevel = 0x100;}break;
' a5 X& {9 o  p# }9 m            case '+':case '-':case '*':case '/':3 k# f1 ?! d0 J9 ~  E& ?
                {csym[nLevel++] = csym[2];}break;7 b4 d. \2 ?5 t& r! @/ X; a
            case ' ':case '\r':case '\n':case '\t':continue;
: t& N/ O# h' q7 ^. K! D4 W; F            default:/ a2 T% g" @2 ~% |' v
                {nLevel=0x100; nERR=1;}
  I* p" A8 o8 B9 K) X            }8 I* M/ G; n' I0 D. [9 p
            if(nLevel==0x100)break;
- N4 [6 {0 Y( Q( P            if(nLevel&0x10 || istrin>>t[2]){
3 g4 o' f) q6 a5 d7 f: f                nLevel &= 0xF;
% h& \) L6 u2 w6 g2 p: J8 ~                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}/ m  S: U* F- B0 u- W* Z# {
                if(csym[1]=='*'||csym[1]=='/'){
0 A) l+ _8 h0 G7 W7 i                    GetExpValue(t+1, csym[1]);
2 f9 ^+ a5 s; M1 ^% U                }
* b  z9 y* i5 E) E' s                else{8 M( \$ h! Q& d; F" W
                    GetExpValue(t, csym[0]);  T- f' }  p' D: N$ ~5 G
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
; s+ a. q! `6 c: T                }+ C; c. X: E) j* Z% A
                nLevel = 1;9 x& R( |; l3 F( I8 u. `
            }/ I, A* n1 F! z, f
            else istrin.clear();2 Q: G" y6 P' d0 n) d
        }7 _; t2 S8 p# z! R4 Z# ]2 q+ }2 i3 W5 m
        else{nERR = -1; break;}; r, [$ q4 R1 c7 y) O* d
    }9 M5 }5 Y, R) j# i6 |
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 Q5 k& y) A9 T4 Y& q  U
    else nReturn=GetExpValue(t, csym[0]);' S2 V# k# w$ X/ o& G+ D
    return nERR==-1?1:0;# H, @) _6 V) e3 |$ L! u
}}
. Z) u; H  n& a1 K" V6 h4 @, v+ d1 U+ b: L7 W  z- _

0 K7 g2 _2 Q% _0 P) L2 C! S6 `4 S0 w# m# s$ l; w$ c8 C
函数模板使用示例:
* v% _7 \8 _" X; @: ?- p在以上那段代码的后面加上以下代码:
5 H/ Q, I# B/ [  o! {  m2 }7 M' x
3 n$ I9 ?" \' \, i- C1 N
( U9 {- Q! t! X3 x- ~2 o# Z& `$ Z" y% [  d: l
程序代码:
- {$ \: f* v; ^  s9 k  Z# q4 J7 [2 q
  H) |( r* _: r: a/ T2 `! a#include<strstream>
2 l3 A" S/ i( ~5 l1 B#include<iostream>6 F$ G$ y- U$ T" q, a
#include<string>% v! Q+ y+ c# z  ~( _
using namespace std;
5 B" \( a# G0 j4 Jint main(void)
' x6 d7 \* ~  \* R( A0 O/ i* f{, [! r5 ?- ]# e* v
    string s1;
# c$ D9 s# Z; b9 o- r    while(cin>>s1)3 L9 D. c& g" J, n. @
    {& O# e0 {( ]3 `) q, ]
        istrstream isin(s1.data());" f1 C5 k% ?' \+ j% L; S/ J
        double d;
3 b" U7 Y( n" e1 l) F- d        if(fy_Exp::GetExpValue(isin, d))
+ C" ~/ T* O" L        {
2 r2 s2 ?0 V$ h# U5 f            cout<<d<<endl;# j' a' ~+ O6 c' E' Y
        }" ]6 S% S( A7 j; k* p. y: e: e
        else
$ ~2 |  c  u: [+ C* Q9 L        {2 ^' A* }# h7 }6 I$ Q2 v
            cout<<"ERROR"<<endl;
# x8 K% R$ t! [; w) p        }
0 E, g: J3 o4 z4 p. \8 H& W    }
- U6 E2 Z" }1 ?    return 0;
  b: u7 ~! `+ W9 U' x3 e}- h% N& O. t7 r+ `) F
; e2 @9 W+ ~+ R* Q
: w- k4 D0 f/ G1 j
然后编译执行就可以了(*^_^*)
, {! a: F2 s2 A' t; M其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ J  O- B, A( P      建议使用VC7或VC更高版本,或者使用GNU C++编译

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