返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,: N% x, q; u5 i# e! a5 d3 y5 {
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 f# a& B! b" A# B# s' f8 e
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ Z! a6 H' _7 ~7 V! }" ?% G
参数解释:
; r4 a4 c; ^  E5 C9 ~% T2 d3 Yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
  j: X& m! ?/ b* d7 a4 vnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; a/ z& H4 v3 i- W+ {8 m; L
返回值:/ n$ T, V" P6 L: a
返回非0表示计算成功,0表示计算失败有错误$ q! K) Q$ O( o' _

* _2 R  i! W: N  x. k   W# v4 B8 X4 o" w
) Q/ l7 T' u1 U
程序代码:
, n( J' {+ L1 X+ p3 a- ~2 b) d+ P5 @  Q) y
namespace fy_Exp{3 [* Z: r7 R* O) ^
namespace {template <class _T>
. S& I: k4 x7 A3 ~: P5 k$ J; m# Iinline _T GetExpValue(_T t[], char& csym){
) f. A3 @, {8 \. L  B" _    char c=csym; csym=0;# |" }# M) O6 Z; P# M1 d6 C
    switch(c){4 s2 S# o4 v3 T% K8 s0 ]2 Z
    case '+':return t[0] += t[1];
9 ^. M  P# e" X1 U    case '-':return t[0] -= t[1];- J9 J: j; o/ B8 o, ^0 u) b8 A
    case '*':return t[0] *= t[1];# d4 q4 k' h) a8 _9 S% O# ]
    default: return t[0] /= t[1];//case '/':
0 a) _' ?# I  d! |6 j; p' b1 @    }8 ^' k0 m7 P8 O6 O3 W' ?' j5 `1 A- V
}}
$ g% ^, c) a6 E+ ttemplate <class _T, class _Tstream>) k, m& e" x8 N
/* _Tstream: inputstream, _T: get return value6 \  G8 r2 z; o3 c* i
* Return nonzero if get value successfully */
/ _  {( V- J  Kint GetExpValue(_Tstream& istrin, _T& nReturn){
, G" G0 `2 V1 k2 j/ Q    _T t[3] = {0}; //雨中飞燕之作0 @. X. _& M0 j) i8 U
    char csym[3] = "++";$ ^# W( d/ K, m$ w% w' U
    int nLevel = 1, nERR = 0;  r- x  M9 y" H. d( e
    if(!(istrin>>t[1]))istrin.clear();+ \6 h- j9 d. e2 t' B6 c  f1 X: S) G
    for(;;){4 p$ @& R, t+ V; m/ h# N
        if(istrin>>csym[2]){$ q2 L% i: q* e6 B9 n4 a7 Q
            switch(csym[2]){3 y: D# J( k) K% P
            case '(':! A2 ^# k7 {" W+ C
                if(!csym[1]){nLevel=0x100; nERR=1;}else
, `$ y( ?9 l8 }7 z' N2 r8 w                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
# Q" K" x4 C* L; D. X                else{nLevel=0x100; nERR=1;}
! E# Y5 F9 o2 Z( y( e$ V                break;2 e  B% k" _! `9 l
            case ')':
( u; |0 E/ n0 {! l                {nLevel = 0x100;}break;
, l9 C% |8 {3 B9 N* r0 i5 F8 H$ l( d/ Z            case '+':case '-':case '*':case '/':3 ^! ~5 c! ?. m% K
                {csym[nLevel++] = csym[2];}break;
  b' U! i: b0 I4 t# B            case ' ':case '\r':case '\n':case '\t':continue;
4 ?! Y; J0 N3 ]) ], t4 h9 k* f            default:' G' ~/ Q3 w; q3 S+ H9 `6 F' G
                {nLevel=0x100; nERR=1;}
4 L+ Q3 s$ N- X" P$ U! h            }
( g2 i0 m& x; A3 b( h            if(nLevel==0x100)break;4 V. E4 D# W+ B; g& s7 ~8 q' R
            if(nLevel&0x10 || istrin>>t[2]){
, \( Y# v* A2 I                nLevel &= 0xF;
+ r# B" ]8 F" |  c: E- |                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 z, ~6 x. t$ g. ?3 v- C% a                if(csym[1]=='*'||csym[1]=='/'){3 x$ A8 i( M* O( k% u
                    GetExpValue(t+1, csym[1]);
% g" e# L8 d; M* W                }5 u1 ]+ C* E0 M4 G) @" k8 m
                else{
* N% Z8 t7 \. U9 {7 D2 }                    GetExpValue(t, csym[0]);
% @  o! d9 r* S) O/ F* b                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 B  I" O2 F) h$ l" Q, u1 E
                }
; {( ?( ~5 K8 B9 B) m( y                nLevel = 1;
6 I8 s7 Y0 Q9 m# n            }8 L# Y1 p5 `% B7 W! H  {
            else istrin.clear();: s  d. b3 K- s
        }
3 f: P. K& N) I* F3 U1 c        else{nERR = -1; break;}+ G% {" p, X" x0 T8 H$ S& Q
    }
9 k/ \3 A6 ^) K& m0 y* i% Y! b9 n    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. w4 V$ Y' J: ?5 S1 t9 Y    else nReturn=GetExpValue(t, csym[0]);" _' X. P- e4 N4 E7 O7 k1 U. P
    return nERR==-1?1:0;
6 g5 ]1 P& z  y; s, ]0 c7 q1 h" Y}}* E* x# m+ P: ^  `
' i! ?: T) U$ P* C1 U- E9 ?) t/ k

7 h  H% ?" A, f; R: c8 R  a) f# S/ U) y: k
函数模板使用示例:
  ?9 W! R- O- [在以上那段代码的后面加上以下代码:
" w5 D$ ]  \* d, }' N, V5 Y) l1 K% X; ]

9 o3 M! a9 [& u8 ^7 W$ ?# o7 g. X. K7 g) j
程序代码:
' [  A8 _, x" p2 b( x/ k% Z. N  S) r# t
#include<strstream>& Z6 v+ W. J: p5 o) K4 l4 |* \* s
#include<iostream>
5 V/ `$ o9 e) X: r: g#include<string>
6 I( f* H* {" U6 @7 m1 n, {/ ~% ousing namespace std;1 w' U; C% ~7 z. J# K8 Z6 T
int main(void): c/ f1 e, Q$ W; l
{2 ~6 J6 T. S9 K' Z
    string s1;% e& A" p3 L6 V4 y* r
    while(cin>>s1)! J  A" C+ [; L( N
    {4 J8 g0 I5 q' V  |
        istrstream isin(s1.data());/ E7 F' i  Y& m, e  N# R$ N- n) G7 E
        double d;1 p: M7 X9 y' B6 C4 C. |9 r
        if(fy_Exp::GetExpValue(isin, d)); l% ]* M/ s8 s  ]6 k  F- o
        {) t" V/ P" q6 \
            cout<<d<<endl;, ?* g! B. P, A5 u
        }
+ Y+ ^* y" e& {6 O  _' ], B$ Y, f* M& P        else
% r* u8 _: \6 ^* R) s        {) G9 ?) E7 [$ M0 C
            cout<<"ERROR"<<endl;( d$ O% k0 @9 O9 ?7 ^0 J
        }! o$ m, S' r" g% ~# m; E
    }2 G& q* R$ `, M) Z
    return 0;/ Y. V9 A7 B, k, t" G; r
}
( [, }' {4 W; V9 L8 U8 ^" I) g  C: W* A% j$ W
+ x5 T4 E! n1 {0 `; ]
然后编译执行就可以了(*^_^*)
3 Q- ?, }  T# c2 \其它:TC++上一定编译错误,不保证在VC6上也能通过编译- |) k$ [  s) C+ z( {2 w1 a
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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