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

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

在9月8日那天我特意编写的,给大家分享的,
" z1 X' N2 d' |7 [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, H- k  O7 T0 c, l7 ~. b# M只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 X! M- p7 J. F# U2 k2 M$ _; X  S
参数解释:7 u# b! s) D- a& y) x. a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 Z7 ]1 }4 X- {) w0 \nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" ~: \  Z1 R# q7 Y% T: Z
返回值:7 y2 i. w# r0 n
返回非0表示计算成功,0表示计算失败有错误
# Y* y1 s* l# y; T: }# [' l. a& T* D& Q( j6 G. L) a
7 J- k  z7 g7 Q8 L" _$ b' n

% e4 P# H- E4 Q+ Q, w9 {程序代码: # \% z4 P. T" a) q

5 E' l% Y4 }, m/ snamespace fy_Exp{' l8 \/ i1 Q! V( u
namespace {template <class _T>
5 h4 p! y0 z7 g* Tinline _T GetExpValue(_T t[], char& csym){; n  r% {) V- F# T, ^& Q$ O( V
    char c=csym; csym=0;
( F) Y+ O; y4 y4 ]    switch(c){
1 z/ i. G) ~% H8 g    case '+':return t[0] += t[1];
/ a9 K. O# \0 @9 E6 N0 c    case '-':return t[0] -= t[1];
* Z, P" r" ?) K; W4 ]) _: q    case '*':return t[0] *= t[1];5 p/ o3 Z+ R2 ~( @6 W& J
    default: return t[0] /= t[1];//case '/':% j/ o. v2 t9 V( u4 w* c
    }3 D5 H/ Y$ \: W9 J3 O- V
}}
9 \) I8 C2 t& }5 `- @/ M" B4 ctemplate <class _T, class _Tstream>
: _: @& Q, z0 f8 q/* _Tstream: inputstream, _T: get return value: {- H9 F' O6 Z  u1 m) ]3 }
* Return nonzero if get value successfully */
7 d$ j% j: H0 o% xint GetExpValue(_Tstream& istrin, _T& nReturn){' A! l2 ?/ y0 n% P3 {! ~
    _T t[3] = {0}; //雨中飞燕之作
$ a( h+ z! i" ], X4 \+ i    char csym[3] = "++";
, A" X1 u( j2 L4 B/ b# L    int nLevel = 1, nERR = 0;/ H7 O  |5 v9 e/ [" U
    if(!(istrin>>t[1]))istrin.clear();0 v- r0 W) g. G3 T7 L3 w
    for(;;){) c: h: \2 K" L" E3 z, B
        if(istrin>>csym[2]){
3 q- R. M) g! ]& t$ r            switch(csym[2]){
' f2 _+ K* h; I' g            case '(':
% v8 p" W2 N0 y' {4 h                if(!csym[1]){nLevel=0x100; nERR=1;}else0 |+ n% a" L: q- H1 q! m- l3 J0 a
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 \0 @: L8 G) V3 K/ E' X* p
                else{nLevel=0x100; nERR=1;}
- v! }( z) p9 g, g$ t                break;" ~4 n" b- K) v
            case ')':" I& q, V& N. Z! j
                {nLevel = 0x100;}break;( y- B+ V; F2 ^% q  G
            case '+':case '-':case '*':case '/':
$ J' ^. P' Q; U$ W) C2 q4 I                {csym[nLevel++] = csym[2];}break;$ D7 z1 r- z- ~. {  r
            case ' ':case '\r':case '\n':case '\t':continue;. K% w5 g* I$ p, x- E' n$ @1 r% V  S
            default:
3 ^/ {: c: |: w- @                {nLevel=0x100; nERR=1;}
5 K$ i' E  p# Q7 @; E. L            }  }1 E) M8 V* ]/ T2 J. g
            if(nLevel==0x100)break;
/ z2 E+ @) v( R, m: n' m            if(nLevel&0x10 || istrin>>t[2]){
0 s! Q7 }3 Y" x; \, ~                nLevel &= 0xF;
2 H% {1 [2 R% R                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) a) }1 d/ y" d% Q# ^) r( F4 C9 Q' Y
                if(csym[1]=='*'||csym[1]=='/'){) P. n9 R. o- ^) P/ o
                    GetExpValue(t+1, csym[1]);; `- {$ E+ \5 S# C* g1 Q* u" |
                }- r& y! ^; [1 H
                else{
- m) o2 S- v: W: H9 B                    GetExpValue(t, csym[0]);( q; V- p& q5 M- d" S
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& m- v3 n; ?3 I! V. L" N4 D2 t                }, e% w) j4 q0 Z+ j! g. F+ l
                nLevel = 1;% D- u4 F, ]. h) g6 q
            }7 ~& X' ?) L8 B4 s& _! m- w- @
            else istrin.clear();# Z) Y' d9 E% _. e* F
        }
9 s9 U3 y( _: b; l' B; w5 ?        else{nERR = -1; break;}
; L. s% m5 L# y$ n% P    }! T% M. L7 {+ Q) P$ ^
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 O8 }, P* B* P3 S    else nReturn=GetExpValue(t, csym[0]);  b7 \2 O5 K% _* |% d2 ]
    return nERR==-1?1:0;
* ~9 r: L. k7 ]}}( w' b/ z1 C% q$ Z. d& d
* o* W" R5 ]: T" ]

0 e6 T! L& o, c6 p! \
. ^  q, S5 i) ]5 f5 G* M. n5 p函数模板使用示例:, c2 i: |. M6 u" _5 N3 B& J
在以上那段代码的后面加上以下代码:
, K9 g4 v& y9 \- S* s+ S7 F( C. I5 A" J/ X# }, T

, V% y; G1 }0 H# X5 P/ `+ {& D2 h1 W' H5 t
程序代码: 2 p( v% s8 s6 h) u2 K$ S
  j) \+ ]0 {) b" X6 S9 q
#include<strstream>
7 ?1 i( r/ R$ m4 x#include<iostream>
% e, \- @( N5 a+ h- I+ ?" D#include<string>
; w1 C; C2 z/ n  husing namespace std;8 s: H7 e4 `+ `' m
int main(void)7 R* M" l, e5 u! d3 h* E6 j
{
0 Z" h  C% _- p% l  u5 `    string s1;
) G7 R1 N: g7 A* M. H    while(cin>>s1)8 |6 p- B3 l( O- u! n- \/ o
    {
3 K$ x8 v1 r, K0 [5 K6 G) O        istrstream isin(s1.data());! \9 s; A5 l8 |5 I% t0 m
        double d;+ |& W' L5 h2 r, o
        if(fy_Exp::GetExpValue(isin, d))  l, n) w8 C) T$ k2 D1 C
        {
+ q# e/ A' v) h/ L6 d* W& c            cout<<d<<endl;
: G: J  ?/ {0 w  [7 |6 L        }
$ a. Q$ r8 S$ w        else
( [1 M- v6 q9 {, S* g  p        {
8 O7 X$ B; l' }& U            cout<<"ERROR"<<endl;& g+ V# \) e; W* i$ N
        }* ^1 T7 G3 |  O- f& D
    }
6 h* n+ o7 E6 \# g    return 0;# x! G: \7 |3 |6 z- g# A
}
7 u& V+ x6 [5 K
8 F0 y' F6 _$ X( }6 B5 {7 w3 i# M9 G
然后编译执行就可以了(*^_^*)7 @+ l2 z, I2 n1 b
其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 }! W$ G6 |2 B$ d
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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