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

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

在9月8日那天我特意编写的,给大家分享的,/ r2 I3 P+ }: x0 _( w1 w
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' K- t* T" P3 `" e只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn). E. Z  q8 p  O7 [( }7 N# C( e
参数解释:3 z& q$ F9 y5 o& P. [
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 E; m3 i4 ]& b6 {2 Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& B& t9 g6 I5 ]返回值:
& J! f, Y3 l( S6 j返回非0表示计算成功,0表示计算失败有错误
3 `" h& J+ O: O
* D: b8 u( L5 R 4 B* l- J3 L7 x# i
5 u1 K+ b4 n. w
程序代码:
; O' ]3 u6 \+ G1 f& z7 J
% K- D5 g) X2 {- U7 O0 T  }namespace fy_Exp{: o9 k1 u$ Q. q0 d" Y5 v5 l0 ~$ G
namespace {template <class _T>
, S* G8 [, i- f# Vinline _T GetExpValue(_T t[], char& csym){
' t1 ?1 C1 G# ~) f4 W+ D6 ], ~' M    char c=csym; csym=0;) D% j3 ?5 t: S$ b- a) v
    switch(c){! f) Q( R, P9 c+ \
    case '+':return t[0] += t[1];8 I1 _$ ^7 F6 j, g: c* r
    case '-':return t[0] -= t[1];
# l6 t% m0 ]4 N7 f% F    case '*':return t[0] *= t[1];5 q3 D4 g* `, f6 Q- p
    default: return t[0] /= t[1];//case '/':
. u: @1 P) @) p% L7 D7 X    }- e- t+ @4 z+ f/ e
}}
; z9 o" L% p- R. _. L# P2 R+ {/ t" F4 Etemplate <class _T, class _Tstream>
3 `9 L/ n6 Y" B* z* }" M& I9 N" M: O/* _Tstream: inputstream, _T: get return value
* G  H: c5 B* ?* q* Return nonzero if get value successfully */
( B; t' h& J: s" S7 qint GetExpValue(_Tstream& istrin, _T& nReturn){5 ^" P& z; _" ^1 r: P, q
    _T t[3] = {0}; //雨中飞燕之作
4 G: W/ E8 f* T3 I8 I    char csym[3] = "++";
& i2 u7 O  x8 l1 l) p    int nLevel = 1, nERR = 0;
3 a6 t0 s$ j% k) S* Z; v    if(!(istrin>>t[1]))istrin.clear();
" @! a$ z2 }* V4 B+ ~9 o3 W    for(;;){
7 z7 W) P6 H; C        if(istrin>>csym[2]){
0 g3 M# k( p! l1 b' E6 ]! Q: p            switch(csym[2]){, \7 A" Z$ \2 c, p8 J. s) p
            case '(':
7 H7 ~/ z3 G. L! \                if(!csym[1]){nLevel=0x100; nERR=1;}else& p! _8 c8 S  K
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
1 f! t+ c" C3 i8 l8 X3 m9 e                else{nLevel=0x100; nERR=1;}7 k: H' W: H* i* k+ y$ _
                break;7 e2 t& E/ A8 w1 Q' A" S; @. t! C
            case ')':
) C3 o7 x& @4 h/ A+ \- X                {nLevel = 0x100;}break;" d5 Y4 s( l$ U( I$ b, y) p  l
            case '+':case '-':case '*':case '/':1 x: s( d3 q1 [6 @. Z
                {csym[nLevel++] = csym[2];}break;$ ]  y$ h" s& M+ v8 s' F
            case ' ':case '\r':case '\n':case '\t':continue;
( E" O7 x+ ^& u& |, @; {8 W* w8 _            default:9 m0 _) {1 o' ]. t& A
                {nLevel=0x100; nERR=1;}
9 S- T) q- b5 M+ \# k+ w0 k: c            }0 C! r1 F( N  s
            if(nLevel==0x100)break;
9 B7 e, O6 y, y            if(nLevel&0x10 || istrin>>t[2]){
" S7 }5 e' ?# N: b6 H                nLevel &= 0xF;
# P0 M' ^; E6 f& V1 e2 l5 _                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}4 `* O; @8 f0 {. d  Z2 [0 v3 `
                if(csym[1]=='*'||csym[1]=='/'){$ e7 ?, G; J8 g5 |! i+ h
                    GetExpValue(t+1, csym[1]);9 c% m" C% q" T  R1 J
                }: W. L+ `6 ]9 q3 n! `' C! Z8 m
                else{
1 R3 ~7 m( r8 `" \( x                    GetExpValue(t, csym[0]);
  F0 A! g' v' y% H9 [; D# M                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! j- w" M4 s9 a8 ?: }- K                }
5 ]+ S- L" [) L3 V                nLevel = 1;
/ S- S& u) G' d4 ~            }
9 Y: r& [; W3 c! A9 b0 o            else istrin.clear();
4 D& J8 |( m* l- i- D; J* Z' T; l        }. G9 i9 n1 K9 R$ A6 I( p
        else{nERR = -1; break;}
' e+ P% k' c( q8 K: L    }
; {. ^3 w2 }% [( o1 P    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 x: v) L% w/ }' G3 q" d
    else nReturn=GetExpValue(t, csym[0]);
* j6 W3 Q* n% [! r    return nERR==-1?1:0;* z9 J5 w; d- z) P
}}* p0 X5 y1 ]2 s

