返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( |% a  c% M$ E  K- ]+ L4 y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式8 w% j( @$ Z$ D- B- G2 a; `
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 E2 T4 z- ^' I: d1 o% ?参数解释:8 l% F$ S- m2 C# c" ]
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! G2 ^+ {8 r' A* t, C: [nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 J; U) L  p9 M" X
返回值:
$ |) t/ ^- @) X- J, R/ }返回非0表示计算成功,0表示计算失败有错误" @, ~7 W' G' `5 q1 I9 A) F. B

$ m% |) x: ]+ y3 ]+ V 0 l; _5 E7 c. N! M3 R$ {: \

& S2 U+ n2 e) ~+ W7 P3 X$ v8 \9 P程序代码: 5 s" b$ m7 ?! Q/ i$ }. P

- |3 r2 w" x9 d2 l8 Bnamespace fy_Exp{
. Q3 }' `+ K8 F/ F1 Wnamespace {template <class _T>
1 p$ n" M9 W  _. W# B4 Qinline _T GetExpValue(_T t[], char& csym){
* _0 h; _0 W/ ?# s* V( O4 l% e9 H    char c=csym; csym=0;
/ _, Q  n3 e2 I1 m    switch(c){
6 f8 h/ z, G8 x, i* O" l    case '+':return t[0] += t[1];
! ~9 _1 N5 c# b" l8 n, u# {    case '-':return t[0] -= t[1];7 ~- B/ k7 g  ^3 l  X/ g, H
    case '*':return t[0] *= t[1];9 ^. F* P* x2 m! B, G
    default: return t[0] /= t[1];//case '/':, l  v; I9 |7 B3 V, i
    }7 }, B* \- t9 J% R
}}
8 ]) Q$ \+ q/ I( E. R9 ytemplate <class _T, class _Tstream>5 C- E' N5 Y, G; S0 D3 L
/* _Tstream: inputstream, _T: get return value  P& x, M0 M- y2 ~7 r# D# ^6 @
* Return nonzero if get value successfully */+ N9 l5 d( w, G: {4 _  w; _$ g3 C3 O+ J
int GetExpValue(_Tstream& istrin, _T& nReturn){3 a( X! |% l7 w6 m/ w6 B
    _T t[3] = {0}; //雨中飞燕之作
3 p' d5 ~$ I; V9 J) ^    char csym[3] = "++";/ W% g, n( z8 ~( ?# h* A
    int nLevel = 1, nERR = 0;, W$ Q8 i) V6 }! u/ l% r9 u
    if(!(istrin>>t[1]))istrin.clear();
9 q/ ^' |, b; o0 y8 t# U1 U# u    for(;;){
3 w9 [# |6 p+ X& b2 w: P        if(istrin>>csym[2]){* e6 l9 E3 l: j9 k( c8 l
            switch(csym[2]){
! c$ T8 ^- Z5 \8 f4 N* V1 j0 D            case '(':
% G7 X: v: V" H1 U$ T1 E                if(!csym[1]){nLevel=0x100; nERR=1;}else
% p, q& x" ~) E2 U. I# X4 U- k                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 I& m8 E) {/ o& p2 N) V+ X+ X
                else{nLevel=0x100; nERR=1;}
9 I8 d. k' C* F                break;
) {4 \5 [. f" a2 S            case ')':7 {/ c: T2 P! i* L7 R) g0 {
                {nLevel = 0x100;}break;, ^' A/ ^8 }9 o# F9 z7 O
            case '+':case '-':case '*':case '/':
* w& s3 e, r0 g) ^/ V                {csym[nLevel++] = csym[2];}break;5 f  D% g9 ?% U5 s* t
            case ' ':case '\r':case '\n':case '\t':continue;4 a% j1 u! S+ O' h4 \8 v. U9 J
            default:
" g; v2 J2 C$ d) N4 Q$ ]1 `                {nLevel=0x100; nERR=1;}, p7 u3 O) H+ n( M& m
            }' P% G) W" U8 i% N+ B9 K
            if(nLevel==0x100)break;
# p" h* b7 P) l4 L# |1 Z1 \            if(nLevel&0x10 || istrin>>t[2]){
& }& ?( c. k0 T8 E5 _                nLevel &= 0xF;) o) Z4 W& t3 g# X
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- D; X0 T9 Y9 y" g; _$ ^                if(csym[1]=='*'||csym[1]=='/'){2 \5 x- ]3 q6 U2 G' l
                    GetExpValue(t+1, csym[1]);- y' ^+ [, z# k" q' y) q; L8 H
                }7 c$ n/ j2 I/ ?. V& b0 r0 O/ a
                else{" y( i" K3 I) ]0 s
                    GetExpValue(t, csym[0]);
