返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,9 O) F4 F  c  j
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) `0 ?1 B; n  g) J: l; g只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% b0 E- y! r) r5 ~( ^4 E' S5 ^参数解释:+ }# Z* K7 v9 O, w4 @2 d+ l
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 R3 s2 Z4 ^) t5 X0 ~7 O2 z5 JnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ |9 |1 K6 Q7 I3 x' b/ D返回值:
5 u( i: p4 `8 D( \( B返回非0表示计算成功,0表示计算失败有错误
& D9 N9 |3 a9 m& K: z7 L
1 d; E. ^  f+ c" o+ S
: x  r/ ?; Y& L, H2 w$ H3 `& P
+ ]0 w" c5 D9 U% P程序代码: 6 \3 @  _+ Z6 y# \9 d

7 @( N) z  `' B, m+ f5 Z0 b4 z( pnamespace fy_Exp{
1 ]: ^5 y8 [2 Y" ^; R0 [namespace {template <class _T>2 _  N& o3 T$ Y4 [
inline _T GetExpValue(_T t[], char& csym){
$ r$ [" p" P0 H" p# I4 y    char c=csym; csym=0;
$ g% O; T; R4 L% Y) \2 U    switch(c){
" V% t0 {7 s3 J7 r5 T7 D    case '+':return t[0] += t[1];
. b5 @% h, x6 U' r: L$ v8 z    case '-':return t[0] -= t[1];
" V$ E- Y2 I! x    case '*':return t[0] *= t[1];
. Y* G  |/ Y: ]: T7 D' D+ I( `    default: return t[0] /= t[1];//case '/':
; U( A  ~2 M. K    }
6 O1 b, h' z% O+ @5 R}}
5 `6 n/ N1 G  Qtemplate <class _T, class _Tstream>
" E" f- C/ O8 Z/ j6 K1 T2 y& i/* _Tstream: inputstream, _T: get return value. E* z% h. A/ k" f& e# E; W) P' P/ s$ Q) X
* Return nonzero if get value successfully */
0 x+ G2 @% T. z# g% ?int GetExpValue(_Tstream& istrin, _T& nReturn){  P" \$ O- c( m# R5 C. h
    _T t[3] = {0}; //雨中飞燕之作7 {1 \" G) `2 D5 Q5 Q
    char csym[3] = "++";  w: Y% A( F2 ~0 d6 C& J
    int nLevel = 1, nERR = 0;
' f$ J- T" i* v    if(!(istrin>>t[1]))istrin.clear();' @0 l6 u" Q9 ^# {- t9 l# _
    for(;;){
  F% p3 Q8 h7 V+ C( O, c        if(istrin>>csym[2]){
0 m; G. C, x. T& y            switch(csym[2]){
( M8 b* t: J& q# e( L- e* m% V            case '(':3 n% z( |, O& |! ?
                if(!csym[1]){nLevel=0x100; nERR=1;}else5 U0 V0 D8 R. ~/ I# c0 Z3 D# J
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# T4 H. F2 c" ]. l6 e: y1 u& t
                else{nLevel=0x100; nERR=1;}
$ X+ N4 p0 ~! T" j, I                break;: ]4 q. `2 W. `
            case ')':
$ n* j- ~1 s' ~" N$ E! h                {nLevel = 0x100;}break;
/ L! h; h6 \$ t+ J            case '+':case '-':case '*':case '/':  p# {# }8 _) [: `/ y" G, D. W7 c! b
                {csym[nLevel++] = csym[2];}break;- v: w, C+ i7 Y  K2 b% I+ X% Q
            case ' ':case '\r':case '\n':case '\t':continue;
5 f; C* Z& O  P2 `5 m* v  u1 Y            default:
- _; e" A  D0 l9 M* m                {nLevel=0x100; nERR=1;}3 i. {1 D" W( D9 x( X$ x! G
            }" l2 U6 G% c% [8 A1 O: P6 X& t
            if(nLevel==0x100)break;1 p  \2 ~) b6 q# O9 d2 N
            if(nLevel&0x10 || istrin>>t[2]){
8 _3 S# p& j9 \3 H: S                nLevel &= 0xF;4 o8 q9 D7 |+ p2 E% j( V+ K
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 z3 Z' E$ e& y, N                if(csym[1]=='*'||csym[1]=='/'){
) x5 k) J, N! w+ D: \$ s3 _                    GetExpValue(t+1, csym[1]);8 i- l' V0 V4 V: R7 v
                }8 A' a4 O- N. }2 W* k
                else{+ f2 R5 {' T  e8 R7 V6 h& n2 k  ~) t
                    GetExpValue(t, csym[0]);
: g1 ~* K2 A  P                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;# _6 j) \1 g; c2 b. J
                }$ K+ t% m$ x. }4 ~2 M
                nLevel = 1;3 s1 G$ ~+ k' s+ {# i
            }8 D0 f; C7 r4 P# e' H
            else istrin.clear();
9 s! e  L+ ^! {& N4 L4 b) s        }
& }1 w- ], C+ b) k! ^7 b$ o) k        else{nERR = -1; break;}; V/ x8 t6 @0 Y5 d( j+ I1 {
    }
( u$ B3 k* i; h3 }+ l8 |# P    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 v9 l' S# i" m2 P0 I) \
    else nReturn=GetExpValue(t, csym[0]);# j5 E* \/ R- M7 \! H$ `5 b
    return nERR==-1?1:0;5 T6 U7 s0 N1 m/ i, j7 a
}}6 S% ^% l! b+ D4 c; E5 T) F

- n" [; ~! ]) q4 e3 ?2 i4 b9 v

: n1 Z* C6 U* c' G函数模板使用示例:
* `: C- V" r8 M5 n) E在以上那段代码的后面加上以下代码:9 A' M8 \! N7 C
# ^. {; j& K6 {( g  N4 \

1 D0 s% ]$ I" `7 x* A: q
3 E' W/ n7 W2 B; a程序代码:
% ^# Z& T  L, D, x, p. y! x. N9 j% l# ~
#include<strstream>0 d1 [( d0 @  M0 W+ S  H7 P- g, H
#include<iostream>8 o, ~* C' Z$ i" a
#include<string>+ i" N  @( N: f% M+ Q( M& \
using namespace std;% L) p8 u' V) V9 Z$ m
int main(void)
& z4 r% }' V: q& b{2 B1 z$ M) _6 U8 `
    string s1;
$ d  \$ U# {0 z    while(cin>>s1)# @% r$ T4 b( E. p% H; E4 P
    {
3 l( g2 k5 v: Y, p' F, M7 C        istrstream isin(s1.data());
. k8 H/ y6 \* V. |8 T/ k        double d;0 _( c3 P* Q. n' \. U$ X+ [% D
        if(fy_Exp::GetExpValue(isin, d))0 p) _/ X8 e* K1 N1 Y. S8 c
        {, ], H: w% W- B$ A' u
            cout<<d<<endl;# [7 o/ i, J8 W, g& k6 Z
        }! M  O% X( F; @3 [
        else. n6 _* W9 X! G; k- S$ s5 A4 n
        {: P# |0 c" L' t0 H( p- h7 U
            cout<<"ERROR"<<endl;
) J; s* r8 U: B        }+ |: a, O" S! l
    }
# g2 J, v& y* J6 _    return 0;
( j; k7 G2 |% F1 N$ s' l. m. H}
8 C. n8 M  _) Z* t( ~6 t8 ]
9 A  G8 C3 O1 v; @& R' e  T* M# ~1 B# G2 L3 ]+ z5 M
然后编译执行就可以了(*^_^*)
, }6 K0 ?- `# n; {3 _$ X其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 t( S6 e4 e3 ?8 p0 |
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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