获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
$ X1 i+ B6 u3 C& T2 E一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 F$ p6 ?' c1 Z0 E只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( R6 f1 M$ q. y% ~2 m
参数解释:  n, N. r9 A9 D- J3 ]& I* T
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 ?) A1 h$ {9 K7 U- |) S, W
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( ^; l4 v1 L) ]2 k6 f& E% s8 J
返回值:
" r2 Y5 I9 Q6 X9 @; f; G1 B/ q$ C返回非0表示计算成功,0表示计算失败有错误3 J' O$ K3 v* h4 m5 b8 d
) Y( w' d/ `& Q3 F# \

- o; l( }1 T: E; e5 {5 \& W$ Q% }4 q; {" M8 E
程序代码: 6 v. Z* c0 L- O. r. p

% J0 l7 G# M3 I% m5 P% W0 a) xnamespace fy_Exp{5 l& f! A2 `# n. K# U. G, |
namespace {template <class _T># P9 f" L  T. m+ P, u% c
inline _T GetExpValue(_T t[], char& csym){
( \4 B2 u5 Q. A3 H/ ]2 b% v/ O7 C    char c=csym; csym=0;- u3 Q  T, g" N( e, y
    switch(c){
$ h- f8 P! Q& j) D    case '+':return t[0] += t[1];
8 u" a4 O" e0 b4 r. W2 {9 p2 v    case '-':return t[0] -= t[1];3 h2 Y0 ^0 B( x* S5 q: }/ l
    case '*':return t[0] *= t[1];3 _, E) L3 Y1 b( [3 ?: R! x- \' w
    default: return t[0] /= t[1];//case '/':, q- `* R3 {9 e( q) B" ?9 r# G
    }* r; c) Q/ h0 m9 q3 \. h
}}
% f9 D! N% ^+ o( Q+ j9 [! Atemplate <class _T, class _Tstream>! `4 y0 T4 g" V" s- f7 j
/* _Tstream: inputstream, _T: get return value3 Z/ d6 ]7 O' z4 G/ r6 P0 F9 F
* Return nonzero if get value successfully */- ~7 {' m) C) d  P
int GetExpValue(_Tstream& istrin, _T& nReturn){) Z1 @5 K! T- G$ w' T6 {2 v/ ?
    _T t[3] = {0}; //雨中飞燕之作& \5 {/ h5 Q8 I0 W1 l( a# g" P
    char csym[3] = "++";# k0 T0 d4 J4 P* H! h  C4 ?' ^
    int nLevel = 1, nERR = 0;8 P; t! Z! K# q5 B& @
    if(!(istrin>>t[1]))istrin.clear();
# @0 _5 a& }# I* ~% \9 `2 _    for(;;){
: A  }& t' ^; H( R        if(istrin>>csym[2]){
, w8 H- z% X( Z1 Y6 e, ~            switch(csym[2]){
; I2 I6 q) n# R! N9 \+ o8 }            case '(':0 W) Q. O% O. g# i
                if(!csym[1]){nLevel=0x100; nERR=1;}else- d4 |' U% P0 a$ J1 u
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;$ J4 l3 n3 U4 x. t9 d+ F
                else{nLevel=0x100; nERR=1;}
* ?! `( E. O) [6 S3 K                break;/ Q8 M/ H" N5 g; N* u7 n0 x
            case ')':% o9 r8 {. f& `0 d* b
                {nLevel = 0x100;}break;! x6 I+ [6 x: P! s* x: y: `
            case '+':case '-':case '*':case '/':+ f; }7 X+ a4 U6 l
                {csym[nLevel++] = csym[2];}break;
4 `8 ^% u8 F1 Q, j            case ' ':case '\r':case '\n':case '\t':continue;/ x  j& p; c2 j) m& y
            default:" s" C9 X' ]. m! e$ o
                {nLevel=0x100; nERR=1;}
  I6 l# G7 x7 _* T            }& D# T( w7 |, W. x3 x6 q
            if(nLevel==0x100)break;* e* G( p$ S9 n5 `+ n* \: D
            if(nLevel&0x10 || istrin>>t[2]){- \/ f0 i6 }6 Q; k0 [' o
                nLevel &= 0xF;# ~/ D$ @+ J! o3 K# f& t
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- z  d5 H' I' E) m3 M7 h( q" `                if(csym[1]=='*'||csym[1]=='/'){! F4 ~, v9 j& b& m% A# `
                    GetExpValue(t+1, csym[1]);% R1 i- H% j5 _4 R  _4 ?8 Z/ y" P
                }5 r" a$ I2 ]- t7 p% @6 Z5 K
                else{
' b+ ]; z: E& [  B7 }- W. t                    GetExpValue(t, csym[0]);& P& q6 Z9 ]9 o$ U* C
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;" B- R- I8 J3 D1 c0 T# O4 D& E
                }
9 r3 j0 e1 u  U1 e8 s                nLevel = 1;
& i- [# [- d. q            }
7 m$ N+ ~- c+ t; ?8 C  `- l. R            else istrin.clear();! `3 ~! w! d4 A4 q9 A+ `& `
        }: l; M7 X: \+ c9 s0 Q) P5 q* k3 h! H
        else{nERR = -1; break;}
7 t. v  v6 y/ }7 V3 D7 V    }6 h% N3 I0 W' }( Q; E
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 c+ l" q9 B  t# W
    else nReturn=GetExpValue(t, csym[0]);7 T. Z0 ~" a' M7 q' [! i' k" W
    return nERR==-1?1:0;  |0 I  H+ p$ ]! x/ {8 P
}}2 H  m0 [7 F7 K  o. T
7 Q) y6 V- l$ P6 V- z4 l& u

6 L' N6 |0 S3 @4 K2 Z9 u, z8 _2 f; }( |
函数模板使用示例:& h5 S5 Q5 h& S
在以上那段代码的后面加上以下代码:1 J' w% w) J. q6 _  o
2 M6 ?6 ]# d3 c( v* a* F; D