$ d% y; _# j3 a                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ U& L) O# W+ O. \                }) E4 Z6 y' |" f3 R
                nLevel = 1;0 {  b+ S8 i* F6 L9 n8 Z
            }. |9 F% ?: k7 ~( `8 }/ u
            else istrin.clear();
! _, |/ [( g% t        }
0 G. {: M6 i/ M, a        else{nERR = -1; break;}7 q1 }* Q% C) e- m7 }& S5 H
    }% N, m! n) G0 ^
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 R4 k! h+ [  N3 y    else nReturn=GetExpValue(t, csym[0]);
  g! k( a: I. v2 S' J) v    return nERR==-1?1:0;
3 f; ?' Q8 V) u" |! r! H}}
0 e6 f9 x) [# @0 S' D2 g: [! `+ @( X! C! J1 N# p6 ]% X
$ x" g/ S# l9 X1 M7 K8 E
) o$ v/ Y, ~$ h
函数模板使用示例:
# A! s5 b. V4 b. y3 J在以上那段代码的后面加上以下代码:
$ f7 }( G! V; P" |! w, `5 s8 x
2 }0 Z# _: f! f' ~2 G
- X: ~7 o2 p4 l( A% d  q5 r- f
4 N/ C% ?& F/ Z程序代码:
; _0 j' A9 h' K; h% A# U% ]' V+ M+ M3 E; g$ D" b" O
#include<strstream>
' ]; @! F9 J$ L# K% F, l#include<iostream>
+ J6 ?$ X6 X6 L+ e1 ^4 U#include<string>
* W% t( g5 F- a% A/ r. P9 v% ausing namespace std;
! t: `  B4 f8 w) {int main(void)
% @2 H8 q6 ?! t8 V; V{* s- S! I2 O( h
    string s1;! t0 ~% t$ ?# \1 _0 M1 i6 x
    while(cin>>s1)  W  l( c8 z  h, u
    {
1 C: R9 G6 P8 p1 G2 P        istrstream isin(s1.data());
9 n) K% S/ g) S2 k        double d;3 N6 c# {6 @% l5 v( S
        if(fy_Exp::GetExpValue(isin, d))
" I2 _/ o( F; j* ~        {
( a" M2 p: x3 N% l" K            cout<<d<<endl;: s3 g* L9 ]7 E0 g' K
        }
) C: a! s) U4 S5 Z- k0 S6 F& ?( `* g        else
, }" `% O% Q, @: t$ i        {/ e7 x) i% B- I+ O! h5 N# x; t
            cout<<"ERROR"<<endl;
3 R/ b: b- ~5 K! U4 t( n9 ~& u) K        }  d) t( c4 q* }& c! ]
    }
$ g# ^( ]" {9 b: c8 k  q    return 0;
7 r5 y' m- @1 d( R* n8 a}
1 Y+ s; S3 |4 M
& J7 K2 Z4 P* r" y9 U' X8 W1 ^* D- k- A6 }7 T- j
然后编译执行就可以了(*^_^*)* F: m* R2 p3 J* o7 b: t3 E5 C- `
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 i: |3 s; C, g7 L, V4 P: u. r. C" _      建议使用VC7或VC更高版本,或者使用GNU C++编译

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