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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
$ X1 i+ B6 u3 C& T2 E一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 F$ p6 ?' c1 Z0 E只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( R6 f1 M$ q. y% ~2 m
参数解释: n, N. r9 A9 D- J3 ]& I* T
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 ?) A1 h$ {9 K7 U- |) S, W
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( ^; l4 v1 L) ]2 k6 f& E% s8 J
返回值:
" r2 Y5 I9 Q6 X9 @; f; G1 B/ q$ C返回非0表示计算成功,0表示计算失败有错误3 J' O$ K3 v* h4 m5 b8 d
) Y( w' d/ `& Q3 F# \
- o; l( }1 T: E; e5 {5 \& W$ Q% }4 q; {" M8 E
程序代码: 6 v. Z* c0 L- O. r. p
% J0 l7 G# M3 I% m5 P% W0 a) xnamespace fy_Exp{5 l& f! A2 `# n. K# U. G, |
namespace {template <class _T># P9 f" L T. m+ P, u% c
inline _T GetExpValue(_T t[], char& csym){
( \4 B2 u5 Q. A3 H/ ]2 b% v/ O7 C char c=csym; csym=0;- u3 Q T, g" N( e, y
switch(c){
$ h- f8 P! Q& j) D case '+':return t[0] += t[1];
8 u" a4 O" e0 b4 r. W2 {9 p2 v case '-':return t[0] -= t[1];3 h2 Y0 ^0 B( x* S5 q: }/ l
case '*':return t[0] *= t[1];3 _, E) L3 Y1 b( [3 ?: R! x- \' w
default: return t[0] /= t[1];//case '/':, q- `* R3 {9 e( q) B" ?9 r# G
}* r; c) Q/ h0 m9 q3 \. h
}}
% f9 D! N% ^+ o( Q+ j9 [! Atemplate <class _T, class _Tstream>! `4 y0 T4 g" V" s- f7 j
/* _Tstream: inputstream, _T: get return value3 Z/ d6 ]7 O' z4 G/ r6 P0 F9 F
* Return nonzero if get value successfully */- ~7 {' m) C) d P
int GetExpValue(_Tstream& istrin, _T& nReturn){) Z1 @5 K! T- G$ w' T6 {2 v/ ?
_T t[3] = {0}; //雨中飞燕之作& \5 {/ h5 Q8 I0 W1 l( a# g" P
char csym[3] = "++";# k0 T0 d4 J4 P* H! h C4 ?' ^
int nLevel = 1, nERR = 0;8 P; t! Z! K# q5 B& @
if(!(istrin>>t[1]))istrin.clear();
# @0 _5 a& }# I* ~% \9 `2 _ for(;;){
: A }& t' ^; H( R if(istrin>>csym[2]){
, w8 H- z% X( Z1 Y6 e, ~ switch(csym[2]){
; I2 I6 q) n# R! N9 \+ o8 } case '(':0 W) Q. O% O. g# i
if(!csym[1]){nLevel=0x100; nERR=1;}else- d4 |' U% P0 a$ J1 u
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;$ J4 l3 n3 U4 x. t9 d+ F
else{nLevel=0x100; nERR=1;}
* ?! `( E. O) [6 S3 K break;/ Q8 M/ H" N5 g; N* u7 n0 x
case ')':% o9 r8 {. f& `0 d* b
{nLevel = 0x100;}break;! x6 I+ [6 x: P! s* x: y: `
case '+':case '-':case '*':case '/':+ f; }7 X+ a4 U6 l
{csym[nLevel++] = csym[2];}break;
4 `8 ^% u8 F1 Q, j case ' ':case '\r':case '\n':case '\t':continue;/ x j& p; c2 j) m& y
default:" s" C9 X' ]. m! e$ o
{nLevel=0x100; nERR=1;}
I6 l# G7 x7 _* T }& D# T( w7 |, W. x3 x6 q
if(nLevel==0x100)break;* e* G( p$ S9 n5 `+ n* \: D
if(nLevel&0x10 || istrin>>t[2]){- \/ f0 i6 }6 Q; k0 [' o
nLevel &= 0xF;# ~/ D$ @+ J! o3 K# f& t
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- z d5 H' I' E) m3 M7 h( q" ` if(csym[1]=='*'||csym[1]=='/'){! F4 ~, v9 j& b& m% A# `
GetExpValue(t+1, csym[1]);% R1 i- H% j5 _4 R _4 ?8 Z/ y" P
}5 r" a$ I2 ]- t7 p% @6 Z5 K
else{
' b+ ]; z: E& [ B7 }- W. t GetExpValue(t, csym[0]);& P& q6 Z9 ]9 o$ U* C
t[1]=t[2];csym[0]=csym[1];csym[1]=0;" B- R- I8 J3 D1 c0 T# O4 D& E
}
9 r3 j0 e1 u U1 e8 s nLevel = 1;
& i- [# [- d. q }
7 m$ N+ ~- c+ t; ?8 C `- l. R else istrin.clear();! `3 ~! w! d4 A4 q9 A+ `& `
}: l; M7 X: \+ c9 s0 Q) P5 q* k3 h! H
else{nERR = -1; break;}
7 t. v v6 y/ }7 V3 D7 V }6 h% N3 I0 W' }( Q; E
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 c+ l" q9 B t# W
else nReturn=GetExpValue(t, csym[0]);7 T. Z0 ~" a' M7 q' [! i' k" W
return nERR==-1?1:0; |0 I H+ p$ ]! x/ {8 P
}}2 H m0 [7 F7 K o. T
7 Q) y6 V- l$ P6 V- z4 l& u
6 L' N6 |0 S3 @4 K2 Z9 u, z8 _2 f; }( |
函数模板使用示例:& h5 S5 Q5 h& S
在以上那段代码的后面加上以下代码:1 J' w% w) J. q6 _ o
2 M6 ?6 ]# d3 c( v* a* F; D
# r8 i& d0 Q% ~6 b
% A; [' c2 J) s! p( h程序代码: : a- @0 l _/ h& Z/ S: D* Y, }
, v5 ?4 e) W) ]) m#include<strstream>
3 ^: o; `$ X9 Q1 W8 Z3 C# y( v#include<iostream>, \2 X: O' R# ]
#include<string>
. ?0 f8 p4 W' B& ]using namespace std;8 r, k6 p7 p* Q' B% G% d- ^
int main(void)+ b/ x. J8 N$ d+ M% p% z/ q
{& {' X- m# Z/ b I9 Y+ Q/ |
string s1;6 R* T& b& B5 ^4 q' r+ Q
while(cin>>s1); j/ N* E7 ]& J9 a
{
( u) l- l0 N! G0 S C, {) F" L istrstream isin(s1.data());$ z1 R. `1 ?& b/ r; N
double d;
' k8 k. n5 G* _6 N if(fy_Exp::GetExpValue(isin, d)); G+ F5 A* S( {6 B# M* e/ d
{
" I9 {! l, K/ R" G# c1 H cout<<d<<endl;/ q0 z" G8 O- f5 W- S
}
q& [4 a: |" F' I# A else
8 y; y5 Y# c! p1 q {
0 D% w$ C6 K0 f. i; ^( O9 l cout<<"ERROR"<<endl;7 x6 l, Q# e: R- v' ^
}6 x" g3 @" F9 @ ?1 m
}: X2 k% m* `8 U4 I! ^4 [
return 0;1 @* U* i r; A* \! E0 u6 L" n4 G
}5 E+ S1 ?+ _+ P9 n+ S
) y& U) g4 @; @6 i& c( s
( g F. w1 ^" o. ]然后编译执行就可以了(*^_^*)! r3 G" c, i$ C2 t+ U
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
X7 S, ^2 Y: X. |6 u 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|