返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
! d: v6 b" j" X, D. e一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 i- Y1 [: A/ X只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
5 T) B5 `5 [, I2 _4 w+ Q参数解释:8 l, P0 E3 d- _7 I$ ^. ~
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 i+ C( N6 G2 Z! s" d% lnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
/ T! ^( O" X# |, D返回值:
4 H/ ?- m! ~0 S- r  I0 X返回非0表示计算成功,0表示计算失败有错误
! `- G  v6 N  k$ g8 \, U
. \9 x8 {7 S" h5 v' q# v 6 D  p% ~. ^8 _0 E
$ h: P! t$ u) d
程序代码:
' z3 r3 R  b- I* N8 K  Y- S
! f3 g8 @, l$ @' tnamespace fy_Exp{9 ^8 A( |( _/ l/ c5 {
namespace {template <class _T>* \! y7 j$ B1 A* o
inline _T GetExpValue(_T t[], char& csym){
2 n5 I9 L, v6 o6 `    char c=csym; csym=0;( [5 f+ N( G2 T' Y0 Q
    switch(c){
- W, @. R# f5 s/ b' J' E  @7 d! E    case '+':return t[0] += t[1];- c5 f1 V" p4 }, h% E) B/ K
    case '-':return t[0] -= t[1];$ D% L6 t# s. d- j: W
    case '*':return t[0] *= t[1];# g8 g' V" X, }% v$ v/ B) B' W
    default: return t[0] /= t[1];//case '/':9 V0 b' O- o! d/ j7 H) A
    }1 P; F! F& H* }4 p+ U! T" J
}}, ]3 d7 X, ~  \% B
template <class _T, class _Tstream>
3 T+ g6 {- B! S2 t" l) u* c: U* @9 I1 k/* _Tstream: inputstream, _T: get return value# y5 a) T2 q) Q5 i! z+ {
* Return nonzero if get value successfully */8 n" ~" G( ]8 T0 t- F5 w3 @
int GetExpValue(_Tstream& istrin, _T& nReturn){7 }% k2 d4 ~# Q' \/ ^, y; h
    _T t[3] = {0}; //雨中飞燕之作
1 f& o  R) K4 ?8 b! j1 s' ~$ I& `    char csym[3] = "++";
4 E, Y/ c5 d: Q7 L8 m9 N9 K    int nLevel = 1, nERR = 0;. \0 B/ I- g$ w" ?& w' `
    if(!(istrin>>t[1]))istrin.clear();/ K# A0 Y4 F3 o. b, a( |8 N0 G
    for(;;){4 C0 A# r" U2 l2 k" C
        if(istrin>>csym[2]){* g5 a. h% c9 Y9 G* I# y
            switch(csym[2]){
( [4 S& V% {* v$ k* p, I2 v* r7 r* q            case '(':
" O. _' R. D1 H1 G                if(!csym[1]){nLevel=0x100; nERR=1;}else
9 l! z: M6 J! o4 A- Z+ @1 N                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" I1 O* l2 [% |2 }% o: l
                else{nLevel=0x100; nERR=1;}
4 r: e6 y( p0 _, {                break;5 b2 [) c) L) t" w/ N" F9 \
            case ')':
+ I4 I6 P4 g5 u1 g2 B& }( ]9 O                {nLevel = 0x100;}break;
; }+ `5 ?( Z7 O2 h' ?3 J( E2 E            case '+':case '-':case '*':case '/':4 H9 e% C* N! O1 @  g( Q( p
                {csym[nLevel++] = csym[2];}break;4 y5 Q$ h' x' a/ H3 j  d  e
            case ' ':case '\r':case '\n':case '\t':continue;
2 V- L; e- `/ B' s            default:
' T4 G& |1 c' s$ `% O                {nLevel=0x100; nERR=1;}* F$ f9 x/ C0 \: G
            }
  z0 \! I3 I& S' l% g            if(nLevel==0x100)break;
$ Q$ w* V: l& Z; u            if(nLevel&0x10 || istrin>>t[2]){
  D4 B# r- R! {2 @( c! [                nLevel &= 0xF;
. f* @% n- ]; s8 j7 D                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 B* [  a3 a& o8 I( ]                if(csym[1]=='*'||csym[1]=='/'){( C& Q- ?7 n: L# Q/ b) V
                    GetExpValue(t+1, csym[1]);, j5 ^1 }! E, v
                }
& z) s0 q; S! q) |                else{
! X/ m' b; G- `                    GetExpValue(t, csym[0]);
4 S$ c9 D; I7 C+ y                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' G1 y8 a4 c* c9 j) m) J4 P2 u                }& P% `$ J9 M9 N; n
                nLevel = 1;  f' S3 E3 u, e+ t$ p
            }
0 [. r; a' B# `4 w8 B- A            else istrin.clear();
( X5 D3 z' z. N  q! _        }
- M, h, v) m; G2 Q4 i        else{nERR = -1; break;}/ b. n' H6 G$ |/ b/ ]& i! @
    }6 p* `" r3 b6 j0 H4 G; R' ^
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 }' ^! b) M/ X- D    else nReturn=GetExpValue(t, csym[0]);
1 A% ?" @* ]( N3 a! \% f    return nERR==-1?1:0;9 `2 E" U: Z! I# {! g6 t
}}
" k! r% ^4 n3 m: O! n9 t( I' b
% [5 E. F3 a; L
, r1 b7 G- Y, R) k) ^* Z. s  [2 ~* Z% k" ^+ s
函数模板使用示例:
3 R, T8 R! N9 d- ?/ @在以上那段代码的后面加上以下代码:: t# X! p1 e: Q* w1 o0 B

- K( B! n) f3 |( M6 Q  v/ {& X1 [ " q3 \/ o; ?; M' @6 l* g; l

3 l: U' ]4 |- f/ w7 S程序代码: % N5 @" k* [& N: Y

9 K. e; t2 o4 _& i9 n2 {#include<strstream>
9 g9 M6 {4 E- R6 }8 X#include<iostream>3 o7 l5 W, i5 k* V+ @& A+ {( V
#include<string>4 o5 L4 r) d7 b' A5 O) a: w
using namespace std;$ E3 i1 P4 d( {7 b( c
int main(void)
! O3 H+ l9 J  J/ c/ C4 w{3 ^' o; y* w$ q& D/ a8 G; n
    string s1;; }# o$ D6 u- Y4 Q5 V
    while(cin>>s1)
: A$ u5 ]3 @! Y' M% M+ g    {
6 \4 Z- B$ M% d& @! l        istrstream isin(s1.data());
' H$ m  b: a. Y        double d;3 h# Q* `5 o# C# R% c9 m& l2 H
        if(fy_Exp::GetExpValue(isin, d))2 D. j0 ^9 L6 P" [) F1 R4 E
        {
( z0 s1 y( X0 r4 @            cout<<d<<endl;
' @: u, O3 q2 ^: |4 K        }( G4 r* l  v  Y
        else
# r. }$ _. a8 T% o        {' N# ~' r# ^% b& Z+ Z
            cout<<"ERROR"<<endl;6 H: W+ v7 u# l
        }
2 U+ X4 M4 B! e4 ]/ l    }
9 B8 j: Q! A! v# S% ?* ^    return 0;
" |7 d0 z# s8 R0 b% H0 s4 a$ U6 r4 T}6 M9 A- v7 u( V: m: I9 A. ?

' }! e0 r; A! U) c  G
6 Z6 O5 F0 _' N6 \* R6 l$ ]% M% ]  J然后编译执行就可以了(*^_^*)
2 u; P) x0 x! ^其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 y/ |* C0 R. o5 F+ m% B
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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