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

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

在9月8日那天我特意编写的,给大家分享的,: e' A' \8 l) K+ m: g
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) G& Q0 S* M* Q$ y. F* H9 @只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% V. Y+ b1 C8 L& v( N( U1 A' X9 N参数解释:
/ B! p# m! J/ Vistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 ~/ e1 g8 B3 h/ w+ W% u
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 u. A( K& b7 p) z( E
返回值:
" I8 Y% A" g7 Q0 C5 `1 E, N返回非0表示计算成功,0表示计算失败有错误
$ {& i' b2 B# c$ b
3 p9 X" v/ K/ Y% k6 \) | 7 M0 \. F& O& @9 a& c

& s, B8 m# B( N- ]! O5 j* ^, U& W程序代码:
) m0 t% f1 ~& G, I" P
. F. T9 c+ O, _6 jnamespace fy_Exp{; a7 c7 w, O  O* q
namespace {template <class _T>
( X3 V/ v) B( Tinline _T GetExpValue(_T t[], char& csym){
) N: Z: j  y( {" B6 U3 k" ]& C    char c=csym; csym=0;
) i5 l% P- J+ t' ^0 C9 w    switch(c){* P. J" Q5 k! d8 [
    case '+':return t[0] += t[1];6 h2 j9 [) E/ b
    case '-':return t[0] -= t[1];) A- ?6 Y! ?0 p+ k1 v
    case '*':return t[0] *= t[1];  w5 m& ^- u+ a& G) I% [0 L
    default: return t[0] /= t[1];//case '/':
% ]& L" M3 L2 C  j  o* v$ D    }: E/ E( J/ r7 b& `0 s# E
}}
" M* L) x0 _$ p& z& utemplate <class _T, class _Tstream>
# [- y4 ?( l; C) `/* _Tstream: inputstream, _T: get return value
0 ^5 `% i2 T# }* Return nonzero if get value successfully */
4 C5 s) m; H$ @! w7 w  ]int GetExpValue(_Tstream& istrin, _T& nReturn){
' l6 V+ k' y% ?: \8 B6 ?, }    _T t[3] = {0}; //雨中飞燕之作
- B+ }4 g; ~# T6 T3 l' k. x    char csym[3] = "++";% ]2 G* I, F' e* |: u; p
    int nLevel = 1, nERR = 0;
: Y% K( X% N7 j    if(!(istrin>>t[1]))istrin.clear();6 H9 q2 J* {6 _+ J1 \8 ?
    for(;;){+ b: e! s8 X0 D+ S* k
        if(istrin>>csym[2]){
7 w: ~, z1 u4 T. p$ H            switch(csym[2]){
4 u! G. m; R7 @( q! p7 E/ r            case '(':
2 A+ o  `; r! Z0 o* c5 R                if(!csym[1]){nLevel=0x100; nERR=1;}else
2 z4 ~2 h+ d7 i5 U. W5 r                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( D# E! i9 w" {$ J  v
                else{nLevel=0x100; nERR=1;}& w" K4 n3 @- v
                break;" E& e5 D" T; l# y3 I# X
            case ')':9 N8 Q* ^$ g/ r: F  s
                {nLevel = 0x100;}break;' c6 O( n7 H* Y8 n7 p
            case '+':case '-':case '*':case '/':
! N4 N7 V& `1 N' x: v$ e: P/ n                {csym[nLevel++] = csym[2];}break;9 m- V: |; J- @- |3 J2 b% @
            case ' ':case '\r':case '\n':case '\t':continue;! D, r6 Y! Z. X& l% b0 Q5 }
            default:
) {7 Y$ m5 J0 Z* v/ t. j& B                {nLevel=0x100; nERR=1;}
6 S( z) K6 N3 r5 Y            }
2 ~* x. Y  \$ U            if(nLevel==0x100)break;
  m1 H' H% G- p* R9 o            if(nLevel&0x10 || istrin>>t[2]){9 P' t  ~) m9 V
                nLevel &= 0xF;; B7 G3 k& X' A7 ^( }* s
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" s6 e9 b  z) X1 l                if(csym[1]=='*'||csym[1]=='/'){! W- V5 H$ `0 `! s' m/ ]5 R# I
                    GetExpValue(t+1, csym[1]);
! W/ S/ P* _) K5 h) v                }7 J" N, Y& |% \" ~  ^) M
                else{! @. N+ [. n: I* ?5 i
                    GetExpValue(t, csym[0]);
3 a/ p7 x* t! W. w8 y6 k2 x                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;* I- n: {4 G/ [8 N3 n, N6 ?
                }; p5 M/ `. V! U; v
                nLevel = 1;3 U0 |1 \$ ~' |# r' j# Z
            }" |1 X. a! w& j* B4 |, \
            else istrin.clear();
& p* C5 z3 [, t4 D' d( ]        }8 N% P7 t8 K: I9 Y2 T0 K: p1 N
        else{nERR = -1; break;}
  r0 N+ l* P& B; \1 ?    }7 p3 J& A3 a' }, Y
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 J: c& l! |5 e  ~3 e/ q* _7 B- O    else nReturn=GetExpValue(t, csym[0]);$ S& }9 b0 ^5 ~9 [& b  W
    return nERR==-1?1:0;7 [, t5 S$ ?8 W; R* R* c* S4 V% c2 F
}}
7 L7 q7 T& D% @5 U8 ^9 g+ L4 l' {+ n

, k% Q5 G% O4 X) V  Y3 [, D6 j6 d+ ]
函数模板使用示例:  ~' W* h/ m+ Y
在以上那段代码的后面加上以下代码:4 Q, v# n6 ^! S" i* A9 M7 z

/ v4 U& ]5 g0 a% P 0 X( _7 B. ?0 K9 x* A, Z
8 C" Q. t- g" t% m# }+ f  s
程序代码: ; b. N' W; ~4 G! R4 A$ D

5 ^* w! N* n. k* Z' M#include<strstream>- \' K0 F( a' W8 L4 I2 d- ]+ e
#include<iostream>
+ z& L3 F) k3 {#include<string>
( p5 t% s- Q8 m- v  G( kusing namespace std;
. B$ I( \, O, I9 s1 c. Iint main(void)4 ]' a$ d9 E8 p/ c, E
{
. W( w6 w' b( o" E% c, J    string s1;0 z; q4 J3 n) q7 A" H" m+ d
    while(cin>>s1)
- d3 P3 i0 u( o- q6 }* ?+ |    {- K. x) H5 T9 d
        istrstream isin(s1.data());7 Q  }4 t0 V* ?' |6 ?
        double d;
* a  S) b! N0 d5 Z$ z        if(fy_Exp::GetExpValue(isin, d))
* f7 v, X/ d9 b0 W9 r6 s7 d& L' N        {% v! ^7 a: H% ]% i9 i$ f9 p& X
            cout<<d<<endl;
# o" K$ Y/ F/ U' w6 @        }0 V+ X; c' ?/ a9 e
        else
9 u. U# c( q" W; j; N        {
$ h* w0 z% L; M; Q! c1 g            cout<<"ERROR"<<endl;
  v) O) l, d% `% ^        }+ P. g2 ^" M9 q+ I) S, a* D
    }% g$ z8 I# |' ^2 t' Q
    return 0;
. }- ^# r% n8 e9 E! u+ I# s( m  K}. F1 P% b# v( @
4 _3 b9 F( q5 H

3 v$ O& H# M5 L9 ~然后编译执行就可以了(*^_^*)" ~& c- {+ @2 S1 J/ |1 O  I7 o
其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 e* q% A! K* F; }8 p' P$ Y
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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