返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
! ~9 h) N9 H- y' I; m/ \* m2 g一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
  ~( G* g9 L5 Q/ v只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) [& D& W3 T7 Z! k参数解释:5 {  T" y( i; l# D( ^# h# y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 m2 F/ T1 ~) n' \nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 q% }4 }+ l) r$ P2 K返回值:
8 J, H% \' l8 z, r+ O: p8 Q4 i返回非0表示计算成功,0表示计算失败有错误
6 D9 O* _9 y3 f5 B' P% I" @' }: R
# X# K& X* a3 i/ {3 ?( K + g1 |! D! q( m  Y

- h! |& {/ f/ k/ j# s程序代码: 2 G0 P- A) g8 S" Q" a7 A0 p" m
; J; s& b7 r, {. B
namespace fy_Exp{
$ u9 Y) N  z) L2 w; Pnamespace {template <class _T>
& q4 ?% I: q/ [- O: minline _T GetExpValue(_T t[], char& csym){
( Q$ V- C1 A3 J  `' t    char c=csym; csym=0;
; f; h# a( m+ i) ]+ @8 F1 N    switch(c){
  u# h1 q8 A' \$ i0 i    case '+':return t[0] += t[1];+ @6 e& q$ Z+ \  O9 m9 t! _1 o& l. {
    case '-':return t[0] -= t[1];
' f  \; E3 b" k6 U; v    case '*':return t[0] *= t[1];
. ^3 x# Y# h" \5 L; N/ f' r. F    default: return t[0] /= t[1];//case '/':
. Z& A  G* @' X0 s    }& U# d% ]0 G' Z: _
}}
5 s; j, u$ C$ C6 atemplate <class _T, class _Tstream>/ w! f7 z( z1 Y) [) h8 H
/* _Tstream: inputstream, _T: get return value; I9 h8 ^3 J# U7 U% @2 L4 A
* Return nonzero if get value successfully */
. u3 b% ?0 T- z( V' t# dint GetExpValue(_Tstream& istrin, _T& nReturn){  a3 T+ f: F. R
    _T t[3] = {0}; //雨中飞燕之作3 E7 w" `9 a0 N/ ~/ c
    char csym[3] = "++";4 C% Y3 J) p2 y! j* Y8 m( B
    int nLevel = 1, nERR = 0;# u! R. [* t$ \- ~$ H* j. M
    if(!(istrin>>t[1]))istrin.clear();
% I; L' _) t" P& c/ ~    for(;;){
* ]1 r7 @. g$ D  A0 f        if(istrin>>csym[2]){8 l+ L" t2 P* d$ Z
            switch(csym[2]){& l2 N+ v! S; B. ^3 _3 J
            case '(':, q; N3 J- O, P% e" \& a% l4 [8 p% |) p
                if(!csym[1]){nLevel=0x100; nERR=1;}else- h4 {2 m$ e$ W
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# {! V# z' I% W' M" ~
                else{nLevel=0x100; nERR=1;}
" g  O& ?9 r; d0 r                break;& |# Y% @! v/ x6 C. u7 y! r
            case ')':# R) m6 N( E# H* O+ w
                {nLevel = 0x100;}break;* d4 T: A- o5 e
            case '+':case '-':case '*':case '/':
8 V- O, @% W4 d4 K  Z& T                {csym[nLevel++] = csym[2];}break;4 m* z4 N! k' P" m( S/ Y1 a
            case ' ':case '\r':case '\n':case '\t':continue;
" m: J" {, }/ ^' Z; a            default:
% R& L5 O; G0 o% v( n0 t1 w3 C# k                {nLevel=0x100; nERR=1;}0 c3 Y3 a( K5 E, ^: S/ o
            }
! ~. G  _7 W% C1 T            if(nLevel==0x100)break;1 d+ Y9 v! M1 K
            if(nLevel&0x10 || istrin>>t[2]){
" w  p7 ]- w8 U0 L( ~                nLevel &= 0xF;
# u7 o  g7 _2 ]' f& t8 M" `                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& h  M1 V1 ?8 b7 T0 d0 z1 G' b" n
                if(csym[1]=='*'||csym[1]=='/'){
0 \$ W8 P/ }! z% w3 F/ x0 z                    GetExpValue(t+1, csym[1]);6 o6 m, _$ C4 k! _$ B- n: C
                }/ v: |% Q( c+ Z: ^9 I
                else{' s' F8 e: g" e. {" Y
                    GetExpValue(t, csym[0]);
$ A  F0 u4 {. F) k0 r& |7 q                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;( m$ o/ P% t- s( ^6 R; A
                }9 ~2 n6 X2 m: i3 Y. }3 f8 @. l9 r
                nLevel = 1;
1 b3 r6 ^% j' q4 G% ~+ n. f8 p            }: q; E. m& F+ t0 w$ e
            else istrin.clear();2 B' a4 k. G# I; i
        }9 c3 C; `# A! b, b) M
        else{nERR = -1; break;}0 R& S) Y! o  M% r1 s
    }2 {! U( R  F; W6 z  Z/ Q
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( T" g5 w# L/ B" E' Y: h4 n" f    else nReturn=GetExpValue(t, csym[0]);
' E& S4 W' h! t6 J- J    return nERR==-1?1:0;
! R2 ?) P5 q- i+ o, O( _}}) I+ Z- D. i& [3 ~* I. m

: p: c6 x6 s, S
$ l) ?8 w& w& E$ u5 @! P. A, \: |) o/ I% p8 |9 p* q
函数模板使用示例:
! A# D+ S3 \/ a2 ]3 V2 Z在以上那段代码的后面加上以下代码:# _1 j, _. e0 L, n. ?2 h+ j3 Q9 Q

2 O' |, q/ c! b" p! J! e6 t$ D
6 r& y  m# N6 Y, |5 ^4 {+ p
) H8 Y9 K  ^2 W7 P' I程序代码:
; k* y3 c9 l! X: W
6 u) ?5 O0 [6 @#include<strstream>/ v+ O% L; n+ l( `
#include<iostream>; V3 G4 u: j" [; N
#include<string>
) c0 Z" G, s( d& z- susing namespace std;0 z( F! u2 p) v# R6 W
int main(void)
# ^4 [0 D0 f: ]! p! Z) S{
1 m, [4 j$ q; _# z    string s1;: H% F5 p; r1 S3 Z# n
    while(cin>>s1)
) z8 f  j' e2 R* }# ~9 K    {+ f. @5 K- h) N$ |
        istrstream isin(s1.data());# e, e2 ^6 O  L4 G* l# I- b
        double d;
# T& N& n- m2 v& t        if(fy_Exp::GetExpValue(isin, d))
4 J5 H$ T) d$ x) m8 U; E. q        {6 M9 U$ M% q" H4 [5 c5 d
            cout<<d<<endl;7 ]' _- S* [# O, @: N  J
        }3 B+ ?, L+ ~+ r! Z2 d$ R
        else  O+ J5 J  D% X- r# Z* n1 ~
        {8 ~& {! w- ^" V7 ~$ W8 c' t- C
            cout<<"ERROR"<<endl;* B. h3 a! l2 P
        }
7 m! K; K) }, B# [! a1 j& f    }
+ v0 G8 j% o  t/ B$ B2 q* n0 @    return 0;1 G4 Z' N( I. _+ B  G3 c1 q
}+ g$ P. W7 ^: p" v! \- X3 C- t
. [) Q4 T# J2 M# T

, U. r. v  a- @" _然后编译执行就可以了(*^_^*)+ S1 v% l1 X( p
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ u% N# }9 ^3 m5 b# `+ {+ u
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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