返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
0 |8 Z+ h+ l$ @# Z, }一个很方便的函数模板,可以并且只可以计算含括号的四则表达式9 S0 j# g3 |; e
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( g# a- P6 c6 \1 B参数解释:
6 T( |- {) o( e2 _3 m8 |6 Tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 E5 Y- K- ]2 ^- n0 Q7 a5 rnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 B9 D" `1 G2 p2 m" ^  T返回值:
3 I; N0 H- J; G( A( s2 y( h返回非0表示计算成功,0表示计算失败有错误1 {) S- G; b( k7 a  t

% P( b- E0 `) i5 A4 j. P3 b- E * R1 ]7 Q. Q4 W

9 K# y  b/ Z2 W' i3 P+ e( B# J程序代码:
& F; i- y, z- L# |( U& M( d
. e$ B. g+ G- pnamespace fy_Exp{
; x1 r4 a" f0 L, y3 ynamespace {template <class _T>1 [) K. x6 \0 E
inline _T GetExpValue(_T t[], char& csym){
: c. _- n! S$ u0 y    char c=csym; csym=0;) [6 N+ k0 P5 n. a
    switch(c){6 {6 g8 L) F$ T! ~
    case '+':return t[0] += t[1];
& }5 C4 W; s% S# C$ W  s    case '-':return t[0] -= t[1];
/ F! B* T. n6 Z' L( e2 G+ Z* o    case '*':return t[0] *= t[1];0 W& F3 N! D# [7 [5 C$ b' w5 L/ w$ d
    default: return t[0] /= t[1];//case '/':9 }2 R- a( k4 d# \  P! D0 H0 r
    }) i& M: T" r& S( k0 M# E3 }
}}
4 d* Q! |1 D" O. y! s) D, ~template <class _T, class _Tstream>
: ?% i/ {' M' r3 `- T/* _Tstream: inputstream, _T: get return value
9 o! Y" |1 C, \7 {& P* Return nonzero if get value successfully */! ?2 x5 M! z' Y+ g" _) k
int GetExpValue(_Tstream& istrin, _T& nReturn){$ n% m% R7 p, ~( R  `6 g5 K8 a
    _T t[3] = {0}; //雨中飞燕之作
; a2 v9 m$ ?, Q/ @2 e* u    char csym[3] = "++";
$ u# s7 z0 c% @    int nLevel = 1, nERR = 0;
. T0 J7 z- ?  H  P    if(!(istrin>>t[1]))istrin.clear();# e" _/ a3 B. ]5 X5 O' [
    for(;;){
7 l* i5 e# P' t5 u. @$ J; l5 J3 m( N! N  i        if(istrin>>csym[2]){
" M/ j  T! A8 Z# E4 P8 D( C: T9 E            switch(csym[2]){
9 h: s% e% l7 u+ S# X! k            case '(':
( m6 k1 a, f5 s5 \( H& x                if(!csym[1]){nLevel=0x100; nERR=1;}else8 B0 E  v) k" \; P1 l
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 O  k' N6 {$ {7 Y: A
                else{nLevel=0x100; nERR=1;}
4 k: A) x* [9 H3 H) ~4 e: g                break;
, v0 W# R1 Q: @/ c1 y" g            case ')':
& C; O9 J" F$ y8 \3 ?                {nLevel = 0x100;}break;
1 g! L+ @# q& ?# J5 w            case '+':case '-':case '*':case '/':
- D( w3 f- J/ {# [* P  Z                {csym[nLevel++] = csym[2];}break;
2 U$ O6 E: b7 Y# p2 b/ Q; X- x2 r) v            case ' ':case '\r':case '\n':case '\t':continue;
% g) n( f* J2 F% x; t' {            default:
0 K2 h5 R4 R6 M/ `: ], Q                {nLevel=0x100; nERR=1;}5 I" z' r# V# M/ c0 |; q
            }
: L' m% [$ O: L+ H# \5 n8 d6 W            if(nLevel==0x100)break;3 J4 }' f9 L0 K" b7 _; ?' `9 F, m6 C
            if(nLevel&0x10 || istrin>>t[2]){
8 M: |$ U9 U% b+ r$ [                nLevel &= 0xF;
% i" T" y& p) j                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 H3 U. N9 j" {                if(csym[1]=='*'||csym[1]=='/'){% F4 i% T8 X6 k0 |* i6 I
                    GetExpValue(t+1, csym[1]);7 W9 `. E; m# \& [; ^# [
                }
- Q& s4 b: x9 @: V, m, o* d$ }                else{
) v( m( @: r& W- ?" p1 Q                    GetExpValue(t, csym[0]);( M/ U% ^* B& L
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;) F3 D4 t& O0 l/ `* y" K1 J
                }1 ]( i, z& i; C$ h( N% x2 G. t
                nLevel = 1;
4 Y, n. ^& h" H+ e1 V' f4 z; H            }
$ A3 R; g* j- J/ z            else istrin.clear();' c, j# P  P6 X
        }
* ]; v/ I0 K8 e4 l7 P3 o, Y        else{nERR = -1; break;}
% s+ U4 {5 h' V    }
) k. z- r4 T5 G. F' |  J' ^    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 [4 [/ L8 o$ V8 d# Y% _& z, U    else nReturn=GetExpValue(t, csym[0]);
) [% p' e9 \/ \0 w* J: ~- |6 X! B    return nERR==-1?1:0;% C% D0 q8 N7 Y
}}
; h) u; c  _& E" \: G2 ~& ]7 W! a2 N7 f6 d
/ `6 }  q; P7 ^
% c/ N9 G& `3 f2 c% ^
函数模板使用示例:! U) n( V3 Z6 f; z- I
在以上那段代码的后面加上以下代码:
% f8 S3 k) _7 ]- y2 _: t; R$ G
8 A8 {$ |8 }; D& `8 r3 W) d1 V
0 G2 K- S, |+ P
程序代码:
9 r% `6 x9 N6 B4 Y- R5 d
$ n% z- w  m+ R( o#include<strstream>
9 v1 d+ G% T8 r) ~+ ~6 B% a#include<iostream>( I$ f" h! L4 e: ]
#include<string>
! @( F* f" S4 I4 K7 u! ]using namespace std;& H$ D: }9 S. z/ V% u6 _
int main(void)8 Y! W5 ~. v# H: M  e% T( `1 }
{
7 J& Q6 H1 f+ O+ N; \    string s1;7 E( s0 Z: ?2 H- i7 e, ~* J6 I
    while(cin>>s1)* c3 A  u3 n; L+ P! N( V7 o' _
    {% @  |4 _# W" ^8 T. b1 s, d, U
        istrstream isin(s1.data());6 ?$ P1 a; Q% ?9 s- \
        double d;
3 f3 c. @! L4 {9 N$ q; _' J        if(fy_Exp::GetExpValue(isin, d))
5 W2 L" n$ K) G8 J        {
" T1 t% N; M2 E6 h+ g4 h            cout<<d<<endl;
+ `. \, X9 e8 X* G+ J4 S; I: D        }
8 T  e! \1 `9 }6 P7 D8 N4 j        else
% _2 l& m' r. T8 L        {) G1 u9 Z( b' t3 K: N1 r0 C
            cout<<"ERROR"<<endl;
# n  |4 w2 ~7 J; b# R2 P* P9 f) d        }
8 g" V' c3 Q! T4 L% ^2 J3 Q3 B    }
4 {% @1 f; N3 y- e9 B) G- h0 y    return 0;& w1 B+ n/ o0 ?
}
  O8 Y8 I6 B2 H8 s) `, N
% O/ t$ A$ f6 f
1 O& M4 |2 j. K然后编译执行就可以了(*^_^*)/ x8 V9 ?' J) }7 L, I: _% {6 Y( J
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( I1 R4 ~& e& I/ i3 @! t      建议使用VC7或VC更高版本,或者使用GNU C++编译

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