返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
% J- y( [1 D; y5 Q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 A* ?2 L- ]. Z; Q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 w% F( l$ @) a  H* H参数解释:! S) _  p6 H+ B- f
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" @% W& e/ C; w7 V* cnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. F3 M6 n! ^( ?4 B
返回值:$ S! k7 o% Y7 y1 E: _
返回非0表示计算成功,0表示计算失败有错误
8 ~9 G& T- }0 V7 P
% `, a% k/ U# [- V( A4 e, A- k
) b2 q4 @+ E) ?3 J9 j* X* j
3 J% P! W% C' m1 z( V程序代码:
7 ~  @2 y/ V6 m6 O" j1 E9 D. k) g' m- H  {: u
namespace fy_Exp{
1 d* W0 ^: e6 Y4 }namespace {template <class _T>3 f3 j2 x; F0 C
inline _T GetExpValue(_T t[], char& csym){
+ ]/ s# n# k! Q: n, ]    char c=csym; csym=0;. Z1 l) Q2 Z* s9 e! r
    switch(c){+ c* |) _; w4 n
    case '+':return t[0] += t[1];
$ r) m: M5 S- \# `7 E    case '-':return t[0] -= t[1];5 k: F: `2 ]2 N9 E9 y
    case '*':return t[0] *= t[1];" S, k6 I7 N# I: o
    default: return t[0] /= t[1];//case '/':
( ?! ]: L4 w1 E" J4 u. _; i5 Q: ^    }
: W, Y* D7 m* t( W* h. _5 e}}5 ^  k; Q& F4 v/ K
template <class _T, class _Tstream>; G( r8 d5 {( M# ^) m& ^
/* _Tstream: inputstream, _T: get return value/ o, @; C4 m+ n: {/ |, L3 W0 {
* Return nonzero if get value successfully */
9 q) f; B8 n( X; g6 b# l3 yint GetExpValue(_Tstream& istrin, _T& nReturn){3 J. [4 x0 J3 C( V# Q
    _T t[3] = {0}; //雨中飞燕之作: Q* t, Y/ o. E: L: O
    char csym[3] = "++";& D3 A1 w: {5 j( h' j
    int nLevel = 1, nERR = 0;' ^( K8 D& j5 a* m' [- L
    if(!(istrin>>t[1]))istrin.clear();& V) R6 C+ j! }6 Y6 I( S3 {5 L5 b$ h
    for(;;){& ]9 H: K' V* A8 K
        if(istrin>>csym[2]){
" u9 B, u! s) ^. |8 r2 s            switch(csym[2]){
4 E# W0 I6 ]9 N2 n9 ?            case '(':* j% |1 }' }) y9 [
                if(!csym[1]){nLevel=0x100; nERR=1;}else( u6 ?0 N$ G7 i$ V! _
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 `- X7 g: ?: W6 z7 E# U- p
                else{nLevel=0x100; nERR=1;}
* v' T- a2 J9 |, I% o# i+ ~                break;" l0 M. g: G2 p* O5 y2 V$ d
            case ')':
7 t$ Q/ u" n: q. }                {nLevel = 0x100;}break;
+ L7 W1 [2 M! A, l            case '+':case '-':case '*':case '/':0 t$ u0 z0 P3 i' y3 q# J/ f
                {csym[nLevel++] = csym[2];}break;+ e' e* A* ]! ~0 A3 Y4 E9 E
            case ' ':case '\r':case '\n':case '\t':continue;+ w2 i# ^* Z, h$ v/ M
            default:7 P+ p, h% [% s5 R, d
                {nLevel=0x100; nERR=1;}
+ _8 L, w3 C( z6 X7 W% O            }
* ?) Q$ l1 G. A+ E% w            if(nLevel==0x100)break;0 F2 `. [( W( P6 f
            if(nLevel&0x10 || istrin>>t[2]){
6 p/ v% X+ O7 I( m' H/ y" S& B                nLevel &= 0xF;
! x: _+ D' k2 U3 f* z                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: i7 V0 ]" u3 w
                if(csym[1]=='*'||csym[1]=='/'){7 z0 m& o3 `- z5 r- ^0 j; F' Q, K
                    GetExpValue(t+1, csym[1]);7 s7 Q4 q. V6 _5 p
                }
1 Z' e4 U' @9 Y& N. f                else{5 K( ~; H  M; x
                    GetExpValue(t, csym[0]);
  V& g. h5 V! W& x4 J# u2 X                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 |9 u. v& u! V  G3 ^
                }' B1 @. V( d+ n. @& n
                nLevel = 1;
, _3 J( M& r9 Q1 d$ j7 y: N' _            }
  h* u, A# N: @4 D9 Z; N            else istrin.clear();
) E+ R7 m. ~8 C) k        }
: S$ z. }, n( e! m$ K) n        else{nERR = -1; break;}* }. I: u3 Z9 v! q; }$ [* |
    }
; Q7 c3 J8 e, u: v/ A  y; B$ @    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: L% T; X( M7 f% C, n$ l
    else nReturn=GetExpValue(t, csym[0]);9 e4 m8 w1 ]; a& b) I: x( j; U8 @
    return nERR==-1?1:0;
/ _* R& G' V9 ^( R4 E+ i/ V& m- U}}
2 a; ~% a, R8 v$ D, l; Q& @
2 V: p, e# O- ]% T3 h! @" b. \$ s0 M0 _

* v2 n  X9 j( X3 v4 {函数模板使用示例:7 M. {$ R5 ^& n) l( Q! R) U0 v
在以上那段代码的后面加上以下代码:
* B: h/ L6 g2 U6 W3 @% r) l6 f! D6 i% ^6 F1 T% X; ?5 t
  Q7 T; X1 l' \0 q& i
+ s6 R! a8 _+ W$ F, d4 Z& W
程序代码:
8 A8 f; k) _$ _, Z; l; _
+ {3 N7 e( j0 x: O, [. D$ u" r#include<strstream>, [) o2 w' v: ]: a1 c2 G+ |0 A0 C8 y. q
#include<iostream>
9 b2 t- ?; R  _% |  Z4 g#include<string>  F, P" u8 K4 {+ c% i9 @5 p/ @9 h( U
using namespace std;' @% I: Q$ R& O5 {# ]* @
int main(void)3 n1 d) j" p) G! T" O
{
) }9 K7 M! m& s3 ^    string s1;9 {. s. r% m2 ]- O: ^
    while(cin>>s1)
: ^( M; G3 h' l4 P+ b    {
1 D9 M8 J2 h5 k) l        istrstream isin(s1.data());
; V# {8 i$ A0 }        double d;
7 a& p9 \+ j) R4 Z" G; c        if(fy_Exp::GetExpValue(isin, d))
, G* u7 P9 ~/ |) i        {
: z) ?( w* d5 W. I" K, [            cout<<d<<endl;, y7 M' h) l0 M( r! t: |
        }% Q9 [& y* R( x. N  g
        else2 L" E- w! r8 y: R
        {7 `. F& ~/ S1 s5 b
            cout<<"ERROR"<<endl;
  q! ]+ C* o) d4 v        }
! X! h" o% u  e1 X7 K    }
; k$ N' t( q4 n6 z1 j    return 0;3 \2 X% \# t5 [7 q# v
}7 c2 X+ z& L7 p/ Z! M# R
1 Z- t1 |6 S) r# R% p$ n' G; [
9 H$ T* R- B& Y' z% ^8 D
然后编译执行就可以了(*^_^*)* s( s7 S/ _0 q  ^
其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 b' z8 ~2 z/ T0 D
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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