返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
5 z" E9 {6 W. f0 O7 G一个很方便的函数模板,可以并且只可以计算含括号的四则表达式# i. E/ Z4 |' W8 K. s; g( M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ j+ x' P! U& n+ F) r, `参数解释:) j1 ]4 O  [' I$ y% x3 q( a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" N1 j' |4 z0 C4 X, n) X5 k  ?nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. L. c; o) n. v- A4 s6 ?
返回值:6 z. p, w; m8 n) M: m
返回非0表示计算成功,0表示计算失败有错误3 I! m7 o* V8 E1 z" U+ Z' h0 S" p
) a" k3 S7 E- s) ?# Y) ^

+ ]  u! i2 E8 k4 R0 n) i. B: k/ [! h
( X0 f' G6 G3 C- }; b程序代码:
9 k4 w$ H' w& W3 y: n; l( a
- `0 }( m6 F0 hnamespace fy_Exp{. n2 h3 S/ U% ~  S+ {
namespace {template <class _T>0 _$ k6 W4 [& w& e
inline _T GetExpValue(_T t[], char& csym){
- @5 ]/ T  ?. L1 l    char c=csym; csym=0;
9 a) |+ Q% S+ w6 ]" C1 B% U    switch(c){
7 E1 Q2 M1 v4 J* B# s) @# `    case '+':return t[0] += t[1];6 A7 d9 v+ K: o; N1 M, X4 \4 z0 v
    case '-':return t[0] -= t[1];
- W+ T" \4 g5 ^4 V: C    case '*':return t[0] *= t[1];9 e: v6 ~7 v) v
    default: return t[0] /= t[1];//case '/':
! O0 V1 t, b2 Q. x: k+ A    }2 Y# L9 H  H$ ^7 O
}}7 C% b% n! s9 ]2 N. `5 m8 B
template <class _T, class _Tstream>- `- X) c$ ^' ^' u- p
/* _Tstream: inputstream, _T: get return value
/ ]  L! w# B8 G8 u& k% L! o* Return nonzero if get value successfully */
% N4 ^. t2 p5 \int GetExpValue(_Tstream& istrin, _T& nReturn){
! s8 C  Z5 B' I    _T t[3] = {0}; //雨中飞燕之作" Z3 r4 H4 [5 t/ i9 g! a
    char csym[3] = "++";/ R; z' t$ y. a3 K+ H, X
    int nLevel = 1, nERR = 0;
( J0 p1 E; P+ r% q    if(!(istrin>>t[1]))istrin.clear();& H: i, }9 C* t9 s' U9 {( g
    for(;;){
) \# M; G8 i( u/ M# r' M- M        if(istrin>>csym[2]){
/ c+ u- D5 i; N: n- e- H            switch(csym[2]){
. C; a( s: V8 }" e: {            case '(':) T9 z+ z- U+ r" S5 J3 \
                if(!csym[1]){nLevel=0x100; nERR=1;}else$ o1 s! [( |' u9 }4 n) D" k
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 X1 O% A6 o0 E+ ?. _8 ~0 f4 ]                else{nLevel=0x100; nERR=1;}, x& K! N5 {5 Y7 ?
                break;
0 l4 r9 y  t- A% B4 l            case ')':
4 x5 O7 F  {. b0 }8 P                {nLevel = 0x100;}break;' G5 H+ _6 G1 e+ ]
            case '+':case '-':case '*':case '/':
* h, N) X5 u( ^3 m  I$ N                {csym[nLevel++] = csym[2];}break;( {/ L0 b, L$ u; B3 _, @/ j" _
            case ' ':case '\r':case '\n':case '\t':continue;! F5 M# _: K$ n. F! R5 z
            default:
) J5 w7 j7 x) I1 B! Q$ _8 \                {nLevel=0x100; nERR=1;}# x3 a/ G. ?7 W9 j' f8 R
            }' L. m9 `- t$ }
            if(nLevel==0x100)break;
5 {$ ^  b- c* V; Z! S( N            if(nLevel&0x10 || istrin>>t[2]){
2 g6 u" ^2 o4 q4 M2 u$ Q- t: B                nLevel &= 0xF;
( w1 G5 E" k6 s1 r* N6 G; X6 ~7 |                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 R' C4 a* b, D( Y! J0 l6 D
                if(csym[1]=='*'||csym[1]=='/'){$ ~( G7 G$ x; @' v
                    GetExpValue(t+1, csym[1]);
* }, W- G4 K/ o2 [                }4 |2 c/ s# i. x, [$ r! ~
                else{# y! ~9 e( w7 E. I9 I, i
                    GetExpValue(t, csym[0]);9 u, L1 T6 \5 F  b$ b: @  Z
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
( b0 M5 c' M6 f& g$ j0 }( K                }
. |! n  I* ^& ^& U                nLevel = 1;
: Z: F) o# f1 d7 ~            }6 ~! P: D" [3 h, e! z
            else istrin.clear();5 H* g5 c1 h& @2 e5 h& J
        }
! T) _6 {' n1 o        else{nERR = -1; break;}
2 Y+ Z# E/ X* O2 j$ }: i3 G    }
7 }$ j- Y- ~: J' j    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
! ]1 L, J3 ]0 h3 m    else nReturn=GetExpValue(t, csym[0]);
& L! w6 b5 N* v; q" C; L8 |    return nERR==-1?1:0;
0 Z% S* r0 {3 q5 \}}) x4 R( k! H1 I  c( @2 R* Z. U0 s
" H) R% s6 |. E0 @" N# \4 f
6 y$ m6 c7 z( g0 |4 _0 n
8 P% c: m  z( a& V* O
函数模板使用示例:
4 Y0 g$ Z+ r$ Y' \4 k" ^/ K$ y" @在以上那段代码的后面加上以下代码:6 _+ z$ a3 i; p$ S

8 ?9 ^. d$ F1 w2 o
. u  j5 e; l" g' s. N( e3 Y; W& ?4 L$ ?; @8 Y  R# }5 I, f. z
程序代码:
# ?7 k- Z7 y" A, r0 C3 r- t
6 E, H2 t$ d0 ]( I/ G#include<strstream>
( Q, Q; Q2 I/ W# [& \5 M#include<iostream>
- Q+ F% y0 V* |! E8 b#include<string>
! X2 F  l! Y8 Q0 nusing namespace std;0 N% ~4 K8 p! ~( b6 @
int main(void)
( J4 i# g0 I# R; b+ a5 B3 }, D0 Q{1 f) e; H+ c' k$ v- f
    string s1;
+ e; B; ^* v# z" Y8 _) O6 z2 Q$ A: s    while(cin>>s1)& e: a* {! m$ \' Q8 J# C$ H
    {
; r) O0 O5 G0 m* V) Q, w        istrstream isin(s1.data());
' f' v1 R/ _  |6 w' y        double d;2 z. Q. G# W% Z
        if(fy_Exp::GetExpValue(isin, d))- s* V1 e" S- N
        {
8 `5 s$ r8 l, W8 Y1 E7 f8 X            cout<<d<<endl;, V" l! X4 h7 l- S, u) r/ i2 o
        }' d8 X4 K- M8 j  @0 }/ t
        else  g+ J0 S- ~9 l" u6 L. G
        {$ m  y- Z* Q9 }& g: J" `
            cout<<"ERROR"<<endl;9 _2 B+ L' o7 ^$ L& j
        }1 e7 |) d* w2 R6 D' h6 i) ~! O
    }2 m0 n  c& j6 _: N: L) \
    return 0;, D8 ?! D- {& [0 [) W% K+ Z8 j2 g
}" }, s) r6 D( L4 G0 F) _

# P, m) Y+ t) q. H1 d2 B
. d( O) j+ |1 F  ^0 Q0 d4 u" n然后编译执行就可以了(*^_^*)7 c5 {" W* B3 g5 @" u5 f; ?% {/ d
其它:TC++上一定编译错误,不保证在VC6上也能通过编译: @/ }- g, g! e7 z
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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