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

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

在9月8日那天我特意编写的,给大家分享的,( F4 a) r9 Z' B; G
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式: [7 A& K5 R; X2 e  v; z5 b
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 U3 t% b2 q( w. Q+ x$ |) u
参数解释:" H8 Y  H( g9 a# L+ t' u/ r* _
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* l) ^2 E- ^$ t* v8 d: g& y
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" O% [0 f# {# m# C0 ^% o返回值:2 J3 s) y( E0 F. `
返回非0表示计算成功,0表示计算失败有错误
& I. W  J8 F% ?- a, Q! f0 F8 s9 L. u( U( I
$ n# ~; \8 o4 r* p9 ~+ N
/ D) D7 Q4 W" E3 w" S
程序代码: / K) J3 j& v( b5 [) J" x
1 x3 @2 j9 Z* d' l
namespace fy_Exp{
9 e9 ]/ z* H3 d9 E% w; X( S1 Xnamespace {template <class _T>
$ q6 ]; K( B# t, _5 yinline _T GetExpValue(_T t[], char& csym){& s2 H: c. ~; G
    char c=csym; csym=0;
' J. w5 ^; w! H3 N7 h2 s$ g- |( a    switch(c){
7 g, l. o5 O& v. C* u    case '+':return t[0] += t[1];$ ]+ @; P5 k4 }9 N: C
    case '-':return t[0] -= t[1];
) s  r: p, U$ }1 R+ ~! B& l$ _    case '*':return t[0] *= t[1];
1 T4 E- a9 I( h( u4 [, o    default: return t[0] /= t[1];//case '/':) W% w; Y# e. e
    }
* O5 T+ u7 @/ n& A  Q( e  |1 d}}
3 v, f: I. p9 Z& jtemplate <class _T, class _Tstream>
: Q( d. P9 Y& E! q" N. E/* _Tstream: inputstream, _T: get return value) z8 A# K5 h# D# U
* Return nonzero if get value successfully */2 }! ~& ^! o& K) |& t) i0 U3 |! i* N
int GetExpValue(_Tstream& istrin, _T& nReturn){
3 u* v0 Z8 h* {( A1 b- N1 L2 _    _T t[3] = {0}; //雨中飞燕之作0 R' s0 J5 y6 `4 Z: P/ ]
    char csym[3] = "++";$ j9 g) D) H* {3 y& j/ W6 b" d
    int nLevel = 1, nERR = 0;
* `! f5 r" p# B% J! ?: ^! P    if(!(istrin>>t[1]))istrin.clear();
% Q1 e- H6 X  ^: j: X    for(;;){9 ?4 z/ }3 V; {$ O5 W$ L$ j
        if(istrin>>csym[2]){
% Z# O4 \9 `% _" X3 }7 g            switch(csym[2]){/ T' f6 i, \+ b# v& y
            case '(':
+ J) h2 h1 \6 F3 g2 V                if(!csym[1]){nLevel=0x100; nERR=1;}else# A) D- Z9 v+ Z& H6 N6 I
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;* _9 S( m: ~5 q9 ]3 X, x
                else{nLevel=0x100; nERR=1;}
8 `1 E3 v+ D3 r9 T( p                break;
+ h% ^4 r; n1 X# r8 H4 X            case ')':
. \3 z+ d8 X8 X2 {$ S- m0 `                {nLevel = 0x100;}break;
4 C8 K; Y! B0 P- n0 d, B$ `$ C* ]$ D! ]6 A            case '+':case '-':case '*':case '/':
+ n8 a/ ~0 K0 L5 k" K: o$ E8 ]                {csym[nLevel++] = csym[2];}break;' ]( D5 E2 }' L- B- K
            case ' ':case '\r':case '\n':case '\t':continue;8 N& i( g5 v4 E  p  E: }
            default:' T3 L) t! ]# j' f+ w' G+ J
                {nLevel=0x100; nERR=1;}
7 V4 j* ?0 T# @) ^( ]- v: o0 H            }
& e7 I- e% \! |4 p( C7 L            if(nLevel==0x100)break;
3 N; R+ a  e5 u- P; E/ {( n  w& t            if(nLevel&0x10 || istrin>>t[2]){/ a8 p# H5 r4 k0 _7 L
                nLevel &= 0xF;/ \( R( r$ b& o1 j
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 }& {* l; |. u, Z% f
                if(csym[1]=='*'||csym[1]=='/'){/ X0 r5 ]$ g3 {5 m6 a5 q
                    GetExpValue(t+1, csym[1]);
+ a1 A$ ]6 J* S                }% _; ~* S, I5 j7 ~: m% d5 Q
                else{
5 E7 F( `, j" B% v0 R! L( v                    GetExpValue(t, csym[0]);
/ _! U/ R  O% E9 W! S& Q- M                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 D7 S4 Q6 ]5 G8 v% N# @
                }
  C7 A/ k: c0 X9 @                nLevel = 1;
