返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,, C$ ]6 d/ S* S  J; A7 H% o
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; Y( l( p( z; |+ l& W! \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- O2 F1 G# ?6 x5 \1 P' l
参数解释:
& G. [0 ?, w0 b, T" Bistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( M: ^# Z% d; I
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
  J) }! Y; k- I5 ]- |1 h返回值:6 Y  _" a2 u, A; I! D' L
返回非0表示计算成功,0表示计算失败有错误0 Y; z2 k  s  R/ N+ ?1 k  N5 \
, E# i/ F- u& b
: U& m7 F' k$ y1 w
* h  E* e6 Q2 R5 t8 `+ X4 K
程序代码:
) O6 P1 ~- @9 M+ X" }4 F8 ~) a* L- b5 L' H! g; a2 a% z
namespace fy_Exp{* Y, ?* }1 C- T4 f+ [( H
namespace {template <class _T>
/ b7 ^3 R1 X2 R$ N/ A  finline _T GetExpValue(_T t[], char& csym){& P4 I6 n' |$ i5 l- F2 `
    char c=csym; csym=0;- e& ?/ h8 ~3 Q% F/ q
    switch(c){
& z( T% Q) D3 ]. j  S: H- c6 B9 l    case '+':return t[0] += t[1];. M* K1 {8 I5 e
    case '-':return t[0] -= t[1];. J' z/ W8 `4 f, {, S
    case '*':return t[0] *= t[1];
( M" C9 m" V8 M+ k6 s, S    default: return t[0] /= t[1];//case '/':; O/ X; k& r- J2 a
    }* X& l: U1 ~9 z0 p! |/ _
}}8 P% L9 N7 J! Z$ [* e; n
template <class _T, class _Tstream>+ G2 P9 H, g/ a% h
/* _Tstream: inputstream, _T: get return value
( Z/ W, R/ b0 Y: h  u* Return nonzero if get value successfully */
& `! @4 I  T* P) fint GetExpValue(_Tstream& istrin, _T& nReturn){
2 ]5 c0 t4 S3 L5 n    _T t[3] = {0}; //雨中飞燕之作
! r' l, \4 ]% ?9 D9 R! @7 {    char csym[3] = "++";
' Q# L# t$ f% F) }& C! D/ I    int nLevel = 1, nERR = 0;. I6 X. e2 B: H! o" ], }  k
    if(!(istrin>>t[1]))istrin.clear();  W3 W7 s/ m+ ?6 h* [+ a% g
    for(;;){
" U+ }# l, E. A% b0 n: Y1 E        if(istrin>>csym[2]){. ~  S! N- h- n$ `% @
            switch(csym[2]){
  p# ?/ v1 H' M" X; G* Q( Y8 e            case '(':
9 D, a" A# O/ M! v! b                if(!csym[1]){nLevel=0x100; nERR=1;}else
3 }; I5 y/ C7 V- y$ e. A2 G                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, v) s+ T' q3 ?: E* Q8 `1 X9 h( ?% R                else{nLevel=0x100; nERR=1;}
& ^- T, m& F" P4 P                break;
' [! Q1 t. x  m: h$ K            case ')':2 g" J7 m1 h& Q4 V- \. |; h
                {nLevel = 0x100;}break;6 @4 r( j8 i$ B7 T# @
            case '+':case '-':case '*':case '/':8 B' ~* N  l. `0 |
                {csym[nLevel++] = csym[2];}break;6 e9 x8 g2 P/ Y& w) g
            case ' ':case '\r':case '\n':case '\t':continue;# F7 p8 A8 U9 [7 d' |
            default:7 ?6 T% F6 M! I
                {nLevel=0x100; nERR=1;}" R, q1 V: A& H$ C  u% n6 Z+ j6 R
            }
' z5 Y9 M" Q& ~( W8 [            if(nLevel==0x100)break;9 x/ L3 q. u9 |/ t; k' }' e
            if(nLevel&0x10 || istrin>>t[2]){. R. @- u. s1 {, [0 A6 u
                nLevel &= 0xF;5 m) K( l: @# T8 b; U; e& c
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}+ I- Q, }2 Z) Z* ?7 Z
                if(csym[1]=='*'||csym[1]=='/'){
" n' T( Z. _7 j/ S$ T5 o0 K                    GetExpValue(t+1, csym[1]);' k0 i6 U% [! v
                }5 T, T5 r" [+ H
                else{
$ D+ c- ]' a- S) d8 f  {                    GetExpValue(t, csym[0]);  d2 `8 Z" h/ P0 d  l+ N
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 Z( Q; w0 y2 b+ t& X                }. m; \7 d% K. p, n" q0 B
                nLevel = 1;) {) h& E' Y% w, e4 o8 }
            }
: u# r0 |  M$ F, P  i$ S            else istrin.clear();
8 \8 F' Q( e. {        }
6 i9 o% c( K! O- [& P        else{nERR = -1; break;}. p" f# z# R, {
    }* Z, x$ `+ A: h, _0 f
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
) c1 |! s/ k$ E9 l1 u; P% I) `    else nReturn=GetExpValue(t, csym[0]);
; C2 j) ?  Z) Y" ?    return nERR==-1?1:0;
- V% m, v$ d2 }+ _}}0 t$ h  ]. X' q

( e& f8 ?" y. q$ g
1 X% c5 j5 t- ?; K7 g5 T0 {" `& _4 h5 c3 n' E9 b
函数模板使用示例:
8 N1 P: f6 Y% c8 L0 H在以上那段代码的后面加上以下代码:
' r& N2 l) w' [* T# m  G9 A) V7 [
) g8 r  k2 b' s- d8 q9 R( O

6 I7 ?* J, a2 i* \程序代码:
5 j6 G6 \4 x- X; Q' x8 S5 R8 O3 Z  u' Z: i; E8 q. d: T" u$ T9 Y9 `% c
#include<strstream>  B0 [  F- e* [
#include<iostream>
: W0 c0 h5 j: v#include<string>
1 j3 m& y) m( g$ T9 Q9 {4 e7 Kusing namespace std;$ [# w* ~! }0 w1 A
int main(void)
2 m$ N6 B; Q+ N8 g( o' ?{7 [7 ^9 L- U) ]* n$ ~
    string s1;! i: z& x- f+ y- s
    while(cin>>s1)6 \# V  V# |5 P+ X! `8 R
    {
) |- o2 Q; O; a$ R* m        istrstream isin(s1.data());
3 z# e3 T& l# N3 n% J( d        double d;
- K( \- s0 C: w        if(fy_Exp::GetExpValue(isin, d))
3 V( _7 e3 w% l2 z4 K/ Q" q  y2 n        {- k4 z) {1 M, ~* }
            cout<<d<<endl;
; R2 c  y( i0 J: |, i        }
* o$ |- A3 v& K0 Q+ A0 G        else
# Q' p! d: n8 ^$ u2 t7 ]) ^3 V5 u        {, I- ?+ n7 |$ U# X5 p
            cout<<"ERROR"<<endl;
' _5 [9 i3 q8 y* A1 T        }) ]* N9 ^5 u' s5 e9 f! k- i, B
    }
2 L+ |( k; }# s+ s; _) g    return 0;
: J' W+ E8 e* J' e9 F3 x}) |/ W5 u" }( N& B# B/ @

* }5 P5 I: z( Y, q/ X1 W+ c7 c
然后编译执行就可以了(*^_^*)
; }3 z! I  z' L2 w其它:TC++上一定编译错误,不保证在VC6上也能通过编译
9 I8 K( g" P! ~      建议使用VC7或VC更高版本,或者使用GNU C++编译

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