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

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

在9月8日那天我特意编写的,给大家分享的,
* k4 |* z2 w! X  m. ^一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 }* z8 z/ [3 U1 Q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( p: P/ `2 e4 y参数解释:  `, J' ^& O& n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
4 q! J( [! s" c$ b% VnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' m& j/ @+ g' |1 o% u
返回值:
, L$ F3 S+ a  H返回非0表示计算成功,0表示计算失败有错误
  A' v6 g8 \' \" Z: d! k+ |( W. A" p
, d9 b7 t  g  i* D: j# b% T
7 |: g9 ?, W* j- F, b- l) {2 i) ?
程序代码:
% x% ]" U6 ]5 _) N  X9 d
+ S3 x+ i" z0 f$ N# jnamespace fy_Exp{9 F% p% i% T! ?9 Q. z% W
namespace {template <class _T>' c5 U+ b' j, G0 U
inline _T GetExpValue(_T t[], char& csym){4 u! M* ^( y8 C* i" G) W, R5 }
    char c=csym; csym=0;4 i  T6 ^" ^: L/ Y
    switch(c){$ \6 m) X: x9 {- s! z& V
    case '+':return t[0] += t[1];
9 L- }. W6 C# L7 c! g8 v    case '-':return t[0] -= t[1];
/ J4 ]8 |1 W# m, R  N, t( d( p    case '*':return t[0] *= t[1];# P$ s4 ~  P( e% L
    default: return t[0] /= t[1];//case '/':6 L1 K( K9 o7 k7 ?+ E2 {. b
    }
* G5 |4 C0 A. I1 ?6 q* R+ h# \}}
2 Z7 c6 P, I* w' J" d+ l, \template <class _T, class _Tstream>0 g8 ]% H* S% _& T4 }  i
/* _Tstream: inputstream, _T: get return value
3 R4 t1 i; X+ [- m+ w$ R2 `" b* Return nonzero if get value successfully */* J! e( x3 n3 A3 \! D  J/ l
int GetExpValue(_Tstream& istrin, _T& nReturn){; r. q, |$ ]; m% \2 L
    _T t[3] = {0}; //雨中飞燕之作
# @  X. v- w; M  V: b& H    char csym[3] = "++";0 `+ x$ o& G8 g' z% a) a
    int nLevel = 1, nERR = 0;
. d: C$ h4 m; _2 ~$ o1 E; z4 h    if(!(istrin>>t[1]))istrin.clear();  k4 l/ h$ a0 \5 d
    for(;;){
' f8 b" |6 g, Y2 e6 Q+ X        if(istrin>>csym[2]){
6 S4 b& B3 H7 q. `# t6 L+ D+ w            switch(csym[2]){7 l1 @7 O7 o5 H: p' R: |* d; B
            case '(':
) X" `8 V$ F; G4 t4 |% Y3 ^& s                if(!csym[1]){nLevel=0x100; nERR=1;}else8 m/ \; r$ C3 E4 A" s
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- j! e% s7 J( g7 b9 d                else{nLevel=0x100; nERR=1;}
+ R3 F6 t" p( F  Z' ~9 R                break;
& V% t. z( m% q& P            case ')':
( E7 N$ U4 J6 G# `9 g- n                {nLevel = 0x100;}break;
! t8 q. U" F* S6 i1 U" z2 O            case '+':case '-':case '*':case '/':
+ K' T/ ?1 q/ p! n. E$ U                {csym[nLevel++] = csym[2];}break;) A; c1 \1 l: e' j
            case ' ':case '\r':case '\n':case '\t':continue;' ]0 b/ c+ i8 V# P2 n% s: ~
            default:
. U" M& d0 }# E5 R                {nLevel=0x100; nERR=1;}& N' }4 ]- u4 d$ e$ A7 u* v
            }, x& ]- h- W" a8 k+ R2 [: O: c. C
            if(nLevel==0x100)break;, Y' `4 G9 C8 [
            if(nLevel&0x10 || istrin>>t[2]){
# q1 C- i3 M" S6 ?! j                nLevel &= 0xF;
" ?  P0 I+ c: Q: W, m                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. P+ h/ z/ i* d5 l" U5 s4 j. {* c                if(csym[1]=='*'||csym[1]=='/'){
7 n$ a9 W  R; k- x                    GetExpValue(t+1, csym[1]);: `( r! ?, a+ X% }! R9 h: j
                }/ a5 E- D8 W7 e
                else{% X* N* ?' E3 ^
                    GetExpValue(t, csym[0]);
0 M# G5 R1 s9 x4 A0 I                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;- c# L- y" }3 f! [% V3 H: S2 ]7 u
                }) @" }* ]1 D& W3 ?; M* y' W
                nLevel = 1;2 X4 D1 p4 ]- P3 @
            }
3 e2 n$ L+ ^1 t! Q8 ~5 w            else istrin.clear();/ o& ?* F" H* X( K1 ?
        }' E5 p, q4 e* t# G
        else{nERR = -1; break;}
0 q( s4 J  E; Z/ f- a    }1 B. f. n6 H* t& U6 |% M
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);! W8 F. A  d# u
    else nReturn=GetExpValue(t, csym[0]);; g" J7 \4 _! a
    return nERR==-1?1:0;
; m1 m$ {, `1 s0 _}}
# G0 q& x6 `) O- ?% |
7 q) e' t" R8 v6 L
$ V, f5 s" o% L$ r( g% v* W% _
: P- T0 M5 x4 ]; g% K8 K函数模板使用示例:" `, i  L9 J# Q1 z& Q; p
在以上那段代码的后面加上以下代码:
. q7 U# J' m4 L# r* ?. }5 d4 \2 n5 o# o( ]' b7 y

. N* w) G9 j9 m5 ^" u" w
' X6 m( R: U$ P# U; F  b  c8 V程序代码: # ]& A% ~) i' B* l5 e5 G) I
* H, ~1 @8 H1 m+ ^
#include<strstream>! P. [0 S' h1 X+ G& H6 _
#include<iostream>
7 o) x8 I; ^: |# i  u5 `' W4 z! Q#include<string>+ W/ ?2 F6 t% u8 q4 N: ~
using namespace std;
- r6 q$ C! f+ r' u5 k; m! sint main(void)8 M0 U. F# Z2 ~4 k4 v
{
* a/ e( ~; n* [# d1 Z  Q    string s1;1 p5 r, Q2 S' X2 ^1 x3 z
    while(cin>>s1)
+ K$ `+ z1 B; l) M/ e5 u    {0 u" Y: c$ Z9 ^6 `4 n4 i
        istrstream isin(s1.data());" S2 |& B8 o' @; g/ S$ @
        double d;
6 P; k" Y2 ]  S. S9 X7 Z# r        if(fy_Exp::GetExpValue(isin, d))
) [) X, s' F# i; Q2 R/ ^        {
0 D  P  P) \% `* Y9 x            cout<<d<<endl;
: v( o( ?* i, b6 [1 g# V( _        }+ g8 Y! C5 I1 z3 e
        else2 W4 V, W9 S8 s/ L; G
        {# \: q1 O! ?& F9 b. W5 s
            cout<<"ERROR"<<endl;
/ c' H' B' P( n; \        }
9 t( U+ r+ T( `" ~, U4 [; x! }6 P    }
! p7 x: R5 G: k% m    return 0;
& M# |4 \5 ~$ U}
6 v% g5 U6 \" }7 F; Z0 {1 ]5 B/ p! L( @5 b) t) U6 r% `
# ^3 J$ S& F; V4 n8 {" N
然后编译执行就可以了(*^_^*)' Q( j8 I* Z4 K3 G+ `
其它:TC++上一定编译错误,不保证在VC6上也能通过编译# L  i7 u4 r0 K/ {  a5 y8 P
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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