返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
9 S' y! t+ y( T3 Z& b; r! r一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ u' G( q5 t$ _2 j- a8 n' |只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' y+ v8 M& g$ t. F; w
参数解释:
6 t$ o* K) @) g; Nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
5 l' C) J- y0 a9 h/ k. d% KnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; \% Z  U- g5 @8 v4 n- R
返回值:, ^4 _# `9 d* {7 ?
返回非0表示计算成功,0表示计算失败有错误
: @2 z$ L  f# x  I/ n/ k& A' i% }4 C2 `
, p. m! N2 Q5 u6 |
, G' X% M8 J. b
程序代码:
5 L: N/ d+ M1 h2 t3 s' H! e8 g* X; k' g
namespace fy_Exp{# d2 `2 h0 K' q8 z; ~/ @. j
namespace {template <class _T>; r  y# `' n# I; V, |' A1 P
inline _T GetExpValue(_T t[], char& csym){
/ ]9 |) P& h/ g    char c=csym; csym=0;' r& i2 \& C2 |
    switch(c){
/ ^6 V  p5 ^' s) o# E, F    case '+':return t[0] += t[1];
, G% _8 ^7 Z, s    case '-':return t[0] -= t[1];. B" |9 Y$ V+ y& t
    case '*':return t[0] *= t[1];
3 d4 z9 s" `% w; l7 t2 f! n; ^- x    default: return t[0] /= t[1];//case '/':# F* i8 S% B2 R1 ?- e
    }- ]5 k) Z: D9 o$ h
}}0 _' Y5 G' i, Y" \, K6 ?3 d/ L
template <class _T, class _Tstream>. B" e% r/ Q" o
/* _Tstream: inputstream, _T: get return value0 N" X1 f( z& X, g# [$ M' D1 c
* Return nonzero if get value successfully */
& u! [$ P+ h! N- a" @" T: q2 P/ {) |int GetExpValue(_Tstream& istrin, _T& nReturn){6 k8 _, G3 _& s" o
    _T t[3] = {0}; //雨中飞燕之作5 J1 e+ J+ F) b
    char csym[3] = "++";' m* ~; }5 v9 K. @* n- i
    int nLevel = 1, nERR = 0;2 g% P8 ?% \% g' z0 T
    if(!(istrin>>t[1]))istrin.clear();
3 ]2 l+ K. M1 m    for(;;){
/ R% h( A0 A3 b        if(istrin>>csym[2]){
9 z+ T! y2 a3 V4 S4 z            switch(csym[2]){2 e) F. z7 P( L* v) d& e5 [3 M' H/ `+ `: v
            case '(':
: A9 P+ z; y1 f0 G- S                if(!csym[1]){nLevel=0x100; nERR=1;}else+ e. S  |9 G) d: }4 B  X5 t
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 K7 _4 h( y, Y; R* w. e8 n. ]
                else{nLevel=0x100; nERR=1;}& P, r; M+ L) o2 U2 m
                break;$ G6 K+ p2 p8 s+ j7 b% y* g( |
            case ')':2 n9 n, M& F+ c, i# S
                {nLevel = 0x100;}break;6 m. v$ v7 C3 O0 d4 Q  v" H: \
            case '+':case '-':case '*':case '/':
! s4 O6 z/ @# M: [                {csym[nLevel++] = csym[2];}break;$ w- ]0 e2 L1 q
            case ' ':case '\r':case '\n':case '\t':continue;
) [# \$ S; |6 A( c" O6 p            default:
  t+ ~% a/ X( P! j) n: s! J                {nLevel=0x100; nERR=1;}
6 v/ w1 ~! v  M" F0 t            }" ^. _, c; Q$ i. E) w
            if(nLevel==0x100)break;
! s. J0 b6 g  x- q' c' }            if(nLevel&0x10 || istrin>>t[2]){4 S$ m( Q$ n" S, b
                nLevel &= 0xF;
, u- m' x- }0 l                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 x  G: c  L6 u' I9 f; a                if(csym[1]=='*'||csym[1]=='/'){
# o  V  i! Z7 \2 q5 A2 D                    GetExpValue(t+1, csym[1]);
9 l9 ]9 B- q4 k* R9 a/ ^                }8 c3 R5 ^6 a! U! Q( i- ]
                else{
# B% P1 G: C6 w3 |% S( V6 j- a* b                    GetExpValue(t, csym[0]);
7 f( b8 Z% \9 p                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- o. e0 A2 U+ R, M8 ]( P1 @( [                }
4 u; y. X; O6 \9 W                nLevel = 1;
  j0 `3 j: I# J) L) T0 {$ ^! _            }
) m; l3 V1 T( u* {9 ]8 w            else istrin.clear();5 r4 O  M' G! Q5 p: ~; t, D1 X" q
        }
2 {% k# Y1 U( p' v' n4 S: z        else{nERR = -1; break;}
& k8 D3 m* _# M9 ~. b    }8 v/ O' I  K! y! ]8 M$ H
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);# w7 T  {$ \! z! b
    else nReturn=GetExpValue(t, csym[0]);# @- f9 }+ x: a3 k/ a# E+ x
    return nERR==-1?1:0;
+ }( T9 E3 j  G0 g- c' V}}3 |9 k2 p# M7 @$ ?
4 @5 q8 x- @0 o7 [* y# Y1 s
$ t: o* [  r. `. N" S# f
; k" _6 [( t4 b8 M; w% m4 V. }
函数模板使用示例:* n# m6 |- X! t* }5 ^
在以上那段代码的后面加上以下代码:
$ b' y* C# V# E: l  e3 A+ {7 ^
# p% E7 R) w; M' Z: ^( p * Z4 e9 o* E0 M3 D
6 h0 m. P- O  Z$ c
程序代码:
( H2 j& [6 ^) U6 U
) Q$ q( U8 u6 M#include<strstream>
& p- r" z' C! c#include<iostream>$ {/ q" M& `* \! I3 Z
#include<string>5 {/ c$ Z8 ~* \8 v# z# J
using namespace std;# @1 h  s# n( j
int main(void)
+ E  `2 R8 ?9 _4 |8 V3 ]' n{. Q9 b. s, k  P( T; P9 ?- ]
    string s1;! b4 f" C9 R0 r# K( T4 c
    while(cin>>s1)3 s* J5 h8 B( n* T# v. s1 e
    {
4 d; k: A# V! {% H        istrstream isin(s1.data());6 W5 G8 L6 H6 ?, I! I  \
        double d;, ~* L6 S( @( D: m) R
        if(fy_Exp::GetExpValue(isin, d))! _/ ~) R  c: D# K
        {
+ z/ u3 M2 z# B            cout<<d<<endl;" q% F: o  k$ p0 H& n5 c9 u
        }
$ U2 Y, c: @' Y        else3 p3 ?7 Q* h3 N" r# ~+ L
        {( x- k0 G' }: ?8 V; F( \+ t
            cout<<"ERROR"<<endl;; @  b9 Q1 f) r0 B) b# e7 a
        }' x4 W2 O; M# A9 \6 @
    }$ ?' z2 a( u4 E% o
    return 0;
4 Z$ B1 M6 Q$ w1 H$ b}2 Y; Y# l8 ~* c7 o# Q0 O, Q

7 ^( h0 m! P' b8 b
  Q6 F# q" u' X. [* h8 e' B然后编译执行就可以了(*^_^*)
$ G' o* C/ ~! O0 u( {# }其它:TC++上一定编译错误,不保证在VC6上也能通过编译
6 \( [' J. g5 {$ W      建议使用VC7或VC更高版本,或者使用GNU C++编译

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