返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,. p: U* {  b5 W% y& x0 }
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% a/ c( E; a5 `$ x; C( F只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)  y3 x2 L: ~2 C! ^. R6 m
参数解释:2 `* y5 u1 f5 I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: Q/ ~! ]% I/ c5 `- h/ K
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定4 F5 |/ w; s# J% X0 w; Q
返回值:/ l! Z  z# v! w' R* E. U
返回非0表示计算成功,0表示计算失败有错误# \7 Z8 ]6 w; I5 s

: S" {$ b) V5 E6 V: r& P/ | 5 E' A& Z1 k& r% D1 D0 S
5 F8 }/ B2 }3 l& g. t
程序代码: & Z1 l8 f. x5 n( d1 v( Y  ?" k
1 ]+ Y& |* d5 g$ q3 b- F
namespace fy_Exp{# i' f* B2 J0 ], F  F
namespace {template <class _T>2 L' N: j$ \2 @3 R$ K" k
inline _T GetExpValue(_T t[], char& csym){
1 T' q( h+ v' t" q5 u    char c=csym; csym=0;
* Z( e; c8 @( {' s5 u    switch(c){
# w6 q' v1 K/ ?3 I) M$ h    case '+':return t[0] += t[1];* G& K& P8 j' d' l
    case '-':return t[0] -= t[1];
$ ]. R& L' O8 N5 E    case '*':return t[0] *= t[1];
% J$ G) H- W8 q4 y8 s7 E2 \    default: return t[0] /= t[1];//case '/':
: I6 j5 f7 g1 p% t" e. M    }5 l) \6 k) e4 K
}}2 g0 z; P" g' i' M/ E9 d
template <class _T, class _Tstream>
! f9 S7 G0 O! T; y+ N/* _Tstream: inputstream, _T: get return value
' N) \  \- @2 M  a% O+ s# i* Return nonzero if get value successfully */2 ^0 g  A. K* @$ J9 ^( P) R/ Q
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 X/ s! F( n( v5 U    _T t[3] = {0}; //雨中飞燕之作1 S: p9 z# {9 k' M" x
    char csym[3] = "++";
+ }- h6 ?- J9 |1 b4 n* e    int nLevel = 1, nERR = 0;
3 A9 H. `. d; N9 w0 p7 O    if(!(istrin>>t[1]))istrin.clear();
( a1 \/ d1 S1 M, j    for(;;){5 d6 [5 N% `6 R8 l
        if(istrin>>csym[2]){0 O6 M7 [% A$ m
            switch(csym[2]){
) z# t( u2 {- R5 J1 Z+ L            case '(':
9 m4 q+ A  e) `' D- T5 q$ i                if(!csym[1]){nLevel=0x100; nERR=1;}else2 T  |6 D! |" j6 [( i
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ ^% @" W8 V# o8 k% }                else{nLevel=0x100; nERR=1;}
6 ]- j  H! I7 Z9 |  r1 F                break;
8 B) H0 I, V' Z4 Y            case ')':  W& b2 v$ v; a/ m
                {nLevel = 0x100;}break;0 P* [+ }" r  I5 W* c
            case '+':case '-':case '*':case '/':. ~, c& q6 p1 ], ^
                {csym[nLevel++] = csym[2];}break;, Z4 f# [' x3 m
            case ' ':case '\r':case '\n':case '\t':continue;  L4 |. C$ C" m7 D
            default:& q# p$ L8 P+ l" a
                {nLevel=0x100; nERR=1;}& [0 V$ H' C; {0 t" H3 s
            }5 V9 k- k, j* ~/ \2 m, p4 ?
            if(nLevel==0x100)break;
. |$ n/ s* M' E& a8 C1 l            if(nLevel&0x10 || istrin>>t[2]){5 e4 g0 [+ d' k1 |, C8 q2 t2 [5 o3 F
                nLevel &= 0xF;4 |8 f4 ~" `: ?9 G9 b  o# ^% J% O
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 f" E5 y  `$ A1 O1 `0 l. D- u
                if(csym[1]=='*'||csym[1]=='/'){
; v+ e9 O) s8 D4 z8 p7 E9 ?                    GetExpValue(t+1, csym[1]);4 |& D% K0 _" X2 U
                }
0 m! t$ ~) `* e  K7 D                else{
/ d+ C# `! f' a5 A3 q# X                    GetExpValue(t, csym[0]);$ Y0 k& O1 ~) m& ]/ N/ L
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ T5 R: F, `' b; I6 Q' S6 h                }
$ e& v! g6 E% o2 o                nLevel = 1;
3 [% ^/ X; s0 {            }
) p* n. X) o% Z8 N  s            else istrin.clear();7 V1 y+ y2 v, w, ^. l1 ]8 X
        }( l" W& f& ?# [# f: Y$ ^! M6 B
        else{nERR = -1; break;}. Q; }& G0 ]% |0 |$ F
    }1 [( v, e  [3 {1 o6 N
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 V* k+ Z; F) F9 k0 k0 j9 b( z
    else nReturn=GetExpValue(t, csym[0]);5 z2 ~5 p  W  d4 L
    return nERR==-1?1:0;
" s5 I* T; p, `& @7 r& D}}
( U2 d1 v9 x. f' Q2 }8 R: a% _& R; L
# L* |& H$ D! z; A; m7 b2 ~/ T

3 }7 q( o- q4 M6 A/ ~0 V函数模板使用示例:+ a# R, Z/ B0 r% t
在以上那段代码的后面加上以下代码:
& a+ c. r( ]: b) c# N) j, R  ~
( l# {5 q% I2 v7 v & B3 V& `4 g' X# {) j7 a
& N! u; K4 I2 Y9 q4 j  x( M9 y
程序代码: 5 U0 S* [" s" \; S6 a: ]

& R% D/ C% P+ @( E. o& P- K#include<strstream>
% W! p3 W, j/ n! [9 a#include<iostream>
! M; v( q' V& `6 I#include<string>8 I6 l/ Y) M3 N% N4 _
using namespace std;
7 N0 h3 P$ r) Y. M' A* m5 Hint main(void)7 _8 ~; T( Z1 m9 B$ m: E( J
{( M2 [+ |: u' h( G
    string s1;* Z6 {+ i" m0 N2 M* I5 F( \
    while(cin>>s1)3 I4 m3 n% ^% Y4 {3 o
    {
7 n7 x5 {) l! E# t$ O% a$ a0 `  b( O        istrstream isin(s1.data());2 f& ]0 W' v! P0 U& e, L
        double d;
: K! w2 Z: z! P" y( R1 C0 A  U        if(fy_Exp::GetExpValue(isin, d))
/ }" a# t7 I) @        {
. r3 D0 g6 D. M8 k" k2 ?            cout<<d<<endl;6 R! Z, ]/ b  j  [6 t* t. Z
        }# |9 ~' H( P6 A' }5 S
        else
# R, l, L1 n. B0 G5 Y! K        {9 v, X: b' M/ r0 m
            cout<<"ERROR"<<endl;
% A8 Q2 M! @, V3 O; W5 M        }
' v, V; F( r- }  m    }. U8 i+ u6 H% R5 H( X$ G3 @3 I: l
    return 0;0 ?! B9 |5 z2 E( Q# g
}
1 s8 A* Z& W) t4 ?1 ]- L" p6 w9 j# a% f# \, v

5 {' _, O, p0 f: B然后编译执行就可以了(*^_^*)6 v" u2 \2 i1 x% r) r8 D$ O+ ]% w
其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ D3 ^  K+ \" Z
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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