返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,8 s- c4 ^! {0 f4 @8 i; r1 o
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, }( M% Q7 V% n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)" Z) Q: T) D2 u9 G
参数解释:9 n" C; b& s# Z  g: Z; k
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" |' V, Z  @/ B2 K9 g% l
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 g" e/ S  d0 U5 @) ?返回值:* ]$ f  Z9 l. v1 b
返回非0表示计算成功,0表示计算失败有错误: j! I0 M2 k3 `& }1 R- D
. _5 @; t: J$ E7 Y9 `. [: B1 J) p
3 ~1 K0 L) M4 g7 f7 ]2 P4 [
& o; Q* g+ ]5 ?3 p8 s
程序代码:
1 R& G* c- {& }8 _5 V, m* N! q9 _3 ?/ w- w  z
namespace fy_Exp{- S9 E1 ~" f+ q4 J) j3 j
namespace {template <class _T>
4 j5 N" |7 k: }) jinline _T GetExpValue(_T t[], char& csym){  h7 u, B* q9 ~( v8 v8 E: m% f
    char c=csym; csym=0;
2 ?$ l( h& J4 h5 z6 n, g    switch(c){
/ E; V3 }& P+ ~- f    case '+':return t[0] += t[1];
3 n, B, g6 ^, P" L) v- e4 `    case '-':return t[0] -= t[1];
$ B$ C) x1 c, F3 B! G( a    case '*':return t[0] *= t[1];
8 [$ x3 N' P+ w% R& Y    default: return t[0] /= t[1];//case '/':
  r6 V( ^# G7 v7 f4 _+ y    }
1 |' n  S3 r+ y$ T- s}}
3 l  q" ?- P5 `0 Ftemplate <class _T, class _Tstream>
: Q! Q/ B/ [$ q- E0 O. G7 C/* _Tstream: inputstream, _T: get return value
; k. S! A0 C+ H* Return nonzero if get value successfully */
& o* a2 f( |( A5 X% e. M" hint GetExpValue(_Tstream& istrin, _T& nReturn){5 K( G: d/ M+ ^+ c: z
    _T t[3] = {0}; //雨中飞燕之作# J& d2 X3 A4 ~( p5 J/ s6 K5 {
    char csym[3] = "++";- x/ r3 p( x3 n* d5 ?
    int nLevel = 1, nERR = 0;
8 e* L  w8 P4 ?4 N. ?& M( N    if(!(istrin>>t[1]))istrin.clear();
5 X% b& d, `( |& l% I    for(;;){' Q' N' L. o1 x, q- K/ n  D1 p
        if(istrin>>csym[2]){
5 D# J; V& Z4 c+ x, Y2 J            switch(csym[2]){$ L2 k, |5 k3 w) p
            case '(':% `0 M7 X! i2 p, S( I" k8 b2 d$ x
                if(!csym[1]){nLevel=0x100; nERR=1;}else
  N4 G8 X/ @0 I( u                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, S# C; ]$ c1 k  J                else{nLevel=0x100; nERR=1;}
2 Z" H2 G/ C$ }" W$ i% d* R                break;7 y/ h; J7 K( t: U; ^8 Q/ J3 V, T( w
            case ')':
$ ~% |5 {; g2 e6 O* J" \/ L1 Z; c. |                {nLevel = 0x100;}break;8 @5 ^  v. ^2 i9 R( L; h  l( t* n" {
            case '+':case '-':case '*':case '/':
  R0 D, i$ R2 `9 v) u; p                {csym[nLevel++] = csym[2];}break;
2 Z7 u' D- E0 M) w, J% P  Z! j            case ' ':case '\r':case '\n':case '\t':continue;
9 U* g! g$ X3 M9 N0 F' ~3 P4 @! U9 P# D            default:$ [" V( U- r- t! y1 ?1 I
                {nLevel=0x100; nERR=1;}
8 r0 T3 p+ R* Z# a# c  b5 \) o: X            }; G: G; u4 C+ G! Z6 ~8 }
            if(nLevel==0x100)break;
7 d0 s$ L# v: p4 j            if(nLevel&0x10 || istrin>>t[2]){
; U3 ^6 Y1 k: Q& A/ z6 Y1 p                nLevel &= 0xF;
0 J$ ~" D1 n1 Y% Z) A                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, w& O+ c- D' S" x* ?; m. {9 g  e1 }
                if(csym[1]=='*'||csym[1]=='/'){4 v; c6 ]5 ~3 r. G. t- P* E& g
                    GetExpValue(t+1, csym[1]);
- a2 l, p: X( t' K, Y: R( E2 c                }; p9 h) O' f9 v2 |
                else{
) I1 J! P* _/ g0 E! \                    GetExpValue(t, csym[0]);4 w7 g! a. T# [8 E$ k* {4 j" l
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
: b0 D+ T; y2 q' ~9 N2 T                }4 i8 E7 q4 e3 g) O9 B, e
                nLevel = 1;$ @2 |' d- U" E# I2 u( _4 O+ h
            }% h# v: d% m. Y4 B7 H
            else istrin.clear();- x$ K( {/ ^: D5 i5 v
        }
* ]4 h/ u% n/ v; `* I1 i% M        else{nERR = -1; break;}
8 V5 M% `1 E; T" y/ G/ C    }
2 v% y# D1 y# N: x    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
! u6 s- D+ Z! ^0 \: E1 D0 Z; z    else nReturn=GetExpValue(t, csym[0]);  @4 E/ b7 {* ?9 X$ O/ @9 M' _
    return nERR==-1?1:0;
0 D9 l) F# H0 N. G/ u1 x5 L3 C}}( D4 O5 C* q. o

) g  b$ W- W% G+ T2 ?8 m2 v6 J: }/ R9 l
. d! t0 w2 G, k
函数模板使用示例:
4 F4 D1 x2 c& l; F4 K( s; f3 v0 n在以上那段代码的后面加上以下代码:- Q6 Q9 o' M3 x4 N
5 G6 x- u$ R5 j& r. s8 ?
7 Y- }( [& N+ Z% g* t/ E0 ^3 ]
3 i- @, |9 ]$ ~
程序代码:
+ w; I5 ]+ g& [. N
" a1 }# d3 f4 U#include<strstream>% d3 K% \7 j. F+ H; A9 {
#include<iostream>) s% j3 W( g/ G+ ?! X6 @
#include<string>' n0 F1 X% m2 L) @3 `! e; U' \# n
using namespace std;" |7 b6 t+ V, K' o, S
int main(void)3 N) D" x5 V4 G7 |
{
: l8 J& B' _) D( R8 u, I    string s1;" H7 L* A1 C' y. H  o. h" S
    while(cin>>s1)
/ A( m/ w! T0 @. H' j* y- b4 @    {- Q2 ]% L! V/ n/ M# Y9 L
        istrstream isin(s1.data());
4 R) R( z  E0 j        double d;/ Y- z" U2 \) f$ u( Y5 L
        if(fy_Exp::GetExpValue(isin, d))2 V1 r! E4 t% h# c# D6 l
        {
6 m; f7 f2 A: a/ l. L& S2 E            cout<<d<<endl;$ I+ J6 A; b1 X( _0 \, t
        }9 f# R& |4 L+ y2 A* T
        else
' k' s- A' y4 T" ]5 F        {  k* @+ j4 b( P0 d5 U! r
            cout<<"ERROR"<<endl;
2 K$ z( R8 p& w* e        }3 _; @  _& m( C5 c7 P$ }$ Q" I! R: c
    }1 C. d9 Y2 A% a3 O6 F4 U
    return 0;! Z4 ~0 a4 p* l9 ~) H+ H6 g
}
1 s! H6 A% B" [# g) d9 ^! n5 h
7 Z: \8 a  I: A) p1 u' [( U5 q: R
然后编译执行就可以了(*^_^*). d! t$ z* F5 x+ V
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 m! A: {2 B. \/ u      建议使用VC7或VC更高版本,或者使用GNU C++编译

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