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

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

在9月8日那天我特意编写的,给大家分享的,6 n: w. ~$ z0 h9 O
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 L9 i" S3 `5 h, o  y只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 b: {0 o. A. E4 ~6 b7 G
参数解释:) s: L# N5 B) r8 f, Q$ ^' I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
9 m7 I, H0 u: T' P" @nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
, i, `: H9 ?# E+ P: m返回值:
2 J! f0 ?$ C1 D返回非0表示计算成功,0表示计算失败有错误
! P) w$ o' V$ f) d" P* \( _- \# a
/ e! `, d8 m+ W 3 ~* m$ d' A8 L, q/ m' P0 L
- j: q4 P2 ~, I  Q. R$ X: R  Q1 \
程序代码:
  r# E* N8 ^. c$ `' p& K  n8 m  ?+ R; E* h% m7 y
namespace fy_Exp{' ~& J0 p# g  X$ z! w
namespace {template <class _T>
- V- ^$ [3 }* X  R8 jinline _T GetExpValue(_T t[], char& csym){9 f$ s0 {2 F5 J. I9 d
    char c=csym; csym=0;5 e2 `: {# T& O0 C
    switch(c){
5 X3 h( g+ r& ]- }, o& y( q    case '+':return t[0] += t[1];
  P+ m* y# d4 J. Z2 ?    case '-':return t[0] -= t[1];$ s. z# }# K: \0 ~3 v+ d5 h
    case '*':return t[0] *= t[1];
: U# ^; A6 J% u    default: return t[0] /= t[1];//case '/':8 `$ K/ }  _( x$ l
    }3 \! r! e7 {6 k7 f; Q
}}
2 o& s2 b4 @- stemplate <class _T, class _Tstream>
% p3 b2 _5 z2 y$ I/* _Tstream: inputstream, _T: get return value
& o  ^2 D  i" {0 f9 c1 ]* Return nonzero if get value successfully */
/ i. |: [7 R$ a& B- B( f& a, g. M$ Oint GetExpValue(_Tstream& istrin, _T& nReturn){) D$ u% f- y: z6 E
    _T t[3] = {0}; //雨中飞燕之作; c2 {/ \- ?4 G3 O# ~$ \; J7 y
    char csym[3] = "++";
8 \+ u& L* O4 F" A3 N9 v4 @    int nLevel = 1, nERR = 0;
2 m/ O: C: U& u# D    if(!(istrin>>t[1]))istrin.clear();
" u1 m8 ?# o- R0 b    for(;;){5 A) a) w* c2 {, L3 }, i, s
        if(istrin>>csym[2]){: g6 s: f. c9 G3 E
            switch(csym[2]){* I& g" o3 N0 t/ q2 }, q3 ~
            case '(':6 z' t. d- s8 o7 R0 R
                if(!csym[1]){nLevel=0x100; nERR=1;}else+ @4 A7 i. ~$ a% {3 o' P7 d. K- l
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 G. k; n& A0 z, ?) b
                else{nLevel=0x100; nERR=1;}; l% f; W. t1 `
                break;2 t4 Z9 l) f! A: b) `
            case ')':
9 v: x& ~/ L) h" R$ @                {nLevel = 0x100;}break;
5 z$ O+ L) N2 c' L! f' O! \            case '+':case '-':case '*':case '/':6 X+ q, ~3 P( X1 g3 f  k
                {csym[nLevel++] = csym[2];}break;
/ t: I% N. L+ p- J  y            case ' ':case '\r':case '\n':case '\t':continue;
+ c  m/ K# x% F9 e8 X2 Z" W            default:
0 h6 g; C" @1 d9 I. [                {nLevel=0x100; nERR=1;}
. ~8 k- d; ]6 t# U! m( p) q6 N            }
1 R4 _! L. Q$ K  p" x: b" h6 s            if(nLevel==0x100)break;' ?# C# x' v  g
            if(nLevel&0x10 || istrin>>t[2]){7 t" @) }5 F1 `4 T
                nLevel &= 0xF;# N* K! b3 n/ Z2 i/ M- C
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. o. k, r: z4 F9 [5 j* |
                if(csym[1]=='*'||csym[1]=='/'){8 Y& ^3 X, P! A# ?8 y( |' y6 L- W
                    GetExpValue(t+1, csym[1]);; \# w& d; Y7 l. P- a# y
                }1 p: r' l4 a3 K
                else{! j4 |8 J1 O: C( h/ `. r
                    GetExpValue(t, csym[0]);
* S! c  x0 w. R# G. y! i3 U                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
% j: o0 Y0 X; i; B, ^1 O- K: E- ^                }
2 P  _2 ]: m, n4 ~5 ]' n% r                nLevel = 1;; O7 K. [" M1 I0 u& x5 v4 Y
            }' d0 J$ c# \4 X5 q, i8 W! T' i* J
            else istrin.clear();; L' N+ v% d% r' U! d  T
        }
/ f$ q  J! h+ w: f9 |2 K+ f3 Z        else{nERR = -1; break;}
, a$ e/ b3 @; [4 D1 g& @    }
+ w3 ]/ ^0 H9 \! T+ z9 G    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ k: s7 {1 N, P, H" k% @
    else nReturn=GetExpValue(t, csym[0]);
4 \: ~, \- k2 m0 v: z. |    return nERR==-1?1:0;
# V! N( g6 V  a$ O" y( A% M6 P) B}}
! j! H; k2 J: E1 o% M# e' f3 m0 w& T; o! S; F

( h( ~8 ], p# S
" C! ?: `/ \5 }; Y1 {, M3 _; i( g函数模板使用示例:# x% c) U* U" T3 T$ j
在以上那段代码的后面加上以下代码:! X1 P" y+ x- p+ x, r
+ \1 D4 e( l7 N5 M; _, I

+ W; N7 n! a3 ~2 S( L/ ?
9 ?9 Q' M5 Q8 c+ f+ J5 A程序代码: + \$ E  j% F5 p! o: \; E

) t0 @1 T; z+ e9 ?#include<strstream>
; B' J: M8 @! q5 d+ q# N/ E#include<iostream>9 t# `& s$ e# B& ]
#include<string>* `+ x% r' L! K% x+ |3 B
using namespace std;4 m; I4 g4 c* N
int main(void)
0 C( M2 L% z6 S{
' T7 a  r! T# Y, r    string s1;
% v3 k% G6 o' |# F( F4 h    while(cin>>s1)5 n' g; d2 a* \3 j7 f* {
    {- S# v1 g6 l9 J7 M# O3 F4 [
        istrstream isin(s1.data());8 I; R% E8 _  a/ f7 k
        double d;  D# \0 a; E8 m6 ^
        if(fy_Exp::GetExpValue(isin, d))
0 ~7 d: N3 n, F2 a        {& v9 N- o8 A# z; e
            cout<<d<<endl;& q3 |6 K" `* K+ |8 e$ {3 S* \
        }4 K" J+ p$ W) Y1 V
        else
1 T/ n" y" A8 E/ u9 r8 a& c" ~1 t        {& S# o  I- M$ w  _4 W+ [
            cout<<"ERROR"<<endl;- F6 D+ [; Z3 I7 u* u
        }( ?# g  p$ z+ B3 I! g% b# w; ^
    }
! M) o) R0 N5 |5 c0 L    return 0;
6 c, V4 p4 y: H' b/ [; F" Y}
* J& B* C, F3 T
. K" c+ x# O: {2 S2 r3 o0 i& R7 O* N+ l+ s7 z# ^
然后编译执行就可以了(*^_^*)
3 m3 L0 [9 \2 M) {6 U+ D& m7 F其它:TC++上一定编译错误,不保证在VC6上也能通过编译
- M. Q! `+ O5 h0 A      建议使用VC7或VC更高版本,或者使用GNU C++编译

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