返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
4 s7 f% z: D. U6 T一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ ]' c. R/ b2 f7 k只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# K) I0 Y' I: F! v7 ]参数解释:& Q# K- n# n& H2 ]) r$ v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ j# `3 S! w3 D3 n8 h
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
7 @; L2 h7 y+ Y$ ~- d8 S3 z返回值:
9 W. M! B. s( J3 `( h; m返回非0表示计算成功,0表示计算失败有错误5 c/ V! A7 i# {7 D; W; Q

" j& H5 s+ F/ T; P ! O6 ]* |& m, }& A$ P* _

3 H5 J8 q: Q; }% S  c. @7 w" E程序代码: ( ]/ W6 P! T7 H5 y& T

: C' R: |: E3 E8 x: S) Q; ~" ynamespace fy_Exp{! H- f9 }" l! }7 ^- A1 c+ z% T
namespace {template <class _T>
' z, _  z) U' I3 M+ v  q1 @inline _T GetExpValue(_T t[], char& csym){2 S# r9 X- z  t% ~
    char c=csym; csym=0;- q) @! w" L+ c' Z
    switch(c){) h; S. f$ x9 ~9 H; d4 z7 m! m
    case '+':return t[0] += t[1];
+ r: o0 T) S) H* z( g1 N    case '-':return t[0] -= t[1];* U; J. I/ w( D; u4 n
    case '*':return t[0] *= t[1];# c& r  U, C4 c, a  w- G) @
    default: return t[0] /= t[1];//case '/':
* R" q3 z  e2 o    }- z/ y" g; T# J8 R% K. m
}}
! e8 n3 z3 {+ R5 r, T( Y3 B. g$ Qtemplate <class _T, class _Tstream>
0 Z' A; h/ O  P' j+ j5 }/* _Tstream: inputstream, _T: get return value
1 {+ c7 N2 u2 o1 X& ^* Return nonzero if get value successfully */
4 N. N  D- x4 b+ ?int GetExpValue(_Tstream& istrin, _T& nReturn){# H. ~( B. z4 o7 d# ^2 n: _3 @4 I; J
    _T t[3] = {0}; //雨中飞燕之作, g2 t4 c  _% [$ i1 g% O
    char csym[3] = "++";8 z9 N2 v. w4 i7 }+ r
    int nLevel = 1, nERR = 0;" O& Q8 Z/ k- O6 K6 {8 I
    if(!(istrin>>t[1]))istrin.clear();# j$ k; _' s+ y2 p
    for(;;){: d. [. z( ^% Q9 ]) u( i; O7 i/ Z, c* S
        if(istrin>>csym[2]){
- {" W' r. K! U" n8 q* O" e            switch(csym[2]){  _1 O  H' @' k
            case '(':
/ v! B8 V; W7 Q7 l8 x4 S7 E. w  @                if(!csym[1]){nLevel=0x100; nERR=1;}else  w0 `+ n8 }8 I8 {2 @! C
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( W2 j9 ^& U( i8 U  I. }4 }& G; K
                else{nLevel=0x100; nERR=1;}
) I; w; Z" _7 v$ b. @                break;; W0 r' ~- K$ \$ F& D6 [" U
            case ')':9 u: e2 ^9 a2 l! f4 I
                {nLevel = 0x100;}break;
* ?; K" \) n! T! I. y0 w            case '+':case '-':case '*':case '/':
/ F# S( d+ X3 c& {! _# g& i# a+ @                {csym[nLevel++] = csym[2];}break;5 }$ ~$ W  J; |0 h, r( j1 A7 ?
            case ' ':case '\r':case '\n':case '\t':continue;
