返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,- D/ {1 z+ a  W4 ?; a! \" J
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. u+ X9 X- F: I  |5 c* i只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# G/ u4 L( D6 Z0 R; \8 g8 q参数解释:
$ ~& o' F6 k. c4 p% {- n# _istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 g$ S% |( I+ q" I" `nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% c7 [+ Y" C3 P: L3 x* p6 F7 w
返回值:
6 I# ]. J0 Z/ X& [7 G% z返回非0表示计算成功,0表示计算失败有错误9 ?6 Q) F% W- D2 T- b" b- I2 L

- J$ ]& g' {  C4 E0 f$ G$ ` ; Z) e- v5 E& J) K* B) g1 |' @
1 R- V3 j0 X' w3 S2 O* z8 o
程序代码:
" y: @5 U/ a2 o$ y+ ^% r5 O. f. ^3 |. d0 Z( n1 c( g9 c+ c; m
namespace fy_Exp{: P6 O9 v/ r1 ^  |+ y1 m4 a
namespace {template <class _T>
+ i7 P6 S4 p$ Pinline _T GetExpValue(_T t[], char& csym){
9 a; R  R" u+ i2 f# B0 M* \2 U    char c=csym; csym=0;/ c) t* F/ }9 P$ m' B+ @1 @/ p) ?
    switch(c){1 U, {7 H8 S: b7 C  r2 d8 h/ M
    case '+':return t[0] += t[1];
; B) [$ I' H! d% _+ U    case '-':return t[0] -= t[1];
" r, {% N3 S, g! W; J    case '*':return t[0] *= t[1];1 |. M- I; z- g. s$ ?
    default: return t[0] /= t[1];//case '/':
* d2 N/ P5 @6 S, ~5 s1 n    }2 I- G2 ^! g! F1 |
}}7 K7 h4 W& F) G& @
template <class _T, class _Tstream>8 U7 P  F; C4 h! S% T& w
/* _Tstream: inputstream, _T: get return value) z9 v" \, u- T1 i
* Return nonzero if get value successfully */
( Q7 r4 n( {: o+ i/ O( a7 B) oint GetExpValue(_Tstream& istrin, _T& nReturn){' n' Z$ V1 S6 d$ I
    _T t[3] = {0}; //雨中飞燕之作: d. {1 B0 P1 r: b
    char csym[3] = "++";
& r$ s3 k  \& R( y7 \& Q( e' P    int nLevel = 1, nERR = 0;
& E$ H: F# W' ^6 L  Q0 X  \    if(!(istrin>>t[1]))istrin.clear();4 p$ {) T0 G" ?
    for(;;){
5 N+ q+ Z0 `& g; Z+ S        if(istrin>>csym[2]){; B( [! I) Z% J! d! f; Z
            switch(csym[2]){
( q7 b1 G1 f0 C7 ]; R. d3 n            case '(':; Y! {* E" a1 ]. ^/ M
                if(!csym[1]){nLevel=0x100; nERR=1;}else
( ?1 a( U. b; s0 S* A: ^) b                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 h0 B2 x7 v6 N2 z- b
                else{nLevel=0x100; nERR=1;}
) Y1 }1 K( h! S" I6 n, T7 P) r                break;
. w3 ^1 R: _3 I( ~' D2 l            case ')':2 x( L: p9 ?0 v! c
                {nLevel = 0x100;}break;( O' |* I1 k  {. _" E1 Q1 o  V# z- o
            case '+':case '-':case '*':case '/':
% F5 m) K- ~5 K0 D1 G# [4 ?                {csym[nLevel++] = csym[2];}break;
" R* E9 R1 w& ~: s( c            case ' ':case '\r':case '\n':case '\t':continue;
2 ^. r/ w' h7 W            default:
) {( q& M# N0 `                {nLevel=0x100; nERR=1;}
/ m' {' [8 P% Y            }! \" {6 O( P  Y8 f$ h
            if(nLevel==0x100)break;
; S. B) ?" [" p. a: N; K. e9 f            if(nLevel&0x10 || istrin>>t[2]){
8 O& S" L* |6 Q, K- y& `6 S                nLevel &= 0xF;
8 i% I3 [4 u8 M" x. P: y. |4 j* O5 I                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! K- K  b/ R( \$ J: U" S
                if(csym[1]=='*'||csym[1]=='/'){& O  y; C! R* @; g+ V  y  y
                    GetExpValue(t+1, csym[1]);
1 [" v6 r5 @8 G( C                }
  V2 u$ g6 x+ v$ L                else{
  `0 N( s) D( s* s; a& V                    GetExpValue(t, csym[0]);
5 p6 F: e1 K/ Z- n8 |                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;& ?' c, K, ~% w" s  A9 }
                }
+ D$ y7 d! A7 o# b" Z/ B$ [9 ?                nLevel = 1;
& ~3 j9 ^" v, B: q5 @            }" Y) H7 U. [6 h5 m1 O8 m! E: k
            else istrin.clear();, o% s4 `3 f2 S$ p
        }5 C* E1 }  y/ o
        else{nERR = -1; break;}2 Q8 E' U9 v, c$ Z& {6 v
    }
4 {: C. o# m+ ^    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 ?5 q  K' J& o# i
    else nReturn=GetExpValue(t, csym[0]);7 q* V4 _; q9 N- r
    return nERR==-1?1:0;6 |) c2 Q! o; }0 Z  s
}}
! o6 W$ u! i1 X
9 N9 Y0 l. J3 K: }! Z* ?" w& g6 H4 O$ N

2 M( ?- N% ?2 P7 X, G1 P4 @函数模板使用示例:
! Y5 ?: A; M' f8 d- ~在以上那段代码的后面加上以下代码:
, ]  F) C  u$ k7 E/ Z( Y
( n8 L$ `& B! U4 Q' A$ T
/ x5 E4 `6 [- l  Q6 {3 B7 ^4 W6 ?
程序代码:
& q- h+ F$ h2 \# E4 Y, G& |9 o0 ~) K" N. e5 J% ?1 E
#include<strstream>
) u5 T  L7 E( [% g7 J0 c% Z3 v0 F#include<iostream>
# `& I7 o* a6 i; m#include<string>
- l0 D. f6 z% B" P& [- [9 D+ Zusing namespace std;% t) z* g& I, B9 `( E
int main(void): }' o5 C1 l5 S. l; i6 E2 J
{
+ I+ ?7 P  _! M3 u$ |    string s1;
  D. I* A" k1 H! _7 j    while(cin>>s1)
% q6 r. D1 h3 J    {# \( i/ C  n9 L2 m+ |6 X' f
        istrstream isin(s1.data());, j9 a5 a5 ]$ r, o' l  Z& T# o5 i6 j
        double d;
) b1 L" K* C  p; W        if(fy_Exp::GetExpValue(isin, d))  O" X& N( E: k# B/ ]) g7 C
        {+ \, r/ K' c0 J" m+ h4 n1 w8 P+ ~
            cout<<d<<endl;, L6 ~0 E/ G! n. B
        }
1 B9 Q" X/ |8 q& N8 e; ^        else
# c* z; \* F$ z, {- o. {        {! u% A& w/ L: r. v+ O; }5 Q" O
            cout<<"ERROR"<<endl;
: W" ^/ F$ v: ~. d8 o        }
& D' V* l& X9 K4 K    }# d" F" O: u$ Q  T' k% h& S
    return 0;
8 Z$ o1 i- }% Q& z. A" d0 H/ a0 d}9 ~; z, ?$ V6 n8 o( x

. z7 @) I  G# m9 S. u3 e4 Y2 N! C$ D5 z) ]" ^6 b$ q
然后编译执行就可以了(*^_^*)$ |: u; B/ Q9 @& a: I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
6 s; [% q2 n3 R% S) q7 {+ U9 \      建议使用VC7或VC更高版本,或者使用GNU C++编译

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