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

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

在9月8日那天我特意编写的,给大家分享的,
* w; j9 o2 P# N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; m' N5 g, l! [
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
2 s6 y* C( K) c, q% W! r: \参数解释:
/ x. o; E- W- V, ?( t# N' i5 ^istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" |5 V6 f1 {- L: M: xnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) q) m% J. {% n+ n1 i返回值:4 o9 ?$ U2 o3 Q: w$ O1 _) I
返回非0表示计算成功,0表示计算失败有错误
" F$ Z$ R' k, Z+ ]! G! j/ P1 f1 N& I+ e) I* ^8 K2 m
& Z6 r% B# ~- e* X- O$ D- l; L
1 a3 z3 ?- x. s0 g3 x& h  V( |
程序代码:
" M' I- l$ w9 I2 K3 k' s! D4 i/ F; X: U9 X  g* r( x; T0 N
namespace fy_Exp{
0 Y) n- w9 o/ f+ u. @7 D4 r8 nnamespace {template <class _T>
; e+ v1 f3 G$ ?5 @inline _T GetExpValue(_T t[], char& csym){
- m& l, s3 t; s; H2 }$ C    char c=csym; csym=0;% Z, q* @" t0 m$ S, K8 h# z/ o
    switch(c){  U' p% y5 m7 w% F' r  _& ^# |
    case '+':return t[0] += t[1];+ Q: n/ \7 C/ O0 l
    case '-':return t[0] -= t[1];/ P' c% i; o. G  |8 r
    case '*':return t[0] *= t[1];2 K7 ~  q9 R& o- I1 A
    default: return t[0] /= t[1];//case '/':8 Q$ l/ H1 O5 t) a
    }' u5 N/ K4 z6 k" b9 ]" l
}}
; h, d' a. n0 o- P3 R; Ztemplate <class _T, class _Tstream># k. \, n" h: F8 C- ^
/* _Tstream: inputstream, _T: get return value
: S$ r6 B: R: m9 j7 l: Y8 F* Return nonzero if get value successfully */5 X2 j/ E2 r: Y; |& V0 B/ q2 D3 {
int GetExpValue(_Tstream& istrin, _T& nReturn){; \( i! v  l8 @" w2 ~) T! d
    _T t[3] = {0}; //雨中飞燕之作
: c: K6 `; N, P. i2 q% m( I/ x    char csym[3] = "++";2 V5 s. Z# N  H
    int nLevel = 1, nERR = 0;& W, ~2 ^) g# u8 c
    if(!(istrin>>t[1]))istrin.clear();
: U1 s( h8 z& |# p    for(;;){) f# C' D7 E6 X' v
        if(istrin>>csym[2]){* d+ O. [+ [% b+ u
            switch(csym[2]){& H1 S+ l1 _8 n3 e7 x- a$ J8 {7 C" k
            case '(':
3 C/ j4 H+ c% X; g) a                if(!csym[1]){nLevel=0x100; nERR=1;}else: U/ l/ d% i: ^, {9 v
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: F1 ~- }* D, m* `* ^9 s8 c: U                else{nLevel=0x100; nERR=1;}
2 e7 i- n- x5 J. [  f1 P. R                break;
+ X( o8 [( m( P! A            case ')':
/ E7 e1 ?) y8 }5 P* S7 S8 h                {nLevel = 0x100;}break;
6 o7 J" `4 l3 O: L$ A            case '+':case '-':case '*':case '/':) k. j+ V" L# R# }
                {csym[nLevel++] = csym[2];}break;
" C) t/ Z* a9 g2 W- k; a            case ' ':case '\r':case '\n':case '\t':continue;
0 o$ y) T$ @( y' g) b( C            default:
. r3 J1 e( f/ u1 H5 {                {nLevel=0x100; nERR=1;}" e& `. _# k3 |& s* H
            }& ?  T5 \& S7 S1 t8 A
            if(nLevel==0x100)break;% d6 h9 V9 P9 h: P8 f/ N
            if(nLevel&0x10 || istrin>>t[2]){6 Q1 k# C- h8 K! k& y
                nLevel &= 0xF;
% L& {. I) |* C9 l. d$ W4 P+ _1 e+ u0 \                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; r- o. S; |$ C1 e9 R8 t) a6 G                if(csym[1]=='*'||csym[1]=='/'){6 z1 {9 ]- M" m
                    GetExpValue(t+1, csym[1]);
- y% X7 o, t: V                }) ^0 C! j  N3 u/ Q" `. J) i
                else{9 w8 e, ?& r1 ], C
                    GetExpValue(t, csym[0]);, H. y* X4 q0 P8 B) W3 X4 A0 t
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
: y( _# I4 I7 `* n3 i                }
! o2 ~; M& E0 B% |6 R1 I3 r. I( w                nLevel = 1;
  a0 C% r, H; `9 j            }- a" {: p1 l, n$ }% m% b  D
            else istrin.clear();
/ _: c2 A; c1 @% X: l# `& {        }
) ~/ F" r- e5 f& o        else{nERR = -1; break;}0 c/ ~" d! J# g3 A) O  m/ T8 c* h
    }+ ^9 T. S' @: X' u8 e
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 u' h0 j5 {& Z8 p. q
    else nReturn=GetExpValue(t, csym[0]);
4 p; t1 f# B* Y. l4 c+ v    return nERR==-1?1:0;9 d, q, {; e4 G& _
}}
) s3 @+ ^, A% [* g; J8 D. @# E; y* i+ V
/ u. T; a- u, w1 a. x
, \- r8 R/ y5 y* v- B! T) x( C3 H! L; t
函数模板使用示例:
7 I3 n; R! s  }% M/ \, d在以上那段代码的后面加上以下代码:
) r$ v2 H0 i9 {8 j, b
" o* A4 V, q# S# T
, }3 Y: [; u4 n; A+ L$ N% Q4 q( v+ {$ h; r/ o! w6 s6 F
程序代码:
' `& k! R& R. q6 h" b  R% F# {
: F6 H1 H4 e$ c& _2 b#include<strstream>7 ~5 Q. P  F& v0 f0 t  Y
#include<iostream>
- X* L. |* h5 M5 S. }#include<string>
, C- A! x! P! l) F& ^: M8 y6 Gusing namespace std;) o' w; G2 E+ X- d" R7 A
int main(void)
. D) \6 r* |* ?' |$ f* ?3 n{
. c4 S& G, c9 A9 ~2 Z    string s1;- T* Q6 k8 ~) M- I% ~! l
    while(cin>>s1)5 g6 o- m; c% Q9 W' W7 `
    {" O0 P! s. p- O: A# A7 \' Q
        istrstream isin(s1.data());
7 w- e: t9 _) F, B% D+ S/ k        double d;
5 e( ]+ F+ C, `- v' e3 ^# S. X        if(fy_Exp::GetExpValue(isin, d))1 c0 K. q' K' O' L
        {& G" v2 b) C+ K
            cout<<d<<endl;
9 t8 E2 `# E1 R; g% t        }% l- n: B) ~* p% }
        else
$ I# G4 a( I! [% G        {
& U* c+ l" l; k# f0 E  Q$ G$ h) @            cout<<"ERROR"<<endl;1 c7 P9 Y: y$ S& F3 r) ^1 ~
        }
' y' Q2 }( n% B! {: r" n; P. u    }
& M% ]) T3 f; U6 ~- a; F( T    return 0;
3 A) k7 h! A* I; K9 v- }- a}! `4 [# C# @1 V  T! r* f
0 y- f8 j9 u) g+ b) B0 P
2 j* d5 ^  g! g5 X% }
然后编译执行就可以了(*^_^*)" H# o' g, Z! m; y3 x6 S
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 [/ n, x3 U1 E* v" O! m# ]6 E  w      建议使用VC7或VC更高版本,或者使用GNU C++编译

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