返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
! F5 j4 V) g  K, p一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 |+ c& W. [+ Y6 I& q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" o" h2 a4 |# h2 A参数解释:; Z0 W0 V* D3 p) f4 v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流- M7 ?9 Q1 e% J- V* o! R
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
/ Z, n: d; S1 G: x( U& P% F返回值:: ]$ N( q, L6 Q6 P5 m0 G3 p
返回非0表示计算成功,0表示计算失败有错误
7 `/ v! o$ b( d: ~& \8 U3 a. X( V" i* ?. D& f7 l) @1 q

; U- {& J7 [  M* \" s/ r% ~
7 L1 I2 |' U; ^% K# M7 g) V0 [7 h程序代码: ( G7 l4 c, n8 W( q) E) |

3 {) H9 D" ^1 l. r4 }namespace fy_Exp{& S& s+ z+ Z4 |3 ~% F4 }
namespace {template <class _T>
2 ^/ [% \6 E2 Z% K: @# h# Vinline _T GetExpValue(_T t[], char& csym){
  A3 C! @5 \6 ^2 t& b    char c=csym; csym=0;
* P( G$ o4 C8 P5 S. J    switch(c){& w$ {, e/ T, E# s, K: X5 j
    case '+':return t[0] += t[1];! Y! v/ \9 e* h$ b, P3 o
    case '-':return t[0] -= t[1];
9 z4 l& D/ }) B7 S+ Z    case '*':return t[0] *= t[1];
# m+ @4 ^  u+ L/ a% ~2 K    default: return t[0] /= t[1];//case '/':$ l7 @5 n% Y0 y8 C
    }
7 N' W/ G" z; |5 u+ |/ u}}
2 O  {; t- U# e- Y# r. R- Xtemplate <class _T, class _Tstream>& F& C4 h) L0 W- p
/* _Tstream: inputstream, _T: get return value, N- W$ ?4 e* I1 B% _8 @
* Return nonzero if get value successfully */3 M) V7 W3 w" e+ n9 g0 ?  N2 Q
int GetExpValue(_Tstream& istrin, _T& nReturn){
% C8 Y0 u! U* [0 \; [    _T t[3] = {0}; //雨中飞燕之作# t7 g5 W5 {, \
    char csym[3] = "++";& P5 ~8 D  d& W( f  A1 m
    int nLevel = 1, nERR = 0;
5 O' i0 z4 }6 B5 }; z    if(!(istrin>>t[1]))istrin.clear();
8 H6 u2 N4 H. N2 x    for(;;){: |- D: @) o- Y. c3 c7 H, H" G
        if(istrin>>csym[2]){% V4 s6 R# T. k, |' c% D4 Q
            switch(csym[2]){1 \0 ^/ W) [+ N0 w  a
            case '(':) ?+ t1 ~+ O. B, F( a5 R, K$ r
                if(!csym[1]){nLevel=0x100; nERR=1;}else
( P% E; O+ B4 u4 D                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ ?8 H5 \* C; g* P& w                else{nLevel=0x100; nERR=1;}
! ~3 c  Q4 A- g3 R* U3 z                break;3 ^% ?% H/ ~4 z+ _6 d9 [! h5 a  ?, `
            case ')':7 Q8 r$ F0 j. [
                {nLevel = 0x100;}break;  B: D2 |4 U: C0 i# z
            case '+':case '-':case '*':case '/':
  q, ~( p- D+ }. D- W: p; `                {csym[nLevel++] = csym[2];}break;
8 y- Y9 o) J5 r2 @) a8 d            case ' ':case '\r':case '\n':case '\t':continue;3 c- }1 e$ r2 A; Y! M
            default:; N' F# `! I+ @) F$ M# v
                {nLevel=0x100; nERR=1;}2 U4 @6 M: }0 M9 H
            }) F5 i! s. H7 c3 z% a: h
            if(nLevel==0x100)break;
