返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,* H' f4 O" y( F7 W$ u. D0 p
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ ?  V- ]& Q9 W. f- b: L/ A4 L
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 ?& j! l3 ?6 ~: y
参数解释:
5 z" g9 u- i( I: g( i* _5 |istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% p4 b  V( y+ k6 _/ \2 i
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
2 I% c" P' }& v% C! C6 f/ d9 [: b返回值:
2 k* `9 R; ?; k: ~/ H1 r返回非0表示计算成功,0表示计算失败有错误
0 [# R' z2 _) V% i1 ~2 V2 S  e5 g6 g' g: t) O: r
9 x3 `' K& q8 p7 e! t

% X+ p" X/ N+ S# `, R程序代码:
+ \/ Q% v! G; a2 m1 \0 y5 P+ W; e' k1 X5 x$ z9 ?
namespace fy_Exp{! _9 w) @& ?; |
namespace {template <class _T>
) y" n" w; A- }$ Iinline _T GetExpValue(_T t[], char& csym){7 K; D# ^3 k% c0 l" p& b( g
    char c=csym; csym=0;
4 c4 p+ f' U2 U* O    switch(c){
' R- Q" h  O! q3 D( ]5 z    case '+':return t[0] += t[1];
4 X4 l5 T2 r3 e" i) F    case '-':return t[0] -= t[1];
8 \  J( u! J- v3 S    case '*':return t[0] *= t[1];
1 q$ E! ~) D# l6 ^! f' A2 P    default: return t[0] /= t[1];//case '/':' Z# f5 p1 g8 S$ d% G
    }5 [8 \. b0 ~7 i& G( {' g; }
}}5 Y4 e4 ^1 ^+ s  l% n
template <class _T, class _Tstream>; R' ^1 G+ ~% D) F2 i1 J- U) x8 I0 d" v
/* _Tstream: inputstream, _T: get return value% b# N. V; _6 d, ?
* Return nonzero if get value successfully */
) w7 P! g7 s. `0 ?int GetExpValue(_Tstream& istrin, _T& nReturn){
. o. K. h6 C- a3 A% U+ x( ~    _T t[3] = {0}; //雨中飞燕之作
( \" t4 n. B; L$ X! i4 Z! e7 s    char csym[3] = "++";9 S$ q( v2 T  L! T; x
    int nLevel = 1, nERR = 0;
; X. p* V3 U% \  _, c    if(!(istrin>>t[1]))istrin.clear();
: v3 N3 g( U7 ?/ V; a: ?1 u    for(;;){
' r3 O- N, n5 m( e# }        if(istrin>>csym[2]){
. q5 i& F6 S5 g. d. Z; e' O( k            switch(csym[2]){
6 A' Y' _$ x+ f0 ^; |( Q            case '(':) Q0 R" i$ f' [) G
                if(!csym[1]){nLevel=0x100; nERR=1;}else
& Y( C% x% \8 P# d+ f                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: b/ }& l$ A+ I% W9 b# V                else{nLevel=0x100; nERR=1;}0 D+ y( F! D% t: o' T# h' s- X
                break;
, y* x5 ~6 _5 |; [' h% \" X" f            case ')':
4 C: f0 c/ X7 c  ?                {nLevel = 0x100;}break;
2 @, A4 S& |7 h* s            case '+':case '-':case '*':case '/':
9 s- P5 q# o% y3 P& S9 ~) X                {csym[nLevel++] = csym[2];}break;
" C" _7 U- w" I) [: y2 q            case ' ':case '\r':case '\n':case '\t':continue;+ H, s1 Q6 F2 y' a
            default:
4 y8 b4 x$ z0 ^. [                {nLevel=0x100; nERR=1;}
: Y3 g  n% o' ~7 v            }
8 z# J+ E3 |# D) f- ]; q1 U, y0 d            if(nLevel==0x100)break;
  \# s& B& a; J8 E5 i            if(nLevel&0x10 || istrin>>t[2]){
& `" F0 o3 l7 q' O0 ]" x                nLevel &= 0xF;) r3 ]8 |  ~5 ^( j3 _! |% L
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" W. K5 W9 _* z4 k8 P" ^                if(csym[1]=='*'||csym[1]=='/'){
  S( i4 a" Q% H& ^) L" X, W                    GetExpValue(t+1, csym[1]);
3 d& D0 V  V7 ?4 I( F; N                }
9 Y2 a2 s- _7 ?" ^                else{
9 c! z6 j! r: f; X5 C                    GetExpValue(t, csym[0]);
  R( I& \# S# s4 U: S4 ~, m                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 O( H% `- w0 m( Q7 `                }
( X! ~  g6 o/ y4 L                nLevel = 1;
- s% }# i( z. Q' X4 M            }' J) X; ~8 d. w* i7 e2 H
            else istrin.clear();1 j$ J1 _8 o' a
        }
* R% L, ?- \/ m+ n. Y! k. r        else{nERR = -1; break;}
, m+ \# Z6 m* M! m& w0 m    }
! A9 _* w; B: V3 \4 u$ [    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 v# H/ r6 |- R# b    else nReturn=GetExpValue(t, csym[0]);
" E9 P7 ^; d  G+ _* D    return nERR==-1?1:0;! @" f8 E4 N( m& d7 k% M& v' H
}}4 c- t1 U/ B" z+ C! s# L
: R3 g) P9 u/ c9 y2 h

1 _/ @6 a8 J3 T5 ?$ j/ _3 B/ U
# a7 ?5 x& T9 n! W. M7 d; U8 d函数模板使用示例:
$ p) U% u9 g' H( ?: B/ m9 o; A) S在以上那段代码的后面加上以下代码:
. d' f6 @7 X3 A( D6 g, z; h& X( H  _, K; t. ^
" K. T/ k+ [, _* J1 q5 K: z# e
. Z6 T5 _; U$ b# y$ w0 I/ H1 Z
程序代码:
) X4 M, ~% o2 @* q+ f6 N
8 C9 a8 n6 u: |+ B+ _# u0 N#include<strstream>
4 T* P1 Z; k  `/ @; g#include<iostream>5 N5 m" o4 |/ t* c: u
#include<string>
. }5 A$ D/ [  g1 u* [8 ^- Pusing namespace std;
, g% A4 N) j& [" |* F" u" hint main(void)
5 v% L: z# \1 O9 t  A  _3 u{
8 S. [4 \* L# _0 {- t# L& |    string s1;8 M5 T; B. \9 U" O6 M. f  W- W. m
    while(cin>>s1)6 N, l  Q) l) ~0 ?; B' `
    {! @" r! l8 ?$ q0 @6 m1 N
        istrstream isin(s1.data());
$ W6 f  K- c$ u& b6 C/ j. K3 l        double d;
( d% N9 X8 J0 Z: H/ U: O7 D; q        if(fy_Exp::GetExpValue(isin, d))
, ^; E7 `& d, K1 A) W% Z; c$ C" F        {
2 A" [7 @8 E) X- f8 F            cout<<d<<endl;
" S: E% ^+ u- r& a% Z6 K" q: |        }
- S, V) m/ t+ l2 i        else' R1 n% ^- J0 k1 l
        {
, T% c& ?( R; x0 L0 q            cout<<"ERROR"<<endl;* X; b9 a. {" k
        }( {. S2 C, C6 P0 J
    }
8 u5 l8 h* z6 o& x. e. a, }$ a    return 0;
# U* W) b. C' V9 {4 W}; s, u8 E- n/ g. Z

4 S- L' i, c" H' c/ Z$ N# |! d7 l- q
然后编译执行就可以了(*^_^*)
5 l- V; ^7 x/ r6 i' N! R+ T5 E2 x其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 Q, [' W) \7 C: d" U      建议使用VC7或VC更高版本,或者使用GNU C++编译

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