返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
! a( G: _9 ~6 K$ f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ X# p; ?7 {. @! Z9 f" ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' b( c1 y; r0 e4 }参数解释:9 q6 |, _: ~' \; D
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" a2 m- l" F* |4 r2 \8 EnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定# V7 Y3 x! Y0 G' Z2 r
返回值:% g) d' M0 K& d) a! U2 j* [, G
返回非0表示计算成功,0表示计算失败有错误
4 D  Q' R# b3 j8 _3 q, a! Y' @  D& D  }% J

' s# D: `, _  i! F  a
5 Y6 J$ F0 l4 U3 u) S, j程序代码:
7 _$ t7 F& E) Y, R+ W
, k! a2 i& ^: a* m6 j! q  dnamespace fy_Exp{
$ T2 X9 t! Z8 gnamespace {template <class _T>* S1 r/ ]( c' n% ]( e
inline _T GetExpValue(_T t[], char& csym){' w" K, x* x0 `( C- m# n* I
    char c=csym; csym=0;
& g/ X0 Z0 l8 v" o# q    switch(c){
% b& v9 R$ J6 M5 U) r7 H    case '+':return t[0] += t[1];
) I/ i9 {; @$ {    case '-':return t[0] -= t[1];
5 v. Q# L1 l0 f" w9 m    case '*':return t[0] *= t[1];
8 Z* I% n! k4 W3 Q) U7 }& M    default: return t[0] /= t[1];//case '/':  }, k3 r+ g9 x- n
    }
: v$ u5 r# ?7 B+ Y}}& N. ^" [1 i3 {/ a  Z  |7 M2 i
template <class _T, class _Tstream>, s; m2 p8 B8 m' w0 N0 D
/* _Tstream: inputstream, _T: get return value
& n/ H& R! I3 W, V" }9 a" O- B* Return nonzero if get value successfully */
+ l" O" I+ g/ tint GetExpValue(_Tstream& istrin, _T& nReturn){
! ]  Z  M4 H6 M( D5 c    _T t[3] = {0}; //雨中飞燕之作
0 v; D: r/ T% c) O    char csym[3] = "++";
; p" A  M& I. q2 b    int nLevel = 1, nERR = 0;( C  a7 W; ?( ]5 ?
    if(!(istrin>>t[1]))istrin.clear();
