返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
; _5 o0 S: Q; c9 f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' `0 r4 c' C: H2 C& [8 S: b
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)# d: f0 R3 H  l/ r: D: R
参数解释:
# B  B' o* I1 Sistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( ~2 g* f  j. Y# \- c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* C* b1 Y! w7 c7 f2 j- [
返回值:
$ \/ Z2 k8 t- z返回非0表示计算成功,0表示计算失败有错误
2 U9 k9 z2 D; Z4 i+ X$ h: d4 x8 D8 _# n' f

5 m5 E0 v0 D! c
; P: c! ^# K9 @( Y3 V5 Q% I程序代码:
) ]1 _. G3 }7 }- l8 R) k( a& h" |3 N
namespace fy_Exp{- x. ]  j8 ?: k. s0 c
namespace {template <class _T>1 R6 w2 E* U" i" i1 E! w
inline _T GetExpValue(_T t[], char& csym){8 j5 ^  W' m3 @
    char c=csym; csym=0;3 N. q# o0 _! I# o
    switch(c){- r% Y5 m9 X3 b4 R2 `5 [. K7 h4 ^
    case '+':return t[0] += t[1];2 P2 ]2 i0 S( s2 R& w
    case '-':return t[0] -= t[1];
. i, b+ N3 t, e+ q3 C; [: m4 C    case '*':return t[0] *= t[1];+ z- s+ Y0 i  ~2 {% Q) m# I2 r
    default: return t[0] /= t[1];//case '/':
# h* c) [8 S2 ]/ u    }7 L. f6 q) p; V! P- t9 `9 s) V5 F
}}
- Y3 G: k5 ~: S5 A2 j6 d5 b4 etemplate <class _T, class _Tstream>
* q2 a9 d& B$ L/* _Tstream: inputstream, _T: get return value: i0 U/ K9 n8 o3 i4 H
* Return nonzero if get value successfully */3 Z" M2 @  ?4 K( s
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 ?2 b. n" q7 H+ A* O( x    _T t[3] = {0}; //雨中飞燕之作3 @% O2 j! t( K+ e7 X/ k
    char csym[3] = "++";& ?# }4 i6 o- d; c5 y. C" Q
    int nLevel = 1, nERR = 0;1 h- T: c2 j3 x3 s- f
    if(!(istrin>>t[1]))istrin.clear();
3 P+ p7 l2 @. P" H4 P    for(;;){
& h7 T' c3 D& N' Y        if(istrin>>csym[2]){
; ]) z# D3 }2 V" Q6 \0 I2 A            switch(csym[2]){6 _# [9 s1 h$ z9 g" K8 K4 V/ M
            case '(':5 L" m* \1 m* G; M
                if(!csym[1]){nLevel=0x100; nERR=1;}else
# O# q" R* `& I+ J# t7 c" G                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 |) h- j. _; {. e                else{nLevel=0x100; nERR=1;}# e$ U9 T3 Q( R& F
                break;
% n2 B& C% G- Z3 E; p3 E8 B            case ')':
, m6 }) b  a- E3 @% O                {nLevel = 0x100;}break;
- l2 j! b6 `8 [            case '+':case '-':case '*':case '/':* q8 Q( V9 j6 a, D
                {csym[nLevel++] = csym[2];}break;& f" ?: J! Z5 K% D/ l+ ~  Z
            case ' ':case '\r':case '\n':case '\t':continue;3 b0 a& u$ D1 g! Z# s
            default:
. Y" r/ r5 T2 |3 @                {nLevel=0x100; nERR=1;}
# x! d' Q: r7 `            }* {0 H! H' J) {6 J; m, s
            if(nLevel==0x100)break;3 {- @* g9 a0 z; C
            if(nLevel&0x10 || istrin>>t[2]){
" w$ h% ]' ?/ K* V                nLevel &= 0xF;+ [# W4 `) S7 d  a7 j
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}5 e: h7 i7 t( ~5 e6 z% p
                if(csym[1]=='*'||csym[1]=='/'){
& R# r3 x: X/ k6 q+ ^                    GetExpValue(t+1, csym[1]);
0 T- H' w& V  C                }' |! h2 o3 ^" [: w
                else{- q" e5 [% M) ~. S: H+ A
                    GetExpValue(t, csym[0]);* }6 _! R( g8 P
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
  A- t! s5 a3 g" T# Y6 L                }5 |& |4 z8 B0 a' J
                nLevel = 1;/ f6 W9 O# i. L  }* e5 H" Z- b7 H
            }0 M% t! c, u% [1 \  d% z
            else istrin.clear();$ t$ C9 f7 W+ F1 @& J* W
        }
0 E. G/ s/ `; f! o        else{nERR = -1; break;}5 J- _- j" _& [* t4 \9 l
    }3 ~% z% j1 l' Y5 W# l
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 u# Z$ x5 d( k+ a8 J' _: ~: b
    else nReturn=GetExpValue(t, csym[0]);1 ~4 o0 T' ^6 |
    return nERR==-1?1:0;% N+ j8 \9 ~# U
}}8 T( J* H& r( @+ g% L
& C& Z) [4 @! N! y5 X

: e4 ?4 @/ s) C7 z( E  B0 i( `6 Q
函数模板使用示例:
- [2 |2 ^6 M9 D( C+ ]) h+ S" e在以上那段代码的后面加上以下代码:+ P% I5 O- Y5 p

' \3 z& z" U1 S" A 8 o6 h* u: z( L* e" E0 \$ _
6 j: k7 e& F: M: H
程序代码: ; O$ x7 x$ V3 w2 B% e

* G! o& i2 l: p7 Y! l1 Q#include<strstream>
6 }' {3 n- g" b) d7 G( `( @7 j$ E#include<iostream>5 Y0 B" n0 P* ]% P% g$ {
#include<string>
& h/ }3 ^0 d3 z5 x/ [6 [using namespace std;
6 r9 R0 h2 w/ i( ^int main(void)
, R- ^7 z3 ], H3 c9 B4 W6 t{2 i* Z3 W: d9 u3 m4 e
    string s1;
1 b, C8 Q: G0 c: }; H    while(cin>>s1)
6 p) D- A8 w6 c    {& A- u! _7 x7 N; s1 @. W" ~
        istrstream isin(s1.data());# }" f$ p4 G) w& p
        double d;6 R% S& d2 ^2 Q" b3 _" X
        if(fy_Exp::GetExpValue(isin, d))
2 E6 v% X" K8 o6 u) Q& C        {; i4 ~' T; u7 h
            cout<<d<<endl;5 k5 Q8 x) o/ S9 H7 T
        }, k5 o1 ?" o5 R  ~9 `% i
        else# _9 i5 r& n% u9 [' p, D" C1 _$ Q
        {
( H+ ]5 R2 K, i0 m( e0 q) k            cout<<"ERROR"<<endl;" I6 N0 y( k, _# E
        }
: k. v$ G2 d* _: x7 v6 b0 P/ b    }
- q, S, k' T# ?7 Z    return 0;% X1 p/ O1 ]  v9 c" {
}
1 K) b6 S6 W- T' n
* q( I$ p2 N' _% _4 T9 X# [! G" k; r- j3 j1 K' W: a
然后编译执行就可以了(*^_^*)% O3 _/ i) n# C
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: U, @$ w) h4 b6 \      建议使用VC7或VC更高版本,或者使用GNU C++编译

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