返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
% [4 g5 g( b1 S一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 |. j, K0 ?, p% v! U1 l
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* I2 @/ J) Y: X0 K1 \参数解释:# p$ T9 ~/ e: F/ `2 k7 g
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& \7 h& s  y6 \3 @( MnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* O: X, R8 X2 E; f) H8 q0 G, s+ [返回值:
! }4 N* o' v) G返回非0表示计算成功,0表示计算失败有错误$ p9 A, S" [. h7 ~+ f7 L4 k7 ^
( `* |( }4 |, i  C' \' n; r
2 F5 k2 {1 l) Y" L/ a
! o3 M' h) r# S8 ]! R
程序代码: " [7 }/ z- S0 h( ]

5 N; V% Q3 q# p- f' P3 s- vnamespace fy_Exp{8 y3 }$ _, U3 g+ O1 ~2 b+ t: [
namespace {template <class _T>' _9 t2 o' x- j0 d! l" r
inline _T GetExpValue(_T t[], char& csym){( d9 o( g9 s4 p: x
    char c=csym; csym=0;
4 I+ s0 h2 P. X    switch(c){( |8 Z" `" U' `6 j
    case '+':return t[0] += t[1];% M- w+ h% k, y" D7 ]0 E( N
    case '-':return t[0] -= t[1];
9 U% B0 F4 y& e& l( {! V+ S6 d    case '*':return t[0] *= t[1];
2 o$ r. E+ m' A0 V: H% V3 b    default: return t[0] /= t[1];//case '/':) W9 q* v+ v0 Q+ i: d( X
    }
  ^/ d- T/ f  f9 K8 H% ~}}
( @8 }" _  x- T# h/ S( Ctemplate <class _T, class _Tstream>
+ A: v7 b* [7 f6 ?+ y2 l. e/* _Tstream: inputstream, _T: get return value
5 e1 E) ~2 Q, p" L2 j* Return nonzero if get value successfully */6 V1 Y" {3 c" ~) X9 P3 \) U5 z
int GetExpValue(_Tstream& istrin, _T& nReturn){: F- P3 K7 [! R! I1 Y" M0 n
    _T t[3] = {0}; //雨中飞燕之作
* t, R/ \1 [# P/ l. B7 k    char csym[3] = "++";: P; `( |* r2 M0 U" D% f8 N+ E
    int nLevel = 1, nERR = 0;
. g! J5 W8 T  a9 C5 I! N. ~    if(!(istrin>>t[1]))istrin.clear();
) K) i- v9 J0 H! }5 ]9 H    for(;;){. K$ ~: a, A" n( A6 x# n$ l: m/ p
        if(istrin>>csym[2]){' V( z5 R: L* `" L5 d
            switch(csym[2]){
4 _3 S9 T  y% O. }; C8 C! o            case '(':  _/ w$ ?& d4 |2 `1 v& o. e* R
                if(!csym[1]){nLevel=0x100; nERR=1;}else. U$ h) S5 y1 v: z+ ?
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
1 H1 d& j1 D; e$ `1 a                else{nLevel=0x100; nERR=1;}
- S: Z  K( N/ @: C4 z! L$ v; Y' b                break;
# C; }- }3 _- Z* U' s1 K            case ')':' H. I6 g) T  m
                {nLevel = 0x100;}break;
$ H# `& f: A' c' t- ~            case '+':case '-':case '*':case '/':
. S& w5 I* Z, B                {csym[nLevel++] = csym[2];}break;
* }. n9 E# _% ?. ~& {1 j            case ' ':case '\r':case '\n':case '\t':continue;- B0 |! m1 O2 L6 h% ]: a' h* [
            default:: B2 D! R; ]* o+ y
                {nLevel=0x100; nERR=1;}
& ]4 _# d$ n* K3 ?. n9 }            }
$ h/ B( p; ^" W) r5 ~6 m            if(nLevel==0x100)break;
0 e/ k% F' m7 j* ^/ @3 E& Q            if(nLevel&0x10 || istrin>>t[2]){. H# O) X" ^2 n: B0 u1 O2 Y
                nLevel &= 0xF;: |- e# f' b+ ~. I
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: E3 B) [. }# R9 U) y/ z                if(csym[1]=='*'||csym[1]=='/'){5 t% Q! e- ?+ F" A1 Q8 j& g
                    GetExpValue(t+1, csym[1]);
