Board logo

标题: 一个计算四则表达式的模板 [打印本页]

作者: zw2004    时间: 2008-1-21 20:17     标题: 一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,8 P- j! @# ]. p7 \$ h
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0 z2 _% w# |3 \+ Y9 S
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 o9 Z" |; R9 ~" R8 Q& m
参数解释:
3 m0 y" \: ?  H1 L- E, R; @! {+ histrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. v) \( d/ j1 {( `. [: r+ @nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 H% c4 Y5 Z9 j1 E返回值:! [+ O! ?4 z- p' a3 f
返回非0表示计算成功,0表示计算失败有错误
/ p$ k& g9 Q5 _+ ]1 a  a( }. Q
# A: B2 f( \. G, p; S: K' M6 X; g ! {* Y) p( `/ |1 s  ]1 Q) V! ]
5 |) q; c1 O& C$ ]: O
程序代码: 6 F, j/ M1 a7 @+ H
; J* }' N* e7 p# T3 N' s! k7 v8 D) D
namespace fy_Exp{
3 n4 y# a2 q( [/ y$ m% Enamespace {template <class _T>
8 N/ N' \) w+ Y" J- {. Einline _T GetExpValue(_T t[], char& csym){
% e7 W( V0 ?: F2 g: [    char c=csym; csym=0;% I0 P/ m1 y  \2 Y# j
    switch(c){8 j- M' W6 ~3 ?; ?! B
    case '+':return t[0] += t[1];% B6 i4 v% ~( w2 u2 K
    case '-':return t[0] -= t[1];8 v4 O2 N$ J6 k2 R
    case '*':return t[0] *= t[1];3 I6 o0 b* `% P- i# K
    default: return t[0] /= t[1];//case '/':( p) N: B" O) B$ @1 y3 c# b
    }
9 I/ S" f/ m! I: `+ k* R4 @# v  S}}& }$ r3 G& Q+ M8 `, z( `
template <class _T, class _Tstream>  }( b3 B- W$ F8 l% ~; A2 i
/* _Tstream: inputstream, _T: get return value: K/ }2 g# G% `9 j8 A: K7 E5 m
* Return nonzero if get value successfully */: x7 e: C$ r: m+ [7 a- z1 ^8 b
int GetExpValue(_Tstream& istrin, _T& nReturn){5 I" L0 c' q7 U0 u
    _T t[3] = {0}; //雨中飞燕之作
" U7 `% j5 g9 S1 B0 n# n    char csym[3] = "++";/ Y8 |" E. N' |. X/ r8 F) k
    int nLevel = 1, nERR = 0;! n0 ?* X. q& w6 R: D; t
    if(!(istrin>>t[1]))istrin.clear();
, T$ \! h9 d% }- V' r    for(;;){2 i3 }  o1 F6 X9 c+ c  W4 X
        if(istrin>>csym[2]){' o! y1 \5 R9 J2 R1 x& x5 A3 g
            switch(csym[2]){/ e5 k& Y4 ]) h/ E
            case '(':
$ U3 [! Y( c. |! P. w                if(!csym[1]){nLevel=0x100; nERR=1;}else$ z  L3 K3 B6 X" t5 T: b
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;/ Z4 X4 B1 k8 G, t0 P3 o
                else{nLevel=0x100; nERR=1;}
0 c$ i* y: K( F& C! d: S; U5 T( _                break;
" J! K7 G2 }4 F+ Y3 r            case ')':8 T0 D1 ~' i6 F  j. F1 ?
                {nLevel = 0x100;}break;
) ^( J+ J) m* I) f# \$ z6 t, W            case '+':case '-':case '*':case '/':
' w" m% Y1 e; |+ q8 e, ?                {csym[nLevel++] = csym[2];}break;  i. x& h* h+ P5 _* {
            case ' ':case '\r':case '\n':case '\t':continue;
7 i# U5 `' \3 F            default:
9 U: ^' j; q7 Y; K/ f, t                {nLevel=0x100; nERR=1;}0 H$ t2 ?' z# B6 P7 |
            }6 w" f- ?' @" H
            if(nLevel==0x100)break;3 Z1 \) }( ~1 F) [
            if(nLevel&0x10 || istrin>>t[2]){' |* U) k1 Y" n4 \
                nLevel &= 0xF;
. w  }, X, Q- D9 ~' P                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}1 c0 d. @  c* b4 k2 o
                if(csym[1]=='*'||csym[1]=='/'){% w9 C6 l; a. c% n# S- d- h) \, I' m
                    GetExpValue(t+1, csym[1]);" K" {- M. F$ ]6 f0 g
                }
* K, q: Z$ ]7 x; ~/ H                else{8 M/ y& U) r0 c, a
                    GetExpValue(t, csym[0]);
' V1 c) f. L4 D4 L/ }1 U$ Q                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
; s* V9 G( Z. a2 p' z6 t+ f* B                }
% q8 C( S  Z* Q# |3 w: T- a                nLevel = 1;
0 i& n# U, E# m% S/ U/ [& X( ~- B            }
3 N, u0 T  r/ M( g; L            else istrin.clear();
3 Q6 i; [* i2 |6 U        }/ M  _, C! `9 V. c3 v( H* W
        else{nERR = -1; break;}. V7 G& Q7 z( Z4 I! h/ u" x
    }: Z" v/ h/ ^' ^  U* E) [1 h- s/ f0 `
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; [4 \0 F! B/ C/ e8 \& ?
    else nReturn=GetExpValue(t, csym[0]);/ {  `; ]! {. u! |% c  R
    return nERR==-1?1:0;
5 n. r; }% y# u/ P4 ]9 N9 U}}
' ~# X) C) [0 r9 o& E4 {8 O
! f& j. s0 r/ @$ S4 M. d5 P( Q- c0 t" `
. m' A5 f( b+ f. A. r3 l
函数模板使用示例:
$ j: l; o1 p5 p8 P1 _) F; S在以上那段代码的后面加上以下代码:
0 m# i3 I( G+ o* q, X& N
, C5 a& D9 d9 O% ?! O/ T ( c. b% W& q7 B' K, _
, c. V8 h8 ~7 H  U" K% M2 J% E
程序代码: , j4 L$ H" e" g' b+ [! b9 h' t
% ~4 ?1 P( T# M' x. N$ n8 V& C5 o. t
#include<strstream>. `- b4 Y! O: ^' B
#include<iostream>( Z( S" Z9 x0 @, h9 r
#include<string>9 _2 x8 M/ _2 }2 f9 y5 Q) Z
using namespace std;
$ s5 p5 z% @) ?; ^+ f/ ?int main(void)
. n+ x+ N* I: e5 P( L{
  n8 Z/ N# k' d# ~, k4 j9 \    string s1;
( Y/ z1 c. P& l8 C3 \* O    while(cin>>s1)
. U0 d! L% g7 w9 O: G    {  t& u' ~( v3 D7 s5 B( {
        istrstream isin(s1.data());
: s# I/ U, `- {- `5 j$ k* ^) v! a        double d;
" W+ D$ {' U5 K% ]" {        if(fy_Exp::GetExpValue(isin, d))
) g! F( l; X  @! ]        {
! B  c1 K/ E/ V, o( S6 o            cout<<d<<endl;! T- z1 j$ m. X& x/ }
        }
+ m* `/ K9 b6 [, h: W( A        else
0 D* G8 [0 e  w5 S; N1 [        {
8 H$ z; B0 ?) a. f            cout<<"ERROR"<<endl;
$ |+ Q. g& B; c$ V. L        }* p) U/ s4 ~0 f' H; @% X
    }) b; G4 b( e7 a; K! R
    return 0;
- D5 U. I, R6 g: V8 F* A}& {& z# E' |$ t' K2 o9 C

/ M, j3 |3 @3 t  B. T* h, v% d8 y: m/ P
然后编译执行就可以了(*^_^*)( i7 ~  ?% r; t# ~" L! w
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
' B3 [1 w% W  {* h7 r& I4 o/ t( V      建议使用VC7或VC更高版本,或者使用GNU C++编译




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2