返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,1 ?* g2 J4 y. ]* j# `( N
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 S" h6 ^" e& c" E$ `2 ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 {5 G  g. A: K9 Y参数解释:0 B8 E) Z3 Q) g- F; Z1 X
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
  y  K5 g& L; k0 V* KnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 F6 A! s1 O% P& E7 ]
返回值:
7 G( _. O! b0 P) q% N5 ^返回非0表示计算成功,0表示计算失败有错误; ]9 [% Q& q' N  P  v3 n; f  t
+ O# V; N; g1 A, o  V% H3 E

" c1 l2 o" s. F. R1 F7 V* Y/ s' x9 G/ P3 k+ o$ ^- m7 B; \6 ]
程序代码:
5 r3 T! c0 M0 ^, Y7 h. Z* T
8 z" h5 A( R8 {5 i& t( C: X' ]namespace fy_Exp{
0 B3 D' c* ?$ T* Y- g5 snamespace {template <class _T>, V3 N: A0 y1 Y; m  ?6 o6 M
inline _T GetExpValue(_T t[], char& csym){+ y$ x9 t3 |; r# E7 f) J
    char c=csym; csym=0;
; y; W$ f2 l5 s  n" s    switch(c){
  R$ k" X; q) i# p+ y* j) K9 E4 O    case '+':return t[0] += t[1];
: q, d* d, y3 E# X8 @    case '-':return t[0] -= t[1];
- |2 x# S3 u0 _9 b. B    case '*':return t[0] *= t[1];  T& T) e& }) d* b
    default: return t[0] /= t[1];//case '/':
: E+ i3 u  j* l% X    }7 x# H) I2 G5 I  G$ r% `
}}8 H0 Z- V7 s- H2 Z- G  W: n# @
template <class _T, class _Tstream>1 }, O7 N( r! ^
/* _Tstream: inputstream, _T: get return value
0 ~% z( H& l  W. r6 L* Return nonzero if get value successfully */+ D/ o# T( s5 c! W% u
int GetExpValue(_Tstream& istrin, _T& nReturn){
9 a' x% J, W3 S; U! X2 d7 S( u    _T t[3] = {0}; //雨中飞燕之作
/ X- ]. u. b9 d3 ?    char csym[3] = "++";0 V9 w( N# H  i* e
    int nLevel = 1, nERR = 0;) x9 p" }! w; V/ L, \
    if(!(istrin>>t[1]))istrin.clear();! f2 n# I. Z) K  x
    for(;;){9 T  g0 {, \! B8 K. x
        if(istrin>>csym[2]){
5 U# |& J" Y5 `% I2 g            switch(csym[2]){9 X- v- o4 }! d+ r8 J
            case '(':
$ [# G6 \. Q* M; r3 W& e0 M9 L                if(!csym[1]){nLevel=0x100; nERR=1;}else
6 F: ?, [* i9 U                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 {3 D- @8 Y1 d4 c/ p                else{nLevel=0x100; nERR=1;}8 b. |: C% P* m) P" l$ |' c# r( Y
                break;, V4 S1 O3 m* K$ m# S6 j3 {
            case ')':- Z# ~* V8 u3 R# J9 O3 X  A) S+ g
                {nLevel = 0x100;}break;9 Y! r( L# y( R: _, R1 H
            case '+':case '-':case '*':case '/':5 {* Y. a2 T5 s) G2 `- C8 z
                {csym[nLevel++] = csym[2];}break;
# y5 g9 O& c/ J* Q5 ?            case ' ':case '\r':case '\n':case '\t':continue;$ T/ _' D, C$ z  K' D6 X
            default:$ b. ~8 q- C8 b3 Y6 B  r  H
                {nLevel=0x100; nERR=1;}
" H, @8 \# |6 b) W" d            }" v( U) F) g& R+ H' H" m
            if(nLevel==0x100)break;5 B* H) {$ x* M' ^  I. F5 f
            if(nLevel&0x10 || istrin>>t[2]){
" D8 `+ ~" L5 p                nLevel &= 0xF;! a* O; H( W) c( Z0 e
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* A( K( t( P+ S* P) J
                if(csym[1]=='*'||csym[1]=='/'){/ ?9 c  c. s. F+ K
                    GetExpValue(t+1, csym[1]);: l; t: ^8 K1 Z# w
                }
. P: R+ n1 N) r4 P                else{
) q, y0 t/ D. d; r                    GetExpValue(t, csym[0]);. D  A( D: y3 A$ M, `0 T; i  {; |
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 w8 K( Y# x+ R1 z# e                }9 I; P, n: x/ [1 o4 `8 r. W# c
                nLevel = 1;
7 E. x9 I( k8 E, b7 s+ F+ \            }
* e: T9 \2 u* N$ l# h: ?" Q            else istrin.clear();
! V% F. p" g5 u$ h8 h0 M+ |* S        }
$ j; P- Z8 p+ D/ r        else{nERR = -1; break;}  ?. n# `7 Q4 _9 g2 F4 [
    }
+ v! o9 `! i$ ~1 n4 p* T  i    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);# F) Q& ?( P: K5 D. D  ]
    else nReturn=GetExpValue(t, csym[0]);
$ L3 I' L2 Y& T* z% G* B0 ?    return nERR==-1?1:0;; A3 l, j- E: S) R5 Y. Q8 t
}}- O( I+ ?) r; D  B. @* q
4 B  a  e8 H" q4 ~

5 a$ z8 c0 a2 Y+ X% N8 p, P) d$ d8 V% Y8 ]% X4 n/ ?
函数模板使用示例:
0 Z4 O' u& @/ {0 @) _9 l! m+ r在以上那段代码的后面加上以下代码:+ R+ [  s  o- p% C; z/ v

& t# O7 H9 _* W8 n. T
/ x+ U2 _( X! O3 L  K* m% l3 s% W/ X
" s+ G' A9 F' m+ M& C: A程序代码:   q, M4 ]* Q! r0 s* `6 t
& G& t$ n9 s" p; m) Q
#include<strstream>6 A4 x2 q9 y; p3 A2 V# @
#include<iostream>
& a* ]" ~# Y, Y; [6 n4 j#include<string>
: M8 Z, p" J& c  {# Tusing namespace std;
% w( a, a$ g/ X( M$ ^) Jint main(void)
9 [2 W" j* B) y* A( e0 M{
6 l6 h! D* `. j/ X% {& l    string s1;
7 J4 S3 |! x7 v# Z- U: d, ^    while(cin>>s1)7 K: M1 B6 T) ^' z, g- [% N. e
    {
# D$ |, G( B1 X$ ]        istrstream isin(s1.data());
* w  ~' o7 i  t        double d;2 G$ `. W- I; |$ F) a
        if(fy_Exp::GetExpValue(isin, d)): j# @4 _8 B' M. a
        {2 F& {3 P( q4 N2 H- `" o2 _. O
            cout<<d<<endl;
, f3 y3 R  E3 x' x" X" S        }
) z, M  q2 A$ v1 O2 `* E/ S0 w        else
* g2 M& f; ~$ I        {( J2 {0 J. N% {5 \
            cout<<"ERROR"<<endl;% `( @+ z1 A1 i( Z
        }# d% _# F+ \' G! o7 f3 \% K
    }2 N$ f% J+ S9 K2 d% w3 e
    return 0;) h# q, Z0 h( z$ ]. k
}8 P5 B: p' t: o" {
  g& o8 B: ]; \  Q

8 h( _+ W9 x2 Q5 _然后编译执行就可以了(*^_^*)' c8 W0 U' R. n8 e) \1 W5 Q
其它:TC++上一定编译错误,不保证在VC6上也能通过编译& d0 I3 i5 m: ?' Z0 w: |8 ]- T. y; i
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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