返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
/ p4 U6 F3 B& Y! ]: H" {2 r0 q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式% y: N" f7 k) O  ]2 r# p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 K8 O* l$ l7 v0 k3 P4 b' u
参数解释:
) j- p1 n: G/ p, R, ^: ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' v% S# Q9 J4 F& q: m+ X
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* X/ ]! _, B1 S4 W: c  `8 I$ R
返回值:& ?# K- s, I' b$ l3 u$ `
返回非0表示计算成功,0表示计算失败有错误+ L+ F. z# n2 z. S, [/ P

, _9 P% b& A- n+ M! a " j$ k/ `7 ]- b. A

; @% x# i( _/ {5 u1 f8 R+ Y程序代码:
+ Z; l1 |& d7 d! g; T- A0 ]) V3 n( U  Q' z6 A9 U1 C2 E% k- ^: ?
namespace fy_Exp{
$ }) X* B% j7 p7 z' {  t9 Qnamespace {template <class _T>
5 r0 ~% D3 z, C8 S) d: H( e- Binline _T GetExpValue(_T t[], char& csym){
, k, M0 p/ }' H9 v5 ~5 f" v3 l$ }0 t    char c=csym; csym=0;; T! \: I3 s' S
    switch(c){
; O9 U: G) I6 L! U& p) N9 c4 i    case '+':return t[0] += t[1];& Q. O( I9 J; p  ]2 U
    case '-':return t[0] -= t[1];
& z) A3 B. \! z* s, {- U    case '*':return t[0] *= t[1];* w' k- d7 h: a& ?+ |
    default: return t[0] /= t[1];//case '/':: c+ V" V! S+ Q1 L7 N$ A
    }
: c4 V' l- a- E* o, u}}
$ X7 z  Y. z! x9 W% R/ @template <class _T, class _Tstream>  w) ~# }' M# b$ r1 ^) c
/* _Tstream: inputstream, _T: get return value
% ?7 I& O# \& `9 p/ D* Return nonzero if get value successfully */5 o2 u7 e+ l4 _* |
int GetExpValue(_Tstream& istrin, _T& nReturn){5 g' ]- n4 \7 J$ O7 I5 r! ^/ ?: v
    _T t[3] = {0}; //雨中飞燕之作( K) x* f8 L8 E
    char csym[3] = "++";
: T+ E0 s# }3 H# c9 @    int nLevel = 1, nERR = 0;
3 }: B" l" p6 l) \+ C$ \* C    if(!(istrin>>t[1]))istrin.clear();: ]) N; O3 L) u* l7 Z4 e; T
    for(;;){; {1 t! b# s% |
        if(istrin>>csym[2]){
4 _  r& \2 j8 d            switch(csym[2]){. t5 Y" p5 Y) E$ X5 K1 s0 e% a
            case '(':
' a  V9 o# s# c  r& T( b0 y                if(!csym[1]){nLevel=0x100; nERR=1;}else' x. q6 h& Y, ^/ A+ P3 J" L
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 j( \- b6 q! ^: _+ F  w6 R, G
                else{nLevel=0x100; nERR=1;}
5 f7 b$ z: O+ j! [1 Q: v7 E                break;9 E; N0 ~9 G  ?" R5 x
            case ')':* z& R  q. x- O* r: K& O
                {nLevel = 0x100;}break;
* T0 W9 y. Q* E. a0 _- c3 M            case '+':case '-':case '*':case '/':
* L" s# y% i# h6 W                {csym[nLevel++] = csym[2];}break;, Y' c( u8 c& \: [/ g$ W" D! ^
            case ' ':case '\r':case '\n':case '\t':continue;: n8 P5 ^% I. m: M1 Y/ e
            default:
$ g3 I# ^4 W# U/ m2 P4 c- Y                {nLevel=0x100; nERR=1;}- J+ i! b: P3 y- Y$ Q2 R$ s! f- ^
            }
; Y4 ]1 f/ j/ o9 x7 d' g/ \            if(nLevel==0x100)break;4 W( m0 i/ J) B2 G
            if(nLevel&0x10 || istrin>>t[2]){4 x8 M5 p7 i% F# M- X
                nLevel &= 0xF;
9 w5 w8 W2 k+ b4 ~- _$ J                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* D0 w4 }4 Q, R8 {, w7 t
                if(csym[1]=='*'||csym[1]=='/'){
% w) m7 r# ?7 Y6 l/ F                    GetExpValue(t+1, csym[1]);
; N4 M2 G1 o3 X. T                }4 q; h0 `5 d& S: L. S
                else{( b" H! j; {: e' d+ f) @" w, F
                    GetExpValue(t, csym[0]);9 i# ?' x  r- R% T3 g3 J: S
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" j+ R8 X# E2 w4 t/ k: x, Q" t                }
2 a9 Q2 X0 u4 n6 E: N- S: `9 G                nLevel = 1;
. ]/ g1 e# @6 B1 C3 a# l7 f5 M8 H& O            }
1 ^$ n! k! K" V$ U8 }            else istrin.clear();
& H  z4 D* n, q3 U        }
/ Y8 K: K( O1 |9 Z6 l0 y, x+ m        else{nERR = -1; break;}6 ]* d, f  Z8 I9 X5 ]  V4 V
    }
