返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
- R! K; J  V+ a+ C一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 \9 ?! n" `) o2 z! q6 {. ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ \+ U% l3 h  i参数解释:
, l  \+ u9 S- E. S& \+ Uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% R! Z" p  p. @) B$ W3 L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- c1 M3 U8 y, M, ^9 `返回值:
. B, r, n/ q, p返回非0表示计算成功,0表示计算失败有错误
" w1 H0 A* v7 A( n, F# I- a9 P) F- _. m/ r" g

( e# d; N7 [7 E, R. ~$ ?4 o" r: a' P8 C
程序代码:
4 k1 A/ T" U; P3 i0 Q* d$ _$ B' u+ o# t/ `
namespace fy_Exp{
( P/ t, i3 m+ V; f5 |/ T& Xnamespace {template <class _T># [$ }7 L$ r+ l6 y0 H' C
inline _T GetExpValue(_T t[], char& csym){- n: F* e" {2 \& ]( u1 f' \, i7 N, F' t
    char c=csym; csym=0;3 {2 x8 Y) u7 G
    switch(c){
2 ^! C; F, S9 @$ X. w- X) R3 c! k+ l* _    case '+':return t[0] += t[1];& @3 g* I$ _: Y% f6 V( L; Q5 t" b" M
    case '-':return t[0] -= t[1];( {& ]" f+ d( o1 E9 F4 F. h' B% ?
    case '*':return t[0] *= t[1];! ~  i( ~) @6 [( C7 s2 r% h  ?
    default: return t[0] /= t[1];//case '/':0 P) q/ G# f. b0 {( o" I
    }  p1 _4 ~7 ^7 ?" N6 H
}}1 k0 }3 V! l; f1 t( R7 O  N. k
template <class _T, class _Tstream>
/ B$ e# h9 h; g" J* l/* _Tstream: inputstream, _T: get return value
, \6 F7 _/ o4 r9 @* Return nonzero if get value successfully */
0 O; p( F, e3 @/ _1 Kint GetExpValue(_Tstream& istrin, _T& nReturn){( j- Q* R9 e$ L" K: I1 l
    _T t[3] = {0}; //雨中飞燕之作
# A) ]( @- b( G    char csym[3] = "++";4 J0 u: c3 E$ h- L% ^5 F
    int nLevel = 1, nERR = 0;
% S( j- w  o$ G" _) T    if(!(istrin>>t[1]))istrin.clear();
( D$ H) C' A0 w2 v* N4 y: A- h    for(;;){+ C4 _/ u) V" M' v3 f3 Q5 Q
        if(istrin>>csym[2]){  X+ _3 d7 V# m& v  y7 T
            switch(csym[2]){% S7 b/ N/ k7 B) U' C$ I) B" d
            case '(':+ l! G' `+ k5 G+ z/ W/ r
                if(!csym[1]){nLevel=0x100; nERR=1;}else
5 Q2 a* d3 R- W% I                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 _: x# b4 [- d* l8 R% g                else{nLevel=0x100; nERR=1;}
( ?$ E& y. w2 Y! x1 n& e/ n- Y. o                break;8 F+ j; e) z% r0 f0 S3 m# ?
            case ')':
2 I# s4 Z# l0 }2 l) R; C; J8 L+ R                {nLevel = 0x100;}break;* D$ T3 W' L! L$ F* ~
            case '+':case '-':case '*':case '/':
  z* @' Y& Z5 Z6 c                {csym[nLevel++] = csym[2];}break;, O& r- z" Z; `. W5 q8 B
            case ' ':case '\r':case '\n':case '\t':continue;
" U0 b3 w# I6 p3 P. c$ ?4 [: x            default:7 G5 B& @9 t- A' w+ y% j/ I# D
                {nLevel=0x100; nERR=1;}( o7 ~2 N( o# ~7 ]7 N* ]" d
            }7 ~' H- y1 z# S/ ~
            if(nLevel==0x100)break;
+ X$ y  e$ Y9 X) Y; e0 m* q* {            if(nLevel&0x10 || istrin>>t[2]){) W: F. n7 ?1 q1 g# e4 y
                nLevel &= 0xF;6 g' K6 ?) ?9 o, e
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) @' z! F, w; S4 I
                if(csym[1]=='*'||csym[1]=='/'){% m. O& T! j  E2 I3 e% H
                    GetExpValue(t+1, csym[1]);
, Y2 B  C, i( e1 ~/ Y                }
: I( k; T1 H; E                else{$ b2 K4 V( l* g3 R* P$ ^
                    GetExpValue(t, csym[0]);  o; @& g/ ?7 y9 w& S8 u1 [+ G  z  ^
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;! N1 S! R. K: R1 Q! ~: F
                }
& o5 d. j( @( a                nLevel = 1;
  U+ ?0 \( n, Y% q" w, l            }
) n9 ?& a& K' }% G            else istrin.clear();& I: `. a5 r7 F2 x/ D( t4 T" m
        }
# X. w$ B3 L7 l3 t# i8 V        else{nERR = -1; break;}8 ~' d7 @# ^: f# U. A( b! R
    }1 D6 d1 f1 m7 Z% s+ Y
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 x! q" s- U( o5 ]    else nReturn=GetExpValue(t, csym[0]);
) z! c" ]. \) y5 j; F    return nERR==-1?1:0;
8 |% @6 ?- r. {6 Y, \4 ^, w* B3 D7 r}}& \4 D# s% l7 a. `, H5 Y

/ }! y( c6 O8 k6 i* T& A. L
; v% p9 \& B+ @  l* |- b8 G0 E$ L$ Y% \( M4 a3 m
函数模板使用示例:
# \" ?- e. N3 _- m: J在以上那段代码的后面加上以下代码:
, J! c. J/ N3 b' }9 E- p8 T+ M
4 m% G' i6 q5 ~: e# ~
; s8 r' ?- K4 }$ N: a" e0 V) ^6 J3 T8 u! J
程序代码: 9 }) E1 r* W, f0 o
1 t- ~3 _, d9 C6 Q, Z5 f
#include<strstream>
' \4 X! T- Z3 \9 F#include<iostream>, Z; `- r2 e0 G2 [
#include<string>
- f7 q' X+ c* K$ L: \+ L1 e- nusing namespace std;- s& H7 @+ O+ w' U% J# n
int main(void)
3 H& T( @% n# i7 A7 B# j+ j1 e{9 |0 m/ k7 Q4 _+ x; S  o3 H8 m
    string s1;
/ x" k. r6 ]  P8 A4 A* e    while(cin>>s1)3 H, E% ?# ^; S/ _8 f
    {
- A$ c1 x& `% Q' Z4 v! z- O        istrstream isin(s1.data());
9 S  o( }( r2 s4 R        double d;% E7 O7 d2 a# x# `
        if(fy_Exp::GetExpValue(isin, d))2 `& g$ l1 S4 O3 K9 U
        {
, |) A4 Q  E8 x1 D            cout<<d<<endl;7 E6 E8 V4 i0 Y& x/ _
        }9 b7 T9 U0 Y! L$ n" }: L* a- @2 r5 N
        else7 |' [. x0 T6 W
        {
# }" {5 L1 _3 {2 }( d3 Q            cout<<"ERROR"<<endl;+ V$ T! s- G: D$ r% F) b7 ]( b& _
        }
8 ~3 h5 _& @* F7 s    }
! @+ Y- ^; g$ _& P$ K# X) ~  e9 Z    return 0;1 \% a/ g; P! {5 ~+ h4 ^6 n
}: z% Y* q6 O) x8 ?

  o' {; w5 W1 C, Q. g/ ?/ y. l# J$ o
然后编译执行就可以了(*^_^*)
* l# |! A8 E: T% Q% \0 h其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 y% ]  T, {; ^0 L
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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