返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
9 f5 E  |2 {. p2 d" `3 j一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% y% L* s& b" n: c) D只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 U+ d$ u1 r/ m
参数解释:
7 b, l3 K# C1 Fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% h6 q- V" A9 b  F& j: i+ z0 }  v+ Y. A
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 n$ M/ k4 T9 {& ]# T7 |8 S* c3 W
返回值:- i  ~. `5 }  t% J$ c8 W
返回非0表示计算成功,0表示计算失败有错误; |! o  I' E' T% P# v# r
- G5 x; k/ S) H4 @) c2 R
' ]8 |- F7 A, J$ B! u! `

+ t; s- y& L+ a- [/ u. W% v- Q程序代码:
( \+ J: r7 z9 n) e! v: e6 [) i4 G, j: a
namespace fy_Exp{
. W. d- F+ |6 }5 Pnamespace {template <class _T>
0 V$ q& Q/ W5 L% b: {+ U4 C+ ~inline _T GetExpValue(_T t[], char& csym){
: E. e1 M2 F9 {! s: ~$ `1 D8 I    char c=csym; csym=0;
/ y& _; {, R9 B% e% z; j/ }" k    switch(c){
3 Z, A3 {" g& [" k# `0 m. q    case '+':return t[0] += t[1];2 Y4 a# B- z, J+ f: n: _' }
    case '-':return t[0] -= t[1];
8 H: V* G* ?1 V! [( X6 Y9 n    case '*':return t[0] *= t[1];1 B+ p3 I6 I# C8 j2 m% s
    default: return t[0] /= t[1];//case '/':
6 T; s2 a" D8 h( Q* R& q5 O6 p9 R    }, J7 x3 k% n6 X- \0 [! c: o
}}/ l  V! F. d0 f
template <class _T, class _Tstream>8 q3 d7 Z/ p/ P% C, l, |& K
/* _Tstream: inputstream, _T: get return value
9 x+ P5 ~9 ?% S* Return nonzero if get value successfully */
- K8 a* z- c; b# q: Cint GetExpValue(_Tstream& istrin, _T& nReturn){
2 o9 w" J* {& \+ X/ y    _T t[3] = {0}; //雨中飞燕之作
8 P1 ^- u1 p0 A# y/ ]3 }' F    char csym[3] = "++";$ w7 s$ \/ K2 M( _' S/ W
    int nLevel = 1, nERR = 0;
+ k: r8 u8 f/ P; x& \7 [, Q% |    if(!(istrin>>t[1]))istrin.clear();; {' w! ?, I5 s) E6 s' t4 y8 a
    for(;;){3 o% x6 I0 r. z+ b) V! z
        if(istrin>>csym[2]){
# Q+ y2 [; P1 P- u; Q/ k            switch(csym[2]){
) K& F2 h# \" p, |0 b! P' G            case '(':2 M5 m+ H) p: [! V/ D7 K# u
                if(!csym[1]){nLevel=0x100; nERR=1;}else; s# R6 l: N- J7 ~$ S6 C/ E
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% V3 }: f% I: @  V+ f6 W3 f
                else{nLevel=0x100; nERR=1;}0 P$ a  `' F0 _5 N
                break;
6 E# |4 ]4 y2 X5 U: V( S% |' B' j            case ')':
9 K" ^6 M# t- Q: F! T                {nLevel = 0x100;}break;
0 |8 ?- \: L; V3 ^  m8 D. x( j            case '+':case '-':case '*':case '/':
0 S. U2 v2 B% [                {csym[nLevel++] = csym[2];}break;
* m% Z. H/ h1 V' f            case ' ':case '\r':case '\n':case '\t':continue;/ p, J* Z$ w( T9 c( H% U  ?
            default:
3 \! P+ i% w4 i; d                {nLevel=0x100; nERR=1;}3 z" F' y8 j4 E# \$ ?! H. \' `
            }* N% [9 L) N4 ^* M, p
            if(nLevel==0x100)break;+ d4 X  G: o5 \3 v* L5 y
            if(nLevel&0x10 || istrin>>t[2]){
3 L: U  _9 K# Q3 b- [% ]7 b: S# Z! x                nLevel &= 0xF;# \, p7 F6 x. r9 h
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. X: ]3 p. Q; F$ a/ ?, [
                if(csym[1]=='*'||csym[1]=='/'){
9 G1 V9 {4 N  J( j; x. j                    GetExpValue(t+1, csym[1]);* W: t4 H: e0 X, E* A) _! i( ^, @
                }
7 U% I# ^( T1 m; y5 _7 I                else{
9 z, z( y2 J# s' K( I- x0 x                    GetExpValue(t, csym[0]);4 l* r( f  u* E
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;* q+ s: w+ D( |- O
                }5 b9 O5 B/ ?+ k5 w6 P: \
                nLevel = 1;8 K" @1 }7 y/ W% Q
            }' @  {3 G4 v( ?& L
            else istrin.clear();
; S' {: G+ U% H- v' R' l3 g" \! L/ j        }
3 T7 r- y; u) n, v( x% Z        else{nERR = -1; break;}& Z+ }6 [- J: j9 @
    }
6 z/ P0 s. L3 x* X    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
3 q, Q  `2 O) l0 E2 f( A% {    else nReturn=GetExpValue(t, csym[0]);
+ F* Q" c- T& k- }) e( p' L1 c    return nERR==-1?1:0;# |% Z* M8 ?7 |& u  S0 I
}}
1 d3 \# h9 U: P) ]  m! d3 G$ x
8 r/ x1 _& A: ?% s" k4 _+ F0 l% q4 Z+ |  g
! _8 k# p/ z* n+ N
函数模板使用示例:$ A) R, B+ A( k( t' D8 o. _
在以上那段代码的后面加上以下代码:. g, y) @# @! o# m; }, v

: X- M2 E, h4 r" S5 Z/ C
2 T, w( x  D7 c
' G1 J0 E0 O5 B+ ~3 j4 Y9 |  W程序代码: 6 c$ u% d5 f& d1 H  G

8 m4 x( ]" [! z- i+ Y7 Q4 w/ L# C#include<strstream>) j6 e  [/ }% x9 L* s4 Y
#include<iostream>* r0 B) E' P" D; p% c. }( {* P
#include<string>
1 ]$ q1 s4 f4 t' yusing namespace std;( _# s' W1 R5 }
int main(void)
+ s( x! x: @; A, H  |+ f{
3 x0 @: z" H: J: O6 K: q    string s1;1 {" Y' ?2 v; V' E4 F: Z  m
    while(cin>>s1)
" S  p8 ?# ^8 [6 V9 p    {
9 Q: X4 R* R& d) i        istrstream isin(s1.data());2 J# |, N' h5 @3 J; N
        double d;
; Y7 q/ `) U, N! B8 ]/ s        if(fy_Exp::GetExpValue(isin, d))
' y# o6 ~/ Y! Y4 X- o1 d- ~        {
) e2 ]' c. w* p& E4 e$ U& P            cout<<d<<endl;& S" [. V0 K* P2 J
        }
% A1 c- f6 ~' E6 ?5 T/ _        else# ]2 u: F- l0 x+ i
        {
; J- V' T6 }  a8 {3 Z            cout<<"ERROR"<<endl;, M2 B7 T# [5 a! W* i3 n# G
        }
% |! U  x7 `: i4 m0 ]0 U    }, T: p- m/ \, h8 C9 ]6 g
    return 0;
- h1 y" S9 }: ]}) W  B8 ~+ Q2 o1 m9 x/ j& F
) m1 Q& i8 S" o7 q6 O% k2 o

% |# L  Z' W# ?: D4 H5 G然后编译执行就可以了(*^_^*)
9 j, W+ p5 }  |1 h0 a. A其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& _: L! U$ T' T9 |0 e! ], b      建议使用VC7或VC更高版本,或者使用GNU C++编译

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