获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
) Y" J0 Y9 t2 T. J一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 V# B+ m! A8 i只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: X! o1 [, B8 W* H, i4 ~参数解释:
0 K2 ~( R2 C6 E2 x/ ?9 zistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 D, Q' F3 W$ Y7 P, m4 X, K5 I
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! H3 z& n/ {: K8 o& z. y/ x
返回值:7 k8 Z( m) t, l+ Y2 e# W4 G2 e
返回非0表示计算成功,0表示计算失败有错误
8 l4 b: @" O- y  D
2 z3 d  l5 z7 o% H0 I 5 T5 v$ U( _* N. L% R" {; b/ Y

3 [* ]' t, S2 p  h程序代码:
, ~$ ~# c, I  |2 D* x$ _2 R
! t: A2 J4 W+ B; y( O9 L3 V5 rnamespace fy_Exp{7 {3 i* |- S) d& N" v
namespace {template <class _T>
' u4 _, ?* l8 e4 Jinline _T GetExpValue(_T t[], char& csym){+ C/ H( h" c1 l" x  h$ {3 ^2 K/ F
    char c=csym; csym=0;
7 K+ b1 A1 ~% A' l    switch(c){
- B/ _; f8 z% s+ h    case '+':return t[0] += t[1];( Y; L7 D9 v" t9 B# Y& k; E
    case '-':return t[0] -= t[1];
3 [; C, s( `  |% y    case '*':return t[0] *= t[1];
7 D0 K0 t6 y$ o& `1 X    default: return t[0] /= t[1];//case '/':
$ Y" i9 r) o: ~    }) |( j/ W  b  |( M- X/ l8 I
}}
+ i) V; W/ U3 z/ ]template <class _T, class _Tstream>
8 R8 l1 q/ D, b1 u4 G4 Z5 ~/* _Tstream: inputstream, _T: get return value
% S2 o* P, Z4 F; b6 g5 J* Return nonzero if get value successfully */
) D) s  f! I& M; I9 Y' \# w# Iint GetExpValue(_Tstream& istrin, _T& nReturn){
' w/ y1 n. m' w8 D- w& P    _T t[3] = {0}; //雨中飞燕之作
7 a+ |4 g7 n  e; k+ U7 m) q; s    char csym[3] = "++";
+ D. D, {, q" S" V5 s" |: T    int nLevel = 1, nERR = 0;
: t& t  }$ S3 t9 z& @5 l, p    if(!(istrin>>t[1]))istrin.clear();
* `! \! l  Z- g  b% I) v    for(;;){
0 R) I7 N: V# _! U+ \3 U$ I- d        if(istrin>>csym[2]){
- _9 n1 y, d- E            switch(csym[2]){2 P7 d5 E( i( H& t/ ^* g
            case '(':, t: n: Y- W: b5 {, o- g
                if(!csym[1]){nLevel=0x100; nERR=1;}else
- i! G, }; m0 D7 y. O5 R6 d$ |                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; D% m0 F" R$ \2 t1 Q5 v
                else{nLevel=0x100; nERR=1;}4 E* c- _/ z  y7 h# d( p6 W
                break;
9 U. A& F" P0 ]" Z& y& M7 T            case ')':7 F6 t9 {2 D, [2 H) }* p: G
                {nLevel = 0x100;}break;
: S4 S& w) V3 d( K  |            case '+':case '-':case '*':case '/':
. s8 H1 o8 f5 G: n                {csym[nLevel++] = csym[2];}break;4 V  @/ D! n* |
            case ' ':case '\r':case '\n':case '\t':continue;
( H& ?9 L, a' h+ U9 X1 h# x            default:
2 P- `$ q; `! D* g% ?                {nLevel=0x100; nERR=1;}
6 z/ ?3 r9 e0 j5 d$ w5 p8 _            }0 w% p) ~8 ^% s
            if(nLevel==0x100)break;
! Z2 f0 [3 H& _1 a2 Z& q9 E! }& L' P. k6 w            if(nLevel&0x10 || istrin>>t[2]){
2 l6 Y1 v4 }2 x                nLevel &= 0xF;2 i- V: B3 O  v
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
* @" g+ L- v% @7 x* V                if(csym[1]=='*'||csym[1]=='/'){# D4 W! x* D  j+ o& H. l& `* ~) e
                    GetExpValue(t+1, csym[1]);; g; p, b( J4 X
                }' Y3 P2 D1 i6 `. E' V# D
                else{
: h  Y- G" r3 L- R. l                    GetExpValue(t, csym[0]);$ K1 S) N. K& I: Y1 A8 G, ?
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 K1 y1 p  c2 S' y
                }
5 V5 ~. k8 c- I2 X' d+ F4 X4 ]& Q                nLevel = 1;7 z* ?1 E7 @  K( i! c
            }
