返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,7 k, @1 A- d0 w5 Z
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- T- X+ f% x/ Q, u  w7 D3 t1 {只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* a6 D% \2 s; D. [" ^7 d: q' {) k参数解释:
) F6 x: B* N- q" ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ e  v. y1 l, A: b" g
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 T7 v3 b, i2 ]
返回值:$ S. [1 M& \# V$ B" \* T
返回非0表示计算成功,0表示计算失败有错误
7 ?, R  _) b- T; S, I
# M7 x6 u' |+ ~ 4 k3 ?9 N1 O: G6 i, ?7 M) A2 O

8 a( x: }) T* p4 J; I& }7 @程序代码: 0 y  {$ V' v' u" Q7 L. H7 A/ s

( u& A  \# H! r, Gnamespace fy_Exp{1 S  k- Y7 o. D8 a
namespace {template <class _T>
$ [: `/ P- G1 a1 \% t# l. W# Dinline _T GetExpValue(_T t[], char& csym){6 `! p" ]$ q# r5 w" b  F8 Q! m
    char c=csym; csym=0;
% A: }" X' Q( ~. B/ j    switch(c){) |/ X; H) J7 @  v
    case '+':return t[0] += t[1];; O  ~# N. d5 U6 k
    case '-':return t[0] -= t[1];
% G! N+ J0 J! q' g* i* |    case '*':return t[0] *= t[1];
) u6 U) z* V5 Z8 R, \4 p    default: return t[0] /= t[1];//case '/':
) ]& ~1 J! s+ R: y2 y( M' e    }1 P: m  B* A8 S. U# E/ v8 E
}}
) i: F- t& k  e0 h2 y6 n$ Z$ r5 ~template <class _T, class _Tstream>0 ^& G/ _5 n# W: h3 m
/* _Tstream: inputstream, _T: get return value
" f, f; j  F+ o1 z* Return nonzero if get value successfully */
+ n: T& v& o1 e; t# S0 rint GetExpValue(_Tstream& istrin, _T& nReturn){9 I8 j0 G' T: q$ v
    _T t[3] = {0}; //雨中飞燕之作, q& c* N# a1 \) H
    char csym[3] = "++";