( R7 J1 j% s* Z* `; K" \' o            default:6 U  B0 d- |: T. F7 h/ u
                {nLevel=0x100; nERR=1;}! }# E0 a& _. O1 I$ q
            }
6 b: r9 K& o$ B' l; \            if(nLevel==0x100)break;; ]0 E  n# ]0 \, h* Y, r! w
            if(nLevel&0x10 || istrin>>t[2]){$ ^- X/ T& |, F& A9 \3 M
                nLevel &= 0xF;
( a0 |3 t9 r; r; Y4 a: q- E                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}+ G% |5 W! {; \+ C
                if(csym[1]=='*'||csym[1]=='/'){- {+ ?3 |! b1 H% i- x# @( r
                    GetExpValue(t+1, csym[1]);
: G; k9 _5 L- K                }' r5 \+ z2 q5 `) N. s* X, M
                else{$ ~, K" G2 I! k* F
                    GetExpValue(t, csym[0]);
6 s9 U: v" F* ~& a* @                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! d$ K; X9 a# d( k3 T2 O* B( E                }! P# }1 l7 x- S
                nLevel = 1;
% X4 h  x: w: v! m            }
, s+ i2 h1 z) P            else istrin.clear();
% U9 |4 k0 o4 l' Y, b        }& `6 P* v6 v5 v: y! }5 s+ L
        else{nERR = -1; break;}" T* b) ]% |" e7 g, m
    }+ U3 ^) d5 S9 e7 C
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 H& l& H* y* c/ F3 Y5 p4 g# N    else nReturn=GetExpValue(t, csym[0]);
% x  \4 [$ X, i! H+ H    return nERR==-1?1:0;7 N3 C' @" x$ @
}}
# ]# ~5 v# l- x# F" y/ N
2 L7 M" P& k' Z& j" p4 ^
  [4 R/ X/ H/ T) {- L" c, _: Z7 D) I, s- Y  r, z- V  u( i: A( t9 w
函数模板使用示例:
2 \6 q0 b" V: b& A# m在以上那段代码的后面加上以下代码:
4 g8 t, ~6 d7 W/ y6 K! L; _1 l
- L9 E# U# ^9 ]7 n1 o2 T7 a 7 k( h! c3 k3 A2 Q
) `; B) C& L; F  i5 J$ h
程序代码: ! _7 e* k5 o! k8 Q

1 L" v% X+ p3 S  E/ z#include<strstream>
2 i1 f# [% V$ V5 N4 N#include<iostream>
* J8 V0 E7 B! X" E# `2 R#include<string>3 u5 A5 B. s  t; O1 c
using namespace std;3 H4 y7 d2 A4 I# J; i2 h
int main(void)
  I% R7 X! Q1 d; L( I; L* a; {! ?{( M2 G# P1 n5 k, A0 m) X+ M6 F3 W
    string s1;* i/ M4 `: ^4 a" B3 E8 C
    while(cin>>s1)
# N4 {+ b4 l  H% M    {
5 c: p+ u' U) |; X: [4 Z. r6 O        istrstream isin(s1.data());% J# ~0 _) _: L/ i6 B8 Y6 Q- o
        double d;
) y7 F4 |* f' f2 r3 j        if(fy_Exp::GetExpValue(isin, d))
. H. Q+ l# n. @4 r( t2 f        {
; X- R1 I; C! f* E( R            cout<<d<<endl;) g- [) C% {. T7 |  }
        }7 P; p9 E7 m2 [8 l: _* S
        else3 s# S6 W' I1 J, P
        {# k# f5 n0 {8 ?# h* K
            cout<<"ERROR"<<endl;
4 n  u6 c2 u) o' z        }
4 i2 W# ?* V- K. E    }: n7 D/ u+ z7 u3 @1 m0 |! }
    return 0;
# a1 j1 |1 Z$ o- \( Y}" m8 @4 k  h9 k3 Y, a  W
1 |' O( g4 |- g

+ @5 Q6 ?- ^  r9 f  G. T5 q然后编译执行就可以了(*^_^*)# [; r6 s2 {  ?, R$ ?: @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译1 J. k& ~8 n/ `
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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