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

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

在9月8日那天我特意编写的,给大家分享的,
6 x4 Y0 M! E& [- ?" _+ G一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 v- p) `3 T$ _7 ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
2 ^+ h/ k# A3 ~/ X参数解释:
5 q6 u# s2 \# t2 p: Aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
4 x" o. w/ Q& [6 O/ bnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; y" A  f! L4 p  a$ @" i- l9 d
返回值:9 j+ d9 U) ]. r8 b/ _1 u) w
返回非0表示计算成功,0表示计算失败有错误
  t$ c+ \" y: v' p3 n
% R2 S* S2 P+ G4 X" Y 1 g8 D  X6 e. U3 G" W  O& Q

4 W0 a: T' _# ?程序代码: , x' Z# [) |( t& T' j

7 h  c; s3 @6 U- }( P+ _- j6 Lnamespace fy_Exp{
& U5 p: u2 |0 Z) Fnamespace {template <class _T>/ Y, A0 V; _) C
inline _T GetExpValue(_T t[], char& csym){  x, ^8 \- C4 w8 {/ f2 v& _+ C
    char c=csym; csym=0;' n4 U3 [- x# b
    switch(c){9 {0 s) u, U- j: R" q* f
    case '+':return t[0] += t[1];) \3 `& k) R; L& m6 Z
    case '-':return t[0] -= t[1];* W) W# s. ]# f) |- E& f
    case '*':return t[0] *= t[1];
; f' Y* {% a- R: D    default: return t[0] /= t[1];//case '/':! M) X3 V2 H" P; F: d
    }
7 _6 W7 r( D* u0 O7 {& h" f}}, ]8 f; k3 M+ b) `4 q
template <class _T, class _Tstream>
% e0 }+ ]: ]( X; P- h5 N" q/* _Tstream: inputstream, _T: get return value7 w6 l3 m# Z- y6 f4 @. G1 |
* Return nonzero if get value successfully */
: r5 a, _; i' J& O7 |% M* b) p5 ~: t/ h3 {int GetExpValue(_Tstream& istrin, _T& nReturn){! t" c( a: [- C, C* j' T( ^, p
    _T t[3] = {0}; //雨中飞燕之作" w0 b/ R  Z! X) v" u
    char csym[3] = "++";& W/ c3 w8 C5 j! U0 m
    int nLevel = 1, nERR = 0;
9 @% Q6 r& E2 c5 G8 X3 }    if(!(istrin>>t[1]))istrin.clear();
- E0 F, y# r# h- {" t    for(;;){
. I6 J) H* L3 B- e$ @! c        if(istrin>>csym[2]){
6 P" \) }0 y( j            switch(csym[2]){
: w6 e+ v& i" ~            case '(':
& @# W+ _5 {0 J8 e/ Z( Z8 L                if(!csym[1]){nLevel=0x100; nERR=1;}else
4 _0 s% q. k; d9 ~1 M+ m                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 C. j' ^* X3 @; E                else{nLevel=0x100; nERR=1;}
3 U7 m' a& g7 ]7 M. e                break;) G& T' M( R7 M! t1 {! r
            case ')':, ?8 A5 [, n; f" y* W
                {nLevel = 0x100;}break;3 O& O, u8 E2 ]! I4 K
            case '+':case '-':case '*':case '/':
0 y5 o' j7 E2 g- z' X5 }) a% f                {csym[nLevel++] = csym[2];}break;8 A! ?! I0 Q! o$ P3 N
            case ' ':case '\r':case '\n':case '\t':continue;& h% q% J. i% U7 M9 Z/ V$ c( ?
            default:. V( K! d0 ~) v2 D, Q, P3 b' o
                {nLevel=0x100; nERR=1;}
3 S4 v7 A+ a7 q3 e' z  N( t) v            }
; ~# t1 N+ c9 k            if(nLevel==0x100)break;2 t! d, T$ |3 C- r3 b
            if(nLevel&0x10 || istrin>>t[2]){
$ B4 E$ d# ^  e6 ~# q8 [                nLevel &= 0xF;, }/ N! u3 ]( a" m# g, \! N
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! Q5 S# L& o- L. p4 ?9 ^                if(csym[1]=='*'||csym[1]=='/'){8 }  w8 s1 L4 W2 v+ t. N9 p) Q
                    GetExpValue(t+1, csym[1]);$ v1 n, P  I0 L- R9 T: q
                }
1 }$ ]+ p7 ]' P% f; a                else{+ _! R  ?. G& l3 J/ o/ d" s
                    GetExpValue(t, csym[0]);. X7 W* B9 u, C, z/ Q
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;* I4 A2 O1 P5 P1 g6 @
                }4 m# z1 j2 b, O: x3 l/ d
                nLevel = 1;" x: v3 t" y5 w7 q' a& a
            }