* w, \: ]$ i6 D3 u; T* d+ e. t- w  w! V
% f* r7 T+ {; H& ?
函数模板使用示例:
$ A( t# d# r/ q# ~7 ^; e在以上那段代码的后面加上以下代码:4 E; S: k9 V5 r( p$ h* J) B

: j' d- Y/ H& b1 O- O5 m8 B 8 C6 h2 A8 p( i* q1 }7 s
- C( J. `: c* E: C( }
程序代码: . b/ S/ x' K& u

3 _/ b$ k; w5 J8 e4 n9 A9 x#include<strstream>1 s' O6 ?3 h* o
#include<iostream>( J9 [7 m+ |5 K' `+ Z: m
#include<string>
# H& L2 @1 L( F' T1 I; c# Ausing namespace std;
, w. P0 `% w$ p# h$ Qint main(void)
( t8 X9 w( O" s4 k) M. {6 p8 o{6 ]: U3 U+ `, d: \7 _' k+ s
    string s1;
& T8 B4 X! k# `+ X    while(cin>>s1)
0 k9 C3 h' O8 w9 ]8 O% |0 M1 z    {
6 D" H. @; I$ _* n3 H        istrstream isin(s1.data());; v& a7 b9 ]5 }0 D
        double d;% b7 k7 @0 u1 a' k$ D4 B& ?
        if(fy_Exp::GetExpValue(isin, d))
$ S& Q0 M# i7 p/ x3 @) s        {! }8 @& a6 w! u: z. l" |$ s
            cout<<d<<endl;
9 {3 \  _/ U4 t/ |/ ^" x        }+ L) K& M, r5 z) ^
        else  D( u* {6 R' ?6 w9 J
        {
6 b2 l; q4 g1 `+ D! P' {9 b- v            cout<<"ERROR"<<endl;
  @% ]# r7 C; T1 x( R8 Y# N        }2 T: ^, |& G5 M: ~
    }
, `0 q- M! P$ Y8 n    return 0;9 t% v$ B$ b. f
}
7 v( P# ?0 }3 j% ^2 E
. X! L6 p" L- ]' y" @; C9 u2 p5 w7 D" x6 H
然后编译执行就可以了(*^_^*)/ r+ F# j( {$ ~; ?, H1 W/ H' ]! A3 {3 h
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: F! K/ X5 j6 a      建议使用VC7或VC更高版本,或者使用GNU C++编译

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