6 T- Z2 x* R  t+ T' N    for(;;){
! Z9 F9 O4 ^3 ?+ ^! J/ _        if(istrin>>csym[2]){
# x/ U$ w4 e" {- F% t            switch(csym[2]){8 z- q9 e/ q: l5 n
            case '(':
7 s* N5 w" {: W* a3 c  {                if(!csym[1]){nLevel=0x100; nERR=1;}else
( A: F6 k; E* W                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 A* v- |* \: D& i# O! A+ n
                else{nLevel=0x100; nERR=1;}5 ?# p' c! T" J4 e* r' Q
                break;- }8 L2 Z; B7 s% f, W
            case ')':
& L0 t0 e* k8 p( D& }/ n: \% n& S                {nLevel = 0x100;}break;
- `$ C9 v$ T) p& J            case '+':case '-':case '*':case '/':
0 j) O# F" x8 l/ L7 v; F                {csym[nLevel++] = csym[2];}break;
  U, I# b! B3 s5 Y2 \+ N            case ' ':case '\r':case '\n':case '\t':continue;
1 U! m: o+ O' N) r+ W9 D0 B  _            default:8 e, `: ~4 X' e1 Q
                {nLevel=0x100; nERR=1;}
& f# l$ z) \1 p& `. n* R9 g% ~            }; @5 J" S. G1 N
            if(nLevel==0x100)break;
' Y4 r; G2 G# O1 W5 m            if(nLevel&0x10 || istrin>>t[2]){% R- h. N/ W8 x2 j. D' P# f
                nLevel &= 0xF;
+ m: h" u4 t% t& N) G  T2 P' S                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- L* L7 l* I2 g8 |/ h
                if(csym[1]=='*'||csym[1]=='/'){
5 x1 M) @2 V! o" r! {/ [                    GetExpValue(t+1, csym[1]);" u1 E! o4 t5 M
                }/ ]  v; p! s, n3 \6 f; p% v1 g
                else{+ c! h, J: r8 \2 ^; |. S* m
                    GetExpValue(t, csym[0]);! I% s0 g% T- Q0 [
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# @& z( d# C+ B' U                }% t* _3 r; S0 o8 y& J. Y0 Q
                nLevel = 1;
' F# e. D* {; Y! T/ ?            }
4 Z: a( \- I7 I& w9 I# g            else istrin.clear();
+ B+ `7 S; s, m. T* G" \        }9 i; W1 v. x. y5 t7 D
        else{nERR = -1; break;}
0 O, K2 f( o$ K, ^# @6 o! R    }: n/ r. r8 f- m* y) t7 f! f/ g/ h% ^
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 k0 u" f" d/ S$ U; ~2 g6 g" D
    else nReturn=GetExpValue(t, csym[0]);  ^  T4 G9 b$ H7 {
    return nERR==-1?1:0;- {9 P/ K) M* X1 f) r5 F
}}
6 ]+ H  l+ V; }6 c. M9 z0 A- r, S' ~+ r7 |0 K9 @

, F- n: B5 `5 s! o$ ]8 N3 h* J/ y1 B/ _/ i1 N
函数模板使用示例:
  {( S: |1 R9 H在以上那段代码的后面加上以下代码:( Q- Q% f- t/ ^0 f/ X" `

5 V# W5 `4 l' I
9 o* I2 Y) i2 v- H/ n& K  u- V: c" l0 v( P' ]4 n
程序代码: 0 x% g+ c" b. O7 D. @+ L9 b$ s

# n( [7 u% y( Z! i3 f4 b#include<strstream>
) G4 m1 t/ j( ?* w. x8 S#include<iostream>
, K: l2 Q) d9 H! ^! [/ Q#include<string>
- a+ O2 J! V& T  j+ Qusing namespace std;1 L% ^8 w- x# F- |
int main(void). p. S% L! ?: Z  \# J
{
) C1 Q1 ^0 V/ J, }  d    string s1;; [5 i/ [! M! r! I1 y
    while(cin>>s1)+ x9 A/ N  X& H0 [: }8 _$ A
    {2 R$ Y. X) f' H6 N, r1 m4 C
        istrstream isin(s1.data());3 V# N* [. g  E8 O. S) X* L
        double d;* z0 M" Z3 E4 b' `9 ~( Z
        if(fy_Exp::GetExpValue(isin, d))+ G0 N2 B5 g3 x. ?( @) V
        {
. i$ X7 @, B3 `  ?            cout<<d<<endl;' L. R/ N+ s/ C5 W4 n; E0 S+ C! s; @
        }8 ]+ @1 ~- l4 m
        else
0 O! A, Z2 ]% {% q. H        {
8 a2 T/ [& \% h9 ~9 ^6 j9 x            cout<<"ERROR"<<endl;
) B) [$ Z* M& r9 [7 r' ?, T: ^5 F        }# [# W2 `/ o" @  e' r# R6 ]0 ]/ E
    }1 h  U1 w; j" a# X  c/ o
    return 0;; I# d! y( W+ v, G7 F* P9 U/ Y
}
( P! P% ?5 Z$ [4 y& ~
9 K" ?* S4 x1 ^$ G8 ~! x% O
" ^% Q' M- _3 [然后编译执行就可以了(*^_^*)
/ V" C9 r; {3 Z/ r- f其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 s4 A- R5 v& x8 V- j: E4 ]0 Q      建议使用VC7或VC更高版本,或者使用GNU C++编译

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