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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,( U% k) A- S' t: T {: Y# j
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 R* j! ]: n" k
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* @8 R* \; }+ w: l" n$ H/ B参数解释:
/ D* f; O1 j# j1 Jistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 ?/ g1 F1 J6 I& G9 b$ w! lnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; y/ f; |7 a/ f) ` R
返回值:& V# p& l5 I# ^7 j& I" N
返回非0表示计算成功,0表示计算失败有错误2 q! ^$ t/ l8 \- q
5 M0 W8 x" i: a) ~; X0 s+ \3 \
6 b. `" {; G3 Q! S5 q7 R. o, x6 @. U# S A- o* {1 V- S
程序代码:
( w# M' p1 i# s. @, x- ~. V0 K8 Z& @
namespace fy_Exp{
2 w- o# I; S9 M& Q4 \' lnamespace {template <class _T>
* Q1 @& k+ O! `0 m& vinline _T GetExpValue(_T t[], char& csym){9 _2 I% [' p5 Q' n+ y+ S
char c=csym; csym=0;2 ?0 L! k- R8 p; B' m! U2 w
switch(c){ M. l* h. a' W+ a( `7 I9 j5 G
case '+':return t[0] += t[1];, P- J" n4 x: d2 W
case '-':return t[0] -= t[1];
7 V: H" w( _2 p( M# ]! B case '*':return t[0] *= t[1];4 t6 Z' {$ L8 M
default: return t[0] /= t[1];//case '/':
, k x M5 R; T }
& E5 m4 n5 R' H @. g+ q}}% n/ [* i+ p. e/ q9 ~2 L
template <class _T, class _Tstream>
) E5 |" l) y; [- c' z/* _Tstream: inputstream, _T: get return value
1 H4 [" f) {" c4 A; C, k. v* Return nonzero if get value successfully */: P& s2 h! ]$ Q n
int GetExpValue(_Tstream& istrin, _T& nReturn){- \" f; }# j# g, A- f) G2 h; g: z0 C
_T t[3] = {0}; //雨中飞燕之作
0 p8 ^! J4 o) M% [% \" e# R# n char csym[3] = "++";; j* f B# Y7 O z3 L% ]
int nLevel = 1, nERR = 0;: c& B: X" V' J) d( U9 F
if(!(istrin>>t[1]))istrin.clear();
& x* X8 h! U$ A/ e5 K# R: v6 @ for(;;){: t- ?$ S2 E& r, y+ t- S
if(istrin>>csym[2]){
! v% D% Z2 B% U switch(csym[2]){
/ _. \4 J3 L4 \* f3 a0 w case '(':
( C0 K+ D; \9 y9 V9 p. x' h/ v if(!csym[1]){nLevel=0x100; nERR=1;}else7 K. T( m' m8 r* q
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, _+ G, }# f* j7 L; a else{nLevel=0x100; nERR=1;}
+ p" s; l3 f) e: c* d9 \0 K break;* |. l$ Q2 _" `' o" t- l
case ')':, Y' p. C4 p. [% l4 Y+ p# r9 G
{nLevel = 0x100;}break;, M3 K% n: V& d+ l" _+ F
case '+':case '-':case '*':case '/':& h9 D( Z5 x# i' A$ a
{csym[nLevel++] = csym[2];}break;
$ x1 ^3 q4 f! ~7 p3 j! [+ y case ' ':case '\r':case '\n':case '\t':continue;
. e1 b( A6 B5 k3 u! `; b default:
9 c/ Q2 u8 l+ B7 E8 X5 K- Z3 N0 Y {nLevel=0x100; nERR=1;}
) S- R; X' G! h2 \7 I }
& q/ i2 D6 O7 h; O7 Y- S- V& _ if(nLevel==0x100)break;
# Y* `0 \6 n# b! M5 r7 l9 y if(nLevel&0x10 || istrin>>t[2]){+ `! @# F0 l9 g y& v) ^
nLevel &= 0xF;
1 g7 X7 A9 L) P0 x7 ^/ z) x if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 n+ [6 m- L9 }& d: o ^: p if(csym[1]=='*'||csym[1]=='/'){
, A' q* P8 A4 Y# I3 ` GetExpValue(t+1, csym[1]);, x/ [4 H/ q0 n. x& J) y' f
}
" m+ i" i7 `: }+ o, z9 e& c else{
' s* |$ W) e: \) o" F, |$ Q GetExpValue(t, csym[0]);
6 ~9 L& d7 s m6 a# N. p7 b! r, W: s t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* ?3 D8 G; _4 \" p* J }
; o6 F* D% @) Q- Y: u7 C1 s+ e nLevel = 1;/ h9 p6 H# Y& Y5 X# b- ^
}+ o" ]" x+ L( n# k6 e2 K j2 @
else istrin.clear();% P" n: h1 I( {, Y' A, _, x. P& q; e
}. O1 ^3 \8 w. k
else{nERR = -1; break;}
; F5 K* G. ]& c( A. L- T0 E! p6 Q }
+ Y( u5 E0 b/ e6 f& m* n- m if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
! q# J. `- d, C/ B9 ` else nReturn=GetExpValue(t, csym[0]);7 y4 Q; {( w* R! t( C
return nERR==-1?1:0;
% {8 e0 R' b+ q: p& q, S}}: A; s3 Z& C; i
& P3 ^6 M! C. V
+ _ u( O9 ?7 W. s1 ]5 Z( E; h) }4 @3 \. f/ Y, J
函数模板使用示例: K+ O& L! ]' ~: O
在以上那段代码的后面加上以下代码:; \8 w1 a. o3 X3 }' f9 m" I
, z5 U# ?% g& S
& e: O1 b) f4 E8 ]: Z$ |! t
( |* D: {: p1 l# ?9 Q程序代码: . y. I8 i, a6 D* i
- m' O% e$ _: v; B: ~* D9 D z( a#include<strstream>9 G9 L! Q6 E) L7 K( Z
#include<iostream>% T2 i3 S2 L( `/ s$ M0 ?( K
#include<string>3 q e/ X4 q9 i
using namespace std;
: H5 x' m; C8 ]int main(void)
. m. k6 q9 q8 J$ N8 u+ i! n+ O{ j( b' p: T+ \! t9 F) m5 S- m
string s1;
1 s" }0 c, A r# I% b while(cin>>s1)1 x# ?( E' P0 Q9 y8 P
{
F& u! m+ V- C' G istrstream isin(s1.data());' A! E# ?) R7 O8 A
double d;
5 w2 Y j0 P: ^- c9 b* o if(fy_Exp::GetExpValue(isin, d))3 h/ v8 h$ x+ }, g! ^: I# A
{2 |8 x( M8 z. H1 Y$ ?& p7 g) l
cout<<d<<endl;
. j) @# u, v5 Z' [+ U }% u P: V4 G( e. \# r9 r: {, j7 H
else
# j8 v3 h" u& f* l. m7 M0 z {
5 _+ H3 c, T8 t% e6 | cout<<"ERROR"<<endl;
: O c, o, f& Y5 [6 G& a/ `# n }
" W6 k2 C& b/ ~1 s: B }
1 U* d( P, c! D1 K9 A% P return 0;" I8 I# }# k& b& R/ R- H
}
: u6 r; E9 O4 ?
3 _' o: W$ V* G B
9 Y$ ]5 _' @. ~+ C然后编译执行就可以了(*^_^*)
& d( U, |6 I3 t% \/ b, Q4 o, k P其它:TC++上一定编译错误,不保证在VC6上也能通过编译 c7 q1 ]1 B' k" O" B5 W3 C
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|