返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,2 I; N1 ?7 n- g7 |! {+ e
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 {0 ]) t3 z% X只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) z1 F9 x0 y; h' E参数解释:0 D+ S5 U/ ~3 v+ ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# L! K! f/ `" [# Y3 znReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 ^0 Q) `' J- E返回值:
: y+ x2 _; z0 s6 c返回非0表示计算成功,0表示计算失败有错误0 L4 V, [8 u3 F
2 S8 a4 x+ z9 B: {+ O. I' @! S
; u7 _7 B! H7 k8 H
. N% \) u# T+ g
程序代码: ! |& i9 y1 S# m, v. h( W2 x

! |: F6 o5 U6 S+ n( u, a' bnamespace fy_Exp{
* i( ?7 R- u3 i7 xnamespace {template <class _T>/ ]2 g* w( p; J2 d5 k
inline _T GetExpValue(_T t[], char& csym){
& z1 i9 t3 c3 J/ k! |9 @" M# a    char c=csym; csym=0;
( @4 \' T1 I4 a2 P0 Q& u    switch(c){
" f$ M  o+ w6 g! n    case '+':return t[0] += t[1];
4 C5 T4 t9 {2 C$ T8 X& Y( b$ g    case '-':return t[0] -= t[1];) w8 a6 A  T5 M3 k! `
    case '*':return t[0] *= t[1];
2 w5 I; l+ _4 S5 _9 y    default: return t[0] /= t[1];//case '/':4 H1 o7 L! t0 e/ u. a7 h4 `. [
    }
( i1 K; }& b$ l/ g; X}}
, U+ f" x; B1 G$ Stemplate <class _T, class _Tstream>6 P* I( ]4 F: F& q: Y% O4 h1 K
/* _Tstream: inputstream, _T: get return value4 K/ b& B; V( _1 s7 |0 M4 o
* Return nonzero if get value successfully */
. N+ A, t* n) B0 `* Bint GetExpValue(_Tstream& istrin, _T& nReturn){
! z# B# L, ]1 Q7 P    _T t[3] = {0}; //雨中飞燕之作/ P& w6 Z, U5 F3 g
    char csym[3] = "++";$ U+ a- n6 x+ N8 Y' U5 C3 g
    int nLevel = 1, nERR = 0;
9 m1 u& |& L$ [: g  N    if(!(istrin>>t[1]))istrin.clear();* c6 h  ^* d/ i" \7 @, i
    for(;;){5 ^4 X" w( F  p* \4 m, L# C
        if(istrin>>csym[2]){4 R7 }( x( x2 K. J3 U4 a' \) j
            switch(csym[2]){
' f6 c# r5 e% ^% ~0 F1 n' G( S/ I            case '(':! J0 \" E- U6 K2 p& @. M
                if(!csym[1]){nLevel=0x100; nERR=1;}else# L4 |: B/ `3 ^
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% j7 L  X5 E; ^$ P% t+ _0 E$ g
                else{nLevel=0x100; nERR=1;}- [( P% Y" E0 J! J2 V4 b1 U: k! N5 A
                break;- Q. ?8 y& c/ e: X
            case ')':
. l; ?6 }& R' U                {nLevel = 0x100;}break;
. G1 |# e; w7 w( h' j' f0 T* W# v0 u            case '+':case '-':case '*':case '/':4 d! i; e4 }0 d0 S# @9 K
                {csym[nLevel++] = csym[2];}break;
6 K  u$ x# T' a- J            case ' ':case '\r':case '\n':case '\t':continue;
# d  G$ z& }) Y' @            default:
1 e* c6 m: q+ j/ N0 @/ T; I: S) b                {nLevel=0x100; nERR=1;}
- S& h0 O5 @* O3 }  O            }  m/ ?( }  Q- o8 I3 p
            if(nLevel==0x100)break;: @& J% e5 }& W0 P) f
            if(nLevel&0x10 || istrin>>t[2]){; |5 ~1 M: n4 _5 S" ?( m3 g
                nLevel &= 0xF;
! P, |  @3 w9 z6 A7 U" ?                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}( A# S; l* b# m: o
                if(csym[1]=='*'||csym[1]=='/'){+ U: i# l% K# Q
                    GetExpValue(t+1, csym[1]);6 J1 \3 \" O. f9 ~6 T6 G0 z. K, r
                }0 B: _, V, e7 c7 l* t, p
                else{# q7 P& i% d6 f7 F8 k4 b
                    GetExpValue(t, csym[0]);
- S- W' I) G! v& N8 f* D                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- f: t- _' L9 q+ X- c$ O9 t3 Y                }
5 G; E1 j( D+ `6 {: @                nLevel = 1;
( k: {% }+ O: _$ f* D3 q, X            }
) ~1 Z2 T/ g! c3 A6 ]# _% T) H            else istrin.clear();% `7 r$ t( ?5 P7 }- `( H9 p
        }9 y9 g( ]4 z2 `( n. y" N2 d8 Q3 s
        else{nERR = -1; break;}- o+ \9 Y0 S: t* m1 E+ @+ j. t6 [% X
    }
4 m) c6 d0 X, U* O7 r5 G    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; X% M+ y- z% b( r+ C/ F
    else nReturn=GetExpValue(t, csym[0]);9 Y( A4 j  S- [
    return nERR==-1?1:0;
! c$ {; J0 D; H' ^}}
/ \9 h+ v# ~8 d) B7 `8 W# T7 A3 D0 R2 j6 M
; `2 n! D5 J# D$ g7 \6 d
7 `) e' w7 f1 j  _. I" H# y$ m
函数模板使用示例:/ h2 G& d5 _; J8 C0 M8 j% Y$ C
在以上那段代码的后面加上以下代码:3 ~# }3 S5 e+ a1 |3 P
+ D4 L. o/ M& }! B  ]

8 E9 K7 Q/ N7 I9 Q  z+ B
" b; w7 F. x* {: Y程序代码:
) m# r7 v& q( x' k. E& {  S6 `: b! n6 x" x- h! K' f& O
#include<strstream>, m7 S3 ^- S  H& K& q) B2 V1 z+ j
#include<iostream>
1 j) {" M% N. q3 C0 f7 p; k#include<string>, a5 B+ n" T2 V" Y% P7 Z
using namespace std;; m! m0 ^; y' k( K
int main(void)
; S& _5 e1 N2 X1 f# b{
9 F- F3 p/ b$ N: @/ l2 ~9 m- [* h    string s1;6 a9 n1 B4 b$ u* E7 ?5 ]1 s
    while(cin>>s1)
, h) u8 S% c* J: j. A0 |" ~    {
5 r' {* T* @; u" m2 F7 F4 }        istrstream isin(s1.data());. {8 Z5 @) |1 ^" k" G% A+ T! h0 |
        double d;
' N. y, `" m% m7 M! u1 L" E% P        if(fy_Exp::GetExpValue(isin, d))
0 Z( d$ ]; h/ d# _/ G$ M        {
. L, v) N7 x* Y- f" h            cout<<d<<endl;
3 ?4 A, z& e* {        }2 M  |6 f! K% J$ J) V: w
        else
; o; v/ E! J7 w! G5 D        {
* W  ]+ L: a( {* o            cout<<"ERROR"<<endl;. p/ @& f6 p7 _0 e3 j+ T  i8 V
        }
, J, @7 c) I# K. u+ k' H    }  P  \4 N' U# Q+ Q- J- V
    return 0;
3 t" q3 Z& c" B+ Y}
/ F0 c" z8 R0 X6 G" E" J! c1 Y( @8 n; r* {1 X- M$ e
4 @7 v( k1 u; w. Z$ Z& W; x
然后编译执行就可以了(*^_^*)$ y5 F: W. P1 R2 R& `8 A
其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 f/ x+ Y7 a; e- F
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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