返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,% T3 d* D( x6 R9 T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# K' l. ^9 m/ k4 }只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)" \, O. ~3 t; Y: ]" v
参数解释:
- @% Q$ ]* ?. b1 Eistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流- s+ F  u) s; K/ x5 }( K# i$ ?
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定6 n& M5 U; L2 d! x3 {; R
返回值:$ A- M0 {% ~. G/ b
返回非0表示计算成功,0表示计算失败有错误
, {% T9 i: t4 Z. j: I9 Q  }
) e3 m- n3 N5 G( h6 P7 C( q  P% c % a8 f7 q1 e. y' ]

. z0 e- E+ M. z程序代码: 1 P1 C: l5 P* O( v
, [' _5 k6 P' T2 P& {
namespace fy_Exp{
/ Q+ A: C  Q8 bnamespace {template <class _T>
1 n4 y. Q1 `4 \1 f# i7 a1 linline _T GetExpValue(_T t[], char& csym){! A# t, h: `+ G' u$ B
    char c=csym; csym=0;5 j3 }( D4 k  b) x  H
    switch(c){  l  |1 s* a8 I1 M2 S% t0 a
    case '+':return t[0] += t[1];
( E7 x* X3 p& y3 r# O& A    case '-':return t[0] -= t[1];: `- k' F% T5 a6 Q
    case '*':return t[0] *= t[1];/ a1 `  N: U1 b2 @) }
    default: return t[0] /= t[1];//case '/':# P6 d1 d1 ^* D
    }
8 I; Z8 \! j/ |1 S}}" }0 Z9 I1 C9 X/ {0 J8 ^2 a
template <class _T, class _Tstream>
$ Q9 V$ v3 Z7 F5 M0 c/* _Tstream: inputstream, _T: get return value) i5 s9 k  O7 l3 ]% Y$ j
* Return nonzero if get value successfully */
6 ^# |+ d7 ~9 z, K. d: Jint GetExpValue(_Tstream& istrin, _T& nReturn){
6 l& K- l# t1 ?( o" G    _T t[3] = {0}; //雨中飞燕之作
0 X( C4 \" r0 C0 \) C% Z2 A% v    char csym[3] = "++";+ J+ p  K5 L# U' T2 [" V' P8 j& D# [
    int nLevel = 1, nERR = 0;
6 B6 Y! H5 V' F# u  Q    if(!(istrin>>t[1]))istrin.clear();
; Q$ E& f0 I. c" i4 J    for(;;){( b5 @" }4 p/ }& |3 C, }7 k8 P8 l7 T
        if(istrin>>csym[2]){
! }, E2 q. g. }( G) ], D$ X            switch(csym[2]){$ Y# p1 g/ W3 _# y
            case '(':
3 e  D' A8 y. a% o                if(!csym[1]){nLevel=0x100; nERR=1;}else7 G) @+ {! s4 W4 r4 Y$ S
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 l0 E" M  y% h( n1 \. ^
                else{nLevel=0x100; nERR=1;}" C; p5 b( X+ l0 F
                break;: S1 [: ?3 h, Z: [
            case ')':8 [4 p4 [4 M4 |
                {nLevel = 0x100;}break;
1 {) Y% X9 J3 b6 q            case '+':case '-':case '*':case '/':3 P! X: {, ~/ l, i8 q3 d8 g
                {csym[nLevel++] = csym[2];}break;
% g8 @* K7 ?; u. W7 ^            case ' ':case '\r':case '\n':case '\t':continue;8 r0 L: f8 p+ _$ G/ k" y; b
            default:! r9 o; H* x' f3 g9 A4 T! l
                {nLevel=0x100; nERR=1;}
" s- j9 q* T, a+ `$ x, j6 e' h            }
. k  i* E6 p. R; O* z5 V! e            if(nLevel==0x100)break;+ h' \$ M9 C7 j' f+ E# H
            if(nLevel&0x10 || istrin>>t[2]){
2 R$ u: j8 I- J# B% b                nLevel &= 0xF;
; l2 u5 n) P5 o% T8 c                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- V# D- X2 L8 v4 N8 a) G. T6 f
                if(csym[1]=='*'||csym[1]=='/'){+ K2 G7 q- s; p
                    GetExpValue(t+1, csym[1]);- k- k8 M1 O, M1 |
                }
6 U" U( t# K9 P- Y$ a                else{
- ~6 K8 B3 u( P1 e                    GetExpValue(t, csym[0]);
4 ~$ S% n0 ~4 ?5 s; |                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, b# _$ l$ u* \! G# I                }, |( @" p/ C$ E& K% h
                nLevel = 1;. b% @9 M* J1 a9 d: A& I$ @
            }
/ \2 l) Y7 g  ?4 x: T            else istrin.clear();' F: H) h5 {- N
        }
# G6 s0 ]1 B$ ^, V        else{nERR = -1; break;}1 P- `) M9 \/ j( ^; Q) T* S
    }
+ I$ x. H, ~0 g    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 E1 ^3 Y' j: w# \3 Y/ {5 v, T    else nReturn=GetExpValue(t, csym[0]);9 k& }- g) c# g2 B3 z5 s; T
    return nERR==-1?1:0;
5 r1 r5 i& _2 W% J2 q}}
, K$ k+ m2 j0 g- s$ q7 [- s
. p" h' l2 H" Y% k) w
7 @% M2 \4 F  H* O2 z. l4 f$ N5 r
# i; D: q& ~, f) w$ T0 o函数模板使用示例:; O5 V) K: L' C
在以上那段代码的后面加上以下代码:' u2 ^; U# f7 Q8 Q) J3 m

9 s% z. q/ U4 Z: ]/ z9 F( m" Z# M ) d7 Q( p% F% t9 P& }
8 A' [+ i7 A$ ~+ N  a
程序代码: . j1 B) Q2 l  D6 x. z
+ Z# D: \; y- E: D6 P
#include<strstream>8 Q  t7 }, T# k  ]
#include<iostream>' I9 \* C4 f) N3 M" ^& |) D4 Z7 T
#include<string>- p) Z. _2 ~' F( b4 X- b
using namespace std;  w1 S2 {6 M. E2 v* Q  _( g
int main(void)
' [( o4 c  U6 Y( U% b# Z$ J# S{
2 @; R' A2 s$ F- M    string s1;6 c5 ~8 J, ^# v/ ~
    while(cin>>s1)
" C" A$ p) @$ G2 u8 g! n# O    {
' [. m2 L6 R7 |, Y7 h! e8 r        istrstream isin(s1.data());% k) L( `- J& p0 N" _7 _( T7 `% S
        double d;1 L9 d* P( ^4 Y: h+ X1 u; F3 e9 \# I
        if(fy_Exp::GetExpValue(isin, d))
/ ]: u! o' T0 L& @        {
# x- F7 o2 y1 \, ~# Z            cout<<d<<endl;/ o+ @$ R3 o8 Y+ Z
        }: ]9 K8 Z' S9 K6 T6 W6 [* Y
        else- c5 ~3 [! F  E; u2 A
        {
7 x4 K  l0 S# u2 k' }            cout<<"ERROR"<<endl;) H" v0 Z/ q& G- N0 G! G
        }
% y0 i) a9 d8 k5 m7 F    }# J. _  l* h+ o+ Q; d
    return 0;, _: r0 Q4 R! O: o
}* Q& O! g* k8 K$ i9 R
% z& k' d3 a) H& l) E
( s" @# y/ o: h$ ^: g) c) ^$ d
然后编译执行就可以了(*^_^*)* e8 k/ _% {, r( `  T, F8 Z
其它:TC++上一定编译错误,不保证在VC6上也能通过编译, N+ A! r. ~1 p$ F
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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