返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
, X& t4 C' B7 o一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' [+ k# F1 \. W  ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)  n9 i7 p" U+ K2 `& F: b. h" p+ N
参数解释:5 H3 l3 b$ L3 H2 U2 R& q* ?' G! F
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 h" {/ @8 t% x! @/ [
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ p- q$ a7 L9 \8 O+ W7 D& u' P返回值:
" n3 ?/ i# f/ B% L; d- M返回非0表示计算成功,0表示计算失败有错误
3 g; g# L. m/ z3 h/ J, u4 V2 v. e8 t

. h" h" Z1 ]6 d3 L6 B
2 q" t$ q' |/ l  F程序代码: 4 P" j' {5 e- ^% O1 i$ g
# X& b, Z; v9 r! Z' r' y. ^
namespace fy_Exp{
8 {3 g8 c. H9 c1 }3 b" Dnamespace {template <class _T>
8 H" D4 s+ J# M7 ^inline _T GetExpValue(_T t[], char& csym){8 s' f) `/ Q. p
    char c=csym; csym=0;0 V7 [/ G2 T0 X5 _& r
    switch(c){, X. V' o; B7 N/ }' c# o
    case '+':return t[0] += t[1];: b) A- t" l5 M+ C# [8 n
    case '-':return t[0] -= t[1];2 \# a7 z; T) k% h
    case '*':return t[0] *= t[1];) v; O  U- W& K5 O  Z
    default: return t[0] /= t[1];//case '/':
# [* q* |( e9 |5 u. g    }0 W) P: U. a% J( S8 x+ p- L
}}8 E% R1 Y8 B) b4 @$ C+ c
template <class _T, class _Tstream>/ k* a# @. k7 m: y* k
/* _Tstream: inputstream, _T: get return value+ f& E0 a0 s: Y* v, t; B6 }
* Return nonzero if get value successfully */0 D* m, n! Q& l* Q7 x
int GetExpValue(_Tstream& istrin, _T& nReturn){
6 `+ ~3 j! q  G: h    _T t[3] = {0}; //雨中飞燕之作0 E  R/ i8 F# R
    char csym[3] = "++";2 l# T- E" @: [1 i. m
    int nLevel = 1, nERR = 0;
* {  m' x4 U! q' R    if(!(istrin>>t[1]))istrin.clear();- E. a2 s1 z5 a# Z+ A7 N& Z1 V( Z$ b
    for(;;){
; p' C) D/ R" m6 S& \        if(istrin>>csym[2]){, C3 C1 g; v: a! p9 A* X9 ]7 y9 s
            switch(csym[2]){) k/ U( _% g! M6 i. x$ x* v; {
            case '(':" B! o; d3 P- [6 J- n, n
                if(!csym[1]){nLevel=0x100; nERR=1;}else. X1 P$ G, ]3 `/ b
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ o2 X/ ~. i: v+ N- f1 P                else{nLevel=0x100; nERR=1;}6 ~. B! U8 ]+ L3 x" L9 R# Z( `
                break;; I4 Y. c; J$ g1 f
            case ')':
: y$ X& W9 `1 L8 @                {nLevel = 0x100;}break;
- c* R3 w; U# X7 D7 P- ~. a            case '+':case '-':case '*':case '/':2 H/ A6 I, F6 C
                {csym[nLevel++] = csym[2];}break;
3 {7 ^5 f) ~! {$ w! U+ d2 V            case ' ':case '\r':case '\n':case '\t':continue;
( C/ w5 w: Y+ u            default:
; l& z8 S+ X& H: Y" o                {nLevel=0x100; nERR=1;}% |# Q0 D8 c. j% }  e
            }
% j& q2 r% d6 q            if(nLevel==0x100)break;. T# k) E; _3 h7 l$ m& j
            if(nLevel&0x10 || istrin>>t[2]){
3 ]4 L' g( O8 t) O, _  r                nLevel &= 0xF;
1 `4 f3 B- A# b. j8 x0 p8 e/ O                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
/ ?; M3 d! G4 J# R4 H) {1 @                if(csym[1]=='*'||csym[1]=='/'){& J  w% J7 k; H: D
                    GetExpValue(t+1, csym[1]);6 M9 M! a8 D) w" j% m
                }
