返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,' N9 D: s* R2 q7 X8 j- h6 I, |
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: C* R( M9 T  r. U* J: U只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 U6 a8 j# F, T  w/ ?/ i4 L  v参数解释:0 f4 `, s: ?. f+ D' V/ f" P
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流& T( I( K3 V* y2 ^8 I- n0 d' }" `8 u
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 j. _: r- i, _& c4 h, o返回值:; i+ a' y  x$ F4 v* |! L: G
返回非0表示计算成功,0表示计算失败有错误
4 w. U8 s1 a1 j: k0 Q) c  a/ v) c1 b* @! I; x
; [" F% h: w3 w  ]! M* j

" b0 X3 G! B! k: A1 h5 ]程序代码:
' D8 `: W$ l" l# c# D  [6 p' n, I4 Z% E6 D
namespace fy_Exp{
' h9 @. Q% [, w: u  M! vnamespace {template <class _T>
  ^3 r# N5 Z* ~& ?, T( w, kinline _T GetExpValue(_T t[], char& csym){
$ B' A; k, _+ j/ \! P9 g9 a    char c=csym; csym=0;! T* z9 a' [; p$ V1 Y* v& A
    switch(c){. ?! n: C+ l! K; ?. }
    case '+':return t[0] += t[1];
, k5 h# \6 ?1 _- s    case '-':return t[0] -= t[1];
7 D9 o. s6 w* ?& P    case '*':return t[0] *= t[1];4 D, C' b$ a! u" ]9 g
    default: return t[0] /= t[1];//case '/':3 X/ _" `9 g4 B! O1 c( f
    }7 v' k) X  X7 p0 T" c8 z
}}
- p/ F; X1 `2 P! L1 q5 C0 @template <class _T, class _Tstream>: V7 c* u" ^! _! L- o$ S
/* _Tstream: inputstream, _T: get return value3 \# W: U' e9 y+ A
* Return nonzero if get value successfully *// s) i1 n% ^% v* M( }# T
int GetExpValue(_Tstream& istrin, _T& nReturn){
0 ]4 T! |; q- O- ]5 P    _T t[3] = {0}; //雨中飞燕之作- B  {) F9 ^1 _  `5 Q
    char csym[3] = "++";+ R$ t( \: K* K- l/ w5 m0 D; K, w
    int nLevel = 1, nERR = 0;
6 H% z, y$ @, Z6 K# h. b- _    if(!(istrin>>t[1]))istrin.clear();
  d) X7 }$ D1 J$ v" \4 b    for(;;){
) e, I+ _& o3 g2 [- b. h1 n        if(istrin>>csym[2]){
; r3 Z( i% w0 ^, y            switch(csym[2]){
; U) r( f# ~5 o* b9 t* Y- @( u            case '(':: B* {1 j0 q4 w, p9 b
                if(!csym[1]){nLevel=0x100; nERR=1;}else2 N- M: j2 y5 ~% z! R+ V
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ E' v! u0 }0 N$ u1 V                else{nLevel=0x100; nERR=1;}
3 T) r, z( f" `3 B- u( d                break;; L' a. L, v- x& t
            case ')':, s+ y. l+ Y. J: m1 ?. e
                {nLevel = 0x100;}break;8 X  V8 B" v6 h. j4 _5 y
            case '+':case '-':case '*':case '/':: N6 ]: V% ]0 z: @* n% {, m& B
                {csym[nLevel++] = csym[2];}break;
5 a+ |9 d  ~2 @) o$ X            case ' ':case '\r':case '\n':case '\t':continue;
3 ^6 O7 Z! w  T0 t, T            default:5 u! `7 L  S# S% ~$ }
                {nLevel=0x100; nERR=1;}& y# [7 E5 C: s) ^- d
            }
0 F% C3 ~: t5 s4 C; O            if(nLevel==0x100)break;
6 N& Q1 ^/ E8 o$ d  W            if(nLevel&0x10 || istrin>>t[2]){) x2 z) R, [  z. e
                nLevel &= 0xF;
. q5 x0 ]( `; H                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; o8 s0 W9 }4 u3 }
                if(csym[1]=='*'||csym[1]=='/'){
# ~  |8 ?1 i4 F0 I+ }' E" l                    GetExpValue(t+1, csym[1]);7 C( H' [5 J+ {; P& t) v( G* Z/ P
                }3 `- ^/ H( p8 D
                else{) C, D4 ^. t7 p& k- \
                    GetExpValue(t, csym[0]);' o0 `0 ?+ m: H% g" ?3 S
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" Z$ c# Y( F; H* _, }( B                }! t, q8 f& p' v' v1 l* S7 m1 E' U/ o
                nLevel = 1;