. C, z5 `* }. F" S3 F    int nLevel = 1, nERR = 0;' Y. M# L* S. [& e
    if(!(istrin>>t[1]))istrin.clear();# {) Y6 _( r3 A9 _' b( j3 X9 t
    for(;;){8 ^8 Y3 Y4 _6 I7 \, j
        if(istrin>>csym[2]){3 ^0 U) o5 N6 f$ h
            switch(csym[2]){
* T! _# L( j+ m8 t            case '(':2 z2 N# u  i* V1 N
                if(!csym[1]){nLevel=0x100; nERR=1;}else/ k' y5 f- V7 T6 ~% P
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- M3 j/ W9 {1 F0 `0 z  l4 G! s
                else{nLevel=0x100; nERR=1;}5 h  y5 E) _( q
                break;
* n% P$ @! t3 U$ b6 K            case ')':  U. f2 @/ l+ W7 L( d6 v( C
                {nLevel = 0x100;}break;/ m, Y# @5 C4 `# M& }
            case '+':case '-':case '*':case '/':$ @, y2 H5 B6 E/ W+ y0 I
                {csym[nLevel++] = csym[2];}break;% q% l; L1 J' {+ {! g% b) W* z4 r
            case ' ':case '\r':case '\n':case '\t':continue;
/ Q. I1 B3 J8 B9 c& z$ \, h& \( c            default:
4 m  k9 y8 C/ l                {nLevel=0x100; nERR=1;}" y- m/ y) O0 D0 B  n8 b
            }' o% y9 w) ^# I, w2 s* W  a2 s% z
            if(nLevel==0x100)break;
% w% \, D% a( m# S  ?+ u            if(nLevel&0x10 || istrin>>t[2]){
5 N2 K0 I& E+ ?9 w                nLevel &= 0xF;* E! m9 q8 [8 X6 @9 D- o4 M
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 O; s7 m! M6 P  R5 {                if(csym[1]=='*'||csym[1]=='/'){5 o# O2 C" w- K. E; u# D. a
                    GetExpValue(t+1, csym[1]);: ?4 E, N# ?# j( M7 o; d! K
                }
, b1 a& {+ Y! z                else{
% k) E2 d' e% k/ J* R& }- Z                    GetExpValue(t, csym[0]);5 X' _7 |$ {/ q% @6 I7 ?2 X
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 ?. X5 I# G/ |# Q                }
* W* |- R, p7 Y- R( d                nLevel = 1;
% u' A6 y: b+ I/ q4 k4 R8 p            }) t4 ?: J" ?' y8 B- M
            else istrin.clear();" O5 V( G# f$ U9 s- N- q2 O1 b( _
        }' d, d! V4 H5 n& @* U6 Y( p
        else{nERR = -1; break;}
% u+ l0 ^7 m! s- F; v' W    }" P! A; n. P2 Y- ]# Z' K0 P
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 ?# G' F( ?. y    else nReturn=GetExpValue(t, csym[0]);5 w* q# }# Q7 S* J7 |
    return nERR==-1?1:0;/ X7 M( c( P: ]' l- d
}}
1 P( i# d9 [6 A8 h- D; I+ x+ Z2 t3 `7 ^- M% k! H
( Z' N# f* D! f% S& c# k8 s
+ @& V1 j& _) q4 n+ F. C* I
函数模板使用示例:5 D9 R1 A- O/ U+ }: @3 A  w
在以上那段代码的后面加上以下代码:& [$ f# J3 m! X+ S8 M  P4 Y# `

. |+ B9 `3 ]6 k. F/ y0 @6 m - S; ], w/ d9 `+ p: F; f5 K  p9 z
7 r$ M6 R  o; [2 q+ W( C: M
程序代码: ( p# e) F0 T- ~4 h
7 l1 N& {0 Z* L  x; a0 b: z5 \
#include<strstream>! `2 H0 ~4 y7 I6 o" N
#include<iostream>. l- E4 a7 q6 t: s9 q) P) g
#include<string>
" r7 D" p8 s+ e8 I! Q7 Vusing namespace std;4 I1 Z$ q3 n! N$ X* \! S( \
int main(void)
  p. }% j' O7 |) U{
# [; \1 P+ W* @. \' R    string s1;3 p7 i) C, h% e6 O& e3 ]- C
    while(cin>>s1)* K& a: o! N) F* x5 R6 E% v
    {
, {: [9 a: |) J- L4 [1 ]        istrstream isin(s1.data());
# ]: w' m4 k5 A1 L7 N2 @        double d;& q: p" ~! D: M' O
        if(fy_Exp::GetExpValue(isin, d)). G+ y' g! z7 k7 S4 u; \8 a
        {7 z, N, X8 q  q2 V) M
            cout<<d<<endl;& J- N1 [$ s8 P0 U. W
        }4 Q, x) k" o) P" s
        else' z+ E  P$ U5 s2 t/ D& S
        {9 l1 h, x4 r0 C% N: M4 v4 c9 ?( Z
            cout<<"ERROR"<<endl;% r+ {! {* z6 |  ]  m
        }% R3 n7 J" [$ r2 L/ X
    }0 B  w8 b' L) B3 W& l( H
    return 0;/ |# m/ y3 X0 Z7 a
}
4 j1 S0 k2 U! Q6 Z  y
9 [' E% A3 o3 R, L/ X  g5 j9 E# s# {- u& H9 v2 k$ _  b  `
然后编译执行就可以了(*^_^*), _! j( F- ?! ~6 j- I0 K! C
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# S* H/ k$ T8 T) B* M( O0 ]9 F      建议使用VC7或VC更高版本,或者使用GNU C++编译

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