, W- Y( P; C- h% n) V' }, b( H0 g            else istrin.clear();
6 T: s9 c9 i) t. x        }
' w, ~4 W8 Q( x* A2 C        else{nERR = -1; break;}
5 j8 t% n. X+ F" N6 l  [) U8 D    }$ k, a7 N/ I- @& W, T: z
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ g9 A7 L) I( C0 {    else nReturn=GetExpValue(t, csym[0]);8 r' I) a4 \+ M$ J1 l; k2 o
    return nERR==-1?1:0;; O& z" P! ?: d( m3 \
}}& c  Q  L& m/ Z7 p( Z" h( x

2 d, }) o" Z4 R6 t
8 b9 l& ?- B# l' R0 J! i5 `$ y* Z) Y# R% U0 J# G! d1 F
函数模板使用示例:
: k+ r$ P( C( V0 @& p在以上那段代码的后面加上以下代码:
" e# a' u1 F: K8 k% B/ `& b# p
; ?( g" |0 p# Y3 A- z! k0 ^, O0 c
+ U( P# M, p" S3 [7 |
0 T9 P' y% ]( X. |0 r! i程序代码:
( ^, R; P  L$ s- Z/ \/ W2 p& X2 q5 \( N1 d9 f% g/ ~" o% B4 H
#include<strstream>+ }. {2 M) j& N" S; n% I
#include<iostream>
. t0 P/ ~: k. u% L0 q, o: M#include<string>. L3 r0 x- y, |+ Z
using namespace std;4 I4 \: L  F( L
int main(void)7 R, X. A- W2 }5 A1 f9 j
{0 X( L! U; F, E# p% @! {/ T6 A6 g
    string s1;; T( o5 c  g3 ]' z. ]: v4 o
    while(cin>>s1)
: {/ s; e. l7 _0 @2 \, t) W    {! @/ Q7 c0 a; H  ]9 \; I
        istrstream isin(s1.data());
( r9 K0 U5 L8 F3 V$ Q5 k& H        double d;7 u" E3 F7 q* f- Z/ [
        if(fy_Exp::GetExpValue(isin, d))  V4 l& I' F; M* N( d
        {
2 A8 n) {8 V, S* X9 z            cout<<d<<endl;
8 M/ y* {7 U. |3 Z  w$ y' {        }
, ^3 q8 r2 c: n) M/ G+ z3 H5 d8 H        else  x# c4 y. `! P/ ?
        {
. o, B' b! [: v            cout<<"ERROR"<<endl;- q  t) t; |4 s% {: {
        }
) i4 Z6 D% U# E1 I7 |5 U  k    }. R" N; h' B2 O# w- v
    return 0;
% q8 i1 }3 w( u* P- [}
' S2 t- O' `( h# M% T9 d0 C* \8 Y: v3 p, g! m5 E! H

0 T9 n, f, u$ _& R然后编译执行就可以了(*^_^*)
- m4 i+ e' ~* {& j3 [其它:TC++上一定编译错误,不保证在VC6上也能通过编译& X  V/ [; D+ S
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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