返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
9 U* X  ^* d9 h2 a一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- V& r* X. N# @$ L: D只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' ~* k) e0 t' p& U  _参数解释:
# l$ M6 y) I, u/ g2 }! [istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. T( k8 @9 U6 y, S: ~! V& Y5 unReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ B% I5 t5 j# L( _返回值:
) L9 s0 M0 Z8 C返回非0表示计算成功,0表示计算失败有错误9 ^  v3 \( N0 X' Z; d

! C6 s2 V% y/ T, I3 Z
" r+ s/ d8 K# `* G3 m4 c. T4 T
# R+ w3 A+ Q4 A$ K6 Y程序代码: 8 ~; F0 T% \* x; z) f

& i- ^! ~' I  M( \5 K* M7 z7 |namespace fy_Exp{+ Y$ P, F5 ?* g6 |
namespace {template <class _T>
1 M3 ~2 C3 n' z. y' Zinline _T GetExpValue(_T t[], char& csym){( v. S3 q. O% \. F9 Y& }
    char c=csym; csym=0;0 S6 n5 g/ P% C% h4 Q
    switch(c){9 z* l8 k* K4 L
    case '+':return t[0] += t[1];
5 m9 @  w' ~7 S6 N" R; Q4 g    case '-':return t[0] -= t[1];4 e  N! ?" a3 P) K: @8 y4 ]' U5 [# w
    case '*':return t[0] *= t[1];! h6 E0 q* s  G" c. E  A
    default: return t[0] /= t[1];//case '/':6 k1 M; g7 Z, X$ I+ I* \+ i$ |  F
    }) e' @. U. a8 \
}}
" a3 k) _) E4 e( u/ d7 x0 ^$ Utemplate <class _T, class _Tstream>" C( m) c- f; J, o
/* _Tstream: inputstream, _T: get return value
& L6 I7 @% G' ?( Z! o* Return nonzero if get value successfully */
: U5 d9 z& L7 m; |) Sint GetExpValue(_Tstream& istrin, _T& nReturn){
0 ]- J) p8 C4 L( r) J6 y    _T t[3] = {0}; //雨中飞燕之作7 D) s1 J: E8 ]! n
    char csym[3] = "++";) \" M: |3 O& F* a" I, k  m
    int nLevel = 1, nERR = 0;$ H& V/ R) z* F2 `5 |5 i( ?
    if(!(istrin>>t[1]))istrin.clear();2 e2 l8 {2 ]8 q$ h4 q8 Y/ S+ Q
    for(;;){
- B% B% T# q( b: c' {        if(istrin>>csym[2]){
. y  c( b7 }; `2 H0 ?8 U            switch(csym[2]){& |# l# t0 T& \! e; ~: W! L% v1 t
            case '(':" d8 _  ~- E( `
                if(!csym[1]){nLevel=0x100; nERR=1;}else# n+ m1 ~& _' y
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;7 b- k) Z0 B, V4 ~8 c
                else{nLevel=0x100; nERR=1;}/ _" g& _& i$ i7 d4 Y8 [
                break;
7 y# ?# G2 ]4 {, |9 T            case ')':
' j# _. @0 w9 H                {nLevel = 0x100;}break;
% X7 z# m" q3 r# K+ z            case '+':case '-':case '*':case '/':+ [! j& G; \  y3 {5 Z% A) c; Q
                {csym[nLevel++] = csym[2];}break;. G' }  e' D/ ^9 T. v
            case ' ':case '\r':case '\n':case '\t':continue;
( \7 {# f' r0 f$ G            default:
: H0 Z9 ?2 u1 l: G                {nLevel=0x100; nERR=1;}  F, ?1 F0 B& f' a9 V9 N1 U
            }, w9 X6 ^) E0 w: b) h' }
            if(nLevel==0x100)break;
