返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
4 i; \# U- z2 B, Y一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 [3 ~0 b# J0 |! a0 l
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' J: v8 j8 [8 a, M5 g  Q
参数解释:' {3 K" L  J6 g7 T: z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ ]& N' x) R* w, G) g0 I! U) p5 K% DnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 T3 z3 W, \5 w& w6 U! O4 a" J返回值:
: r7 T' a6 X0 q5 g8 e1 a$ ^% d+ h返回非0表示计算成功,0表示计算失败有错误
# U' y: e9 S) ^3 V# H$ ~
6 F' X! c% e9 v- K" b. R
* w5 a3 ?. G8 H3 Q2 K$ k) J, `% R: w+ u5 u% D8 a; X
程序代码: / [8 K' m& H; {$ R3 e' i
3 I: R/ P2 ~/ L5 I8 W2 Q
namespace fy_Exp{
) h( X! O) W, Dnamespace {template <class _T>
" q* ]/ o% ~' T* n; ginline _T GetExpValue(_T t[], char& csym){: P/ O0 u. r) D# Z* K
    char c=csym; csym=0;( N% r; B# ?: H+ U+ Q8 h; F
    switch(c){
4 G* t8 Z' n2 `- @; }( B    case '+':return t[0] += t[1];5 t+ v* i& q; Z  w* |4 a0 e% X
    case '-':return t[0] -= t[1];; `0 N9 f6 I1 L7 }. v
    case '*':return t[0] *= t[1];
. u1 y8 J; z5 o8 C( U7 O% R    default: return t[0] /= t[1];//case '/':  B9 y  b, q9 \
    }( ]+ R7 f4 L5 B0 |$ C' S/ u8 q
}}; U4 a: c" o# m
template <class _T, class _Tstream>+ Q6 [4 s! y% q9 d/ N9 {9 h2 N+ P$ P
/* _Tstream: inputstream, _T: get return value
3 Q, u- g0 f$ |, t! {. o0 D. ^' a* Return nonzero if get value successfully */
9 I" \! t" D$ I3 @int GetExpValue(_Tstream& istrin, _T& nReturn){& J3 R' `+ w% J' U3 X( }/ M, V+ f
    _T t[3] = {0}; //雨中飞燕之作
4 c8 v4 N; H" G! d% ~, u  j    char csym[3] = "++";
& Y. d; u3 u: L) L# @& n  U9 a    int nLevel = 1, nERR = 0;
0 W- Q5 @0 B* {! x" m" x3 }    if(!(istrin>>t[1]))istrin.clear();
2 {3 \9 Q5 ^' Q3 g    for(;;){
% z7 M0 E' K- Q5 `8 f* ]( |6 Y        if(istrin>>csym[2]){
! S7 i- K/ o9 n5 w, j            switch(csym[2]){
7 i  t: @  s2 D1 Q! e6 j. G' {2 |3 b            case '(':
- {  K' N7 O* x/ D, u7 Q! S                if(!csym[1]){nLevel=0x100; nERR=1;}else2 u8 t& t4 e# a" h; P
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# j" W* Q' i* e, W; ^
                else{nLevel=0x100; nERR=1;}% _! ^% A' N6 b  K: d1 m; R
                break;2 \7 M1 ?9 X/ t& P" P
            case ')':5 ~; z; i' v, h: a7 J! \
                {nLevel = 0x100;}break;
& w& q' P  `+ F- B& }            case '+':case '-':case '*':case '/':
8 ^( z6 ]; T  m                {csym[nLevel++] = csym[2];}break;- b6 {; h% f5 q' T
            case ' ':case '\r':case '\n':case '\t':continue;
" x: o2 M& L# z8 M% ?6 C: M5 a            default:
  e1 a% @! ?# H, A0 b/ ?                {nLevel=0x100; nERR=1;}
, U, K" z2 J4 q7 O: }            }$ b4 s' g$ j5 m
            if(nLevel==0x100)break;
2 ]/ o  g: G& h9 P" {            if(nLevel&0x10 || istrin>>t[2]){# D% ]- q3 P2 W% W6 s
                nLevel &= 0xF;
1 [0 C0 I% k1 q" T4 L9 K. r4 f                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; _# J. p  }6 E1 J                if(csym[1]=='*'||csym[1]=='/'){
5 \" |9 d* b! E- M                    GetExpValue(t+1, csym[1]);
" w4 C5 D' a: g# R: ?* p; j( v, Y                }* ~6 p9 D( M3 m% b( F% A
                else{
+ l3 y4 j" P) o; A8 j. }9 m: b                    GetExpValue(t, csym[0]);! J: v$ N8 ?/ h! V
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 b/ c' x9 |! T$ t8 d% H+ B- m! c( d( _. A
                }0 \: ^  _1 C  r
                nLevel = 1;; a  q" Z) z0 [9 D) {
            }9 H4 a7 R" s  |& y" R. g
            else istrin.clear();4 A$ b& ]' p! j0 i
        }8 ?- u3 n8 t- ^; q3 Q2 g/ ?
        else{nERR = -1; break;}
# |6 V# s* I/ b) {" j3 l! X" e    }
1 o8 j6 a$ u& y% R6 V$ C; r- y( v    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
- I" f2 y7 y$ ~    else nReturn=GetExpValue(t, csym[0]);" A7 F- P% u1 I3 v$ F. I, P
    return nERR==-1?1:0;$ [; ]' g7 x, ^
}}" c' q( P4 n: ?+ D7 `% a
/ ?  r: |9 @0 x' j# }

* Y# t$ l& h2 M3 K. B  }6 A. Y" {( N6 M3 q+ b% S
函数模板使用示例:( z% W$ ?9 ^8 Q3 @
在以上那段代码的后面加上以下代码:
6 f+ w+ I; I# |$ }7 x6 |- Y, g
1 L9 s) j; L$ F5 b& t- K 6 r/ D  d# C1 R' ~7 N8 @8 Z4 j

% Q5 B1 O4 W+ S6 Y/ P程序代码:
; E7 @7 N( c  k8 X/ Z. e' }: M+ o
  R3 M. B+ b- e& b#include<strstream>. N3 I9 R/ h% u3 ^' v, x3 o' A7 s( e
#include<iostream>9 x3 g. p$ n, v7 ~% t! j. x: w
#include<string>
  a2 F3 Z0 T3 {; E/ X* ]6 K1 f5 iusing namespace std;0 `  P. Y1 r/ t" r7 u8 F" g
int main(void)% a" U$ L9 E' ?- C
{8 M- x5 s  ^! O/ K, q
    string s1;
5 n' W/ [+ j7 ~, z    while(cin>>s1)% T9 J( r: ?3 g' a  v4 M
    {
1 P% D$ X' ^: f# Z! l0 Q4 P4 F        istrstream isin(s1.data());/ M5 d6 u/ R7 e/ d: A
        double d;
' m& ^- x0 e1 l        if(fy_Exp::GetExpValue(isin, d))
1 f  h+ j! |# v& y$ w        {
6 v) g! I. |2 g) @2 m3 x, J6 _            cout<<d<<endl;
( T4 A" h4 D8 U1 G- p/ Y5 j$ z. D        }
* R" z* t5 Y1 d$ J1 M7 P* o4 ?  Y) G        else
/ D; p" S. V  g4 @6 {" G        {
6 n: @2 J: @! K            cout<<"ERROR"<<endl;
1 c" U6 c6 U! x2 A+ p( p        }
5 y- L1 i/ i' h' J# k7 l    }! R4 f6 t  Q* F+ Y
    return 0;3 }" p2 j4 R, k. t  d. Y
}
/ B% L# m* v1 U0 q* z; C( M8 k# ^; I4 W) _  ^* b  u

& o! l. B; v! E+ C然后编译执行就可以了(*^_^*)
0 N$ r: \/ x! G" d* e其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 V% e! p- j, B( D/ `+ O      建议使用VC7或VC更高版本,或者使用GNU C++编译

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