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

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

在9月8日那天我特意编写的,给大家分享的,; K6 }  x$ a  |' a  u' y5 f
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' L: V% _7 e$ ^& d9 j: Y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 z" N0 J0 {: c! S
参数解释:
( ~; y, Q2 x( n* [* C4 Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ X  w4 s  \7 a. h8 ~# RnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定  H, Q2 J4 [  p. O) j
返回值:
% C$ [7 {& P5 u) Y. ]" E返回非0表示计算成功,0表示计算失败有错误
  ~' k$ W# I6 @0 l; T( N6 O2 h* @. o1 k" |) z

; c- K: Z; J. ^" I- A( _5 m: F- B/ E" i8 Z* N
程序代码:
' N& T) v, i3 U$ j+ a' T* ^8 C- |) y( G" x  U8 i2 E* ?9 E
namespace fy_Exp{
0 m9 u$ r$ z9 `" t0 pnamespace {template <class _T>1 z+ ~' f- s) H6 t. b$ ~
inline _T GetExpValue(_T t[], char& csym){
, x9 j+ v3 Y+ s% k    char c=csym; csym=0;
1 o$ \! W3 t  f8 o/ y3 p    switch(c){
9 F% o( T$ m/ a# C4 @0 p    case '+':return t[0] += t[1];: j% @! g3 E/ X6 T1 p6 b/ x$ d
    case '-':return t[0] -= t[1];: ?9 x; |) E# M1 t8 w7 n
    case '*':return t[0] *= t[1];
% y8 t9 _3 H8 G- e+ d. Q    default: return t[0] /= t[1];//case '/':# m; \1 u/ M- l+ k) `
    }, j& H5 |! _: b, m: h  v
}}
5 I: W) I$ B0 \: p% ]. B. ?template <class _T, class _Tstream>
; o5 B/ O0 C; Y2 e3 g/* _Tstream: inputstream, _T: get return value, Y0 T0 o- X/ h9 q
* Return nonzero if get value successfully */* A! q# N- y' r
int GetExpValue(_Tstream& istrin, _T& nReturn){  ]! j& m' Y* ~  E
    _T t[3] = {0}; //雨中飞燕之作! L. S2 }1 ^7 r- l/ A6 w
    char csym[3] = "++";
