返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
4 P3 ^9 B& N2 j一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& N. ?5 y% ]9 C& G- E
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 K8 u! b- L9 D2 E, a4 }3 x9 B
参数解释:+ n* V  w- x7 R) z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* `* E6 L) L) D( O* ^nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
7 w) e, o( \# j! g2 U返回值:& ?! I; _& }" J3 Q
返回非0表示计算成功,0表示计算失败有错误* r, i3 U' O! |+ _+ S9 ?

! _/ X& Y2 X" W/ S
# A0 M6 }0 b2 u0 o3 J6 d% m) Y2 i6 @4 e4 F4 m/ q
程序代码: $ ^& l' f. H! U& i
; Q1 \' k( o2 W# i& V0 S
namespace fy_Exp{
( c1 i0 a; F# u! f3 ynamespace {template <class _T>6 @* S0 m7 _" h& H8 @* V
inline _T GetExpValue(_T t[], char& csym){5 V* d) b6 c, j% i
    char c=csym; csym=0;
: }/ W7 \; I1 e    switch(c){
3 f) X3 z/ ^- Q3 E6 ~" h4 W    case '+':return t[0] += t[1];) ?" P9 w2 F! K2 i: ]$ K
    case '-':return t[0] -= t[1];: k6 k" k* y' G; ^; U
    case '*':return t[0] *= t[1];
6 Y3 V+ k" f6 P: ^% S8 t" }    default: return t[0] /= t[1];//case '/':
4 ]% H3 q9 M) f4 \    }  `4 R) K, m! v/ [
}}9 `" q; Y5 k# G: T
template <class _T, class _Tstream>' o' |- j2 r1 f$ o7 G/ Z$ |
/* _Tstream: inputstream, _T: get return value+ P. X5 s# l1 I- k* z. T9 e
* Return nonzero if get value successfully */
" S- u* I  d, D1 ~2 p0 Rint GetExpValue(_Tstream& istrin, _T& nReturn){  H9 I9 }  f$ w9 [
    _T t[3] = {0}; //雨中飞燕之作
+ x; Z& H0 y% y4 g- H8 H$ O9 W    char csym[3] = "++";
$ \& ?- M. j, ?& g    int nLevel = 1, nERR = 0;
/ ?9 ?5 D. e( [$ D5 f# J    if(!(istrin>>t[1]))istrin.clear();& ^4 w1 O* v5 b8 H' {) k
    for(;;){
5 ]" y; T9 u; r1 S  h. Q        if(istrin>>csym[2]){6 D, Q$ \3 X# n4 s0 D
            switch(csym[2]){$ d& R, u  C1 h: v+ P
            case '(':
2 ?! n- w4 r( s. {8 S' {                if(!csym[1]){nLevel=0x100; nERR=1;}else
2 E5 z  b8 g/ O                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 D8 B7 g) ^5 q- C9 ^/ |0 D! G* Z) w
                else{nLevel=0x100; nERR=1;}
" R: m( B1 R  }/ f0 T& {5 D: M* d                break;" q3 m- r- i9 t; V8 r
            case ')':
& f3 s! s7 F4 i7 ]                {nLevel = 0x100;}break;) E7 p; P! a) K% h
            case '+':case '-':case '*':case '/':5 K/ r4 \% z: z4 U6 w6 {- e
                {csym[nLevel++] = csym[2];}break;
$ @# v- |# j' C) k  u9 G& K            case ' ':case '\r':case '\n':case '\t':continue;5 m- w6 P* f; i6 O7 n- x! X
            default:
! R& `# |( p' K7 a6 T                {nLevel=0x100; nERR=1;}7 r$ n; U2 n& E* t, A+ A! c
            }9 n* R" h4 K+ ]3 T5 g; T
            if(nLevel==0x100)break;4 F% W% \9 Q+ h  s# d+ G5 b* U
            if(nLevel&0x10 || istrin>>t[2]){; s2 x4 b! |+ l' e; M
                nLevel &= 0xF;: f8 n- I8 w# Y  U* u8 M/ `- C
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
/ k+ S  ?2 J2 g/ x- B8 ?3 [; q                if(csym[1]=='*'||csym[1]=='/'){
0 q7 m2 g( `$ F( D- [/ w" N                    GetExpValue(t+1, csym[1]);/ }1 F) t. g; r3 @- V
                }, `5 H" }6 j0 G5 E7 X: y4 _$ D1 G
                else{
; n9 G( K, @8 R1 R- W                    GetExpValue(t, csym[0]);
5 w) m+ k& a5 p+ V0 s+ J5 I                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;  H$ X; H$ f  a0 z. Q5 m
                }% o4 c  y% f9 W6 E0 O
                nLevel = 1;0 Q" c! t/ v0 J% B0 o! n, T
            }8 ~4 Y8 w& D  {4 F9 J
            else istrin.clear();5 A+ I3 U- c8 H% x9 D
        }5 z( F9 x# m* e0 ]( r
        else{nERR = -1; break;}
  H4 Q/ T* m$ y    }, X& }2 b" f; x7 q% `
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( M) W! X6 D4 {& C% a
    else nReturn=GetExpValue(t, csym[0]);( R+ {+ M$ M, N1 B2 z, j. {
    return nERR==-1?1:0;
9 i# u6 p* O& w5 G8 n, V& Y}}( o+ {* R$ g( R0 D
9 t/ Z4 p( ^1 p

$ x" L" l/ N2 H0 K6 V. M. K- \4 }6 [& o0 l
函数模板使用示例:$ E' f2 a  j* S: B7 _1 w9 G$ l; b
在以上那段代码的后面加上以下代码:
+ |& j- p+ t' L' O" U4 ~9 P8 C) m! o9 W$ Z

$ E4 f3 o  J9 d' _
5 J- _$ p% E! _5 \! T程序代码: , a9 z! p, i; N2 U# i

. p+ {* K  A! `; G# n( Z* y  G#include<strstream>
" O" h. I: b7 X. m- N, C: Z#include<iostream>9 m: M7 Z- _3 S! `0 v0 U6 M5 u
#include<string>" |5 w) ?/ {5 v. {, {; k
using namespace std;
! G+ C0 J. O9 k4 [int main(void)
9 T2 K& |/ M  E* S' P{# I  {* G7 ^/ y! g: B
    string s1;
& }4 F0 }# j6 a' `2 E2 o    while(cin>>s1)
# o" X, E2 \, x2 Y9 \    {; G5 e! M* i( V8 J5 T
        istrstream isin(s1.data());
& H! p" r1 w$ @; d9 K4 h        double d;: H$ r5 x, N; c7 z
        if(fy_Exp::GetExpValue(isin, d))7 Z) }6 T! ^, {$ q' g7 H) d$ C
        {. t9 W: w. o8 a$ O1 S
            cout<<d<<endl;
1 n7 T1 d, p$ f; {1 T4 e        }
, N; Z7 Z/ K7 l  x# v0 N, o5 c        else3 |1 J8 A- V* n  |6 j
        {
2 D, [0 b4 ?: t1 @            cout<<"ERROR"<<endl;1 r3 w$ a2 p* R/ ]8 U
        }$ K+ R9 _9 G( D8 k4 e( u
    }
; t9 o$ F$ y, D. i    return 0;8 b4 I/ i4 A' Y. W, Z
}: m+ n8 J9 E6 G& c- E
( L( @& L6 g( T. t( B
) n* Z, t3 f. H8 ]$ ~3 f/ `
然后编译执行就可以了(*^_^*)! V" b4 N" i( t( ^( k/ W
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% q9 W$ j; A, C& Q      建议使用VC7或VC更高版本,或者使用GNU C++编译

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