返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,5 B, c# {6 k+ ^) b7 M
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. n3 D, r! ]5 Y' V: K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 K# w& v; I1 ~: C( G9 W1 d参数解释:) B- l$ ~: w' s7 K) r
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 p2 B" H- F9 t# J/ L, y0 u8 a
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( U! [2 R' O# M7 A; d
返回值:
& M. N# G8 l7 R: A返回非0表示计算成功,0表示计算失败有错误
/ R- H  z% [$ R" Z- N/ ^' a: B0 G
# C0 t8 R4 D% L( v+ q. z ) Y; m( T( H; j9 V
$ L& i) m0 Q  ^8 w5 |3 c6 [
程序代码:
$ [- s9 I: t; ]: Q4 V  D4 B/ n$ j, w( n) P! P& z
namespace fy_Exp{
* a" |, b9 j3 ]. h" S0 knamespace {template <class _T>
+ y" g2 W1 O" R. Zinline _T GetExpValue(_T t[], char& csym){
* S: a3 |; [, ~0 a    char c=csym; csym=0;% _& V* K. {. Y
    switch(c){" i, ~9 D' P$ y: c' t  q
    case '+':return t[0] += t[1];
. n% z8 q2 J! y    case '-':return t[0] -= t[1];
" L# N5 X* n, B+ [% V    case '*':return t[0] *= t[1];0 c) v$ m8 |3 X$ L* Z7 T9 |
    default: return t[0] /= t[1];//case '/':, i/ X4 S( t( Y7 g: b) ~* i
    }
; I5 x( W" C1 T. X}}4 K$ @& }4 w  a9 v$ u  l  g
template <class _T, class _Tstream>
. x. o9 O3 c. X/ n/* _Tstream: inputstream, _T: get return value
6 T% e8 s8 M2 i4 P7 g* Return nonzero if get value successfully */& \! u3 `; X, x. P- I# ?
int GetExpValue(_Tstream& istrin, _T& nReturn){
  C4 o( t6 K% C. X5 L: _    _T t[3] = {0}; //雨中飞燕之作
& x) q% r) `/ ?. b# k9 v( k    char csym[3] = "++";7 s. }# X; x, X9 ]7 S5 |2 A2 a
    int nLevel = 1, nERR = 0;% C6 Z5 R9 k7 c; s% @9 v
    if(!(istrin>>t[1]))istrin.clear();
7 x" F- O/ D. O  Q$ r" B( D    for(;;){( G0 t& ?2 [6 Z/ o, D0 n
        if(istrin>>csym[2]){
0 d9 p/ z: Q0 V& W: R, C3 g; v            switch(csym[2]){
* `# @2 w. ~* t            case '(':
, A6 S, u& S/ e' \: ]                if(!csym[1]){nLevel=0x100; nERR=1;}else
0 d1 a4 Q% e. X" p, O                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;  Y8 S" m9 W; n& [' @
                else{nLevel=0x100; nERR=1;}! r; D8 V8 T) a, H
                break;
5 G" z) k: [1 s7 b, a  H0 P/ `+ E+ q, {1 U; W            case ')':& u. ]5 g% B& I4 U
                {nLevel = 0x100;}break;5 ^0 k% Q) b% M$ J
            case '+':case '-':case '*':case '/':& k; C2 i; q6 u( i! {- x& i* q
                {csym[nLevel++] = csym[2];}break;! @- i6 O" J5 J& F) _4 H
            case ' ':case '\r':case '\n':case '\t':continue;3 @+ w. S! K7 P8 }6 n: y8 X+ G
            default:& ?5 v+ Y; q: Z2 E  C; d0 H1 Q" I
                {nLevel=0x100; nERR=1;}( W( u3 Q8 U& s# s- E: c" D
            }
* W6 |4 B3 t  a4 t' d            if(nLevel==0x100)break;" p/ Z$ F- s, d9 \% _* M+ v- y
            if(nLevel&0x10 || istrin>>t[2]){
6 {/ z" k+ t" N                nLevel &= 0xF;
; `& n) ?4 q% F                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# D1 F  N5 p5 [5 [                if(csym[1]=='*'||csym[1]=='/'){1 P7 N# y5 E: |1 \1 p7 K
                    GetExpValue(t+1, csym[1]);
0 Y+ ^6 u' ~) G) M! F7 a  X* D                }# Y8 E; ^. h  Q/ [: a: G
                else{# r1 y! O$ @7 K
                    GetExpValue(t, csym[0]);( Z& r. r& Q( c4 k2 h! t5 w
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;) x" o' }; z' _- h8 L9 e
                }) e9 K! x* B8 f( ]/ s6 F1 G8 ], ~
                nLevel = 1;9 n1 q, v6 b. }5 C
            }
% E/ V+ A0 a* O8 c- B3 j0 N( u            else istrin.clear();; O; p, G7 [5 a- w# V
        }
" G5 r# s. z5 u+ d# _6 i        else{nERR = -1; break;}
( }) l/ a& _& W# H- v    }
% A% g" `0 q3 j$ Y    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 H- S9 V/ m6 N' w    else nReturn=GetExpValue(t, csym[0]);3 B3 w9 l' x/ K: v7 _8 b- {+ b1 a& s
    return nERR==-1?1:0;
. v' w  N/ w/ F; W}}
& t7 T+ x/ U7 |, y; `! S3 c! ~- b4 }3 s. n

4 S' @* B, y* ]
9 d7 ^, J) m4 j# L5 B: a函数模板使用示例:
# i7 ?- @8 a/ F; F2 [在以上那段代码的后面加上以下代码:4 Y0 ]2 R6 `* c- d; v6 I5 o

6 d9 x9 `0 F8 v, U! R/ G
$ x% B1 B+ r' {. P+ I1 v/ a# Z/ `, m' g! f0 J$ P7 X9 W* u+ v
程序代码: ! N& y& t; l; f' E

. p( M5 `5 I! V  w1 u3 p& u' g#include<strstream>" K: j+ @) y, L
#include<iostream>
' e% B) b2 D+ i#include<string>
+ b" R5 k+ h& d/ z- t0 J8 jusing namespace std;
) k- I1 I' U( B! d: I+ b- [3 H7 Oint main(void)& h9 z1 p$ S4 d! [
{
3 |$ g) Q) ]% g" @6 D6 X/ i    string s1;+ D6 }2 I6 ^' z5 O- @
    while(cin>>s1)
# v2 l# W# S+ W0 ?    {
" ?7 M0 r* g8 V        istrstream isin(s1.data());. `, z2 J  y+ q" I2 ^
        double d;
& V- O0 y, M( ^# ?        if(fy_Exp::GetExpValue(isin, d))' `' z# J  c2 J, B1 s
        {
; i& j1 z2 A3 p            cout<<d<<endl;; E6 ^( _. N# ~# D+ y
        }
7 y6 |6 a+ l2 }        else
, |. v/ X9 x! g5 w% a        {# G7 g) c4 W2 W9 F: h9 A7 q- l5 L
            cout<<"ERROR"<<endl;: w. g% t, p4 g7 r
        }
7 T# |* q, Z/ K1 X8 F    }
$ B# Q; C0 q. m    return 0;0 G1 s4 x1 N5 ~4 S  c
}
$ T9 |. D* r0 {
# v9 m- w5 ?, I( q1 S( Y& M5 [& c1 C% @$ |, F* B* @
然后编译执行就可以了(*^_^*); [: Y, {/ v) {" _* K3 \
其它:TC++上一定编译错误,不保证在VC6上也能通过编译, E! U  O8 z& |7 M3 ~
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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