0 s& Z8 z- w  d3 @: K9 T3 o7 S' e    int nLevel = 1, nERR = 0;
4 T7 ^8 o& z/ i/ f0 _& g    if(!(istrin>>t[1]))istrin.clear();$ D0 w) y9 s- @9 Y- X7 j2 {
    for(;;){
/ B0 q2 [  g3 q- ?        if(istrin>>csym[2]){. x) w& @8 f- e
            switch(csym[2]){
( x3 p- H: Q0 z, ^            case '(':& p5 b) L0 c  k$ E
                if(!csym[1]){nLevel=0x100; nERR=1;}else/ O: M( f% x5 k1 Q" X
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
( c! d2 x. U( Q0 F6 E                else{nLevel=0x100; nERR=1;}
$ ~& u9 X# ?" y  g$ F; Z7 u                break;! f* O& {, ^7 G0 K
            case ')':
9 T7 I0 @/ V$ D1 n1 J9 D                {nLevel = 0x100;}break;$ Z  W: L' J  _9 Z, ?7 c
            case '+':case '-':case '*':case '/':
9 h  |0 l, T, |/ {                {csym[nLevel++] = csym[2];}break;) b$ m. Z3 T3 Z5 G
            case ' ':case '\r':case '\n':case '\t':continue;% @$ A" K* m3 x% ]% I
            default:
3 [. i7 I  F: _$ z. B9 v% H                {nLevel=0x100; nERR=1;}+ M! o5 T4 N. Q
            }
$ p; t: Y+ R; N            if(nLevel==0x100)break;) j% C0 q8 L) j; |* ?8 M+ h
            if(nLevel&0x10 || istrin>>t[2]){  {( t3 l! {3 Y
                nLevel &= 0xF;
) Q, v. O  r/ L% P( b                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 c% }. ]" h  y# D" _3 E( g                if(csym[1]=='*'||csym[1]=='/'){$ G1 b( E! Y! @/ H9 K& m% Y
                    GetExpValue(t+1, csym[1]);
. `  `& Y- b5 @& C                }$ G, _, ^, a: w8 \
                else{) o4 n1 a9 @* a" W( Q8 F( ?6 O
                    GetExpValue(t, csym[0]);0 k' y: L# ~5 h
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
: O2 [3 i- A/ h- b7 o                }
  g' g% U+ E+ L7 l                nLevel = 1;4 P& Y4 E; @; q% R% x
            }
: y% z9 v* i: N0 {. R" C5 Q            else istrin.clear();$ G3 ^5 C0 X. u* j2 |6 e
        }' A' O' d  _3 r' E
        else{nERR = -1; break;}. T: L$ z. w% i5 A+ E: ]4 d
    }8 v+ v* X1 o1 n1 X4 {/ W6 _4 \' D5 }
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 x- H) m5 A- U% Y5 s0 M  @* @    else nReturn=GetExpValue(t, csym[0]);& f, j* E7 u% V' M
    return nERR==-1?1:0;
8 K0 G, B" h- f. H5 H}}
$ x# y$ m4 n) r0 J- Z8 B# D+ a. ~1 l$ ]1 }4 {. v' d
/ t6 Z! j; W4 V

3 T+ E. M( w( z" G9 A函数模板使用示例:
: d, ^- U8 P6 t" z在以上那段代码的后面加上以下代码:
& {0 w$ f& K' z2 m+ R4 ~% U  G  ]: h3 U" \& _

0 ]+ @2 d# _6 |7 D+ j
  q( z6 Q3 k3 Y* c4 {程序代码: 2 d; o9 J( g+ S8 m
1 Z6 T8 n: A! u) [" k+ ~2 f: y# W
#include<strstream>
) k, [+ R( g5 O( E" l8 i# c#include<iostream>
/ k; i4 H* J9 N' D9 ]) j# H#include<string>
( n! b0 D* v9 i6 Y2 [using namespace std;, B4 y' l0 C- H. ?* q& P( a
int main(void)% q" L2 E6 y) e9 `
{) F8 G  O- N0 ^1 ]6 H8 Y, k; x
    string s1;1 T6 V( S5 U9 u* a7 G3 W
    while(cin>>s1)
+ H- g( K* g3 s6 A- g4 p    {' F9 I5 Z) e2 s# Z: d+ \
        istrstream isin(s1.data());
& T1 R8 y7 A' w- v+ N        double d;; c- @+ U6 J4 L- w# @! g4 |- A
        if(fy_Exp::GetExpValue(isin, d))+ g7 c1 [) Q3 o& g/ v
        {
; @, s& j% w* U            cout<<d<<endl;
3 P9 A% i" \6 ^5 l. _8 I+ d        }1 O7 P+ e$ Y0 k4 O
        else
% j0 ]' i7 C0 [2 w        {) x3 F3 E% b2 e7 y1 L
            cout<<"ERROR"<<endl;/ |# Y& A9 o  O
        }/ Q4 x: ]6 y' B- r
    }
  H2 J* K+ B# _2 {% k    return 0;
) o3 V! Y6 L0 j; H; Z/ `0 R1 k}
4 z% M; k3 a6 Z
8 {* m3 d/ ?  l; z$ G( n1 E; A- K: H' d0 t  o- i" ^" J
然后编译执行就可以了(*^_^*)
# v; @- h3 [$ p; u4 l5 Q& J3 H其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ Q' {3 i8 k, e/ }5 T$ `      建议使用VC7或VC更高版本,或者使用GNU C++编译

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