返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,2 r; [+ ~! Q0 x9 r& o/ x
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
$ X% e7 `: u. i3 [8 o! ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! m+ k# E* {' g: j9 D2 {& E% m参数解释:
; x# S. z% V4 [. G* ]/ s' z. Oistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% R7 R$ v2 Z4 d# s
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定9 O# T! s. k  _5 j* k( P1 Y9 E' N
返回值:6 J% K. y- P7 Z7 p/ k+ R" m9 ^9 O
返回非0表示计算成功,0表示计算失败有错误% n( b. u$ g- D

# n7 Z0 i8 y! s+ E& t1 u: I ' D6 z/ T0 l/ X1 S+ q( m/ d

- z0 m* U' L+ C1 k8 R8 {0 W程序代码:
1 S  K7 C/ T" z: ]" x' o8 y7 j$ ^7 H5 d: a
namespace fy_Exp{
3 M& V/ |' u: h0 e- _namespace {template <class _T>
/ `; A! e; S  z! Y- h: o* J+ Z2 Rinline _T GetExpValue(_T t[], char& csym){
  {+ `, s. B7 b  F  g+ F    char c=csym; csym=0;
2 Y$ w3 ^9 E% {1 a: x% r    switch(c){
# f) q4 ]$ k; p    case '+':return t[0] += t[1];9 N- m! l! X0 }. G
    case '-':return t[0] -= t[1];5 B" d" L. r: \% b5 \% o( k
    case '*':return t[0] *= t[1];
  k: R6 i9 s$ |/ J! E4 `4 ~    default: return t[0] /= t[1];//case '/':  K( w1 l( _7 d$ ^
    }$ |6 O  ^  |4 G* y
}}) l3 f/ Y- g8 Q1 ?. Y, A
template <class _T, class _Tstream>
2 m$ A5 g, k8 V9 Y! T& e/* _Tstream: inputstream, _T: get return value1 a. [+ y; {7 E- ?1 ]
* Return nonzero if get value successfully */. H* T& p  J  _/ ^5 A" M4 v5 `
int GetExpValue(_Tstream& istrin, _T& nReturn){
6 X: M; G9 u- t& {    _T t[3] = {0}; //雨中飞燕之作+ J. m5 P6 a8 N8 d" O% Z: M
    char csym[3] = "++";
0 `  i0 Q% f% L0 y7 A% N    int nLevel = 1, nERR = 0;- t% p1 Y; y) o0 l
    if(!(istrin>>t[1]))istrin.clear();$ d3 h. ~& U( C0 f: y
    for(;;){
9 X/ s" j$ I4 L        if(istrin>>csym[2]){
* L$ i6 Y. h9 R0 u5 E            switch(csym[2]){
3 ~7 @* g7 g* E- I) [) O( O& B            case '(':
- l8 B+ }! _. {/ k6 d2 k! S# x                if(!csym[1]){nLevel=0x100; nERR=1;}else$ f1 n& x! D: f$ Y7 J* q
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;  i  F  B! d: h* ^
                else{nLevel=0x100; nERR=1;}
1 {) J/ q: V. h* O# j                break;
' v( ^! S$ X: {/ F% S2 H1 ]" _            case ')':
$ u0 Y5 @' f& }  M8 Q: {8 F8 O9 b                {nLevel = 0x100;}break;
4 V1 n. B% D/ A3 w            case '+':case '-':case '*':case '/':
2 ~- L+ M2 C9 |; x                {csym[nLevel++] = csym[2];}break;: ~& \$ h' w2 H
            case ' ':case '\r':case '\n':case '\t':continue;' h& ]5 j( S  r5 B$ l
            default:
! C/ ^. l# J; s# p$ }4 k) P2 z                {nLevel=0x100; nERR=1;}/ _. {2 l$ p3 \* m! i
            }5 {8 M1 L7 N2 Q8 e4 ]* S. B
            if(nLevel==0x100)break;* l" a3 c' d% `. u* V% I
            if(nLevel&0x10 || istrin>>t[2]){- A/ A3 w9 ]* c8 F: V: D" f) W2 P
                nLevel &= 0xF;! Q* k- ^1 ~7 k
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ H  J/ W0 @# {+ i! G0 F/ i0 O, h
                if(csym[1]=='*'||csym[1]=='/'){
8 `. r" `) s9 V                    GetExpValue(t+1, csym[1]);
# L. H8 X9 B, U/ N! @5 i: m/ A                }
" H; o& P6 w1 `! A! y                else{3 U, n% C; w+ x" g& ]4 }& T* }; \
                    GetExpValue(t, csym[0]);" j; Z1 U6 s; W. ~
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;" ]1 {, I  j0 p: e% F2 b
                }