# r8 i& d0 Q% ~6 b
% A; [' c2 J) s! p( h程序代码: : a- @0 l  _/ h& Z/ S: D* Y, }

, v5 ?4 e) W) ]) m#include<strstream>
3 ^: o; `$ X9 Q1 W8 Z3 C# y( v#include<iostream>, \2 X: O' R# ]
#include<string>
. ?0 f8 p4 W' B& ]using namespace std;8 r, k6 p7 p* Q' B% G% d- ^
int main(void)+ b/ x. J8 N$ d+ M% p% z/ q
{& {' X- m# Z/ b  I9 Y+ Q/ |
    string s1;6 R* T& b& B5 ^4 q' r+ Q
    while(cin>>s1); j/ N* E7 ]& J9 a
    {
( u) l- l0 N! G0 S  C, {) F" L        istrstream isin(s1.data());$ z1 R. `1 ?& b/ r; N
        double d;
' k8 k. n5 G* _6 N        if(fy_Exp::GetExpValue(isin, d)); G+ F5 A* S( {6 B# M* e/ d
        {
" I9 {! l, K/ R" G# c1 H            cout<<d<<endl;/ q0 z" G8 O- f5 W- S
        }
  q& [4 a: |" F' I# A        else
8 y; y5 Y# c! p1 q        {
0 D% w$ C6 K0 f. i; ^( O9 l            cout<<"ERROR"<<endl;7 x6 l, Q# e: R- v' ^
        }6 x" g3 @" F9 @  ?1 m
    }: X2 k% m* `8 U4 I! ^4 [
    return 0;1 @* U* i  r; A* \! E0 u6 L" n4 G
}5 E+ S1 ?+ _+ P9 n+ S
) y& U) g4 @; @6 i& c( s

( g  F. w1 ^" o. ]然后编译执行就可以了(*^_^*)! r3 G" c, i$ C2 t+ U
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
  X7 S, ^2 Y: X. |6 u      建议使用VC7或VC更高版本,或者使用GNU C++编译

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