获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,: ]* C& d: f! [( c
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 x' q5 ?3 c% [
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- `2 u/ H% L6 d参数解释:
0 O8 s+ F! o6 O0 K! Z3 \$ R5 ^istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) M3 v+ y) u6 U, f  ^5 H
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 m& m) e- u4 D! N; a返回值:6 T/ P- h, v, O! ]- u7 v- w- J* v7 H; I
返回非0表示计算成功,0表示计算失败有错误4 S% {& V9 ~. h0 a( V, z
+ Y' s$ f8 F6 S) E, C

% z8 ?! i: M2 t1 r  U8 |  [  O9 `! B
程序代码:
, w& z: _7 i2 D& i! R7 {' z9 I2 Q) a$ T+ W4 ?" P
namespace fy_Exp{, U  q0 n) L% Z+ M( m8 k
namespace {template <class _T>" }! h* Z' I0 f, X; g) Q& t
inline _T GetExpValue(_T t[], char& csym){9 k4 K: j, o9 i& b5 _7 S" q) }
    char c=csym; csym=0;
8 C) V. c7 @0 u    switch(c){8 g3 }% S) d1 x1 b. Z3 D9 ]
    case '+':return t[0] += t[1];+ X/ Y3 O1 C: P3 P# @1 C: f9 U2 w
    case '-':return t[0] -= t[1];+ F! x( k: j8 B, I1 m$ Z" Z
    case '*':return t[0] *= t[1];: i  K) M8 _, g
    default: return t[0] /= t[1];//case '/':3 B4 l$ t4 X# Z2 F9 a
    }
+ O/ S+ K3 l# m+ ]2 G( T6 [" X}}  i/ g0 S% F. _/ F* l+ G3 _1 C
template <class _T, class _Tstream>4 P3 p$ t" ?, w+ S$ I
/* _Tstream: inputstream, _T: get return value1 r1 d* Z4 {0 f; g3 m
* Return nonzero if get value successfully */, P0 j/ G3 R0 |7 {
int GetExpValue(_Tstream& istrin, _T& nReturn){9 b) [2 w% j* A; i
    _T t[3] = {0}; //雨中飞燕之作/ f. w2 D; Q7 `. q, a9 q) _
    char csym[3] = "++";
- ^- o2 V4 X* I; ]1 b    int nLevel = 1, nERR = 0;
5 l) w$ [7 c6 t: d2 b4 s    if(!(istrin>>t[1]))istrin.clear();
% M( o+ p' `4 K( X" x2 j    for(;;){
) m5 \5 ~) _/ S0 p  T: H        if(istrin>>csym[2]){
& D6 @" T0 S+ r+ s* P            switch(csym[2]){, Q$ h5 t7 `! j, V. V
            case '(':0 v& I7 B: N4 E1 ^6 F' ?1 g
                if(!csym[1]){nLevel=0x100; nERR=1;}else
4 ~% D$ B& |* N% y7 Z" R& Z) d                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 s7 D- z% u. W  Q
                else{nLevel=0x100; nERR=1;}" r& E8 V, ~/ Q& M$ R
                break;5 G6 U$ v6 ~/ j+ C6 F8 \" X
            case ')':; ~; }  F# B* }& t$ S$ e. v
                {nLevel = 0x100;}break;! z- T! T( P" t
            case '+':case '-':case '*':case '/':/ Q. Z* i! p8 p! G% ?
                {csym[nLevel++] = csym[2];}break;
9 j6 ?$ X! m# X- W! a+ ?8 P- S            case ' ':case '\r':case '\n':case '\t':continue;
7 {1 J! G3 O) e" f" Y            default:
- n+ M- y9 {) o( J                {nLevel=0x100; nERR=1;}2 i' j4 k  S# v+ G! F4 _6 ^3 W. a6 `
            }5 t$ w; P/ D2 P) e" t4 Y0 U
            if(nLevel==0x100)break;
- |, y( L5 E9 L            if(nLevel&0x10 || istrin>>t[2]){  T% N! s' E0 O1 @
                nLevel &= 0xF;0 U& d, `% q8 U* T0 n5 o
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 [3 Z4 x1 F' n. L( v7 Z% H  W                if(csym[1]=='*'||csym[1]=='/'){
  t8 d7 p: V: P# h                    GetExpValue(t+1, csym[1]);
- j6 P8 H0 X2 ~. t                }
+ V2 @) _; Y( B5 c5 L! \                else{3 n# H  z; q; G* o. ?6 }
                    GetExpValue(t, csym[0]);
. D: F/ U5 S* }. Y' |                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;, e: y( `  Z% D9 `( y7 Z' \( x  T' J0 P9 w
                }
" t( U5 n6 R; P# t; S) [& d                nLevel = 1;
+ V, W8 l. z/ Y- p% @5 @) j: @            }" X" ?' U- T0 [
            else istrin.clear();: {; R7 S6 r8 R) \* f
        }4 a+ H- j7 k9 P2 Q# Q% p. \
        else{nERR = -1; break;}( G  }0 x$ K& Y2 b) m$ q
    }; o# c4 F; j* N, k6 j. k$ t
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 h1 M6 T# b, S! m& k    else nReturn=GetExpValue(t, csym[0]);
% K8 K9 `3 f5 J    return nERR==-1?1:0;
4 x8 K& M9 u4 d}}
% F" @; X: X" J2 A1 d' W% i3 g4 S4 J- n: h: k3 z. E! w+ |9 z+ B9 e

- u5 G3 |1 m5 c! U9 }2 q5 p4 f2 e! i) I& h7 a; d/ O7 X' ~( J
函数模板使用示例:
  n) x/ Q% c3 T5 M% T9 R在以上那段代码的后面加上以下代码:" U6 {9 p7 y; k. S* d, O
