返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的," ^- Z9 R$ {; d  I/ i6 q% v" l0 r
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ N! \1 }$ L6 ?8 f5 f# j/ g
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 o$ r, d, I# g, h) U
参数解释:
3 ]2 m" l) w: X* y2 c& qistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) s- C& g, f/ C& z9 x7 YnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 f* [5 y; V1 L# S& l5 y1 |5 Q
返回值:
( Q: ^8 @7 c) ]+ b: {. C返回非0表示计算成功,0表示计算失败有错误
* p; x+ N( ~6 i- \4 W* ~5 f1 R7 j4 N) h: G# h: }% C& |

' z' c" r$ q2 [) f
; D* T8 L, Q1 s$ c# _3 [( r$ n程序代码:
, v6 r3 s, v. ~) _$ D( g* g$ {# X! N
namespace fy_Exp{# \- y. l2 Q! Q
namespace {template <class _T>; O# `. N- i! h- O8 [3 L/ y
inline _T GetExpValue(_T t[], char& csym){& A5 a! ~0 z( x. N
    char c=csym; csym=0;
* ^6 K, v& T* `' M+ R% {( v    switch(c){* _. j4 Y+ \# Z  V: W. L! Y3 _7 }! s
    case '+':return t[0] += t[1];
5 g& P1 n  i% k% ]1 j2 D- r, L    case '-':return t[0] -= t[1];: E; A% j% c0 c# T/ Z- S
    case '*':return t[0] *= t[1];/ S( X& C$ L9 B5 u3 g
    default: return t[0] /= t[1];//case '/':
. B; \. [1 U; s1 v+ M1 E) Q    }. a0 D- Q" V# _& j* I; q
}}
0 v& |4 D) Z. _2 s' ytemplate <class _T, class _Tstream>
5 K# o* k1 l# Y+ a2 V/* _Tstream: inputstream, _T: get return value  S0 D& v: _, F/ m$ I
* Return nonzero if get value successfully */
2 t: X% x) h$ A8 ], F: Zint GetExpValue(_Tstream& istrin, _T& nReturn){
6 \+ l( S/ d7 _% W9 \    _T t[3] = {0}; //雨中飞燕之作6 ]: G5 C! v7 R
    char csym[3] = "++";
; d" |% g0 f/ ]! s' Y    int nLevel = 1, nERR = 0;
* ^) J2 ]- g* E/ Q% x/ V. t    if(!(istrin>>t[1]))istrin.clear();
* g' l9 w4 a" D" S* q0 r    for(;;){6 C& a% R0 l- S  E" ~
        if(istrin>>csym[2]){
1 z( Q* c# C% d& W; E  m6 e; h            switch(csym[2]){4 r* P( }3 X, z
            case '(':
' i7 w4 D2 u& ^* s  G& g( h$ z( Y, ^                if(!csym[1]){nLevel=0x100; nERR=1;}else
, x, ?' ~) Y5 ?8 y& a$ f                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! z7 _) M0 t- A2 R$ F4 ?
                else{nLevel=0x100; nERR=1;}
. i0 l/ O8 p1 i7 @6 A1 V& z5 d                break;$ @& S+ s: i; R# l
            case ')':5 n- f  w. a3 `: z
                {nLevel = 0x100;}break;
( O7 J$ U, j% |2 F! _0 z% ]            case '+':case '-':case '*':case '/':
7 x$ I9 F+ S( J  `2 h0 f                {csym[nLevel++] = csym[2];}break;
( _- H" e* G9 A3 l: l5 a0 t            case ' ':case '\r':case '\n':case '\t':continue;  ~# g, s; t' ~3 R
            default:
9 }( O: C; m5 d9 v! V6 v' l                {nLevel=0x100; nERR=1;}
, G% _! O# O' y0 L9 \            }- h. |7 x  B) r1 F- o
            if(nLevel==0x100)break;
9 g/ V0 B, m9 A' x# G2 N1 C            if(nLevel&0x10 || istrin>>t[2]){; Y- s2 o# p  k8 [
                nLevel &= 0xF;
/ P' O9 x3 r4 W+ N8 |                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 M4 q6 E2 D6 s8 r6 }                if(csym[1]=='*'||csym[1]=='/'){
6 t8 n6 C: Z) M                    GetExpValue(t+1, csym[1]);
+ K# Q; D) D3 Y, X                }) ]# G) [/ Z$ s- b7 I- w
                else{
9 m5 g* ~+ H$ W3 [1 [9 `5 I                    GetExpValue(t, csym[0]);
1 ^1 [6 L9 w& f& G% \* \: K9 W                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
. ?3 {, x5 z" K% q                }
# s$ I" G3 Z  B1 E                nLevel = 1;+ [! A# O! k  H& H$ o+ }+ V- y
            }
, n3 l* o/ \8 E& Z4 }  B            else istrin.clear();
) i+ \3 y1 u& D1 p        }( \9 d$ X$ k' ~0 u" O( a
        else{nERR = -1; break;}
8 H% v  A, q6 C/ ~3 N! q8 T" f    }
5 N7 V7 K# {0 m- v    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 x: R7 ~. Q! i# A5 H: [. a
    else nReturn=GetExpValue(t, csym[0]);4 Z  E  p% z4 i  G: v$ {- f  m0 e
    return nERR==-1?1:0;
" G1 |3 a9 U  z& a) Y& V}}9 |: k' d4 g) B
% w. N. t  @! Q& F! S" w
6 ~/ @' Z% k1 b6 i7 A
0 t/ z# h1 B, C0 f1 }" [0 i
函数模板使用示例:1 E3 M9 B" u9 O2 c8 H6 J. O: ^# o
在以上那段代码的后面加上以下代码:' I2 [3 m2 M0 P( S7 d
9 R: |9 Z' o" I: o. V
% R% L* N- j* s* ~
, B% n# n( ~" }9 D+ H
程序代码: , o$ Y( V% V2 ^8 W5 l

- {' O( i2 N5 `$ R#include<strstream>, D& m6 D) e1 t/ A4 D" @# F0 R
#include<iostream>& L: C  K6 e" m$ g; J# R) u
#include<string>% v! y1 Q. H7 X  Q* Y
using namespace std;
8 M: Z3 @! N% C' [. G; f$ fint main(void), Y: s/ `7 X: c- o3 M
{
+ Z( d  a: Y% n" F    string s1;
1 I/ ]  M6 _' F0 M2 j- M6 L# C    while(cin>>s1)1 A. p: ]; ?0 v* e( _
    {, s# M: a8 `: F" E
        istrstream isin(s1.data());
; U; z8 B  N* E$ [6 r9 L        double d;
+ g, E' O! M1 A! W+ d' m6 a6 \% J        if(fy_Exp::GetExpValue(isin, d))5 ^# n4 r% b6 X7 H4 Q, W
        {
' e/ L2 l+ ?( s3 G* v            cout<<d<<endl;
" ~7 M2 E& s4 y4 K( S3 g        }. k4 F/ O/ F* h) X" o6 e
        else
3 U* {, s( X: i  R  M  q0 Y4 F2 f+ y        {
4 L5 B& e6 J& V- x% |' Y            cout<<"ERROR"<<endl;: u2 Z* g# L- `) p% v5 s2 q
        }
( Q9 m$ I4 R0 c- d( ^# l: A    }6 F/ i: |* {/ [, c, D; W, e" Q( @
    return 0;
# h- J0 P: }6 P) t) n& L$ ^}
3 {. s+ }: x  k/ g$ q- s- a% b* l$ P) ]/ i5 e, j
1 I# d! G3 ^0 |0 ?# k
然后编译执行就可以了(*^_^*)
9 h& b, {+ H$ f8 A& J. m其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; Q; d0 ^" v3 N7 Z+ U1 f6 |3 b      建议使用VC7或VC更高版本,或者使用GNU C++编译

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