返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
, |6 Q' p: A4 _! _9 R一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- x/ K% P1 r7 o0 h; H只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 B+ I# Z3 Y" k0 P% Y# A! B# J% ?
参数解释:1 v- `. |! a: J: G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( X$ F9 }, U" t( B. s6 ]! I9 Q6 Y( Z/ N
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定  S  q. p, Q" E/ z
返回值:9 |- r. i/ u  p: h
返回非0表示计算成功,0表示计算失败有错误0 M" U( v' d# ]

1 [; M4 q' U* l" x3 w: N3 ^
. c4 \, w/ D$ l2 G$ ~
1 o$ N1 ?; l3 }& N3 }程序代码: ' s/ @% D  ~/ ]7 z  K) q& Q. D. Z
6 {% R' Y( ^0 a  J. Z4 K4 t; k
namespace fy_Exp{
' D" P0 j  X* W: D3 @namespace {template <class _T>: Q' U- f' I4 L2 K8 B* L5 I* [
inline _T GetExpValue(_T t[], char& csym){
/ v0 v/ F2 G+ e: g: q% ~" s    char c=csym; csym=0;
. O; M' y% C% n# }" F7 f+ J9 u1 o    switch(c){/ [4 W1 d4 P( y, b+ h2 g% i
    case '+':return t[0] += t[1];
* p  w! J+ ?3 E+ P3 d6 u    case '-':return t[0] -= t[1];
3 X, n; p9 k" d" b( l! n    case '*':return t[0] *= t[1];) q! I3 l8 ?1 _/ Z1 Y2 x3 s
    default: return t[0] /= t[1];//case '/':
1 x/ t% G( z1 w% ~    }& J3 t4 p, v" @6 K( p  T
}}
+ G; ~, O# h# w) Q! c) o) itemplate <class _T, class _Tstream>
( l  C" r8 {# q9 ^/ Y$ p. [' s/* _Tstream: inputstream, _T: get return value# l' ?0 l0 t. ~- B1 y
* Return nonzero if get value successfully */% w: \  w- r( t) f5 X. N2 D
int GetExpValue(_Tstream& istrin, _T& nReturn){3 C* M+ k0 \& s8 e( _
    _T t[3] = {0}; //雨中飞燕之作' B1 f$ l4 [0 B, A+ j' X
    char csym[3] = "++";
* m6 y# i2 }, _, |. g    int nLevel = 1, nERR = 0;
& Z# V# ]. f  D: n    if(!(istrin>>t[1]))istrin.clear();1 v8 n8 k2 t  ]7 s
    for(;;){
0 s' o  `/ A, K( d4 C1 G2 Q        if(istrin>>csym[2]){
' D) B9 q; H8 L: x+ ~% ]1 h3 z            switch(csym[2]){
% u( z8 @2 z) h8 C/ {$ s% r            case '(':
, p1 p4 O0 _6 v6 @1 z# e$ l                if(!csym[1]){nLevel=0x100; nERR=1;}else
! `7 J9 T. j1 k& Q" F1 c                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 P1 I3 ]: u) E2 }* T
                else{nLevel=0x100; nERR=1;}
  z3 f" F, K( [" l9 i7 e8 J' K                break;
% O: E% V$ n1 B1 w            case ')':
2 V1 W% D. B7 A3 s- Z4 c4 s- a' `                {nLevel = 0x100;}break;
0 o. D; {% U2 T0 U  {            case '+':case '-':case '*':case '/':
) E# ~4 I+ u3 f+ m2 l* \* {! {                {csym[nLevel++] = csym[2];}break;
9 Y3 F! u1 U, }/ y- q0 ~, y4 D( V            case ' ':case '\r':case '\n':case '\t':continue;
, N7 T0 h8 ^" x* L! N8 g! n  N) Y            default:+ C5 f$ \9 k; x0 I
                {nLevel=0x100; nERR=1;}$ H# S/ V- R# m" N# l  j
            }7 @# ^3 I# }) M3 ~$ l0 C
            if(nLevel==0x100)break;6 ]" C/ M6 G# ?2 {
            if(nLevel&0x10 || istrin>>t[2]){
6 L( {6 c' \( o! Q4 W  w* b                nLevel &= 0xF;
- Y3 c# d) G1 P/ F3 E                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ `7 }: e8 V" u5 Y, X+ `3 d
                if(csym[1]=='*'||csym[1]=='/'){" s- D( [( y7 A$ Q3 v
                    GetExpValue(t+1, csym[1]);
4 J  \5 i* U/ k                }$ \) {7 u; Z+ S. k+ r
                else{5 d, L# l1 b5 H6 W7 k
                    GetExpValue(t, csym[0]);
4 q( {! Z; G2 H4 v                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ a' R9 T: E! c  F  h
                }! H& A; V7 y0 s) ~( v' c0 q( n
                nLevel = 1;
! {- [  R: q* v: e. E            }
- q8 F6 N: J4 n            else istrin.clear();
% }7 j' h' p$ v: {/ P' u        }  V2 @$ P: v* }% W
        else{nERR = -1; break;}) S) Z9 v/ |( U) _4 a. }& T
    }
$ k4 \7 G. X. j% u    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
$ o2 P; j. w: D3 p/ k0 r- K    else nReturn=GetExpValue(t, csym[0]);
" J% x( o* F8 W3 @' ^3 A    return nERR==-1?1:0;- I1 n9 P6 a5 P8 n" n
}}. |# D4 W, q' B) F1 \* B* }
. D4 K9 M' |* Y4 \( L4 u
' l( f/ R- r5 O) I, l
  `% e- z. a9 X2 }% R; L, [# ^
函数模板使用示例:
' Y0 s# G. h; _0 ~- h9 B, N) N在以上那段代码的后面加上以下代码:- l) i1 u# N0 z1 R" J

* L4 S# d# n0 M3 q 4 D6 \: ]1 H8 {9 Q+ \
( |) `3 Q" Y8 M$ t! \/ ]$ X
程序代码: # w# ^9 |0 H$ T
! l2 G, F0 Z$ z; y8 g4 b
#include<strstream>9 l3 d% ]& \1 s/ I
#include<iostream>! _2 |9 L& [: |2 X- N6 s6 k# p
#include<string>; m% X0 m) {5 `( j/ t" X
using namespace std;+ Y# x% {" p2 K  ]8 v# }& l
int main(void)
4 Q/ f1 Q3 t* h2 w/ F: o{
8 x# C( T, p) r4 ~    string s1;5 [3 m4 m0 Y+ h. o# T% o1 E
    while(cin>>s1)# G+ a+ Z+ N" U
    {
- {9 t: Y0 r9 P' T, A% O& ?# w. m) L        istrstream isin(s1.data());
% ~8 G9 R2 R& h        double d;
$ `/ w  M* L7 i3 x) n- w7 q7 s( _2 b        if(fy_Exp::GetExpValue(isin, d))& E) M! C! m" o/ }! B; ]
        {
) x1 B4 S! D! W5 w# Y            cout<<d<<endl;
0 }, D! L3 h" }+ w        }* m, M, f3 h- D3 n
        else6 A1 V7 d1 t' C- g+ L6 M0 P  T
        {
7 H/ K3 B6 m) U  |) ]8 D# b            cout<<"ERROR"<<endl;
$ x' Y% A: J9 z8 }. k3 G        }
$ i! R. q- x9 t' @2 \# K* |3 p  c4 r    }
7 D% u1 H5 |1 C# ]. {* C9 C$ C    return 0;
1 a) r: d, P9 ~8 a* x( P}
+ ^+ u# C2 w1 V9 x" C4 c
! H- B* t* T2 ]3 _" k" O" I2 g0 t; [6 Q! j
然后编译执行就可以了(*^_^*)
! m, S$ r4 {& `. d) ]* J其它:TC++上一定编译错误,不保证在VC6上也能通过编译. l3 x9 a' R7 p+ w5 }, m, [
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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