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

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

在9月8日那天我特意编写的,给大家分享的,0 H. ?4 K# |, G) m8 A6 j9 H6 M- G
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式% ]0 \- g6 Y5 I  s
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 v6 q& `* m3 f' v- S参数解释:) S8 ]# ^% o# ~3 E: }
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( H1 P0 s6 r1 dnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 X$ R6 O0 v/ F& D; Y) H返回值:
* z. d+ ?- ~- @4 |: B$ Q! O返回非0表示计算成功,0表示计算失败有错误$ ~# N5 ?* B& \$ o
! y3 y) ]! P7 v3 e+ p! z

' `1 P4 l' S, q, \" K1 j
6 C, E; z8 l  V$ d& D2 Z程序代码: 7 g- S7 j8 W5 H8 @6 e) K, |
& F) |9 A8 V# T% F
namespace fy_Exp{: |" ?$ M  t! Q: y! s7 [
namespace {template <class _T># W2 |6 B( R' b; ^9 A2 S
inline _T GetExpValue(_T t[], char& csym){
3 c* G" e9 X4 O/ S9 u    char c=csym; csym=0;
; Y( I5 A% g  i) H' @" D* j    switch(c){
$ ~$ k8 I4 ^. ?' k( C9 [# l    case '+':return t[0] += t[1];+ |. y2 c' ^" V+ X2 o. ~2 s
    case '-':return t[0] -= t[1];4 s7 k2 r6 V* S
    case '*':return t[0] *= t[1];7 l# K& C+ |- s+ `* K
    default: return t[0] /= t[1];//case '/':
9 \. d/ p' [. G/ {    }1 e" F  W9 |) a* j+ K
}}: P5 D5 y* c5 f1 ?! \$ N
template <class _T, class _Tstream>
7 V5 r: |2 z4 J: |/ A/* _Tstream: inputstream, _T: get return value
" _  P/ I+ Z7 H* Y  i* Return nonzero if get value successfully */: R2 F/ F: F9 @. W
int GetExpValue(_Tstream& istrin, _T& nReturn){. |  l: l( f/ s- w
    _T t[3] = {0}; //雨中飞燕之作4 d. y7 N( W- }. d3 O8 i( c* ]
    char csym[3] = "++";
" \3 t7 P" O1 O1 g' n$ l    int nLevel = 1, nERR = 0;- n: M+ ~5 ^: C/ @2 V
    if(!(istrin>>t[1]))istrin.clear();
  ]7 \6 e  m6 `4 }5 p    for(;;){
, [( d% A. k0 Q% ^' g6 `$ n        if(istrin>>csym[2]){# [! N: I2 H( X% a; P6 X  b
            switch(csym[2]){6 R: C; e! U4 a$ L$ [
            case '(':; Z' `  p9 b/ t2 J
                if(!csym[1]){nLevel=0x100; nERR=1;}else
4 C, v4 f) ?+ Z, G                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 `# _& s+ \" l  b7 ^" \; q; b, Q                else{nLevel=0x100; nERR=1;}
$ l$ ?$ A* U2 C7 ?                break;9 h6 \# H: h9 C, Q8 Q2 ^9 o5 ?
            case ')':
2 I2 \5 B- z% ]6 Y2 b7 n$ u0 N2 H3 c                {nLevel = 0x100;}break;
  x+ ?% r) A$ i            case '+':case '-':case '*':case '/':
) l. n- V+ b2 c6 Z7 W7 v6 M6 @3 i                {csym[nLevel++] = csym[2];}break;
4 n* k; u& S+ l0 i/ d            case ' ':case '\r':case '\n':case '\t':continue;, d8 `! k4 `7 n. l+ m/ |1 {( `  f
            default:* @; {: X+ k8 Y4 Q# R
                {nLevel=0x100; nERR=1;}
" _7 E4 ]* A$ R' S8 v( S            }
( W- P' g4 W9 y% X& b$ K            if(nLevel==0x100)break;1 Y2 V# {: K, \2 ~& z# A) A
            if(nLevel&0x10 || istrin>>t[2]){- F* s7 P' S/ m4 K
                nLevel &= 0xF;: @- Z& h/ P, @! u! ?* F
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
5 h. s0 G( [- R# R" ]                if(csym[1]=='*'||csym[1]=='/'){7 t5 k3 o; _7 {, S0 E' S% T. `
                    GetExpValue(t+1, csym[1]);9 o( R6 }+ r) p7 h
                }6 d/ V* H9 _' v/ f. W$ b: g
                else{( X& \9 e+ Z) W- z3 e  {! H6 F
                    GetExpValue(t, csym[0]);, T/ |  _, S/ J! B. `- g6 H
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
% [9 ]6 J& k7 P6 E- q. l7 T9 c                }/ v! w* K6 b0 L
                nLevel = 1;3 n$ P2 A4 L8 P* ~
            }
. i: M  C( `% W            else istrin.clear();% E+ t9 W- H! R7 a4 u5 |
        }. p2 y& m7 F# X: Y' f# e" s2 m
        else{nERR = -1; break;}# @) |% ~5 ?4 I7 M& D( J
    }4 x7 u9 j) K4 a" J4 ?& o" t
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- R8 z* v6 F$ A& H* K
    else nReturn=GetExpValue(t, csym[0]);4 m8 K7 J8 h$ ~
    return nERR==-1?1:0;
7 P9 `9 ^/ {8 B$ g5 W8 |; I2 ^}}
4 E  {: B( G4 {6 U) z* F* [0 n$ \7 T! F, r5 z$ i* [

2 A# G" R; V8 k2 z4 \9 J) a+ L
# U3 e5 C6 x$ x4 @函数模板使用示例:3 {7 b5 I) m7 r% s& C  T
在以上那段代码的后面加上以下代码:
* L' f  Y$ h( I6 e& M/ B% h7 U5 a8 c/ {) K

+ P6 J$ O: u4 J" I- Z/ r
7 h( b, O+ ^) ~: k; q7 B& G! }4 V8 c程序代码: 8 \- W/ F1 E8 o; @. n$ {% {
, @. n/ o( E, x, M& b
#include<strstream>) _( u. u$ |, `9 x" H) ]2 [
#include<iostream>
1 ?, Q* {* C- `5 |) r* C2 U#include<string>
$ V& x6 z2 I) ?5 L9 Uusing namespace std;
0 r  `, {; F- O; N1 g( ]7 Aint main(void)
' P6 c7 K6 i+ |+ E) H{7 F' u- t; k* v% G& n
    string s1;
+ k2 I1 |- g( j* X  ?2 b    while(cin>>s1)
9 n. J3 d  V( ^* n    {0 g. c! O# u' U" A! R* O
        istrstream isin(s1.data());+ q; ^/ P5 h; O/ @( J) @
        double d;. Q: G3 O5 z2 O8 L
        if(fy_Exp::GetExpValue(isin, d))
, a6 T! ]% l5 Z! g* v6 h        {
8 l. e, q; b7 w! U/ d, ?# k$ G            cout<<d<<endl;
$ z7 [2 p3 ~4 |; W1 w0 U- e& ]7 _        }# X/ P2 i4 }% O2 ?
        else
& R$ r* r+ @- E% J        {
) w/ p0 B# ~: f" Q% f9 \            cout<<"ERROR"<<endl;& i. }3 @; q# C/ T1 I
        }
9 B! N! \" s" o: J9 O    }. R/ I/ g0 r. ?$ g6 C
    return 0;( u0 G! W; f% j4 L3 g" p: u/ [3 X, s9 n
}
1 u$ L" \3 O& p
: |! P1 K8 K3 f5 D+ m7 L1 y0 n; O% P7 ?' a/ l$ f! y/ a( r/ |3 C
然后编译执行就可以了(*^_^*)
# ^1 u' v+ ?0 I; e  e9 ]% W5 j3 [其它:TC++上一定编译错误,不保证在VC6上也能通过编译" H4 _) c/ ?6 n' i7 A0 r1 {
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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