, y/ ?( c" b- L            if(nLevel&0x10 || istrin>>t[2]){! p4 D4 V; T, t& [9 a) ^$ K
                nLevel &= 0xF;
  v- B, u$ u5 a- }0 E. U                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& o) X- C/ `, M, w# E( E) {; S: s                if(csym[1]=='*'||csym[1]=='/'){  L; q) F, `# \8 Q
                    GetExpValue(t+1, csym[1]);' A( y: z  V9 a8 P" @4 s7 I
                }
* n8 W) E6 I0 H. [, `0 ~                else{
, g& S8 ?6 I: W( c" c+ X. O                    GetExpValue(t, csym[0]);
& r: N0 E4 z/ L6 a) w- H" r* m" I5 y                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;" B! \6 l0 V& r1 D4 X
                }
7 Z  s4 F- z. y$ d4 d( G5 @                nLevel = 1;# n) h4 d! N  B& a3 c) c
            }
$ r2 ?9 y0 N* ~$ u: K! Y/ a            else istrin.clear();
* F; n/ r6 M/ P) G        }
$ ]* a" F+ b6 C% U% e        else{nERR = -1; break;}4 _/ F3 c6 I+ w2 e
    }: {, X# g1 c; I  [
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);. f5 _* }) \: G$ d
    else nReturn=GetExpValue(t, csym[0]);
/ @. q0 _1 y2 P* S/ C    return nERR==-1?1:0;
: \/ \8 e' i3 D/ E0 a$ s}}) o: L! K* }) y/ l. Z; b5 e( ]
8 X* }& x2 A; M/ q9 [1 ^, C6 K; U
* @3 I3 f8 S( s! z
& R4 a' [+ Q  K1 Z' Z  k
函数模板使用示例:0 p# W; {- s- ~3 }! @1 C! ~2 t
在以上那段代码的后面加上以下代码:1 w: _0 b7 [5 u  T2 i

8 P% U0 J1 H7 g1 l# I
4 B2 S6 l2 i' t1 Q1 e# j: [
- F7 y- j% N% n. r' J8 }程序代码:
8 U$ i7 y4 b6 G1 T4 s$ f5 Z7 T* m' }% l4 |4 G
#include<strstream>
7 X  c4 p" I4 v#include<iostream>
. g3 o! e* _. B" F2 S# x#include<string>
8 M7 Q) O  G7 O1 b  `using namespace std;
# J% q' t$ Q- y* oint main(void)) b- X! B+ b3 x; s
{/ _2 F: g" }. V! x4 k7 a7 c
    string s1;
7 n& e- F. p: L& m/ O8 p! ]) ^    while(cin>>s1)
6 R0 F- A& {5 w: Q  n    {
: ^! t8 A9 P  A) Z/ j, B0 C6 ]; u        istrstream isin(s1.data());; G1 C+ }' _: {3 v& @2 [
        double d;
5 {3 X/ U. X! ~/ w6 a8 e9 r3 ]        if(fy_Exp::GetExpValue(isin, d))
$ k2 {* O8 ]3 O! A- F        {1 L9 W! l; R6 B5 J
            cout<<d<<endl;' P+ _- d- e1 E- K  u
        }
: k+ f3 `2 s- c$ A1 q% K% \& T7 G        else
0 v& J& d* J+ Y        {( x- K, d) z) [# E/ y5 f" l0 E
            cout<<"ERROR"<<endl;
! {9 {0 F& Z, Y        }) R4 Q! D& K4 R, S, b) z+ }
    }7 K8 J- r# w% j% w7 ~  H- R; m) @3 r
    return 0;/ V$ G' A6 Y$ _0 X9 \) z& p+ [
}- \( M8 T7 o* `, \& M2 j

& J' c: f+ @, |$ \" h; M/ e: j3 \2 P* G& h( [! b
然后编译执行就可以了(*^_^*)
( Q: C" q; w; B) r6 o, ~其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ d% ?& T2 Z$ K6 n5 M7 [2 }1 j. e- J
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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