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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
$ n8 E9 \$ T5 L( H" m一个很方便的函数模板,可以并且只可以计算含括号的四则表达式: Z* G6 a4 R# d- X: c$ W
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- @ K3 v" Z) C; I. k
参数解释:
# A& q; r% v* ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流1 C6 h W2 v. S& O3 l( j, n
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) J: }" {/ R0 c: R! M' v
返回值:7 p E. J9 o- _
返回非0表示计算成功,0表示计算失败有错误. N; F' o5 G' V- s9 Y1 v) R4 _0 e
5 O% `/ N( E5 {- T2 I. x% M0 j
, K4 H5 e* S, E, t z4 c* Y, d1 a1 C
8 G, f+ p: u8 F! c" w3 V% v y L0 F9 C程序代码: ' `4 H m4 e) K T4 u+ Y
# O0 x0 r0 E) Q8 V$ T# h; z
namespace fy_Exp{' l, @! A* ?7 j' k5 E' N
namespace {template <class _T>' R0 S* L' `4 z6 t$ H4 ^9 p- j
inline _T GetExpValue(_T t[], char& csym){8 Y7 O+ z4 b3 S# `; B C. Z2 U2 P
char c=csym; csym=0;5 q6 B( K. g2 W# t/ g, \
switch(c){1 C2 E: y! Y+ L# }
case '+':return t[0] += t[1];
& h' ?! O1 p/ u7 q5 j case '-':return t[0] -= t[1];
% U2 e2 Y+ f9 |9 v* g case '*':return t[0] *= t[1];
/ q# H, n5 V) h default: return t[0] /= t[1];//case '/':- K5 ]" Q3 b+ ]$ n
} l6 A- j: S) g/ P$ Z2 A" s
}}
$ A: t/ U# U! X$ \ Dtemplate <class _T, class _Tstream>& f6 m6 H. K, d& ]" W: Y
/* _Tstream: inputstream, _T: get return value
( i" |& S2 a1 i$ q: d% }" _* Return nonzero if get value successfully */
+ g) Z9 W- e; ?int GetExpValue(_Tstream& istrin, _T& nReturn){
: o2 Z8 A( h/ [8 ?6 [ d _T t[3] = {0}; //雨中飞燕之作
) b# x3 t: j _% K0 t char csym[3] = "++";" N6 S9 f9 W, ?
int nLevel = 1, nERR = 0;
0 r3 C1 V+ x8 [! d if(!(istrin>>t[1]))istrin.clear();
. v4 j0 D) c% ?- Y3 U1 p for(;;){( [9 G8 f% Y0 V5 a- a0 T
if(istrin>>csym[2]){. K/ x; I' T. ^6 _ r/ E
switch(csym[2]){
: d3 o5 E! |( f. I case '(':6 R" Z1 d* R/ j6 ?/ n5 B
if(!csym[1]){nLevel=0x100; nERR=1;}else
, {. n2 P- M1 E4 N+ y if(!GetExpValue(istrin, t[2]))nLevel|=0x10;) s. g( D5 B" D
else{nLevel=0x100; nERR=1;}
! ~" o+ Z/ g% s( F' W+ n1 R# ]' ] break;
2 T0 e6 [# `8 i. }- g( B case ')':0 c( }( C! {+ Z2 f! @5 ^: ]
{nLevel = 0x100;}break;
) H1 @/ |- A1 p case '+':case '-':case '*':case '/':
8 ]$ N- X3 u/ T5 l4 D {csym[nLevel++] = csym[2];}break;3 T5 R- @# [$ F# Z
case ' ':case '\r':case '\n':case '\t':continue;$ m& B1 ?3 \) i7 |0 w+ L
default:, m4 j7 b& z, }0 \8 ~& }- J
{nLevel=0x100; nERR=1;}0 k4 r0 a0 {1 q& [! H! ~
}1 i4 R( B. O6 K" ~! O
if(nLevel==0x100)break;. w9 e$ k& A$ B# j
if(nLevel&0x10 || istrin>>t[2]){7 l! o" h/ |; A4 |# {# |
nLevel &= 0xF;
6 w' I. r- Z: ?" R' j if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: a- E- j# }4 y
if(csym[1]=='*'||csym[1]=='/'){) N1 a9 k# `5 W5 c
GetExpValue(t+1, csym[1]);! ^3 E: ^; H( {3 V2 Q. e7 W
}
4 Y. r+ `" I9 e else{
$ E. Q6 H/ F T s GetExpValue(t, csym[0]);
5 D% f/ b6 D1 A1 U, q* R& @# j3 x* Z t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 g' `' B9 f$ E) c; ^, Q
} H. g# [! O9 \3 l. R9 y
nLevel = 1;
" p) w, ^1 T1 q Z2 R* l R ], M1 x }
" w# ]5 ?& W9 Q2 v else istrin.clear();, V- @7 G4 F3 @$ o9 k q4 O0 p
}! F, ?9 Z4 n: |& w! _" t% [
else{nERR = -1; break;}6 E0 }8 b& N1 L1 t+ O# k" V
}
5 C8 x j: ^5 k# r0 h- E0 B% p if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
) l* n) I/ V" i, o% y/ P else nReturn=GetExpValue(t, csym[0]);
, N; n0 L5 ^4 m, o return nERR==-1?1:0;
9 u8 J) B: M `% U4 O! n, v}}
2 T) T# T2 f! Y5 {: H
" J* B; ^5 C' F4 N) F4 n" b( n+ Q5 S: z. f
- d+ r. m- H4 t3 [& R函数模板使用示例:
4 \$ Q% ]5 O# c; w( ~& t6 N' S0 U' q3 x8 z在以上那段代码的后面加上以下代码:, s6 y. h6 l8 y/ {' Y1 q$ D
' q0 x5 e# v* T; C7 K
5 W5 r8 o% H" e
# Y9 C# M1 a& p6 Y% O4 G# e/ Q程序代码: + b8 A/ Q$ [4 ?# h
5 a9 _8 W+ }) \( L: H' o9 j T
#include<strstream>% t0 I% I8 v- |' B: _ s7 M
#include<iostream>; c) B: |& Y3 O; `
#include<string>- f3 ~9 ?! c9 J1 A
using namespace std;: R9 M4 U, W1 a
int main(void)
0 z) u% C, f) p) @' n{. @- _. f5 ]0 ]0 z, X( ?! e
string s1;2 C4 ^* |/ t8 p1 f
while(cin>>s1)) @! [. J2 s! [4 Z
{5 S9 d& y4 T9 b" s. F- b
istrstream isin(s1.data());
+ g& ~4 \; C$ `& y3 e+ [: s double d;
5 A4 H5 Z( F' {1 |8 E8 s0 f& O if(fy_Exp::GetExpValue(isin, d))
8 u8 W$ s, k7 Q( p1 P' Y7 i {
4 {8 R: g; v' h/ g, |* s2 d cout<<d<<endl;& N* d7 y; V4 `
}' |, l; {0 V( P: M* n8 o
else
+ J2 Y7 T! z3 P* A# d& v1 ?) l, z {
) A7 [- B# w$ j: g' p( g3 M cout<<"ERROR"<<endl;/ E* [- a# A: A
}
/ _; n/ T6 C3 g7 P$ Q+ x9 a }
. E+ S& A c" d- P8 j return 0;5 Q1 ]$ w/ L' l9 H9 v* D1 |* l
}1 v, m: w0 a$ N! K( p. O2 l
+ n( v/ W/ m" X$ W1 @% r1 Z, e- ^6 }8 e
$ d" c. ]9 f+ v! J
然后编译执行就可以了(*^_^*)- x2 X$ J5 C( m7 R' _
其它:TC++上一定编译错误,不保证在VC6上也能通过编译* d; D6 v6 f! ?
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|