# [' K9 }7 x4 `1 `7 Q' ^& v1 v                nLevel = 1;
- s0 T+ J' f" I  }0 v* O            }7 n+ J9 \' T5 S& |& d+ T) U9 \
            else istrin.clear();
6 Q" K, M; u; F9 b        }
2 F6 a# a7 x' _        else{nERR = -1; break;}
' W  C  W( F2 Y    }
6 u8 C4 M8 a' j& ]3 Y3 Z  X    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);  V7 T$ o3 |' T; h. L. L
    else nReturn=GetExpValue(t, csym[0]);
+ k. C5 q- E& \9 e) j  p, t( S    return nERR==-1?1:0;
3 l, R8 |% X0 O}}
6 N- M) D3 G' E3 h8 e
, i5 |& Z6 B5 @5 g& j8 d
3 K+ F. g+ n! M3 J1 Q  c5 k. d2 G: p" y( k" `2 }. x
函数模板使用示例:
* z- D* P! e- Q# h2 F在以上那段代码的后面加上以下代码:
" Z) t8 L/ |- x5 m. @3 R. O3 v
" t; `: f' @- m- c; \* C# x
% ^( }" `% e5 P- q/ s
: @" H: E7 L- U1 Y  Z3 c7 C程序代码: " A) T. m: o* M8 W- r3 f3 f3 R
. E3 K4 c8 x) G
#include<strstream>
) H' y, e) }% v' t7 v( J#include<iostream>
& f: u# Q" k8 @# d* {#include<string>
% ^: j3 m+ C. J0 Xusing namespace std;
; m, q4 P: A3 t3 D/ Tint main(void)
% L0 x- Q7 u' j! p; `# U4 k" c* b! A{- D/ X- i) E0 W
    string s1;
/ O! |/ y& M, h( A+ C$ ~7 a6 K    while(cin>>s1)( s$ A0 x0 r- z' M: r
    {3 O, z( i5 t2 ~- h2 L7 D: y# Q9 \
        istrstream isin(s1.data());
6 a# j, _8 a! B7 h8 ^        double d;
4 _9 |" }- j" N! ^9 v( }' G+ m        if(fy_Exp::GetExpValue(isin, d)); j- I9 q! X0 K1 h
        {
$ n1 X0 J: q+ Y# n. e# J2 U' y9 P            cout<<d<<endl;
8 ?6 C; R1 r5 J& b9 c4 v' ?4 h        }. `) E/ S; F0 |! Q& A
        else) x, m8 {0 Z# a& k  Q
        {
0 f$ u9 d2 ?' s+ d            cout<<"ERROR"<<endl;$ L# N5 C) M' `4 D3 R, U* q
        }$ d8 N$ a3 I, p& i7 b5 V
    }
: E7 p) L& P" B& T) |& n: u    return 0;' h2 y& E  s7 C
}4 ?3 A# k2 ~% H2 q
8 P5 J! ^- T% b+ C2 U* a% l
2 }5 H+ v, o; F" @
然后编译执行就可以了(*^_^*)
3 \- }, {5 S9 l  j3 |( W其它:TC++上一定编译错误,不保证在VC6上也能通过编译
' A$ E0 Q4 }/ w  ^* I: Q$ E      建议使用VC7或VC更高版本,或者使用GNU C++编译

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