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

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

在9月8日那天我特意编写的,给大家分享的,
1 l# Z/ V7 m! q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
( k' f; g, i/ ?* |. ~# v只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 _; U6 z# M# f  G. Y参数解释:
5 d" v/ K+ l: u4 }, nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
' H1 C4 `1 ~8 `8 U/ Y' F, OnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 D& x  }  Z' @9 q4 L/ s
返回值:  E0 N5 |$ s0 }+ P$ N4 u, H
返回非0表示计算成功,0表示计算失败有错误  Z2 e7 H% O* i) d3 s: j2 D
& b/ G! V  z. A% ~

6 f5 N4 P/ l! I+ {- C1 B4 `
  C& x. ]0 O' M0 n3 p' o/ d程序代码:
: U3 ]; F6 P2 S
1 A1 S/ ?, w. y7 {8 K6 jnamespace fy_Exp{; b7 `- E! s  `6 x, A5 @
namespace {template <class _T>! q, w3 D4 P& g$ j) U$ T# w
inline _T GetExpValue(_T t[], char& csym){" u. a9 }" ~4 y: w2 @: N. b9 `
    char c=csym; csym=0;
, M6 u. R& @4 ], \, o    switch(c){% f, M8 D9 O. ^, a4 l" |
    case '+':return t[0] += t[1];1 }5 D7 ^+ K: @. ^
    case '-':return t[0] -= t[1];4 F3 q, P& ?: x" u9 d# S
    case '*':return t[0] *= t[1];8 z. w! \/ A" L, A8 V
    default: return t[0] /= t[1];//case '/':( P- c. q( F. T: [# ^
    }% o; u: k: A4 _; G4 F" F% X
}}
$ R7 S. k# n1 U5 X3 k# etemplate <class _T, class _Tstream>5 R& Q( M; K4 x' `! A9 n- I
/* _Tstream: inputstream, _T: get return value8 r2 I9 }! K9 b# H3 x! N+ `( K
* Return nonzero if get value successfully */. R. H7 S) G7 c8 ?3 G+ e/ m) I
int GetExpValue(_Tstream& istrin, _T& nReturn){5 d: z! P& {  e: r" ?# {
    _T t[3] = {0}; //雨中飞燕之作
7 D' ?1 T. C7 \5 }' F% d4 }    char csym[3] = "++";4 i& p/ B% o. r5 y7 [' s  X
    int nLevel = 1, nERR = 0;
, d1 A9 ^" N  }: J    if(!(istrin>>t[1]))istrin.clear();
6 b1 r  {/ G4 X# s9 s+ l  @: }" M    for(;;){
9 G. V& W, l) f0 q5 [7 _        if(istrin>>csym[2]){
& C4 n/ @1 v; u" e, R% a2 f            switch(csym[2]){
1 l# D7 _7 p2 r            case '(':
2 F! I7 H( Z* o& p                if(!csym[1]){nLevel=0x100; nERR=1;}else
+ ?  O- k( R- k                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 B5 o& |7 a- H' O* p
                else{nLevel=0x100; nERR=1;}9 t7 v0 ~% P5 E0 h
                break;: c* H0 F! {9 E, I! \, F
            case ')':
& i; q) w* D' b7 r) w                {nLevel = 0x100;}break;
3 z+ ^8 A- p/ s- X! O            case '+':case '-':case '*':case '/':% |+ S! n4 E+ ]6 O
                {csym[nLevel++] = csym[2];}break;, Q+ i: }: r) x5 [5 ]
            case ' ':case '\r':case '\n':case '\t':continue;
6 ~( N/ t1 \* ^" V" k            default:
7 W: |  @' @( T4 c* Y                {nLevel=0x100; nERR=1;}# V, W/ E7 |, g+ q
            }
$ g* o" D$ C2 |3 [4 y9 y5 h* C            if(nLevel==0x100)break;& ~6 |! L/ t# b" L* M" _0 j( J8 n+ u
            if(nLevel&0x10 || istrin>>t[2]){
7 P0 Z( B! L, G7 j' s                nLevel &= 0xF;
* e5 p1 k$ R, o! F* q# M" M                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% W5 ^8 i! {. m* t  A  C; p
                if(csym[1]=='*'||csym[1]=='/'){
3 D3 }2 n  c2 `) `                    GetExpValue(t+1, csym[1]);6 @3 G1 S$ ^: M  L3 [& N7 Y% o9 v
                }
  l5 p- b4 L& K7 P( a                else{
5 H& W% l7 V8 P- V( d                    GetExpValue(t, csym[0]);1 y) Q/ ^  ]/ \% J! v& U* D
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, }9 w6 F4 }. }1 a, P" U1 f9 E$ U                }  V( g' |9 Z' v$ v& O  w5 e& Z
                nLevel = 1;
# _' u; B+ E# ], i            }
% i1 q& Q2 D' G, Y, {  l            else istrin.clear();: z: D# j- z9 i1 P
        }3 n3 ]! {) i5 W; H' c7 Q9 X6 g
        else{nERR = -1; break;}
/ t" E3 r7 t' ~: G: j) h- E* z    }7 ]- X. W/ W! O+ ^: p6 u9 {4 _
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);# T' L2 m  F9 M
    else nReturn=GetExpValue(t, csym[0]);
