获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,0 W7 W3 y; B  l8 n$ A, s9 n
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' u5 y( Q' E) z$ I
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
7 h- s8 }: q, V9 C6 h+ M: g参数解释:
! q  P8 Q, e' N3 P: e# Ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流; [. e, }' U8 t8 c1 y6 L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' S7 v7 A$ y6 s; @% K4 x
返回值:7 Q' w$ F- Q( m" q' ^2 h
返回非0表示计算成功,0表示计算失败有错误
: r7 \; n0 G0 W9 n0 h& F; ]4 ]. g9 L& H- K: O) P

7 N9 y$ X5 e: d8 s2 M( C0 z! c% f0 d8 i9 J
程序代码: ; P. c& @# D3 R! r( L' ?. p1 `

& X2 I1 B. l6 D% D; t6 {namespace fy_Exp{+ N% Z0 ]' B, R+ }1 _5 S
namespace {template <class _T>
- C' d: X( h  |6 r  Ninline _T GetExpValue(_T t[], char& csym){
& [. B$ [% A$ ]! v- r8 p1 z5 \    char c=csym; csym=0;8 m+ z! q" X6 y
    switch(c){3 }# m+ g: Y& x
    case '+':return t[0] += t[1];9 c$ J) L( T/ B; R# p# g# J# J1 h
    case '-':return t[0] -= t[1];
9 p) `1 d* i8 |+ b, [5 C    case '*':return t[0] *= t[1];, z8 P% F! J; \& K
    default: return t[0] /= t[1];//case '/':" _4 ~( I8 B7 b; C& r6 f8 A
    }6 |  M9 J7 c1 A
}}
4 ~- E7 Q' X; t: G0 \( Y4 l  e! jtemplate <class _T, class _Tstream>  y' u3 |* O' v6 X& D2 F
/* _Tstream: inputstream, _T: get return value
4 q' |* d* c8 O0 o' s" y0 E6 k* Return nonzero if get value successfully */
+ a/ N6 Q" x5 H4 sint GetExpValue(_Tstream& istrin, _T& nReturn){. v" S! D( \! p6 a' B2 k
    _T t[3] = {0}; //雨中飞燕之作) R1 M/ E4 q3 |0 j  f9 [( T' h
    char csym[3] = "++";; I7 z: ~) i7 G
    int nLevel = 1, nERR = 0;
- r4 V$ @" m! @3 m5 U8 V" B0 [, y    if(!(istrin>>t[1]))istrin.clear();$ @; o" J+ ]& e; s
    for(;;){
4 ?# K% [/ b7 a& v        if(istrin>>csym[2]){
; x/ c  ]! F& M: u9 g' s& B+ {            switch(csym[2]){
: V7 |2 R+ l7 V) ]            case '(':
3 a' L, F( g- o4 y5 r' I' ^                if(!csym[1]){nLevel=0x100; nERR=1;}else
! W& p* ~5 a8 U: [. Y6 z: E9 o3 b                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% J# Z8 D/ |8 g) D1 O* f" H
                else{nLevel=0x100; nERR=1;}
( X/ L' f( f. U" a; j                break;
4 S% N% l6 X6 m0 P            case ')':
; j* C+ J) j, m; U) T                {nLevel = 0x100;}break;, L. Q5 e: ^0 e
            case '+':case '-':case '*':case '/':; c% h8 Q; K- y! R
                {csym[nLevel++] = csym[2];}break;
  d! ^0 v) o2 h0 m& h' w, Y            case ' ':case '\r':case '\n':case '\t':continue;
; }- P: Z3 ?) K2 S. }! Z, r            default:+ Y* ?; K8 q: P6 ~
                {nLevel=0x100; nERR=1;}. u/ l3 h$ f! M2 T* v
            }
/ q: }4 D9 b- C9 o7 s6 D. D1 V            if(nLevel==0x100)break;
* k0 h& V# p' f2 t# ?6 A% n            if(nLevel&0x10 || istrin>>t[2]){, L# {; T4 K  M3 p
                nLevel &= 0xF;
# f$ m* M; e; e8 N6 K                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
* F  V! i, X) q1 f. _1 R                if(csym[1]=='*'||csym[1]=='/'){
9 T# g3 m- ~$ D                    GetExpValue(t+1, csym[1]);
9 F$ b7 W: {; e' l8 N* m( D                }7 w1 f3 }1 u; P5 D
                else{
0 o# W  l  P+ Y, P8 Y$ t$ I1 F                    GetExpValue(t, csym[0]);
1 n2 @8 T% \* R                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 y$ t/ }5 r2 I! W
                }
+ _+ c' m- c2 c$ P- h9 [                nLevel = 1;! w5 |# N* r" m# v; c
            }' o) h. i# N8 ?
            else istrin.clear();
; c- L. B. f8 N" r. H        }
) m8 w# B' {% m' \$ `% d9 n        else{nERR = -1; break;}
' q. q# R) m% a- L    }4 J' t& H8 H8 T# }: I
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 S) \  W' K, C% X. \* A% A    else nReturn=GetExpValue(t, csym[0]);6 q5 t3 _/ d8 j2 `: R  E
    return nERR==-1?1:0;: z# h0 p& g, J7 q
}}. e; `4 d. g+ @% S% L; ?" ]
$ y4 _" p* F. @1 X$ Z7 ~
* q3 a0 k* A" F

9 T5 ]0 c1 g# M8 n; `函数模板使用示例:
8 V, V2 h# ?2 A/ O5 U+ e' H! i$ v在以上那段代码的后面加上以下代码:
/ O6 C( u4 {, N' F
$ X/ P3 n5 t% ?. H* S3 H
% s/ R& |/ F0 Y3 H0 v: S9 {6 Y5 z( p+ p9 b0 l' z% m3 U* _: S1 q
程序代码: % u! X& H% U3 y; M% j

: b+ |: p' j+ G: c' G#include<strstream>, Z8 n& N$ h, a2 Z% L0 d- d0 z* |
#include<iostream># q1 O7 d2 E: N) i
#include<string>" v9 G9 n9 c7 v6 X. c0 o* E0 I
using namespace std;
$ ?- d3 i9 O2 i3 G0 c; B5 Cint main(void). r+ `+ J, E& U
{
. {: N! H3 L/ J    string s1;' s1 \. V6 e& Y# a. P1 v2 X6 y
    while(cin>>s1)% q5 @  o* s8 i- M- I
    {
4 _4 h4 A4 h0 ^  v& e. b        istrstream isin(s1.data());8 K0 |' ~  `0 w, i* ^$ v
        double d;6 k, a) _- R" m1 t6 r
        if(fy_Exp::GetExpValue(isin, d))
1 g0 A5 v/ Y) R) ~        {7 M! Z+ n) C! s( I8 {
            cout<<d<<endl;
) ]. F* X$ [$ W9 S5 ]) L- C2 Z4 w        }- r0 Q* \; d. E* q8 k+ o
        else
$ X. V4 l& \. Q' {: g: Y' B8 N0 X: K' i        {
6 G: L% T2 a& u            cout<<"ERROR"<<endl;
5 J5 q# j8 r6 y        }: W6 V/ W2 @# @/ |7 z
    }% X% t" V7 q2 e5 ]8 C
    return 0;
+ M' J2 g7 q) B1 V5 g}4 v; F4 H& X% e* i
# E: ?; l  W! B

1 m" ?- r% d1 j8 q3 V, v然后编译执行就可以了(*^_^*)
' z& ?7 R2 r3 i其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ J! B2 I& `0 R6 r7 ?
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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