返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
% Z/ H8 m" B# _$ A3 r一个很方便的函数模板,可以并且只可以计算含括号的四则表达式2 U$ c7 B1 B( q6 N$ k, W
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
0 z$ L' T4 k) O' C% S5 V5 K参数解释:2 J2 {: e# `# a7 f; J
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% q# x+ d1 R7 Q8 \) Q7 P6 Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 W4 b: Q. {$ u" V/ r! y
返回值:
7 S1 L; }4 \6 E9 u/ V: S3 m$ K返回非0表示计算成功,0表示计算失败有错误, w( y1 K7 z  i2 f2 r% a7 y. p

2 `$ Q; R5 N3 ^/ P( u
9 r- H1 J) W: O9 Z2 O; K$ n% `0 g, R( p0 ]
程序代码:   f! x; x1 @% y* h
  M% u- W" A! T, ?3 o( Z3 j5 \
namespace fy_Exp{
! ?: j/ j# n8 @# A/ u( p  pnamespace {template <class _T>
( }0 Y7 i8 q' S% c! Q. dinline _T GetExpValue(_T t[], char& csym){
& h; [) r1 I. q& O    char c=csym; csym=0;
4 ?% v, [. J4 p, g    switch(c){8 y1 }9 h/ @4 `( M+ @! B1 _$ `( k
    case '+':return t[0] += t[1];
4 M& y  ?" p# c  X! b! M3 X    case '-':return t[0] -= t[1];8 ~; P8 I, E) N$ {; e5 T, @
    case '*':return t[0] *= t[1];
& J( l8 S" x2 Q2 U# a; i- [2 ]+ K    default: return t[0] /= t[1];//case '/':! Y" _/ t: `8 _3 v; ^* u+ i% Y
    }
) R8 l0 K/ G- ?- p& g}}
7 U. C- B) w1 p8 x/ `& {template <class _T, class _Tstream>
$ C) P, M7 n; u: I, ]3 ?5 r8 {: Q& C/* _Tstream: inputstream, _T: get return value) D$ h" U% ~7 l+ {
* Return nonzero if get value successfully */
( I$ c5 O" b5 g0 R7 Wint GetExpValue(_Tstream& istrin, _T& nReturn){% i6 N8 O% i1 I2 {! l1 |, m7 \
    _T t[3] = {0}; //雨中飞燕之作- b( x8 i  H& C9 S. ?0 r
    char csym[3] = "++";" C* q3 n; J: D3 N: v
    int nLevel = 1, nERR = 0;, k) O6 c, W& \. W! v3 Z0 n
    if(!(istrin>>t[1]))istrin.clear();- d7 L: ]6 P7 x9 B( V! T% ?
    for(;;){- k7 q$ I9 d/ C6 O. `! m8 X; W
        if(istrin>>csym[2]){* V* C4 W9 I* Z6 y  G9 H
            switch(csym[2]){
. X. `( p" T: F0 g8 c5 ~            case '(':
0 e; _/ ?7 f# ^: N+ a                if(!csym[1]){nLevel=0x100; nERR=1;}else8 ^( m7 q) E2 }1 H" D( t: t, |/ k
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 [5 h3 o6 I; S8 B* k
                else{nLevel=0x100; nERR=1;}, u/ X. K2 f6 P2 Q  ~6 }5 ]
                break;
' M# |2 D+ f" t7 Z4 i            case ')':* Y5 w7 j7 E3 V, N. I! Z
                {nLevel = 0x100;}break;2 A' ^5 H( n# c$ P% _8 i: N2 y
            case '+':case '-':case '*':case '/':
4 J' J% R# r+ i) c! q# q5 {                {csym[nLevel++] = csym[2];}break;
* \' b3 B0 P: E  t3 w            case ' ':case '\r':case '\n':case '\t':continue;6 t/ N( i8 T. Q+ y
            default:
: |4 Q3 p$ ^" f1 b( ?% e                {nLevel=0x100; nERR=1;}
, D) G* Y& G4 f9 J* ?            }
  D5 m! T2 y" z, x/ r& p( d            if(nLevel==0x100)break;/ [  j( E( Z. H0 w- b  h" h# Q7 U; `+ _
            if(nLevel&0x10 || istrin>>t[2]){: M  d0 U" h7 ~4 O. _9 ]
                nLevel &= 0xF;, @2 d. d6 `* U
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# `) _5 O7 z3 Q
                if(csym[1]=='*'||csym[1]=='/'){0 Z0 b4 O' M# S" G$ e
                    GetExpValue(t+1, csym[1]);
( Y; I. V. |5 k* P5 Z                }9 Q+ u* S" O7 _$ U  Y! G
                else{# l1 K1 A* \/ t) `0 B; V
                    GetExpValue(t, csym[0]);
8 M8 Y6 W3 t, h) |" p% ?5 q8 `                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
( m+ j3 H7 J% l: ?2 P0 A9 ?                }
. ]# g4 L* v# q1 S1 T, q. ]                nLevel = 1;
$ F9 |9 a0 N! A( w- |            }
# L- r/ J- C0 w            else istrin.clear();
% d: v& i3 U! e, Z6 \        }
- W; r8 c! t# C$ C, T& C        else{nERR = -1; break;}* c. P- Q' ^1 S. p
    }