. l8 w, Z4 V  }( m& ^1 i8 E    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 c7 U$ B, f0 q
    else nReturn=GetExpValue(t, csym[0]);
- ^7 p, c, F8 L! j: Y    return nERR==-1?1:0;
1 E3 l  K  {2 \+ l" K}}
' \* m- z5 X* C2 x( i) a* @7 [; O9 U$ O$ H: x

$ m% n2 t; E$ ^# B; F8 A1 g$ K  v$ [% a0 A) n: n$ R) b3 _6 {  }
函数模板使用示例:
1 O$ D. }9 }6 D, T, n3 \在以上那段代码的后面加上以下代码:
4 o8 w1 v  w$ p% u% W, v
  v" ?3 ?- _: ?& Y2 @1 s/ Z + l) L1 W7 A5 U! i* Q! [
) x3 m" F+ Y/ ^2 j5 Y$ A9 C
程序代码:
+ u! d$ ?+ j+ T" ]" J! Q# G3 ]
9 W3 M( V8 D4 `& o/ k#include<strstream>
# C  y* ~6 G7 ^# M$ ]. {" ~" I1 b#include<iostream>
+ T, H6 D2 q1 N! l& H" b#include<string>4 V$ k0 O# S. M
using namespace std;
. T( B# Z& X: U% l1 u, Fint main(void)
$ Y/ i( ?$ i4 Z) H9 o% p6 _{. E4 {3 r- G; }* N8 U* W1 b
    string s1;7 L6 g4 u% C) m' z8 O
    while(cin>>s1)
' F, ]: i, U5 w1 Z( {    {, s! j$ E; F- l! \
        istrstream isin(s1.data());: D; U8 T4 w# ^) t4 S' C
        double d;. B/ J5 a. P& U. e
        if(fy_Exp::GetExpValue(isin, d))
% K. K' A9 D9 d7 ?        {
! F) n. Q& J1 C$ U, L            cout<<d<<endl;# L6 L4 j$ O8 v! M1 Y+ S* c* [
        }
% v  @% U: z/ g0 h        else: A1 \: ]/ {1 a6 Z% W1 L2 T! p
        {0 E3 r+ [6 f5 e' v+ j; w
            cout<<"ERROR"<<endl;
+ r+ v- U& V( C  [9 X6 A; Q; ~& }& |; j        }* c- s. f0 `4 A6 }( {4 b& s; s
    }& F5 W# z/ t0 t" q5 s: w
    return 0;) r# a% }/ G" U7 x) C. }1 M
}
* b/ @/ T' {" ]1 w% }. m% I" _5 d# R% W6 {! `

2 I( I6 O3 P* q  e% H" @然后编译执行就可以了(*^_^*)& J1 ?8 |+ I: E, e1 I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! t9 G. O( \2 r8 [8 ~      建议使用VC7或VC更高版本,或者使用GNU C++编译

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