# ^4 O4 d- G2 g2 _                else{0 f9 h' T9 _1 d9 l
                    GetExpValue(t, csym[0]);
! s6 t: N6 R% H" _. m; E: J                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 W5 v% H9 ~! C3 T% w
                }8 M/ d% ^; q- ~, y& Y- M
                nLevel = 1;
) K. v; A( ^# f  J! n! [. Y            }
. x* z# N8 [; O) ?& ^            else istrin.clear();
2 k9 u0 Y; R  ~" q$ V6 S        }
9 V6 h  o1 j+ h. o        else{nERR = -1; break;}
; l* b! p3 J7 [# K  U, c: Y, o) w0 M' c; c: K    }
* Y1 a3 q0 y8 x    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 S! _3 C) _" t. C& o- ~    else nReturn=GetExpValue(t, csym[0]);
' I% `* r, v$ J( D: y  J8 P; r) b! e    return nERR==-1?1:0;
( @! e* Z( l8 r}}( }( u/ k3 l7 n/ m& E

* E% [& @4 f( [$ c4 K# Q4 {, A( V  p" f1 `2 p0 f0 K

. N8 d7 O+ \0 H/ W函数模板使用示例:
4 c, V2 J, N8 h% L! L在以上那段代码的后面加上以下代码:
( V/ K3 t, b7 o1 e; f. k/ g3 v
+ t, u8 E% }2 J% S8 Z 5 F' u1 W+ S# w1 _8 T

  ?) |3 x* y9 D, \% c5 H程序代码:
& N! Y  R" n6 V- m( K0 L) @; F' x7 E  l
#include<strstream>2 d3 ?8 |; D( h. r6 P* ~' d1 O
#include<iostream>7 ]: {" I) K  W& x% u
#include<string>8 U. V" f; W# x, Z+ z. D
using namespace std;6 d. C2 @, _% s. y* y
int main(void)1 u& l& N0 O9 H  {
{
4 ]1 \; G6 g% \4 M- _) ?) G+ z    string s1;
' Y# v0 J' c6 z  \6 k    while(cin>>s1)$ o$ @; ~! S! }+ v# X& b; `
    {2 A" j6 E* N: u2 ]4 \+ L
        istrstream isin(s1.data());- }2 D: {& B( s+ J' M- y
        double d;
8 ?. e8 f1 l0 p" A1 ]) {& ^! @        if(fy_Exp::GetExpValue(isin, d))* P& q* c/ U4 B: ]  q$ P
        {$ }, G. |9 V+ z9 f/ W3 r+ w2 T
            cout<<d<<endl;3 {1 c1 e' y* E" S8 F  q
        }
. A0 G, F9 L( |/ F% o6 I        else; n* K% K, B3 g
        {
, V3 Y4 _0 w+ i& d3 H/ R            cout<<"ERROR"<<endl;( X0 a- f( z9 {2 ]
        }
* {$ |# [% w3 W) z6 W" p    }
- u3 t/ }( _6 \5 K7 c& W+ W" z    return 0;) a4 B8 b- r: n8 p  q7 [# v  Y
}
' k$ I/ H3 O$ Q  {0 i
; F6 [- j& E6 }1 k( J1 R# B& q6 ^, ~3 P
8 R8 @! d" l( W5 R然后编译执行就可以了(*^_^*)
8 @) t8 [3 t" ]7 X. k8 S" J其它:TC++上一定编译错误,不保证在VC6上也能通过编译# D/ |( e5 I! e( Q$ \1 v
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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