返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
/ }  A# a( ?6 ], h) F6 M% q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 ^0 T6 h$ I' s5 M1 m# `. r
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, ^  p/ L" J- ]2 L9 m参数解释:; S, t: y0 X, C+ R
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
9 M  K* o6 L+ i( E' ZnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
7 D/ `7 M5 a/ e$ O返回值:# Y, y0 A# I; f9 f) d' x8 W1 \
返回非0表示计算成功,0表示计算失败有错误3 L' o3 J  z# s+ y
3 j) m# s, z" R: K' c8 V

  Q0 Y" a+ [* ?8 e& b0 {7 s4 }' a, o( t
程序代码:
3 f* N( m/ |) T9 D* X! m" Q& E6 V) t/ c2 `' k- [% [, o1 S* [' y/ d
namespace fy_Exp{/ k0 L" |5 I$ x/ E' `
namespace {template <class _T>+ |+ \7 k8 i3 v% o: v4 d
inline _T GetExpValue(_T t[], char& csym){" k6 I, j, Z8 K, t% P+ W
    char c=csym; csym=0;( O0 |$ o! r$ @! C3 j
    switch(c){* R" y1 Z3 U* ~0 n! G
    case '+':return t[0] += t[1];8 j- P/ E1 Q$ A+ k5 S9 `& \
    case '-':return t[0] -= t[1];
. R, z, i5 `5 Q( Z    case '*':return t[0] *= t[1];
! p* o8 n1 Y% @6 e, k7 b    default: return t[0] /= t[1];//case '/':
* L9 {4 F- l, n    }
. Z# o5 E/ S! Y8 {; g}}1 ^3 ?" Q- {$ x/ z$ [
template <class _T, class _Tstream>
6 e, r( a# D. h1 n4 l! |/* _Tstream: inputstream, _T: get return value
' J4 M8 W2 M9 O' X" z, q. K3 P* Return nonzero if get value successfully */, t' |  q6 `9 e" |" ~2 m8 O
int GetExpValue(_Tstream& istrin, _T& nReturn){) O: ]7 W( R( K, h/ N5 s' r7 e
    _T t[3] = {0}; //雨中飞燕之作" o$ e0 T3 [$ G) q( `6 @9 i! G% H
    char csym[3] = "++";2 K9 ^. C0 F. o6 E
    int nLevel = 1, nERR = 0;# l% ?/ z1 c- h- |7 z' s' ~
    if(!(istrin>>t[1]))istrin.clear();
& D: }+ N: U3 i2 A# p( O    for(;;){
: f7 V: {  k5 {& p3 ]/ Z, I: N        if(istrin>>csym[2]){7 l& Q- i  V. z, X, }8 T2 `& Z
            switch(csym[2]){5 u* V/ \: w3 }, I# @& Q
            case '(':! X4 ~3 V; k6 Q. F) @
                if(!csym[1]){nLevel=0x100; nERR=1;}else
3 S5 a6 \/ L& v% j6 q                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' U: q5 E  i& y5 W/ E                else{nLevel=0x100; nERR=1;}
( |2 Y, b7 v' {( d- F                break;
6 s: @* c2 l* x/ l            case ')':0 p* C, [  D6 B8 P
                {nLevel = 0x100;}break;
3 u$ ^) o- J9 _( f            case '+':case '-':case '*':case '/':
$ v- o' S5 n7 G                {csym[nLevel++] = csym[2];}break;4 ^4 Q0 z1 E3 s/ Y
            case ' ':case '\r':case '\n':case '\t':continue;
7 f& E/ A1 s0 j' X" j3 ~  a            default:
' Y6 \) F5 Z" Q" K8 [                {nLevel=0x100; nERR=1;}& S" u5 T6 |8 I9 ]
            }6 ^9 U# d$ B; ]9 k
            if(nLevel==0x100)break;
" i+ ?2 a- z" ]* e7 ^6 W7 S$ a$ T            if(nLevel&0x10 || istrin>>t[2]){1 T% F. K  A/ r/ d
                nLevel &= 0xF;
: l- A( ]5 C+ a+ J" x! I" _                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! Q4 P4 x' ]3 l+ {, |* `/ ]) W& d/ f1 J
                if(csym[1]=='*'||csym[1]=='/'){
4 v* a6 u2 a! q- V% m9 Q                    GetExpValue(t+1, csym[1]);2 ~6 s  J8 D. s4 G
                }
& q* m, k# ^, y                else{
: |. M) s  F* o                    GetExpValue(t, csym[0]);
, s5 V+ j4 q- u  q9 ~- s                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
) e5 t" q6 h7 I: ^' w3 z2 p                }/ B7 o) Y! i( V
                nLevel = 1;
8 [: O  P" g8 {4 m' ^            }
7 v% b+ V  t. c            else istrin.clear();! \) W% i$ B3 N; y/ t& s7 S
        }9 ~. d0 z$ j2 t
        else{nERR = -1; break;}( i0 f3 R& W- `! A' [
    }1 D( f5 H8 N1 F; u% n: B. N
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) v' V: r2 e$ g1 m& I
    else nReturn=GetExpValue(t, csym[0]);
% C5 z5 K' ^- @0 y5 l( H- ]    return nERR==-1?1:0;# J, M7 O: j' }
}}/ {* D7 R: @6 n+ b9 K* m

) |! v' x9 ^. [# n# K
8 V7 x8 h1 E6 X) g7 [& z
; ~% s- `, q/ ^! p) i; {函数模板使用示例:( U9 q3 g$ I! |8 E' u
在以上那段代码的后面加上以下代码:' R2 S: D, p: Y" E2 m: _
3 \/ I9 U" O& w, G

% l1 C% t$ }8 B' p7 N/ Q: `& y$ \! X8 H: q; _$ N$ P1 V
程序代码: 5 H/ G0 z) |9 }# ?' p& h* U: O
1 x8 f( d0 N9 s0 i8 ~: j& _8 g
#include<strstream>+ q' U3 y6 g4 S
#include<iostream>5 l/ K" R3 J* Z6 P" _* f
#include<string># U- L3 v8 R  y7 w, u
using namespace std;
3 H" L+ z$ z. Z' W  C# Gint main(void)" b  @2 J) H5 L3 t9 U5 f. J+ x
{0 t: a2 ?) j) T" T: \
    string s1;$ B( J$ I" C  j; Y  j
    while(cin>>s1)
5 K5 w$ p. Y8 H, O    {
/ ?% j7 W2 U2 `# w1 u( e        istrstream isin(s1.data());
2 P4 Q$ g2 ^) q$ @        double d;
5 o. N7 {8 R/ O9 @        if(fy_Exp::GetExpValue(isin, d))/ z) l1 q* ~0 ^7 o$ g
        {: w: C" v! U  W4 P
            cout<<d<<endl;" e( d) Z: q+ I5 v' g0 k! }% E
        }
0 b4 O" P. D7 b0 n& Y        else( v+ N0 I8 n0 U3 B* R, n$ H
        {! ?6 r" B4 S' Y! l+ Y
            cout<<"ERROR"<<endl;1 l6 P4 ^4 T# ]& A  }
        }
: J5 Z0 a7 ~4 Q( k  L4 f    }
4 W. F# F& h1 @3 b$ U    return 0;
3 z) y1 w( K9 ]}
  w& \- T0 f# V: Y/ T3 c% n& F, N# N0 r  K# N8 W0 M5 ?$ `( g
1 M) `& l7 r/ N" M+ i
然后编译执行就可以了(*^_^*)
3 V& a/ @- b; Q% R" m其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 J" s6 z# u  \4 t! B      建议使用VC7或VC更高版本,或者使用GNU C++编译

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