返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( A' |# E' L, V; }8 F9 D
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& j1 l0 ?4 t; a* p只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 w9 Q3 h7 D. R7 l, k, g, L8 y8 @2 O
参数解释:! l# r6 Q9 Z7 E9 b
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- I6 g/ \5 Z. fnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 T: d9 X: Z8 ]# i" H返回值:% G" C4 b- A' a. X+ h
返回非0表示计算成功,0表示计算失败有错误9 ?, i8 @& P' B" W- u
. l( K; f7 l# z: ~( C9 R+ y: _
+ w5 F2 ]: ^/ B$ S# k6 c
- b: t/ M8 E# q
程序代码:
# K& N' {5 N, q% L7 e6 M  v% ?& K8 U0 S) p$ Z
namespace fy_Exp{6 z8 y2 Y% W" J9 e
namespace {template <class _T>/ p6 a) t' N" H- l
inline _T GetExpValue(_T t[], char& csym){
% J% z, e* e9 R' V5 ?& Z    char c=csym; csym=0;
. X' G2 L9 e  ]9 P& }    switch(c){
- v9 f3 c+ n/ E9 V. E% b# K    case '+':return t[0] += t[1];
: C# B) U2 g  G) b2 X    case '-':return t[0] -= t[1];2 i( E  e. |3 a
    case '*':return t[0] *= t[1];
$ y* e3 g  _( C) f( E- m) S- J) L, G    default: return t[0] /= t[1];//case '/':- y# Z% v# O* o3 H
    }4 s) l9 E5 O2 L! |% T# Z
}}. R6 ~. j* z4 W0 V: ^
template <class _T, class _Tstream>& R4 a, r1 J. M, K
/* _Tstream: inputstream, _T: get return value
: o" O+ C! Y% Y& U% C* Return nonzero if get value successfully */. o1 \8 i; r0 Z
int GetExpValue(_Tstream& istrin, _T& nReturn){; M9 R& d8 ~4 q* E. t( A: G- U
    _T t[3] = {0}; //雨中飞燕之作
) v6 Y& l) ]" W& z% H9 v. G. Q8 o    char csym[3] = "++";- x. ]+ U, t: m" n9 i& D
    int nLevel = 1, nERR = 0;
/ d- V4 o- _' ^7 I" u    if(!(istrin>>t[1]))istrin.clear();9 V  q3 S; y6 P( n1 d* }
    for(;;){) }5 O3 D3 Q; `7 e7 D; v
        if(istrin>>csym[2]){
# Z& u8 @$ l) |# E; `4 X            switch(csym[2]){
3 z2 H( x# g/ g, c. S8 A            case '(':% M: m$ V5 J! ]. T" U% b8 O! p  W
                if(!csym[1]){nLevel=0x100; nERR=1;}else
4 b8 P) p/ b! d5 _. a. U; V' L                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 G/ c3 {, D# _) q2 h* `
                else{nLevel=0x100; nERR=1;}/ w1 G( C5 V6 _* t" l
                break;
- ^6 ^. }- O6 S8 ?            case ')':
# V7 S0 {& }7 ^5 \                {nLevel = 0x100;}break;
2 F% d1 Y' @; [0 N  ]3 R6 V            case '+':case '-':case '*':case '/':
( ^, I. V( ^9 b/ O5 E) W5 f5 \$ N                {csym[nLevel++] = csym[2];}break;) W! X" u4 b5 ^
            case ' ':case '\r':case '\n':case '\t':continue;7 q! q, V. E% o# A
            default:
$ Q: o& K3 c; M- S4 o, H  K! h                {nLevel=0x100; nERR=1;}
5 |6 U- n/ V/ f- }            }4 y* o  d, W1 R. p
            if(nLevel==0x100)break;
, k% g5 t+ ^. u; W% m            if(nLevel&0x10 || istrin>>t[2]){
; f7 n# Q* _  {! R+ ?5 o                nLevel &= 0xF;$ i$ l3 ^) T2 _4 }( h% F
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 e. f2 s- w, `8 b                if(csym[1]=='*'||csym[1]=='/'){
1 p+ [4 j& u6 x$ P                    GetExpValue(t+1, csym[1]);
/ a+ @$ U* e; v7 F. L2 k" v                }
, j& j' I  x+ x' G. v( _" P8 L                else{: ?0 ]' x2 v! {
                    GetExpValue(t, csym[0]);
; ^- Z# ]+ A; B" q# u1 M0 O                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
6 m( {# e* }3 Q2 C  W4 I4 X9 E                }
( T1 c! i' s# W                nLevel = 1;) Y" c! Q/ x' |4 S# v2 S
            }5 u2 W- y* r' r' Q7 U
            else istrin.clear();: w. [* z3 ]2 ]
        }+ }6 W2 Z3 j( h3 L/ i% p) {' T
        else{nERR = -1; break;}1 D. K* X8 n$ j
    }
6 y( S$ i' p4 R( {# K3 c    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ ?* Q. d. L* x    else nReturn=GetExpValue(t, csym[0]);& i$ a) a8 P2 n
    return nERR==-1?1:0;& m) N4 D* n" K
}}
) A% b& {  _* e1 o, R5 n8 [2 G
% }% e  [/ F) k+ B% y3 Y: U- R/ b5 o: X' n' j
0 l7 {, P1 h" V$ f( B
函数模板使用示例:
: g+ c3 s8 P: {+ L4 W" @) ]; u在以上那段代码的后面加上以下代码:
" G2 k# h% K( f& e+ \6 e% m, v4 C
6 Y, @) O, S) h7 g) O8 o' j
6 a0 Q5 S" h# ]
程序代码: - {0 r* O) f2 P% z* F" ^* L
4 c" e- b* ^. n
#include<strstream>
# C2 W5 F" r1 Q- e4 S#include<iostream>1 A- \" F4 b9 s
#include<string>" V* U' N" t6 a& y# U5 e; _  ?
using namespace std;$ R6 P7 K7 |9 g$ q3 _& t- s
int main(void)
: M8 o2 ]9 }& D) q  }{
* W  T$ X8 ^$ V. F    string s1;+ a4 |0 |% D& ]- _
    while(cin>>s1)
4 Q5 O* Z3 m- f7 p5 m5 v) D7 }    {
' }) v0 V$ [% E6 Q# @, `        istrstream isin(s1.data());
: O- w! A# J( ~2 Z; B9 S6 i        double d;# [$ F7 w& p' z  U
        if(fy_Exp::GetExpValue(isin, d))- a7 Z0 k0 Q; W( C
        {' Z" q* Q7 ]9 J
            cout<<d<<endl;
! C6 k! c. I) f        }% N- l5 r5 w& b& R( \+ s
        else* F/ m5 h- t8 ^, |1 F8 U! v! d; z
        {+ y$ v6 U) C4 j9 {: x+ X3 {
            cout<<"ERROR"<<endl;
. l, M9 S' F# d( G+ ~, O8 q: E! V        }2 X  X9 Y9 |* V
    }. h) Z$ `9 y+ x
    return 0;
0 v2 ~8 Z. t7 o. y}
7 E5 O$ \: H' c$ M8 d0 c7 Y
2 g1 a% H6 H2 ]7 _+ K3 c
+ I8 i/ k5 R& g; J5 V' A. H然后编译执行就可以了(*^_^*)
1 T$ F+ _' t: K3 }8 {4 b- M其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 _" S1 V7 N" A4 l5 e" [
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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