/ J( ~- n4 {6 O5 t

  W+ u( h+ J- e- y: h( i
3 h9 p9 t$ D+ r& b( o程序代码: ( @9 u4 N8 q: d! @1 v" P4 e8 x
/ i/ j  V  N8 ]9 b/ d6 a- R* v7 y
#include<strstream>& P( b) y4 E1 r8 b" O, i
#include<iostream>+ N" `  A8 d& _5 ?6 s, b
#include<string>
( a$ [- V- I2 Z" }, p) Gusing namespace std;
/ b1 o( A9 B8 P( v" b- ^int main(void)4 E& ~( b+ }- J
{
7 N3 o; k9 d8 S: @" T7 \7 I    string s1;9 I! W% d/ \. a& i- S! y# t
    while(cin>>s1)$ \" {2 b+ F# Q" i8 B2 ?
    {
7 T: u# ?0 l" \; P* ~, ?        istrstream isin(s1.data());
$ Q# `9 y, L/ f2 h: n+ S2 Y4 H        double d;
. Z8 k% o8 `5 l  w        if(fy_Exp::GetExpValue(isin, d))' O6 J$ P* J3 L# O" R  m
        {$ F$ X3 ]4 }8 o* ?! X
            cout<<d<<endl;! ^8 B: p; P5 ~  i
        }7 W0 J9 q8 x: m3 ~3 }* c
        else
4 Y8 _7 o" d: v0 P/ N0 S: s        {$ d  n8 Q1 l6 l- a4 u: Z2 W! j4 ?
            cout<<"ERROR"<<endl;3 B6 |( w/ v2 }* R9 I. I
        }9 M! r4 V& x% j' h5 Q7 {' ^
    }! s  L; E- T: t- N
    return 0;
( o8 F# B$ k- g  p6 Z0 @9 {}4 g" i! e% v# z  L
3 u- p0 i; A. a8 C# {
1 H  P! v' `# P
然后编译执行就可以了(*^_^*)
/ a1 E" ?; i) p- ]其它:TC++上一定编译错误,不保证在VC6上也能通过编译( H7 \$ |) r+ j; L" b
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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