; Y8 T0 z. d8 G9 c9 ~) N% ~    return nERR==-1?1:0;
' S4 n# E! k# Z7 U}}! C& f& S% j4 w: h4 M: b! R* b
1 I4 ]+ ~$ l: c1 F( n. Z& T& B8 U
  M0 P, L: O& f4 B

  [7 c- l6 ^3 s9 A; d! ^( V. {- h函数模板使用示例:
2 J; H8 l" x2 \' u: z在以上那段代码的后面加上以下代码:
) Q$ H6 U; R  o" l! v- I0 _! C" S
9 b6 n1 b$ d: H  }" f 8 r2 V: d: I$ N5 O( Q$ }' p3 k( M

: p4 W" U# G) }. |  c程序代码:
6 A# ?& Z1 ?) S- V  M* v; c; b" k( E
#include<strstream>
5 b: T& l: L9 U  r4 ^, `#include<iostream>: N" M: w/ T" l
#include<string>
, ^3 U3 z, o( ^  nusing namespace std;: f- t) {; n- b. P
int main(void)! X; \) ?$ r8 A. `+ l
{8 U) a8 Z! `1 H* S+ C8 z  Q  [
    string s1;( \+ @% K$ [8 B1 P! \9 S
    while(cin>>s1)( e# l1 V0 M% ]& [
    {2 N+ H& n  S* S3 s6 \
        istrstream isin(s1.data());
/ i" Q1 Y( a, `1 L: T- v$ Z; j# t        double d;# f: Q) x7 }1 T7 U: i! Z1 F
        if(fy_Exp::GetExpValue(isin, d))" Y5 ^3 K9 n: w1 \( n% u
        {
# [/ E. P: Q8 T2 P            cout<<d<<endl;
! i! m6 \6 C, e  M+ T. S        }' a' B8 ?3 o2 s
        else
) [4 T9 W4 g6 h' l" W7 \/ _        {5 U# P% f2 t2 L
            cout<<"ERROR"<<endl;9 j. B  V: n0 F) ?  f/ M
        }
% K& e" {4 s, V4 `' y- _9 U    }
  `" m1 X1 W0 H    return 0;) d' ~# h3 q/ ]* `/ o3 a
}
) |3 p" `# S% R  i, M; Y; H$ X
- `; p  [+ y. L+ H8 [% \' @! j4 u4 R  K0 j2 k  n, f
然后编译执行就可以了(*^_^*)  H! {( B- D7 Z
其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 z7 G4 U3 Q, M- N9 ?$ t0 e
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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