返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( I* W7 J9 J, g( }* Y8 a
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 r0 c+ ~7 d+ U! j! W7 b只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- ~, _( r9 j, l: S) e7 C  f参数解释:
; A* I. m6 L9 B4 t: h6 O+ |5 k; c0 Wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
+ a% f- x# k$ B, u9 J9 z7 R4 ?nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' z3 S& D7 h" D, H+ d2 }
返回值:1 ?1 T+ ], k7 Z3 o2 n  F
返回非0表示计算成功,0表示计算失败有错误
9 j9 n; M* Y/ ~  e) r0 b
, i1 l" V! F- F" h1 O9 U: g; X* N & ?% u% k/ ?+ a6 e! O/ f" z
0 I4 G% a2 W( |% r# j
程序代码:
8 a) n4 L3 Y- v) `/ p
% Y# z& d: P% Znamespace fy_Exp{. H+ k+ w+ g( v0 J9 r
namespace {template <class _T>- D+ s8 O, ^& L+ g$ y
inline _T GetExpValue(_T t[], char& csym){
# E# o) O* |9 g7 C    char c=csym; csym=0;# ]$ G$ B; U" ~; M
    switch(c){, Q1 m7 L4 l/ Y6 D) ~
    case '+':return t[0] += t[1];$ C% T& E/ l( }- @- f4 }: h' r
    case '-':return t[0] -= t[1];5 ^6 q3 G6 ~" }/ J3 s
    case '*':return t[0] *= t[1];
  T) \0 Y! l* C. \    default: return t[0] /= t[1];//case '/':5 m+ x2 z+ W' r- l8 A! c
    }7 c+ h* \5 `0 m% r
}}0 M5 v9 L1 H. S& t5 `8 |* }" ]
template <class _T, class _Tstream>
  w6 h" q5 M& T6 O; S) y1 Y6 d/* _Tstream: inputstream, _T: get return value
* y9 I  G. B% t0 m9 b* Return nonzero if get value successfully */
0 L% [* F) b1 e- E) Oint GetExpValue(_Tstream& istrin, _T& nReturn){
1 F9 K" A  k2 y    _T t[3] = {0}; //雨中飞燕之作
) ~2 U7 f- ]- J* O' G    char csym[3] = "++";0 x4 a; ~" @- p% w' q  F
    int nLevel = 1, nERR = 0;
# L5 B1 C! @% a; I    if(!(istrin>>t[1]))istrin.clear();. C. A* W& b. _
    for(;;){0 w0 Q, X3 A# q, `
        if(istrin>>csym[2]){
8 b( K5 ~, T4 Y3 E! G1 Y- Q6 e            switch(csym[2]){5 C& |4 g  q. \/ [5 |/ M8 L* M
            case '(':
) u  v$ k/ _7 y* o9 ?/ M                if(!csym[1]){nLevel=0x100; nERR=1;}else6 a; f7 M7 X/ h0 E# B! X7 j
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' w7 j. h' S/ D2 ~2 ~* `" w1 x                else{nLevel=0x100; nERR=1;}
2 O' M% f# A+ v+ {                break;
+ V, ~- P1 M" e            case ')':1 n8 t2 ?' ~$ R5 k
                {nLevel = 0x100;}break;/ j2 V8 W5 `! E8 C, l
            case '+':case '-':case '*':case '/':
7 b- b$ H) E/ ^) ~7 t5 q                {csym[nLevel++] = csym[2];}break;
* Z$ b4 A2 `6 u/ P            case ' ':case '\r':case '\n':case '\t':continue;
9 p( k( f8 n0 k8 Y% a            default:1 O. w# m+ o+ @1 u0 ~. `' d8 t
                {nLevel=0x100; nERR=1;}2 t6 ]9 K: `, b' \. n
            }7 D0 D+ K( ?3 u  I# v
            if(nLevel==0x100)break;
9 |7 C' M; `$ k( z* {            if(nLevel&0x10 || istrin>>t[2]){* w' J& K: h2 B6 _  O7 A
                nLevel &= 0xF;
$ {9 X$ e! @" y                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}( L! Z' r, Z7 {7 k( O" @: F
                if(csym[1]=='*'||csym[1]=='/'){1 P/ V' j5 q: G! m
                    GetExpValue(t+1, csym[1]);6 B8 u/ _2 J  O2 h
                }9 ~- y6 ^- W3 m9 \* @% V
                else{
# {. h- `; b" o; I                    GetExpValue(t, csym[0]);# a5 H+ Q  I# v8 W
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 k, n5 c+ A. D8 i. D3 z$ j* j
                }
$ G, I+ q3 a% _! A; S                nLevel = 1;; S9 @( G5 n% m
            }
2 Z3 M1 s1 j3 ]% |            else istrin.clear();# ~# j7 p/ n) M% [# F
        }
, Y+ m) w! t/ G- e6 @        else{nERR = -1; break;}
; z6 ?5 i" K  R  `9 G) Q* D    }
: h( \8 r, m1 O% ]6 t% U/ M. q    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
) \  U: N6 g6 K9 R    else nReturn=GetExpValue(t, csym[0]);
! b) G0 m; Q% w2 y6 @9 |4 B" N0 \    return nERR==-1?1:0;7 H' U8 H( e$ S% _0 H  @  f8 H6 Q
}}
1 h, L9 H- k: p* j$ q) e3 n
6 T3 y' Z/ ]" J& i8 C$ K* X
% a* O& g% t2 x# [8 d' M
1 w6 t1 L- E) I5 X7 X. Z函数模板使用示例:8 v+ u& j6 N  C, x' {$ [7 m
在以上那段代码的后面加上以下代码:
0 N( _/ ?* U& d1 P8 D/ O/ x6 W3 D2 q# M7 P
$ A  l: ^' q0 Q9 n, ~) I

4 A9 O) `" W0 s* _$ L, I程序代码: & c9 Q- m9 B6 d
" a: d2 ]% A0 b, v4 u5 q
#include<strstream>* ~- x0 @0 l) R. q- k
#include<iostream>
8 O) g9 g- \. t, N5 e/ p: T#include<string>: ], E+ L9 E' ~" \  z9 u3 c3 Z
using namespace std;' m& ?6 J$ O' g0 R) r7 V; u
int main(void)
1 a9 ?5 F, }/ B: p& P% K- y- P{5 y$ t- X* b! C8 c7 i; R
    string s1;' @' O% f) v& X' D8 U1 h3 _
    while(cin>>s1)0 T* x1 D' Q- V1 |% x& a( h
    {
  v; ]$ b& J; O, T- ]' J* s        istrstream isin(s1.data());
! Y7 Z& u8 I  I, }& ^        double d;
& n# k: i0 R; D# u9 s        if(fy_Exp::GetExpValue(isin, d))$ n2 ?. o/ [8 W# ^# T
        {$ B& F4 A7 K2 f' i( K
            cout<<d<<endl;$ \! y3 B  n/ H0 ~5 x
        }
1 k$ I9 Q1 t9 S4 L' h+ v4 {        else
, y$ }$ v" j8 ^  ~        {' F+ S! i  H: U6 O* \
            cout<<"ERROR"<<endl;9 T' m3 g  n$ Y- ~% U* g0 n
        }& D3 T4 v) b5 s. ~9 ~# P. x% t
    }1 m* S6 k) X) r2 O* [
    return 0;5 G% N9 C+ ~) o8 v# h8 l
}
9 ]: d/ i; s$ g9 s) R( V. n4 U. Q5 |* ?9 L8 z

' H1 O  m) v& @- u然后编译执行就可以了(*^_^*)
0 s( [) C- y* p+ Y6 I其它:TC++上一定编译错误,不保证在VC6上也能通过编译' }$ S' j3 {7 u0 @" T+ q% @) j
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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