返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
: J! g; q( b# f( s一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ y# P2 }: \% c0 Q7 e, M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
6 b+ r* w' B# C/ S参数解释:
% U: Z; K* C9 ^, U$ z! nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
, a+ k5 T+ F- T% j2 b; h& QnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; K+ O+ S- e& @
返回值:2 t3 z& ^# c6 F0 P
返回非0表示计算成功,0表示计算失败有错误
! l' r$ F7 W  P9 E9 Z& x9 W. G) @, K. P% `
( v& P5 d/ Z# u# E7 c
9 B6 E5 ^4 C& T5 c
程序代码: . t( ~9 O3 T% P0 m, F
& X6 ]8 u! S) K; X9 [$ z
namespace fy_Exp{
2 X7 J+ r* j! v$ hnamespace {template <class _T>, \* h5 [* t5 ^( c# T, H: h, K
inline _T GetExpValue(_T t[], char& csym){
4 h+ S& G: k  ]+ m0 v5 a2 W    char c=csym; csym=0;9 N, p$ t1 b% K- m, a$ w  }( m, ~8 t
    switch(c){
0 x4 Q2 R3 J8 V7 k7 V+ c    case '+':return t[0] += t[1];
3 R3 T, z9 L" q3 K& i2 A: [: i    case '-':return t[0] -= t[1];1 ^7 G# x3 z/ C" n+ G
    case '*':return t[0] *= t[1];
0 J- ]8 ?) r4 V9 ^* `3 @" g    default: return t[0] /= t[1];//case '/':
! F5 y* P& j0 @( @. g    }: w& d" r! B1 s8 q/ c5 x
}}
, Q! Y8 s  r- \# T, r  {4 ]1 A0 itemplate <class _T, class _Tstream>
+ f+ Z+ U7 I% n7 X& D0 z: `8 F/* _Tstream: inputstream, _T: get return value
) a- U" z  b/ a# l; U" v6 a) z2 f* Return nonzero if get value successfully */
5 v) g: V- C! H' [int GetExpValue(_Tstream& istrin, _T& nReturn){
& Y1 l$ k& }& U5 g. J) k0 x& @    _T t[3] = {0}; //雨中飞燕之作
' ?& s- m9 i4 o    char csym[3] = "++";; J8 O8 ^# P4 b& ~
    int nLevel = 1, nERR = 0;
2 m% e3 ]+ ~4 X0 }    if(!(istrin>>t[1]))istrin.clear();
" d0 \& x# _; p' q    for(;;){
: ?! S8 @( w4 H1 f+ l# _( W  T        if(istrin>>csym[2]){/ Y2 \. `! F, F: I( `
            switch(csym[2]){
) D+ T& g) e. {( v4 E# |            case '(':) |' b" I" k# f3 W
                if(!csym[1]){nLevel=0x100; nERR=1;}else
" I) @2 _; j! L5 X$ k                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' q* w& ~. o0 c" T                else{nLevel=0x100; nERR=1;}. [' s( i" w% o0 [: f
                break;
* S- U5 n& o% L* w5 ?0 J( s1 r0 ]            case ')':
  B1 ?/ [) E/ X& V* r                {nLevel = 0x100;}break;
* Y! S' I# x$ H5 H7 n$ f; c            case '+':case '-':case '*':case '/':
8 ?6 ]2 i1 i( B' N* M( l* t: r                {csym[nLevel++] = csym[2];}break;
8 w7 \* v" J% q            case ' ':case '\r':case '\n':case '\t':continue;' W1 Q# S1 n2 u' o- L/ l
            default:
; `7 j' h8 E% e* S  a, ~# m' [                {nLevel=0x100; nERR=1;}
1 C& u$ ~8 X- Y0 l, L' T$ t& h* ^            }
& `, p/ _4 M8 B            if(nLevel==0x100)break;+ T! y  L/ h4 m% r
            if(nLevel&0x10 || istrin>>t[2]){
/ T2 y) N' o: z4 n                nLevel &= 0xF;
6 {; W0 \- A. O  ]" W                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! k: x3 X- ?' Z5 P7 N9 t                if(csym[1]=='*'||csym[1]=='/'){0 H  _: n1 x( `3 e8 A) C( F
                    GetExpValue(t+1, csym[1]);- S! Y- s1 p* h. F% G9 O1 r( p
                }
! o) B$ P) H2 f' E# Q/ e                else{
6 L1 @- j- \' y8 B0 Z                    GetExpValue(t, csym[0]);
" B& I( |* \6 X( X$ q, Q2 {! ]& m                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 i7 H3 Q- S& n/ p* d) b                }# J9 @" L( a$ }: s: e
                nLevel = 1;
) t4 @* W& |! y* m! t7 ]* p            }6 }+ ~$ |8 T- w
            else istrin.clear();% i& N6 g* Z$ {5 `* Z* u8 z
        }) H) ~4 S2 a/ x7 w# s8 L0 i9 S
        else{nERR = -1; break;}
+ u- B- e  ^( s. v+ `# y- X' V    }1 Q1 L, d" ]: |' t0 o; ]4 ?1 \
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& e$ n7 N3 j. f5 q. |4 l" K4 l- H# t    else nReturn=GetExpValue(t, csym[0]);: l2 g: n( |0 [8 d1 ]; [4 S
    return nERR==-1?1:0;
5 E6 a5 V1 M5 t5 x4 ?}}! d( g/ M! B, I+ T1 G% R' U) W

, H' ]6 X' W- A' D" D: r( R; F, T- h% e
; S. D( j4 s9 y7 Y9 D! R- J# I& P+ A1 A
函数模板使用示例:* V8 X) K9 {  C) b
在以上那段代码的后面加上以下代码:- O4 W! G% K# I
9 `# x! m; D2 [# w  D5 ]8 L

7 Q5 O1 X+ \- t2 i4 _' i$ t1 G3 N  m8 H) B$ @
程序代码: 8 z" \% I5 p9 U! A7 Z3 x

0 V5 j) d. Y  s; p3 ]+ @6 Z  M8 @6 |#include<strstream>! u% U+ d+ U% z" O3 N& Z# `
#include<iostream>+ C' Y# F1 B- D1 D! m# {
#include<string>
$ s6 P3 Y, f$ c0 H. R, l- Susing namespace std;
6 S, G- G4 p. \5 z3 sint main(void)
" K" U. w+ k' y  I' n( ]6 n{
/ @6 l" e9 @/ r: j    string s1;4 g( U- n& I/ ]
    while(cin>>s1)" X# u8 Q# O7 N
    {
- N  _& P! ^! U) u" P* K        istrstream isin(s1.data());
4 ?3 w  Z) c/ A: r, Z* x        double d;0 [8 W) t. L1 j* c( C- L
        if(fy_Exp::GetExpValue(isin, d))
' l: [$ H% _5 T2 y+ W        {+ g0 \- q- [1 h# N
            cout<<d<<endl;
. X* y" H4 G/ Q5 j. g! L7 W- w- R  F        }
  ]& D! L9 o1 a! {& D$ Z        else( Z% ~0 |" d  }" r1 O
        {
) q( O6 O* I/ w$ S5 X( ]            cout<<"ERROR"<<endl;/ q- j' T% {0 @
        }" G+ g8 S; E4 W9 B  ^7 y
    }
# C7 E& h) c4 o2 ^" N4 L8 ]" ?    return 0;" H; f- x  @/ @: \, U7 b
}6 o* I% a7 f3 J2 x; u! z
/ h2 {( z( u$ P) q
) ?" i: O& g) u% o
然后编译执行就可以了(*^_^*)
3 y2 L# [, p. r" A0 {* w+ J其它:TC++上一定编译错误,不保证在VC6上也能通过编译. X9 J1 p8 E# w6 w, k: @
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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