返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
/ ~  c, j8 R0 [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式% F' o: j0 `  C, y9 E6 P5 @2 P
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 c1 E; U+ l; u4 v; h: K
参数解释:
) i+ F" k5 N9 }istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& _( i$ y0 V5 ?% }# f( G. d. qnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ n' O+ T4 v) O2 [' {; D返回值:* y7 n) V- _7 Q
返回非0表示计算成功,0表示计算失败有错误
8 [" p1 I- t% t) L- }$ R
. H+ X4 U* n$ @& b! a/ d
; X+ a" Z3 ~8 {6 w
( k: X9 U8 z" b9 w8 c) ^9 e: }程序代码:
" y3 H* |& a, b. @" u8 f5 A
" t1 `  H; F& x9 w9 Anamespace fy_Exp{
# w7 g/ G( T' v4 }+ G! m' Anamespace {template <class _T>
& ^" \( p/ G, h, u% o5 I- Binline _T GetExpValue(_T t[], char& csym){
2 C8 w  _4 v% r. X. w7 E    char c=csym; csym=0;6 ?3 M# o5 ]- _/ ?/ u4 }8 [
    switch(c){: A! `8 ^. x- @0 L) p! ^# C& x! m
    case '+':return t[0] += t[1];/ }& K# O9 m' ^" d: y/ e: P
    case '-':return t[0] -= t[1];
. A8 b- f4 D3 {" t5 G0 L    case '*':return t[0] *= t[1];1 \; D7 }6 S! W
    default: return t[0] /= t[1];//case '/':* r) r$ r. [! D! w0 Z
    }
$ P0 j6 V+ {* ?3 G$ q8 `! f}}! q. u+ r. O+ x; c2 l% {1 t/ C6 W
template <class _T, class _Tstream>
( q( ]+ {& h% v2 L/* _Tstream: inputstream, _T: get return value
: _3 v3 I0 I* t3 D) `* Return nonzero if get value successfully */+ U. p8 z" m$ J# E4 M& Q  G
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 _' Z$ q  Y0 I9 F    _T t[3] = {0}; //雨中飞燕之作
3 f, s: j0 k- e" R; j    char csym[3] = "++";6 T5 _  \4 Z) v3 G8 k( G
    int nLevel = 1, nERR = 0;$ c6 Y" G5 ^% p# H! Z5 A% D: Q
    if(!(istrin>>t[1]))istrin.clear();" u& |% c- X; Z( O2 m
    for(;;){
8 k& h- L' j3 S8 }# x& s        if(istrin>>csym[2]){; u+ L: R5 j0 K6 I9 Q
            switch(csym[2]){4 a# O% X6 R. F' V( F- b$ o
            case '(':
% @  s0 C2 C+ u6 ~, H$ s                if(!csym[1]){nLevel=0x100; nERR=1;}else
& s) d: l& Z4 ~! k$ {6 @) C3 i# w                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;4 m4 W( }( B4 _( e) [
                else{nLevel=0x100; nERR=1;}2 N4 `8 h( J3 L4 N/ N: T" \
                break;) K" v: I: M# K& D4 t' N4 o, |& N& d
            case ')':& @' R% o; u: b1 j& f2 _
                {nLevel = 0x100;}break;
6 L- F. |3 @& X' ?5 D5 ~8 ?" l0 X            case '+':case '-':case '*':case '/':
& Z& M5 ], F) n4 X                {csym[nLevel++] = csym[2];}break;
+ k$ X) R- G! W9 ^7 E. F            case ' ':case '\r':case '\n':case '\t':continue;" K- Y" m3 c/ w! X; E$ m( C% R6 K
            default:
) U! ]3 |! k( p/ U5 S                {nLevel=0x100; nERR=1;}
$ ~7 n6 i' }# U            }8 h: z1 y9 [  f6 U4 [* d0 K& M
            if(nLevel==0x100)break;. h: c, x" c9 l5 A$ [4 I
            if(nLevel&0x10 || istrin>>t[2]){
3 b: E. l! O; I. _# H; @" a                nLevel &= 0xF;" m. p% O$ q$ l; b0 r+ C9 R
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}/ m/ v3 f% v* {, i$ k- [
                if(csym[1]=='*'||csym[1]=='/'){
2 v% A* a, u2 o, J1 ?$ v                    GetExpValue(t+1, csym[1]);
! Z+ Q) n3 N3 O                }! h' c: v) {( f; V* l. v
                else{) I8 ]: v" @$ @  {4 P
                    GetExpValue(t, csym[0]);" R+ C- q& P* u4 ]1 p
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;5 f8 z9 M- w$ z0 O3 A" p
                }2 R2 e  {, ?9 K! y# C+ Z
                nLevel = 1;8 q% Q2 x2 w$ {+ B
            }
$ e# o; m# _8 E* p            else istrin.clear();, C6 `4 e4 j  s8 h
        }
8 G( A5 ^5 W: x/ R        else{nERR = -1; break;}
. l2 Q4 D  Q# J& A! C    }* g4 I8 n5 v% x$ k) {; g
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, W2 F, r, g5 ?- I* l! l    else nReturn=GetExpValue(t, csym[0]);
( p% E6 g4 H1 c- j) u) C9 x! k! ?% Y    return nERR==-1?1:0;
# z. F3 |- E3 r5 n. J% B3 G}}! b  s9 N' e* E3 `6 h/ ?

2 v0 {' x3 H, j8 A* z/ R7 p3 \, g8 l$ m8 L
# M# Q' M6 T% B2 v. W; p; |: B, A
函数模板使用示例:
- t3 h1 E' b7 W4 n在以上那段代码的后面加上以下代码:
  Z1 b( B4 @; |& b/ B- O
6 {/ M% V& @% ?4 j9 x ( L% p' V4 f. y8 Q, F
# R$ C. N5 H6 E9 ~1 [. ~+ \
程序代码: : v1 t1 [- W% b' B% Y; R
  F5 S3 y( [4 @5 U2 f
#include<strstream>
" S4 b3 J# R& K# A  t, E#include<iostream>
  E' P& n$ u" P' K  }$ E; _1 G#include<string>+ P" O3 A& L( q+ k& `  r
using namespace std;
# u! Z2 k1 P8 cint main(void)$ H% ]* J! ^# ?; r. J' z6 w
{* i0 C0 c1 I( e
    string s1;
2 m; A$ j$ t4 Y. L$ Z6 H  t    while(cin>>s1)
7 S9 Q, k3 m4 F* |3 S0 f) r5 ^6 ?    {
# A' d. E' i* {1 U        istrstream isin(s1.data());
' r' w7 f7 k7 ]. S1 c$ d( {$ l        double d;
$ t) P) I* f, b/ q$ N        if(fy_Exp::GetExpValue(isin, d))
4 b; p3 u* s4 |% y) u: L' ~7 D        {3 e  _' a% r, w' o) |# d' X
            cout<<d<<endl;
% j8 X$ r2 c1 l  z1 n        }, L; ~6 N: P. y! x
        else
$ U- S5 J- e: t$ n        {" ~) G6 R* f) p% |0 l3 e
            cout<<"ERROR"<<endl;+ h, o) H! h. {# Z, s
        }
$ n- I0 T* f/ d* v    }
* p- d" ^8 i( V% [7 r" Z" }    return 0;
0 V( m3 G: k5 G# W8 d: n) f- i}
0 P5 ~1 g6 m: V8 L0 q( F. t
! E+ c& @/ e4 R2 z" R
# o, @$ e' m4 T7 D1 J然后编译执行就可以了(*^_^*)( Z! D, u: Q. N& P2 H1 A1 ]
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; H7 r5 A2 E' W" [- [# q* \" }2 a      建议使用VC7或VC更高版本,或者使用GNU C++编译

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