! ^( z& m% j* j0 }  c    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 r; c5 u4 _/ u3 x/ A    else nReturn=GetExpValue(t, csym[0]);
9 r7 T3 ^/ C8 ^0 O; x6 `. j$ F, ^    return nERR==-1?1:0;
  V% m: |% T4 a/ Y# V/ O0 b}}
9 S% x8 F: s, R+ N+ j% K: m) @2 c/ u3 h- j8 C; Y3 a

- ~3 }) N6 g8 ]  d: ?
  L4 B4 n  T& {% k7 S% O函数模板使用示例:; i$ ]! d8 K) E% a# J" v, R
在以上那段代码的后面加上以下代码:# U5 L8 f2 c* W# x+ v1 \) V: B
' B+ J. N% y* x, A5 k- U1 U$ Z
* d* v/ |0 S: n  k
6 Z# L3 L1 g" c  `+ ~% G
程序代码:
/ {" z5 X* [/ d$ J( e4 T) x' s# Y1 @0 E; L
#include<strstream>( y4 C- m% x. j/ T- W3 J9 s' q4 |1 ]
#include<iostream>) y. T6 Q* I: H9 n( p) _
#include<string>
: o! j, D* Q) q: T$ D$ O! ausing namespace std;& @: f0 D0 Y! L8 P
int main(void); z8 I5 k: f6 N* Q
{, A" i7 d2 D- M" U' N; k8 c' _
    string s1;8 V# _* O4 d! g7 b
    while(cin>>s1)  k0 J3 Q% K! x: p8 o$ _& P
    {3 H' {) T2 }( U  ~5 n1 O' m
        istrstream isin(s1.data());
. v! U4 m6 o* A; }% w        double d;
" I7 F# i  \/ M  W7 U8 c        if(fy_Exp::GetExpValue(isin, d))
. y" V0 L9 x* j3 i/ z9 V$ z& v        {! s  b4 f! K8 b5 M, u/ S1 F1 X# T
            cout<<d<<endl;
+ n+ @) r$ ]& i% E  V0 q. [        }+ n+ @; K3 D2 U. F# G' `* W
        else
( v  @7 K4 R& N1 l) ~( l- S        {7 A$ G0 I4 z8 W# U
            cout<<"ERROR"<<endl;$ c8 G9 V8 M8 ~! V( R  t2 x
        }2 _" _# e+ ~# S* @! n  a, z
    }
1 a- O0 z/ |" {& Q    return 0;
4 K: b* o  L) t}
3 U2 r! u; S2 D1 w. H& P1 J
: Y8 N% V4 L( I1 l/ P; N  I
& |! H: m$ }1 O然后编译执行就可以了(*^_^*)4 {# ^. K# S7 T6 A4 Z
其它:TC++上一定编译错误,不保证在VC6上也能通过编译' }0 ~! g$ g( ~5 j
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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