返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,+ s+ C' L. b3 Y% |
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& a$ a. l1 u% B7 N
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 V! h2 W4 \3 b
参数解释:3 Z( L3 v. V) X; s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( G7 P6 ], l. _" I/ m+ |5 v7 PnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" j! M- R2 X$ _- R/ R返回值:
1 b9 t' K5 W! ~0 x: x返回非0表示计算成功,0表示计算失败有错误
1 @  {% P+ f8 L2 w! ?+ i% ~
$ T- u* m* y4 D$ J! _; w ; }4 N$ S$ E! U4 A3 J6 @+ c! S8 G1 R
3 w7 d4 }- ~4 H) z) }  k0 H9 K
程序代码:
1 Q- M3 D& `/ H  ]' A3 X+ p4 k/ L; Q7 P& r+ D; ^" o/ _
namespace fy_Exp{
# ^3 r8 L& X7 v1 V1 n  unamespace {template <class _T>- S1 m$ J6 r6 d1 U: X( A) k
inline _T GetExpValue(_T t[], char& csym){" G( I  }5 R* O' k- c9 P9 t  ?
    char c=csym; csym=0;
& B  X+ P5 P8 f$ y1 a* I! _# l    switch(c){
) _9 e( g( K+ v; }9 {: j" o    case '+':return t[0] += t[1];
: t2 A5 j. J* q3 j6 j4 q# w- a    case '-':return t[0] -= t[1];
! l, `- Z( X" E3 A5 A    case '*':return t[0] *= t[1];
1 H' \4 i; O4 b0 k; t. P- d    default: return t[0] /= t[1];//case '/':
! ^+ g% n# e; f# a! e    }
5 A: \% d, i+ x6 B: U9 E}}) g1 q8 p4 d" T) x2 C" z
template <class _T, class _Tstream>
$ r% S' S! d6 n) {! n" \/* _Tstream: inputstream, _T: get return value
3 E) t3 W" u( s! L* [4 v, [* Return nonzero if get value successfully */$ S. W7 t: N  e! [
int GetExpValue(_Tstream& istrin, _T& nReturn){# I% w! D. H, {; r3 S: Y: O: z% n
    _T t[3] = {0}; //雨中飞燕之作% I7 K( R9 K% m8 |" p. `4 D0 O
    char csym[3] = "++";
1 e" v: @" |% S# u# j5 _: U. n! @    int nLevel = 1, nERR = 0;
1 U# g. Z$ p( D6 E- L0 ~    if(!(istrin>>t[1]))istrin.clear();. y" L) ^; V' K" O7 Q, c0 i
    for(;;){
' s7 o6 B! }1 m4 o        if(istrin>>csym[2]){
# z9 P$ P+ Q. `5 X% _& V" u            switch(csym[2]){- _* z5 y7 a( n2 e+ ~
            case '(':
! L1 I8 a: {) O, n& p# [                if(!csym[1]){nLevel=0x100; nERR=1;}else
" L/ Z( Y* \  D4 y1 h) V: v: [- L                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' _* m- }3 v# X9 r1 d0 \  q+ v                else{nLevel=0x100; nERR=1;}
& U* ^! Z7 M$ {: A- v                break;( N( i. z5 o5 P3 B/ E0 ]
            case ')':* X1 M. K0 B/ e( Z
                {nLevel = 0x100;}break;' b  X, P. J  l( J5 p
            case '+':case '-':case '*':case '/':! b# z0 K0 b" R! m% ^- U' B
                {csym[nLevel++] = csym[2];}break;6 p# P: \9 o/ C7 r
            case ' ':case '\r':case '\n':case '\t':continue;
: r' m* o  ]% C            default:" L  X) U, D  H8 D# }9 a
                {nLevel=0x100; nERR=1;}/ u! F, K% d  T; }' V
            }
0 W0 G& ?+ \+ p/ F. Z$ W            if(nLevel==0x100)break;$ j+ x  Z$ i9 w* k
            if(nLevel&0x10 || istrin>>t[2]){
% U3 |, s/ }' Y' I9 Z9 F5 e2 K                nLevel &= 0xF;
2 L" ~0 j9 w  E7 ?                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 b1 x; n: L' I. t7 [
                if(csym[1]=='*'||csym[1]=='/'){
/ ~: X+ H* y7 E& P* \7 H' ^                    GetExpValue(t+1, csym[1]);
# q8 [& }- V  S% M0 Y% @, g                }
6 v& P  d1 j$ |* ?! z, Z                else{
4 T( c* z" N) q4 d                    GetExpValue(t, csym[0]);
- G% H3 \, N+ G- T+ ?                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
  P0 H) j  i# u% z! {5 K                }( e7 A7 r9 J% G5 K! t
                nLevel = 1;
: e7 b6 `% }5 @" Q& Q5 m1 c            }, M% T( g5 S- I1 b  e0 F
            else istrin.clear();1 a4 K0 ?% b- `/ f, Y/ w
        }
! J% p3 D+ z4 i: x( X# N& G, S' y2 \        else{nERR = -1; break;}
+ w( i: r+ v6 h" ?' `  x6 Y# B    }
( z4 N8 `  N( n0 M. U; T9 n- R    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 O+ s1 Y2 h2 i* m
    else nReturn=GetExpValue(t, csym[0]);
' f) h8 |, w! a: e" R0 \    return nERR==-1?1:0;5 {# W) i; @2 g& g
}}5 Y: D) R, Q$ h5 E' D
1 B* H. s" h  L6 ~6 I0 \/ U. N9 [

7 l6 L9 T5 s1 Q8 K  L
' k! N7 Q$ c6 v% ?1 Z$ I函数模板使用示例:) H0 o' L) k' F5 x/ z
在以上那段代码的后面加上以下代码:3 h6 g9 j+ f0 K8 h! R

6 C' e) ?) v  `2 }& e( d! V ; e3 ^" S( p0 H1 L4 Y1 w4 O

; @- d/ `- g6 W程序代码: $ L4 x0 v2 f9 K1 V( }% n, S! c
/ l! A; z( o# w. V
#include<strstream>
( a0 R9 ]2 }5 Q2 {1 v" `#include<iostream>
3 ~% ^0 B: a/ l9 Y6 z#include<string>/ z8 L+ p; T( i! J3 a
using namespace std;( G0 \+ J$ `7 K* |
int main(void)1 D& K2 `6 [+ g8 x8 d
{
" j& O4 o5 z5 o( W" E1 T    string s1;
# v7 c; w" Z( I; W    while(cin>>s1)
! p! B( w/ Z$ h3 o) d- t8 q3 c    {! B% c% O/ H7 @: A# ]9 g6 L
        istrstream isin(s1.data());* K# z" v3 Y! z5 I
        double d;
; t) ]/ a7 L/ b1 F6 R' v        if(fy_Exp::GetExpValue(isin, d))
! w1 ~+ ~+ G2 A% P        {2 V/ j* J" ?5 [0 r5 G7 o
            cout<<d<<endl;
* ], B5 i, E3 n7 H+ b        }; r6 w" G2 D. W# h/ P& p3 i$ a( K* w
        else1 l8 n4 F2 h/ o0 N$ V
        {
7 b) y. T' @1 j( Y& H! f            cout<<"ERROR"<<endl;: Y; K) K1 y! z# n
        }+ m# f, o9 t. {/ e% p* s
    }
5 H' S+ W3 N! m% \6 K& y8 ~    return 0;
; Q! d3 |% w  X- w* p}$ K+ R- g& k  K, H; |) p6 H

; ~2 {) z) S$ U5 F. @5 _! g3 ?* j, j
" Q; t6 A7 G$ U) |! T& m# _! u0 f然后编译执行就可以了(*^_^*)
7 j% r1 Q$ \4 C# k2 ~- z. G其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" ~, h8 X6 ~% m/ R1 D: E  X2 m7 S* v0 T      建议使用VC7或VC更高版本,或者使用GNU C++编译

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