4 D2 F) F! C6 q$ b+ H' o            }
3 O! N, A) }, z" V5 F: f            else istrin.clear();. V* c' g2 Y- f" L4 Y
        }
# n3 X: r6 j6 u- C( V  [        else{nERR = -1; break;}
4 c9 y3 g# Q: Z+ ]: G    }2 r2 \3 b$ `1 N1 V5 V+ k
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; t) T2 S1 N1 L5 \1 r5 `
    else nReturn=GetExpValue(t, csym[0]);$ b/ h2 _  @" b, f+ l( F! p) N, Q  b
    return nERR==-1?1:0;
) f; W6 m6 U7 m5 U$ A4 P}}
7 G8 f. K; x, O* o5 K4 f0 s
: ^% Q9 ]4 Y/ N  K" v2 u+ g' K/ i% _+ @1 `

( Z  ~7 N  V( f  g函数模板使用示例:
5 X' T" c2 e" R: m* }7 b" q在以上那段代码的后面加上以下代码:
1 S- p9 h& b" R+ H
0 s. }5 Q( o) {' C 6 w0 q2 ~$ l6 ?
" T0 Z0 ~5 y! d* t
程序代码:
( Y5 ?( t* b, o, o& x1 D8 W* p2 v* G: S- e' r7 ~
#include<strstream>
! G$ V8 c& z2 O9 R- |$ {#include<iostream>
. `/ ?  I$ b3 g, U$ ~8 A. }) h#include<string>1 c7 s1 @. z7 R# g
using namespace std;
* I$ I$ t1 _! }int main(void)
! A+ i# P3 U8 n* s# G  z{
0 q1 R: w- |$ H. N( _    string s1;
! v! e7 F% Z5 P: j7 P2 G    while(cin>>s1)& A: p  P4 B5 c$ b, z
    {! b* b  e  D: y9 s4 ]
        istrstream isin(s1.data());! c  C+ G3 b4 ]1 c, D7 }
        double d;
6 K- Q( v- I3 S/ A% O" D        if(fy_Exp::GetExpValue(isin, d))6 l9 M0 S& O( x  G
        {: A  e: g+ G9 L$ d. Q
            cout<<d<<endl;
, }6 j3 O$ S0 Q; n6 t        }
) q. M' b1 X. ]        else
* x+ e  t( M8 \# n, e        {: `2 R6 W7 S' _; F3 S! @
            cout<<"ERROR"<<endl;5 U) [! e* I" e8 I0 @" Y
        }7 G( G( B" E  H
    }
" L% [5 Q3 @- ^1 l- L/ @2 |    return 0;
  u* \9 t' z7 ?/ J}
% b9 M7 p( L2 C9 ~3 O, R  g0 ~7 W2 n' p* ]. S. u

. \  O" ^0 z9 p+ |+ N然后编译执行就可以了(*^_^*)3 L2 o, @8 C& R3 f% o
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 Q. U% K) r7 c% K4 D+ ~      建议使用VC7或VC更高版本,或者使用GNU C++编译

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