返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
, Y4 R6 Y  R/ W6 m* D$ {; z一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ T9 ?$ O- I0 C$ f& z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- J: c: V1 i$ Z  f1 v参数解释:9 d+ C* p/ F% G: }+ p2 [0 Y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% U; Z9 N6 i( [$ S
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) h, L3 ^( j+ ^
返回值:
! C* V) b7 x+ D7 B' H: d" Q返回非0表示计算成功,0表示计算失败有错误: t! `2 I* |: T

, [4 ?( Z- h' v: w: i
6 r: {* H- ^" W' R/ R
( P4 G+ I$ _: k* Y- \; b程序代码:
. i" _2 F+ S0 ~1 I! j/ f) N
* z$ i- V3 F" Inamespace fy_Exp{
) W/ Q7 w  L) Fnamespace {template <class _T>
  r9 c( O; N: B, ]inline _T GetExpValue(_T t[], char& csym){
4 f# L0 o& A+ o    char c=csym; csym=0;$ ?# a/ F0 ^. n5 x. v
    switch(c){( [( F* L% K0 \/ B# O# `0 E8 ~
    case '+':return t[0] += t[1];
. }# |( Y3 E5 a4 Z    case '-':return t[0] -= t[1];
4 r$ H0 j. L2 i  x    case '*':return t[0] *= t[1];) c& F0 Z. l( t; y
    default: return t[0] /= t[1];//case '/':
) f$ Y! m0 t( b# A9 x+ h    }
  b3 z( t# ]! N8 w4 f. N}}! P- b# Q1 e$ ]0 {" C* I0 C4 C! Q
template <class _T, class _Tstream>: B; V6 e2 Z/ d( b' j
/* _Tstream: inputstream, _T: get return value
; A# l3 \, y3 U& u) p* Return nonzero if get value successfully */
9 N, J. R# D0 T2 T; ?# j2 a5 f! X! {int GetExpValue(_Tstream& istrin, _T& nReturn){
) f0 l7 \( }4 A- u: p$ e6 m    _T t[3] = {0}; //雨中飞燕之作. H/ P7 e$ T# g1 B
    char csym[3] = "++";- e0 z- Z- ~+ P# [5 n: K
    int nLevel = 1, nERR = 0;9 P( r* W& |' [
    if(!(istrin>>t[1]))istrin.clear();
4 c; }) b; V( D( @. A% n1 Y    for(;;){
/ q. c$ S- A3 d        if(istrin>>csym[2]){
9 d8 C# ]- {/ K$ z$ n+ f% |            switch(csym[2]){
; c8 [0 K1 c+ o$ i            case '(':, y) i! K; [' p+ @: I
                if(!csym[1]){nLevel=0x100; nERR=1;}else  ]: N' b  h5 J8 D( m! @9 p' S
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 U5 ~- T7 p2 u5 V: D                else{nLevel=0x100; nERR=1;}
5 ?; n8 C5 {" i4 P' @$ m# v, g                break;5 R3 V" v5 J' W
            case ')':! w4 O  ?8 d5 ~9 ]' n, S2 |" Z5 Y) ]
                {nLevel = 0x100;}break;
' r8 J1 \. z1 K; x            case '+':case '-':case '*':case '/':
& z- g7 v3 \( g3 m( B) ?- F                {csym[nLevel++] = csym[2];}break;8 p% J! T( M' S( @5 B! o
            case ' ':case '\r':case '\n':case '\t':continue;
! Q$ x0 a1 [' d6 ~& S( o7 X) J            default:
9 A- r6 z0 y$ I5 ~! O                {nLevel=0x100; nERR=1;}. ?/ D; ~/ Z( ~
            }6 x/ k; H5 }' s" T+ l
            if(nLevel==0x100)break;  w% O6 s) O, y$ L# [8 f: y
            if(nLevel&0x10 || istrin>>t[2]){
  H) |* \, r5 ~" I$ b                nLevel &= 0xF;
9 T/ I/ E, F, L2 ?+ }% s                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}' z- U! T  C, ^2 G
                if(csym[1]=='*'||csym[1]=='/'){1 A  ]! m" w, N0 g* J
                    GetExpValue(t+1, csym[1]);
/ H3 f* b* w+ S1 ]7 b6 q! u                }
+ i4 s# a) q2 |* }5 T' T" {                else{& H/ u) A2 H  ~6 R3 F/ k% B% J" U3 ]
                    GetExpValue(t, csym[0]);
5 S& d2 n5 z5 M3 v4 p; ]/ B                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 d6 x* ^& L# Z& r- f/ H1 [                }
; P" p/ W  m" L) ?: T2 C) Y; I; N9 x5 r2 V                nLevel = 1;6 F3 W( P  p/ }, {& |' e8 y
            }
+ s: y" ^7 w. u7 w            else istrin.clear();+ z, j+ Q, d( H  l: `/ L
        }
# ]& h( S& @) g5 p# M' a        else{nERR = -1; break;}) l3 S1 c4 S7 |( b6 D
    }
& H/ r; l! E6 Q; U    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
! ]8 s* H9 |0 `% I2 U+ Y* v    else nReturn=GetExpValue(t, csym[0]);
6 P# l3 K3 Q% j0 S    return nERR==-1?1:0;1 Y  b- J- s( y0 y
}}
, g9 U$ `3 t1 i! a: _0 f8 y. ]! m
3 v" o$ a' p  D3 I$ q$ X" F/ e
  R5 b& {$ [& o* ?# y
# z0 g2 R: m% l% l$ y% y0 {4 E函数模板使用示例:
1 ]3 O& ~& T8 U( z1 y- v" m在以上那段代码的后面加上以下代码:
: `" W9 x# D6 K* |. Z& i( u
7 A1 u% [1 v, w$ A2 ?$ l3 ] 7 p8 l/ T8 t3 ~0 l6 a$ R" t

' N& O, h8 ?/ G# ~) s, b$ F! Y程序代码:
6 X2 ?$ W% [4 P* u3 ~  b/ e9 v8 J* L# W: Q! {( j# T# {, d4 Z
#include<strstream>, ~1 U* i6 F* C' _
#include<iostream>
- @" Q( n/ R) e0 @8 \, c6 L2 k; D#include<string>5 p" w3 R- ^# ~: N8 X
using namespace std;9 [1 e- f/ ^3 l* F, d0 K# U  w
int main(void)* v. U  n* Y. x) C+ W
{1 V) o3 u8 F1 W3 s# k$ f: B* Q* Q
    string s1;
3 @# A  k. P3 R. I7 x0 j" j( c    while(cin>>s1)
( p4 O2 }* c2 e, Z    {1 ^2 ?: D0 e' K/ I' Q+ y2 P
        istrstream isin(s1.data());
* K) I# G9 D# D3 V2 Y        double d;
" p# i$ J* g0 z. ?2 w        if(fy_Exp::GetExpValue(isin, d))( q  X( A. w' J+ E
        {: d- X3 B$ Z/ o4 O/ V) G
            cout<<d<<endl;
4 v. T  Z6 v; P4 U: H; C$ C        }6 L5 L0 _. s8 C" H5 Y
        else
+ \9 t% D7 e" d! M$ v2 Z% E) P        {
: `! u( Q3 o* N% t: L# ^+ i- v            cout<<"ERROR"<<endl;
1 [5 D# ]' f$ Z# H' A7 v1 U6 ~( {. K        }
: C* F4 ^1 v: W- q; m* n    }
" b( u1 I- F3 b9 Z" {    return 0;% L; O9 S+ ^. o5 R: v# @* d
}
4 Y. A) P6 g; l8 B0 n* Z1 L; h* G' M1 r& O# S) P( P/ E
' a# p0 D0 X2 p1 @; w6 u
然后编译执行就可以了(*^_^*)
" r4 B1 Y. U3 S) u/ B- _* V其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" ^  t; m0 Z* E" r' e      建议使用VC7或VC更高版本,或者使用GNU C++编译

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