返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,1 t0 J8 \  _6 G% e, f" w$ a
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 d3 O8 u2 ~) q0 S' r- J( @
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 t# F1 k' N1 W) u; r$ v
参数解释:
9 P4 b- l0 Y. n" p  r, H! @) J9 xistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 t8 G+ ?+ l0 h' F; p; b0 Q( z% b
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; N! r9 k- B4 r; S$ x: l' ]
返回值:
2 T8 N/ W+ K1 t0 ~& V返回非0表示计算成功,0表示计算失败有错误6 }; a9 N0 z# |

- O( c  h6 U" T( @" K- C0 c * R, Y( q3 M6 U" _3 E: T

+ ~0 @$ E+ G- t" Z  C" Y/ o2 O# s程序代码:
! X$ M8 b4 _- t, g( {5 p$ [9 ?# z: D) |4 M
namespace fy_Exp{
. w. U- R# U4 A, Inamespace {template <class _T>; i* M) |' L5 V2 t0 Y
inline _T GetExpValue(_T t[], char& csym){
& z7 s& F0 R. D# O    char c=csym; csym=0;4 _8 g9 {$ u- d- m& [$ C6 s
    switch(c){* z5 m. A% W1 e2 C9 x. \
    case '+':return t[0] += t[1];1 J% d& {- x" Q) e& X* X) o9 R/ g
    case '-':return t[0] -= t[1];/ {; G( O, _" ^: A! i  \5 f, U, a
    case '*':return t[0] *= t[1];
" k" n0 e( a. c. m9 ?& e) f( ^# o* H    default: return t[0] /= t[1];//case '/':
9 ^& I; C9 Q1 P  x  b    }( F* G9 J. b5 h) _
}}( U4 y/ b) ~5 I. j2 J! ^- u
template <class _T, class _Tstream>
' v& A1 ]. k2 [3 K) a" A/* _Tstream: inputstream, _T: get return value
/ K) C/ X4 W2 |8 \* Return nonzero if get value successfully */: X7 p. k+ ]  w
int GetExpValue(_Tstream& istrin, _T& nReturn){; D$ X  E% }' C4 j+ I6 e( C) m, B
    _T t[3] = {0}; //雨中飞燕之作7 [! L" ^$ T8 d/ z
    char csym[3] = "++";6 J8 _+ `. j+ `% }! @) }4 v  S- {# l
    int nLevel = 1, nERR = 0;
; [2 V9 P4 ]1 V( [7 Y% j. ?, x    if(!(istrin>>t[1]))istrin.clear();, z. U4 k" |  W8 P
    for(;;){
1 h" Z3 W: G, v! @/ T        if(istrin>>csym[2]){
! N. b( t8 b- l8 z. N2 X            switch(csym[2]){( P- X9 A* W: o9 a
            case '(':
6 S2 X; e4 J8 |( h; w                if(!csym[1]){nLevel=0x100; nERR=1;}else
5 e% H/ A9 f7 v1 [4 E. j                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
  R5 z4 V) e( [8 d! b8 J                else{nLevel=0x100; nERR=1;}  J/ C8 g0 |) b
                break;
5 V0 B) ^: C! ?6 {' @- X            case ')':
2 X2 }9 \: r$ Y+ W                {nLevel = 0x100;}break;
2 Q- W# G- Q- G( N0 ~            case '+':case '-':case '*':case '/':/ h" a+ [; u3 e0 R0 R& X% v
                {csym[nLevel++] = csym[2];}break;
# M% g- a. Q8 l) g% u. y4 U" @% Z8 W            case ' ':case '\r':case '\n':case '\t':continue;
8 Z1 \* l# W6 ~. V  k. H3 S            default:0 Z& p5 n2 P4 \1 O( r" H& i$ ?
                {nLevel=0x100; nERR=1;}2 H1 g( d4 f# L* b
            }3 g, U* [! n" U5 F5 i( j* d
            if(nLevel==0x100)break;" B+ R" b/ D  O/ Y: w+ o
            if(nLevel&0x10 || istrin>>t[2]){
% Z% w: l2 u+ E* a* n/ c* u. i                nLevel &= 0xF;6 u  d0 H2 B) V! h
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 K8 o: l) _, {( L, e. [) S, p) t                if(csym[1]=='*'||csym[1]=='/'){
6 J& m5 A/ u1 w9 ~                    GetExpValue(t+1, csym[1]);4 U0 p( f1 I+ J* t& n* L
                }. \2 B( {" n: Z" T
                else{
) H2 B3 R* h8 p8 [                    GetExpValue(t, csym[0]);
% f8 w4 }( U  U: n3 a1 k- l                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;2 t6 W( }; L7 n5 w) q2 ?& W% j! ~1 s5 X6 t
                }
0 s( F) Y6 V8 z1 Z* N$ z" ^                nLevel = 1;
% K7 s& _  Y9 Z  x            }
4 F4 p  m( a: ]# [) {            else istrin.clear();
! R6 H* i6 N/ ?2 D7 O% X, E4 S        }/ P! O) `) q' {. E, V! M. J! F/ {
        else{nERR = -1; break;}
  j) H8 J+ M, m' V' i4 \    }: P9 l* y4 ]. ?/ k: [* x* ?
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 W8 q! r' L( n: B9 ^    else nReturn=GetExpValue(t, csym[0]);
9 A' F' L' ?' }    return nERR==-1?1:0;
9 C& @  w% \7 t5 Z4 u}}
+ Q3 I  ]- C3 Z$ n4 V5 L/ Q7 o/ R( @5 k
7 _7 N  n5 n' y! W% J  `+ ?4 g

$ h! i* w% m4 D4 |$ ?- @5 ^3 k函数模板使用示例:
* U9 g( |( A0 n/ [: z; ~在以上那段代码的后面加上以下代码:6 T2 V9 s1 U* z; D+ G& v7 e

. a/ y& ^+ A8 o( @4 n3 p
/ m8 O5 ]% [" R6 n* E( X- z
, C* C: J" O, B) ]# u$ b) z程序代码:
  G4 g4 H- ?$ y4 O" V& X1 T: C% g: c
#include<strstream>$ h3 T2 V7 M# N; r) d/ C
#include<iostream>7 b" _6 b7 E% p8 R7 Z1 W) g
#include<string>
- J' I2 w- j! X. Tusing namespace std;' p6 D0 T  u, c  @( _3 j
int main(void)9 `& |! L( o2 }% `
{
2 h/ V# w; b3 h! m    string s1;; n- D# `  B+ r$ Y* \& m
    while(cin>>s1)
8 s* x5 D' D' U, `" q    {
+ T7 Y7 T, d) u# o5 y# l# w        istrstream isin(s1.data());
$ ~. o2 I" u  J7 j4 F* y        double d;$ B# k8 Q5 V& Q+ j; H
        if(fy_Exp::GetExpValue(isin, d))( P; f/ J$ ^4 b! k5 O$ }
        {
% P/ a/ z; l1 K6 f. D) {% c            cout<<d<<endl;5 |% O1 c2 e0 C. l
        }
1 _2 I1 s! K9 h5 P7 `0 S3 W        else
( z; E( m; d- {3 y/ N        {
, W! `1 u  V% {: m            cout<<"ERROR"<<endl;
8 b2 e+ v! j' K3 w: p: G8 {4 `9 l        }( J8 S! `  `" k
    }2 t4 i& y( Y6 C7 {7 l/ n5 j
    return 0;3 t+ `: N( b1 i" Y$ [
}/ {9 S* |/ v4 X9 r/ p
' ~! \6 v" `% F4 P  Z
, U1 d5 ~- Z: y
然后编译执行就可以了(*^_^*); t$ |( t3 d% u) m8 e6 h( R0 [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" C7 X% Z; C( p  t- ^      建议使用VC7或VC更高版本,或者使用GNU C++编译

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