|
  
- UID
- 133
- 帖子
- 51
- 精华
- 1
- 积分
- 186
- 金币
- 55
- 威望
- 2
- 贡献
- 0

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,( c* y+ z) P y/ d2 c- s
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
( D4 l0 T( ?$ [只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 X- @8 h* q, G& h% W参数解释:# |# R& j/ r$ N8 }7 f
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! _- ~) V* O4 t) `3 WnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定, ` C/ m/ q' `# e
返回值:3 t. r5 O. e+ Z. t
返回非0表示计算成功,0表示计算失败有错误* [- u7 D: B6 c2 y$ w ^8 j6 q
, G$ E, d: g. ^# j- K* Q5 A, v
A" I2 r* [# c) t: J/ f, J- P1 p( l) l c
程序代码:
! O( V/ \* y+ U
# g, i6 S( F: L/ C. v( ]namespace fy_Exp{" @5 f& a! Z* a& p
namespace {template <class _T>) a! G( N: Q& K8 H* U B/ o
inline _T GetExpValue(_T t[], char& csym){, m0 M$ N3 C4 r E9 U
char c=csym; csym=0;
4 {# A" a. A( i switch(c){/ m: x9 {4 N8 U5 L0 \! `* |( \" m2 X4 P O
case '+':return t[0] += t[1];& d1 o& {! M% [! a
case '-':return t[0] -= t[1];
2 b7 c- r, z: f4 D. q! Y% U case '*':return t[0] *= t[1];6 G H1 @$ h2 _3 i/ c @
default: return t[0] /= t[1];//case '/':; v$ O6 l# f, K b6 C8 w
}
. p3 q$ i1 ^0 J) v/ k7 P8 O}}
8 r) J8 G w& Z# ]template <class _T, class _Tstream>
4 t8 O, A8 F5 A9 x/* _Tstream: inputstream, _T: get return value( t# \7 x% k+ A4 l
* Return nonzero if get value successfully */
, I& J! G( [; t, @5 [3 I6 Cint GetExpValue(_Tstream& istrin, _T& nReturn){$ w* p& k' v" S. P+ ^
_T t[3] = {0}; //雨中飞燕之作
1 r0 o) j8 a! I. o5 @7 u5 G char csym[3] = "++";) f K. m) f6 X& v* F) ]# o4 _
int nLevel = 1, nERR = 0;
2 Q K3 I! [8 Z& m2 }& v4 [0 R if(!(istrin>>t[1]))istrin.clear();
( ]* L) h, n/ h for(;;){& L7 R4 N0 X" F" \
if(istrin>>csym[2]){! i* ^/ {( s6 c9 T
switch(csym[2]){
. m- a: M7 `8 A3 w7 O case '(':' v& j: A& y1 C2 w4 H) q* d; @
if(!csym[1]){nLevel=0x100; nERR=1;}else, S' e5 A% @$ l, u1 d' U
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( n# I) Y5 l: e- a0 A8 `
else{nLevel=0x100; nERR=1;}2 m% V9 X9 |2 I% \
break;
6 K+ x& G$ \% s) \! ]# B: v case ')':
( A- t8 q1 B; T0 _( Y {nLevel = 0x100;}break;
- G5 k* }" C+ ?5 _! f4 d% o) s: u case '+':case '-':case '*':case '/':
* K. a7 b! C1 T {csym[nLevel++] = csym[2];}break;
% }0 K% M- M7 W6 V5 r% Q. e case ' ':case '\r':case '\n':case '\t':continue;, d$ q: }! d/ E. H
default:
0 `" K! e* M, B# u4 x( [ {nLevel=0x100; nERR=1;}
/ J% B! o: \- Q0 E8 ~ } z) N& A3 p+ u6 j/ u
if(nLevel==0x100)break;
/ m. W! v3 y3 `3 [1 T0 Q! e if(nLevel&0x10 || istrin>>t[2]){
; M; p& Q0 D" S' \/ Y nLevel &= 0xF;% y* I# e+ e0 P3 k+ j) b& B
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. Q) Z9 e/ f: m) {' Y5 L, Z
if(csym[1]=='*'||csym[1]=='/'){
4 `* ^( J' L1 ^, X) _7 A/ l GetExpValue(t+1, csym[1]);
9 i9 g0 @" h" c$ D% S }
, j* p8 k) W* o2 M% R else{3 ~2 f, g/ f- _! s4 K
GetExpValue(t, csym[0]);7 ~# ]! G- c* p1 K0 A
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
2 A( u# b0 w/ k$ N }
0 I0 n, Q7 I! c3 c nLevel = 1;
' N7 r; j: S* `. K$ g6 j3 v }8 D' P! a# S0 F
else istrin.clear();* \ K" e9 Z, f* z
}
3 O( f$ w' W- l7 \ else{nERR = -1; break;} F: U3 `, p* [% H+ W0 |' Z
} D* W' Q0 D9 y5 ^
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( l1 X# K- @' E! D7 c0 `5 D
else nReturn=GetExpValue(t, csym[0]);
/ M1 k. L5 W; a& j( K return nERR==-1?1:0;
" {' p- C6 J3 e% ~: R}}% b* D. Q* p+ {" H% ]9 g5 K+ z h
* @6 I0 Z8 s9 M7 F7 `
! m, w4 ] m' G1 i2 n9 F
A8 z0 N2 u& {" y4 `7 [( U
函数模板使用示例:# j+ M- T! I+ C. @, i+ e
在以上那段代码的后面加上以下代码:
) ]/ |" Z4 C# E: |) G$ f K* ]0 F( M+ Q! O2 P
5 m1 F d& K4 A) d t* ]8 B7 S- w& X, H- y' P$ e1 k- k! F
程序代码:
7 ?; t$ `1 R6 p( [! z: G1 y
8 ]" I' h' M& R; I$ F/ o#include<strstream>. C3 i2 e0 v( X) n
#include<iostream>
( C" Q% q! L! ^+ }$ g& P2 A9 H#include<string>
' f* F8 t- b4 B6 ousing namespace std;
4 Q( f% x( p8 e% t$ D( o r: e! K; mint main(void)
! I L0 N$ D: f& z A3 V. g{. {+ l* W n7 ~3 W
string s1;$ P" ^$ E# C! n) w
while(cin>>s1)( n+ I5 W+ _' Z' ~+ i
{; O' @4 [5 ]! h7 g( ]' O! T& b$ B
istrstream isin(s1.data());
) \6 \8 j( E3 N, A double d;/ x, k4 |/ r8 w3 X0 [3 S) J" z
if(fy_Exp::GetExpValue(isin, d))' W5 g l; m) r. i' g
{* ?5 @! `4 B, m0 X" y
cout<<d<<endl; x, B4 r+ `$ Q7 M
}! B0 i7 K+ a1 s( j0 m( O* ~' o! x/ J9 f6 H2 Y
else
9 a7 n$ ^/ R5 C9 Z7 {4 f. q {6 w4 {3 N$ K, n. Y
cout<<"ERROR"<<endl;
* f6 X( n8 k+ i; o# b7 W0 e7 N }. t7 G6 \. M- V% \7 |" ?- j; e# M
}
. a/ I; r: h" a6 s return 0;
8 X( k& b2 r8 c9 d* ], A}
, F, L# e# h, O. B2 o1 x8 }
, ?/ ~+ K- D1 f/ ^! K& \9 j5 _0 b4 e' K$ Q1 `" S8 y
然后编译执行就可以了(*^_^*)( e8 x/ Q0 f, L# `
其它:TC++上一定编译错误,不保证在VC6上也能通过编译, `1 x* I1 n) h9 K
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|