' J: F8 |9 [6 \8 v0 f: @            if(nLevel&0x10 || istrin>>t[2]){
6 C- F# l+ t* J: z$ r                nLevel &= 0xF;
% U+ a1 R9 |' K8 _( X) F                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 K& y( t% n2 y( \# a
                if(csym[1]=='*'||csym[1]=='/'){
6 {* V- C1 N& I2 U8 q) V9 h                    GetExpValue(t+1, csym[1]);
+ q% L) p+ H2 z3 @$ B' q* @                }- B' X0 @3 T* T* O; t( k* z
                else{! w0 h% m, ?0 O
                    GetExpValue(t, csym[0]);; B, c% [, ?% T, c
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 g) Q9 T/ G* e/ Z
                }
0 H1 e! V7 W; I' n0 G2 K( K                nLevel = 1;9 A: z# F1 H3 T% H* i
            }" A& r& C& Z* m( @6 ?+ k3 j
            else istrin.clear();
) I* T5 t8 b8 o( G. B0 l5 W        }
7 j. w& E. E5 Q  N        else{nERR = -1; break;}. s& h3 I1 o$ g& k% k/ K1 l
    }* p+ F& J1 D9 z6 `8 U) r4 d! m/ a' v
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 v. F2 C3 d- m  _
    else nReturn=GetExpValue(t, csym[0]);
4 j8 U% G- }6 U5 N5 b0 n7 O. |: {    return nERR==-1?1:0;
( s  R% c. \- ]7 d1 K+ x* x}}
& d: c6 j  a7 p* u$ }7 q2 c- {% @* O) H8 N# e5 a
6 n  z* Z9 H) u

6 U' X% [- }  K, a: v函数模板使用示例:
4 u7 T3 d2 P3 U" D4 H在以上那段代码的后面加上以下代码:' ]0 ^8 \9 C) D

+ |1 y- f+ m2 m1 x' p 9 X" o$ t6 r" F
& ?& a% D! k2 B. T+ C( I
程序代码:
: S7 w6 ]# i% _. P1 g  g# {+ e; o9 H/ N, E' i; w
#include<strstream>: U5 x" f( h3 K4 z' V- d% |
#include<iostream>
. L4 A; E7 Q+ u#include<string>2 k# W! |" ^6 V; s. ~" D1 r
using namespace std;5 ]# Y' b1 f2 V! p* p
int main(void)
1 k+ _9 Q: e* d% H{. I$ y5 m1 a6 X4 E0 h% f/ A
    string s1;
: g# G* @- o) I    while(cin>>s1)
6 d0 E2 p9 K/ `% |( u    {
: k0 f& x/ _0 D8 Q' ~  p- s        istrstream isin(s1.data());
& x- b0 |' j' J0 h        double d;) t5 {, |) t  H) r7 a- t. p0 j
        if(fy_Exp::GetExpValue(isin, d))" ]% Y. t- b# |' Q. i
        {
0 Y# E$ ~! V- p/ U- ?            cout<<d<<endl;' i9 I* W3 H# ^, S" J8 m8 J4 V
        }  g6 A8 m  x: k" \$ L! U
        else$ l+ ~/ ^; C9 A7 P2 c
        {
! G, T% [0 T' n" i7 I% r            cout<<"ERROR"<<endl;1 u1 @$ a" r& ^- F0 L0 k3 ^
        }
/ ?! q) m4 t: u" M7 q" }    }6 T3 s0 s: J6 J1 t0 ]5 V1 \1 _$ y
    return 0;
! l% H- T$ y, R& j9 z3 N2 }" [" a1 N}/ T) Y0 }+ Y  \# f
% p, n5 s5 R" _

: M3 ]' j5 e8 w& t9 j* Z- ?然后编译执行就可以了(*^_^*)
6 l) w8 |( x1 \! ^8 l0 T8 o3 j其它:TC++上一定编译错误,不保证在VC6上也能通过编译& `0 e) f4 U& {8 N0 C+ S
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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