返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
4 @% v8 }% |7 A# p7 a  f0 f/ R一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 l7 j& k6 b; F4 Z6 M8 b只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) }6 E$ B$ a0 b& }4 a: K% Y+ O参数解释:
* n9 d  M+ L- H0 a  Uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: D% F$ G9 s; h0 c. b- mnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" X9 i7 ^- g1 j) E' w返回值:) Y5 u+ A4 g8 t' l; W- q9 A, k
返回非0表示计算成功,0表示计算失败有错误( P9 N  L8 Q: S

' e. \7 Y, `3 s/ \  J3 Y; y
9 e  g1 Y8 I2 N( g2 A
( B0 w" B/ G1 z0 f" e9 P4 y程序代码:
- f+ F+ \2 i( Q1 {$ ~! E4 W/ S8 w8 C( a$ b, c
namespace fy_Exp{0 K2 T" E9 ?% ~
namespace {template <class _T>. c( r! `. U8 |7 {
inline _T GetExpValue(_T t[], char& csym){% {( c2 _$ y2 I% v" A, N
    char c=csym; csym=0;; c; t. P. H8 a3 f) Z# F
    switch(c){
# l# g" K3 O0 A5 `2 }    case '+':return t[0] += t[1];
9 G8 p% N5 v  J( b    case '-':return t[0] -= t[1];
! \% l+ V( I% o6 N    case '*':return t[0] *= t[1];9 |4 F( ?8 G8 D6 N- A
    default: return t[0] /= t[1];//case '/':0 d* L# z% P8 y
    }
. u9 Y8 ~* x1 K& P$ C9 l}}6 N7 [6 b! X/ ], d6 f
template <class _T, class _Tstream>
8 e1 i/ J0 g. q4 m, m3 a( G1 B/* _Tstream: inputstream, _T: get return value: f8 a. L2 c8 {" }0 `
* Return nonzero if get value successfully */
; l' |1 W+ A7 p* d$ I% Cint GetExpValue(_Tstream& istrin, _T& nReturn){
0 M  _: |- Y# ~& B, N    _T t[3] = {0}; //雨中飞燕之作6 U8 L8 D) b( c, Z: ~$ O
    char csym[3] = "++";
+ N* g5 ]* ~8 j3 |8 c. T* g4 L  j    int nLevel = 1, nERR = 0;+ P' G* Z) f- T
    if(!(istrin>>t[1]))istrin.clear();
+ g- n* l/ j/ i! x' k4 d    for(;;){
# r  I$ n$ f9 y" B1 u' u+ d7 e        if(istrin>>csym[2]){
8 r$ ~' J) [1 n- D) H8 Y4 x            switch(csym[2]){7 I, r8 K6 b0 C5 J% h
            case '(':
8 Q$ n& _' D/ p                if(!csym[1]){nLevel=0x100; nERR=1;}else
& D- d3 |, o  \& r. f                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 }0 V2 W1 I8 V/ R5 J6 H
                else{nLevel=0x100; nERR=1;}
2 E6 W) h7 |% u5 f& [                break;
+ T: A/ V& S. ^3 F. o            case ')':9 I5 A6 z- @' ?1 g) O5 u
                {nLevel = 0x100;}break;
- d4 A, J2 I! b! u2 g8 W            case '+':case '-':case '*':case '/':& D! J% S; h* j$ c! u
                {csym[nLevel++] = csym[2];}break;
. J( G9 f. Y/ O! F            case ' ':case '\r':case '\n':case '\t':continue;  ^4 I3 D% v6 _$ Z" Y
            default:( r' M2 I1 C6 N4 v7 H
                {nLevel=0x100; nERR=1;}
6 C- Q' s2 d0 z! I5 {# x9 a3 F            }) }# E4 d: R( c$ D
            if(nLevel==0x100)break;
1 U. ?  d- x7 o* t6 H            if(nLevel&0x10 || istrin>>t[2]){2 p5 r4 N) O0 O
                nLevel &= 0xF;
  z$ q8 I1 X7 g2 W                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 m5 j3 c" ^( e7 M" F& S                if(csym[1]=='*'||csym[1]=='/'){4 A* |! x) v( Z# R. P
                    GetExpValue(t+1, csym[1]);6 g) k( g) Z% H" V' f  `* C$ s7 W
                }
; m: \0 N* c2 h. ?3 A8 ?  g                else{
- K( V" z2 k4 W. q. |                    GetExpValue(t, csym[0]);
" C1 G3 N% e+ C, e- k! g# {                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
6 X( }; n& I* e0 h9 o# @                }& N) Q7 ]. d2 X  M" {6 a: \" T
                nLevel = 1;
' t& a4 `0 O2 r# L( G- F            }, Y3 `0 d- _9 x
            else istrin.clear();
# T9 s) c# h6 r. f        }! R/ u; U) ]- W. o4 S1 T
        else{nERR = -1; break;}: M& L. g- p: y0 \" |+ H5 u9 J
    }
1 }/ S# [/ a3 ]4 N" |; w( x( y+ F    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% i* y+ {; L3 u7 a
    else nReturn=GetExpValue(t, csym[0]);
! |; a$ c2 N8 n# ?; ?: Y4 B    return nERR==-1?1:0;
* ~5 {3 j2 q( O) ]9 `}}
4 N, G# q0 e% L) B0 d8 L- y, e+ j/ b' L( U
. v# F. D- m- C! u
6 N( n$ u9 ^& s
函数模板使用示例:" G" l+ W6 v5 F! q9 _4 c
在以上那段代码的后面加上以下代码:
) W( @' W; v/ ?+ {! F% ]: {1 C* M- Z2 s7 H7 a9 G5 k" O+ `

) s/ m  e0 V7 f" v- w( z
% f- ]0 U0 z! G6 C" C& J4 {+ D程序代码: $ J- D% o- a& [2 q

( |5 k. Y7 \( t' J4 @2 L#include<strstream>
) X6 ]  d: ?4 ]  B- A: C5 M; f( h; t#include<iostream>$ G  p4 ]4 ]$ a
#include<string>
+ Q# U: I, B0 x: g% K8 {using namespace std;1 G6 c' Y6 l$ a4 Z5 |1 S1 O
int main(void)
* T+ }9 ~6 Y$ r6 y{' v' M4 B% Y0 _* h$ I/ b
    string s1;
4 [; G, ?2 \9 h3 a( Z    while(cin>>s1)+ _3 G9 L) _/ V8 ^- H( e
    {
7 i1 I* u, Z7 T$ Q+ _* r        istrstream isin(s1.data());0 H7 v( \9 T0 e+ q+ C5 M* [
        double d;6 R9 N  u; o$ L/ A  n$ x: R8 N
        if(fy_Exp::GetExpValue(isin, d)); s4 i# B- T" C2 b+ m; v3 E
        {
4 I9 `. F8 H6 T: ?" Q8 w+ N            cout<<d<<endl;
( d7 K! s& _2 {& l0 ^  z1 g        }
/ ^  a, F/ \: ~$ {! u: u! ?3 h" h        else0 Z: G" a9 @0 \
        {9 k/ c5 \4 L; ?4 B( G4 Z
            cout<<"ERROR"<<endl;1 ?5 k9 T# j+ s4 u/ B, X0 [- x
        }
) `& Y/ x- J6 b5 K/ V3 J    }
4 `8 e- M1 [2 ~* Q    return 0;
9 H! m7 N9 c2 K1 h6 m. }& e$ o) `# a}3 V3 o( f' Q% V6 _

! P. L/ Y& B* X2 p3 c# b: f  ^  z# w7 S6 @' u
然后编译执行就可以了(*^_^*)
7 B7 |  J. o3 Y1 N# b5 |其它:TC++上一定编译错误,不保证在VC6上也能通过编译' E& E9 z8 k- }1 @! P9 x
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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