返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
) o' N% R( L7 {4 ^3 Z一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ u  ?4 C/ ]! ?, L
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ o( ^+ n  L8 X  w3 `7 w
参数解释:
3 w  X# D2 U! t% v4 yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ a6 _) Y8 v' z$ ~& X5 x1 \* c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' [' E2 }7 J7 l) w; w
返回值:
. X3 h. u  c3 \4 F: X" r9 Z$ n返回非0表示计算成功,0表示计算失败有错误
5 W' G$ u( R9 F3 V, v
; C8 T6 R' U& _+ s8 W2 `, M( z' y8 j
" z6 V7 _* `& j  D; ?
2 X+ Q; Y% ]8 b$ Q: y  n程序代码:
/ T1 G' W1 r2 q  Y1 n7 V" T& \5 `1 ^, w7 X1 e
namespace fy_Exp{
3 t# O: R$ {  p% X( Tnamespace {template <class _T>5 F- d/ z/ h2 t, s4 R6 n9 d5 |
inline _T GetExpValue(_T t[], char& csym){) f# ^! D& ]; m- X9 F% e5 D
    char c=csym; csym=0;) m5 V9 B+ h- y# |, X! ~# X/ \: ?
    switch(c){
# @. G5 V) O7 F    case '+':return t[0] += t[1];9 }& x/ m' p9 ]9 A
    case '-':return t[0] -= t[1];" D7 A# y. U3 m7 m% Y: [
    case '*':return t[0] *= t[1];  W5 B) g7 N' |
    default: return t[0] /= t[1];//case '/':
: D% P: g8 R: G7 L1 s" b2 {    }
: p* P4 B- L* q& M0 g}}
6 {; ^1 Q  p# f8 f; ~3 Ltemplate <class _T, class _Tstream>% R- ]: N. G) `# f4 e
/* _Tstream: inputstream, _T: get return value
( ?$ g; Z$ g/ O% G* Return nonzero if get value successfully */2 u4 Y! |) _! K* L6 u
int GetExpValue(_Tstream& istrin, _T& nReturn){
$ K+ Y$ q) l# [) g" k% n4 o, x6 g    _T t[3] = {0}; //雨中飞燕之作) @; v3 U1 R: |
    char csym[3] = "++";5 L1 e7 P! H6 o" ~
    int nLevel = 1, nERR = 0;7 c1 x4 T. {  {6 n7 s' \! w
    if(!(istrin>>t[1]))istrin.clear();% c" d# a. w* h7 N3 I# l( @9 u
    for(;;){
4 ^: m) `& Q& Z, W) N6 M) j* ]        if(istrin>>csym[2]){: B6 D. `* h, @
            switch(csym[2]){
& R! L5 ]+ L$ ]2 j: c3 w) a; l            case '(':; q! \! m# F8 o) [# D
                if(!csym[1]){nLevel=0x100; nERR=1;}else8 F0 }. H& E+ {( y! E( w* R
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;/ Z8 G7 v5 r# `2 |( _4 A" a
                else{nLevel=0x100; nERR=1;}: E' G  l6 R' r- ^5 p! P" @
                break;" e7 t' U' \- ?5 s
            case ')':
4 P" A' Q% s9 C5 t7 s4 L0 n                {nLevel = 0x100;}break;4 n2 K- ]' O/ ^3 c" R2 `6 i( s! ?9 {  F
            case '+':case '-':case '*':case '/':$ I' c( j5 _( a
                {csym[nLevel++] = csym[2];}break;. E5 R# f! D$ |" E. S3 \2 `  h
            case ' ':case '\r':case '\n':case '\t':continue;
& a+ C# d! a) m1 @4 F# }1 o) U            default:- S) w) F8 k3 b" d
                {nLevel=0x100; nERR=1;}% u$ e% V2 M2 K4 T
            }
! U2 N  f" l& i. u            if(nLevel==0x100)break;+ g  a9 ^7 E. o% I- G* h3 c' t
            if(nLevel&0x10 || istrin>>t[2]){: h) N9 V  C; M) Y2 ?* Q+ _
                nLevel &= 0xF;# C" `! ]; o  Z! X! e. J, J' P
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! }; t, X5 C8 L                if(csym[1]=='*'||csym[1]=='/'){
& ~3 I0 P6 Z9 T2 j0 z                    GetExpValue(t+1, csym[1]);
1 W  E& p/ M4 P3 l                }
2 d2 l4 U7 {' H. ?1 b) J                else{
; a- u# S- M2 v# ]4 i7 A* [                    GetExpValue(t, csym[0]);/ y& ?' t( L: R
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ p' D8 o  g( U                }
3 H4 E" M; r0 q% Z2 L                nLevel = 1;
& a% z) {6 T! S6 D            }
+ Z5 B# I# @+ K( T/ V5 ]            else istrin.clear();
+ p4 r, h+ Z* m        }
8 W+ d* n+ y+ n! j9 c        else{nERR = -1; break;}, _5 k. _& T3 }! S, J1 k
    }
: @" d: R( W- p    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: c3 ~8 K/ g1 C. Y+ b" e    else nReturn=GetExpValue(t, csym[0]);" b! A! q( C( b% s" C6 L. Q
    return nERR==-1?1:0;
( M2 w8 w; M3 {1 H+ T9 e# |}}
: Y& E# \- t6 K4 w$ M
4 u1 G4 R" m" {8 o, P4 C
; I; H( u4 q( D4 J1 |0 L% b7 S. a; d4 m2 j, L4 G
函数模板使用示例:4 k* m! o! W# @
在以上那段代码的后面加上以下代码:8 K, X$ g. k/ b; M+ \3 q3 T
; |% @8 @: i+ s
  x& i7 }- r/ T6 d; ~# k
! U5 [# [" l$ o& {, O& Y  b, F) c
程序代码:
9 b8 n$ _* H2 J: T  x- T
6 s( J! i1 a" D% i; m: I#include<strstream>
) P# Z3 S4 _5 G% F# @, D+ g#include<iostream>
; @, G- e% @' V" o) W- \#include<string>
* F* E- x8 ^6 I' F5 ]using namespace std;( y5 D+ n8 F+ Q3 z6 b
int main(void)6 d# ~! d' _  ^, B
{
' N/ H/ \* d$ {    string s1;0 G; F: V+ l* q
    while(cin>>s1)4 Q' S( ]* _4 f
    {
) E7 [1 v8 d# F        istrstream isin(s1.data());
$ Q% E$ o$ L& g  n0 @. E! i        double d;
% }3 \# p$ o* E( D        if(fy_Exp::GetExpValue(isin, d)), h* ^& i$ H  Q+ K/ j7 h! T; g
        {
# [% u/ m) |/ E& ^9 ~            cout<<d<<endl;/ c, @( G" J- }
        }- F0 X8 v) S" I# I/ |: e
        else/ W6 \6 q9 X5 `% q- l
        {
* M: a/ v5 h& ?1 o. j( w* l& b            cout<<"ERROR"<<endl;
7 S3 D1 c. o; Z% l( b        }; b: O& k; E! Z. ~/ `4 y
    }
: D, W8 d0 J9 B7 g3 L9 g" w8 S    return 0;& U' K5 C+ Q: O8 x- B
}# q( _5 i6 r" r

6 |6 y0 e* F- {) l# B# ^( A( ?
# G( @2 c8 y3 z2 G; v  ?4 G* x然后编译执行就可以了(*^_^*)' G, W% ^3 z9 k( Z! o
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ D4 G$ {. z8 D% h      建议使用VC7或VC更高版本,或者使用GNU C++编译

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