4 c$ H7 A. R/ [% |            else istrin.clear();
% j! q7 F9 M6 r6 {$ x/ V' f- X- B        }
5 P) k( M0 L/ U( y        else{nERR = -1; break;}
/ G6 ^1 T% E2 m; }    }
4 `* S, {7 ~5 ~( i' s8 `$ C1 i; {    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);  |6 S4 D: t- _" l* E
    else nReturn=GetExpValue(t, csym[0]);
) o- K0 Q: ?2 b: q' ~# b7 G    return nERR==-1?1:0;
! c9 w- g; ~3 D9 x, F( W) Q}}
8 a9 v* I% B$ @0 c' @" A' z/ e+ E2 b5 b2 k" J

& n$ m0 ?! [0 w3 q, `- L
, r: W1 A2 e* W' F" G# i  U2 O, _函数模板使用示例:
, o  \6 M! _, b/ |" B. ~在以上那段代码的后面加上以下代码:
. y7 S6 m% O/ h! y( C3 m+ C1 s
/ e8 ?8 s" S3 G: N2 _: _0 b& F 2 F; N2 r8 q8 Z! m0 L
( w7 b1 r6 w" X9 e/ o9 r
程序代码:
2 r/ n6 ]* K, q5 d  b9 f3 Q
. S8 I7 e  o& J#include<strstream>% M2 r; z3 r+ G" Y6 o
#include<iostream>( O! |( q) @% b- f6 R
#include<string>
  i# M# h  N* Y! eusing namespace std;1 A9 x. J1 S* S; q
int main(void)# i$ B$ I/ D, I* i" ~( M
{6 W# m; C# Y9 r) x9 V
    string s1;
3 n- z" Y/ L8 X! U+ d6 K* @    while(cin>>s1)( b/ D% F$ f, f' B' |! G: J. n+ E
    {
# u4 x7 c  E: s8 D5 X        istrstream isin(s1.data());( U! F+ I9 c% H) n
        double d;$ _/ F% R( ^/ U/ @6 Y) j0 \
        if(fy_Exp::GetExpValue(isin, d))5 ]/ t7 {( Y1 l
        {
  a( [. d4 V0 }6 B            cout<<d<<endl;" p/ q. S3 |/ X2 C/ K
        }8 S4 A0 g4 ~. I0 l% f2 ?
        else
7 Z4 S- ^9 O( m/ }        {
. b. @. `2 T8 o# M% |( W            cout<<"ERROR"<<endl;; m& u- i" r% P3 V3 F/ Z0 P
        }
3 [4 }1 `& z' m2 m/ A% a8 B6 S    }
+ m+ G' B1 W; x* c9 i    return 0;& J' c3 h! E. h9 Z3 X- v
}
% X, {. L1 X4 s" o% ], B
3 v7 u" F3 I$ @3 p3 `% W- Q" p0 |
7 @$ d9 Z. {) s+ z0 N. f然后编译执行就可以了(*^_^*)8 O, ^' P; n9 C! Z! h8 t
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: t. @9 d# b3 N+ n( _# E/ A8 d      建议使用VC7或VC更高版本,或者使用GNU C++编译

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