0 K5 f0 W2 l; T; J8 s. K7 {' u            }; V/ R0 n3 G7 S+ D4 [& a/ a
            else istrin.clear();" Z# P* J( [8 |# }$ b0 F
        }0 r' ~% {" I* g& V: C
        else{nERR = -1; break;}, C6 J. o# Q' X; p2 i1 E' B
    }  t$ M" S9 h4 x. o
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( ?: F/ t3 m- O8 ~6 y$ h( e    else nReturn=GetExpValue(t, csym[0]);( j5 O- K+ k! a  x$ w3 q
    return nERR==-1?1:0;
/ }5 T0 w3 }- d' q}}$ [7 I' D5 w' u1 z& E# S/ [

" O; s$ ?% {0 j& ~0 n* X! k) I+ q
, d; N0 s& q. n2 H0 o, A# P" V* e0 {' S' H$ B: ^  x  b
函数模板使用示例:5 B- E" ~. ?2 A3 k, f! z+ e7 T+ ^
在以上那段代码的后面加上以下代码:$ Q$ n: Z- J, `6 q8 b2 @* X
, Q* f9 |; }. H/ J5 D  q' X- i9 @
9 ^6 @8 V3 I, q2 X2 x
. P0 B5 _# v" V+ \2 P
程序代码:
% {( F7 ^/ R5 C) w4 b0 @  k/ c, c9 v$ ]8 |
#include<strstream>
2 b0 e' F  P& o9 g, U#include<iostream># P3 L- B/ [1 R3 g( }7 o7 |
#include<string>
: |! m" q" x( _1 S/ uusing namespace std;  D0 q" z7 @- A- E
int main(void)
! ]* i% N3 N* {) R$ X0 w{6 o7 L; w" l  t
    string s1;* \/ ^; `" V6 h
    while(cin>>s1)
4 b6 c4 c/ r0 g) y) h    {
+ u! n7 c0 Z( I; y* W! P5 d4 i! }# o        istrstream isin(s1.data());
6 [/ `* P0 s2 a7 D( N        double d;6 y* @+ r1 x* Y$ }
        if(fy_Exp::GetExpValue(isin, d))
2 h" E& |4 P; u5 q/ _( K5 Z. x        {
$ i* z! N- h: N4 r% J            cout<<d<<endl;
- M, M. M+ m) o        }7 M; f5 l$ Y3 X! n" X' j+ K
        else4 P/ e% N% a# ]& l8 @
        {" R; y% G$ S3 d
            cout<<"ERROR"<<endl;
% z" C" F! N* C* ^$ r# [        }
* o* h7 _+ n/ m. s- Y) A6 G5 Q! c    }% [/ V3 j( w8 E1 t; t
    return 0;
% |4 |2 q0 q. j}
7 L0 T6 \; z* l% t& ?4 m" X
/ E. f$ _* d( L6 H+ U0 H
8 U- B3 i! [' }1 q然后编译执行就可以了(*^_^*)% S, E4 [5 x' J$ i1 U5 Y; d, ?! Q3 \" O
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* v' \, u& D! q3 P+ A# i      建议使用VC7或VC更高版本,或者使用GNU C++编译

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