+ _3 h- M' v! X4 [2 W% ?2 P7 ]* G                }& Z9 D! @$ E% n- Y
                else{; L+ c# B, p' H" r4 f8 X, i! P5 Z
                    GetExpValue(t, csym[0]);
5 w6 L+ P0 _# P# x9 I2 }                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
. h% B* N" Q4 E- f+ q4 r# j                }6 p+ E  @; k: \- o
                nLevel = 1;
" b1 y% e! z6 R. L3 C            }/ n2 j6 K8 i" O" d, R5 t
            else istrin.clear();& {9 ~8 V" t0 e+ W2 y
        }( P0 @: x0 H/ u: r( i/ f# o
        else{nERR = -1; break;}
1 C' o! s0 H, C# S$ C    }
7 r5 X2 K$ L% u" l  Q1 V    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 p- ^* W& I! a1 H    else nReturn=GetExpValue(t, csym[0]);; e( ]3 ~4 {* B# ~5 ?
    return nERR==-1?1:0;+ l! z* J" f% K& q
}}* \9 P! i( v* E
1 {% s: D% w" G% @: c
, R5 k- O7 V9 w

  k/ B) o# {' W9 {  o* h& T函数模板使用示例:9 C+ s% m  K4 P* G  J
在以上那段代码的后面加上以下代码:  I; E- l9 C3 o
7 k! M5 l7 e9 K- W$ ]

4 `7 n& S/ F* p/ p/ @( h, B6 \' j1 @8 B. m" p1 |: t
程序代码:
  w/ x/ e  q" n% p' `7 T8 q( \5 S" z. Z/ t
#include<strstream>& F0 g5 b8 C; S& @$ l) P/ G
#include<iostream>
5 \* T' d  m/ a6 }+ F0 p#include<string>) v, p' J" w5 b2 x8 {# M% Y  Q) |
using namespace std;
" K9 d7 c; Q' m: I) d! wint main(void)3 {) B5 y" I+ b* k$ A: a
{
- R2 }; M0 O4 O; ^! w    string s1;% @5 _/ v3 G1 Y$ n: n% V
    while(cin>>s1)
& D6 D" ]% G# }9 s    {+ C: D6 P$ y2 w/ P/ l4 E
        istrstream isin(s1.data());& T! V' ?! W8 v. X# K
        double d;( n2 y7 M+ H5 U( A
        if(fy_Exp::GetExpValue(isin, d))
; E% y& A7 a# ]3 r! q        {
) F* A, d0 G* S' v4 ~/ R' \            cout<<d<<endl;/ W6 Q* @9 @1 v
        }
8 o# n$ v3 Y' }# d0 n# \        else0 g/ R) J' c' K+ T) X5 z
        {
  u7 e: m6 V. z* Q1 u. Q% G" [            cout<<"ERROR"<<endl;/ D6 V& ^; Q& O' o% X* ^, p
        }
/ N0 A6 A/ C/ Q8 y/ V    }
& {7 U3 N6 W( P/ I    return 0;' g# _, M" l8 y( |) e1 D
}
  r6 U& n, h& j0 A# g
! U3 H0 |) k3 x% [# m0 T% {9 ~& [2 Z4 }2 F6 [
然后编译执行就可以了(*^_^*)
2 c% g2 `2 o3 i+ B2 _其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 _# E7 u- i) o  c# c2 Q! g      建议使用VC7或VC更高版本,或者使用GNU C++编译

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