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

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

在9月8日那天我特意编写的,给大家分享的,
* X8 ^" O# h+ k( C9 R一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
0 g( e  v% L* v1 K: t; Y# J只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)  g, R1 S* p$ B6 _9 X/ c
参数解释:
( Y( \# B1 D0 _# _% B+ G' Ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
, S0 t  B) [/ k/ r1 onReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
  E- z( |! q* A* P; e0 K返回值:6 F; {# x) s5 \7 E8 X6 g: x$ T
返回非0表示计算成功,0表示计算失败有错误
  C  q$ N; M0 U6 S3 M' i. p- j9 ~
! t: N4 h! i  d4 B# J' e6 J5 k# ] * E1 r/ i) M; A4 R% g5 a& H; E. i

( q7 g, {* r0 H程序代码: . `1 M: K1 K! j, u7 q" ]# D

9 O; z$ j6 O  [0 P  Z" i8 Knamespace fy_Exp{$ d+ |9 a. N) X8 k) Q# K) v
namespace {template <class _T>
- B+ H& I; ]  w7 r& H  w2 O0 cinline _T GetExpValue(_T t[], char& csym){
* F$ U7 ?0 ~0 ^6 ]$ q: g    char c=csym; csym=0;
& q6 G- {' _% M    switch(c){
" M: U0 f3 i+ ]0 r! B8 j    case '+':return t[0] += t[1];4 s5 _& _+ l& P  T- ~$ a" i
    case '-':return t[0] -= t[1];
  g/ m' Y% _( l5 P    case '*':return t[0] *= t[1];. @- b% N( p2 F2 `
    default: return t[0] /= t[1];//case '/':
! }% m+ _9 ?5 v. q    }
& ^0 e- i  A7 \) i' G}}& }- ?7 M) `1 f  |2 R5 b
template <class _T, class _Tstream>, G; I  `0 ~8 g; N6 n* X1 o
/* _Tstream: inputstream, _T: get return value
( J- P7 z! `) M* Return nonzero if get value successfully */
% |# e+ R6 g* r. a* Q1 r/ vint GetExpValue(_Tstream& istrin, _T& nReturn){
+ z3 q. x# h6 i, v) }    _T t[3] = {0}; //雨中飞燕之作
, x2 ~$ g- H0 j0 k    char csym[3] = "++";/ _- x. m1 G$ j9 L0 |5 p
    int nLevel = 1, nERR = 0;
9 b- C, R$ R) Q2 K1 `    if(!(istrin>>t[1]))istrin.clear();: \8 }+ ]8 ?' t$ J- p
    for(;;){
/ k: I4 T/ R/ @% K% b' a        if(istrin>>csym[2]){1 A: S. G& V4 s/ G
            switch(csym[2]){  |' q7 t) [- y1 U; _( i: ^- A0 x
            case '(':4 ~3 J$ j* \, |# M; ]: d% L: }( s
                if(!csym[1]){nLevel=0x100; nERR=1;}else
# I2 B2 y4 v. C0 d                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- n1 o' ^. _2 b/ B% ~. U                else{nLevel=0x100; nERR=1;}
  {/ G0 ?7 r: I$ S) S  E                break;
0 h* J6 W) B; R$ [4 I' x8 C            case ')':
, ^: A- ~0 ~5 W0 c                {nLevel = 0x100;}break;. e; c2 n$ D/ b6 J2 V
            case '+':case '-':case '*':case '/':+ }" n& e$ s1 l3 o
                {csym[nLevel++] = csym[2];}break;3 {3 q3 i, W' N- C) E8 W5 e% d0 t
            case ' ':case '\r':case '\n':case '\t':continue;
  q+ r% S% V2 L& H1 A8 J) C1 K2 W            default:
3 ?( Q( N2 r" j6 R/ ?. P                {nLevel=0x100; nERR=1;}8 [/ Y( Y8 X( C* f/ q5 z
            }( x9 T/ f+ ]' y9 j% X0 g
            if(nLevel==0x100)break;
% r6 J/ ], K# B+ B' K            if(nLevel&0x10 || istrin>>t[2]){
6 h& B( O2 I* k. Q% g$ H" W                nLevel &= 0xF;
: ~  k+ [* O7 Y; B. D& h                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}' U, |# r" K! U, x8 h4 x5 u
                if(csym[1]=='*'||csym[1]=='/'){
0 v: z4 y# G3 E+ ?                    GetExpValue(t+1, csym[1]);  X7 p5 _3 E- ]4 Y) z* v8 P5 I
                }
( h" K4 G1 v$ \                else{
$ |, S* b' h7 ], G5 P                    GetExpValue(t, csym[0]);
& d% {7 _- u1 Q* O( z5 F# h* Y                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 y, u0 b2 E4 m2 n) Q
                }
4 b/ G( L+ r8 r' U, E                nLevel = 1;
  }5 m; R/ F! m- N# p0 G) A( M* F9 ]            }
! H& Y9 K* u# R9 ?: h$ Y/ \            else istrin.clear();
! O' }9 q' [6 {3 d        }
5 @) e' ?/ L: v1 B$ i( b( K/ ]        else{nERR = -1; break;}$ Z) e# Z, }$ c5 ?. D& k! |4 V
    }
, G# b3 d8 @" G% c: i2 Z    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 Q; E6 P6 U5 E9 P* t
    else nReturn=GetExpValue(t, csym[0]);
4 c/ B' j. V- r3 I, b    return nERR==-1?1:0;
7 p" n2 t- ]( g) F- V* G2 l}}
9 ]- o: @5 y) `+ Y) n: y: P, x" k) ?& O  H  l0 a
$ F5 `1 J  n- b5 T* j

% c4 p) }4 u% l3 ~! ~函数模板使用示例:
6 s/ \" P: n; [# B  r# S: f9 A% N在以上那段代码的后面加上以下代码:
, P1 I; w% ^0 M4 c5 z% N3 J- m- ]& R8 e2 h7 y2 h; R
5 N4 [5 h- B# Q1 d
# L5 W! V3 w' h7 N
程序代码:
6 V# }; S6 G5 j# {# M6 h2 T: G- P( x$ @) X9 v" t' l
#include<strstream>3 I5 X/ B- q* M( U" f6 F
#include<iostream>8 U7 d1 T$ l8 Q. C' g% J2 ]
#include<string>. ?. G" {6 f! ~/ |
using namespace std;
( g. a7 X) |! o! S* eint main(void)
( ^4 w& y8 R6 x3 b: f5 u1 Y5 Q  j{
2 f: E' r. U* `5 B. A% G: T3 ?3 ~3 [    string s1;
: M2 X8 `/ C0 t    while(cin>>s1)
+ ~7 T8 l* w. m+ S+ L1 e5 S7 I    {
9 J# T- _; W5 \( i        istrstream isin(s1.data());6 O+ [# I, M$ M1 N' V$ D
        double d;& L0 l- u$ _$ A8 _
        if(fy_Exp::GetExpValue(isin, d))& @/ {" u* a4 i
        {) L  i# _& M. r4 |& S3 p4 C0 ?
            cout<<d<<endl;
+ [5 L! I1 {7 B- k5 d/ P        }: ~. e5 t+ F6 B8 S+ j6 n
        else  b( ~; s$ d3 g7 c2 q& v
        {7 ]7 O7 G3 X6 Y
            cout<<"ERROR"<<endl;
( u5 C* O. K# o) g1 s9 c        }0 t2 J" ]/ \( F, G
    }
% ?9 L$ N, t  b    return 0;
4 O$ F/ G! a, w7 d9 R5 a& }5 j}
5 W3 i7 B8 i/ ]* |# a- k& ]. G2 p/ W8 d$ M
& {- c$ g  J$ f( T
然后编译执行就可以了(*^_^*)9 x8 p' e* l/ \; d. l) Q+ ?# j
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
- y% n3 q0 v/ j6 X      建议使用VC7或VC更高版本,或者使用GNU C++编译

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