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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,! J/ \" q3 p( A
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ Q' a4 Z" B. O$ u% i2 e+ w3 u8 S只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% y# M, a: `! w4 k+ E参数解释:+ |) t& I4 S; r! `5 U; a% c, r( H
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( l" B, c/ T! A
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定4 A. Z" R: n1 M9 A9 |
返回值:! V# Q1 U) i5 ^
返回非0表示计算成功,0表示计算失败有错误
8 ~. h/ U) n6 V$ \ M# n3 N
& f; |' h: }3 M6 u) w1 [; t+ u
5 U3 F, ?0 T0 y$ [7 }3 n$ L
7 Y8 b: M. y/ y$ [: w$ }程序代码: ! A- Z- r+ U0 W" E" i7 z
4 J6 o% V1 Q1 R/ Fnamespace fy_Exp{
8 Q4 g6 ?5 f* V) u( o, bnamespace {template <class _T>
- R% m. w c% iinline _T GetExpValue(_T t[], char& csym){9 Z' ?9 P1 \# @0 |
char c=csym; csym=0;9 {6 i. I. g- R/ S( `
switch(c){
' `8 O& w/ O. [) g8 X/ f case '+':return t[0] += t[1];
3 X! ]- v( g" { case '-':return t[0] -= t[1];
, r& W6 F5 s. a) y% z2 _7 n9 a case '*':return t[0] *= t[1];
1 l1 J- `3 M& y1 r4 i$ k default: return t[0] /= t[1];//case '/':! T: q% y G' L
}, E7 L/ E( W* K9 V, k
}}
% s7 x6 F! [1 Ttemplate <class _T, class _Tstream>/ Q/ R+ I8 n/ F6 n5 L! U' L! U
/* _Tstream: inputstream, _T: get return value `5 g/ s/ j6 H/ B" i
* Return nonzero if get value successfully */
5 r3 h3 Y8 J* v& t: Z$ A( g4 cint GetExpValue(_Tstream& istrin, _T& nReturn){" j: L8 N, ]% V0 L$ Z1 c+ D% I
_T t[3] = {0}; //雨中飞燕之作
8 ]* n% ]( ^1 U char csym[3] = "++";0 o8 x9 b7 z: {, x: \) W4 h' i
int nLevel = 1, nERR = 0;
+ B- y6 H7 T& D6 @* p# o if(!(istrin>>t[1]))istrin.clear(); T+ f$ |1 D1 i$ i" I4 Y' W, U$ o
for(;;){
0 _" @5 v: o- W2 @* P" o0 Z if(istrin>>csym[2]){
) f- w" N) C" z1 t3 J switch(csym[2]){
o3 J1 u5 S4 g4 s$ Z case '(':7 r( k" ~+ }7 V }; T
if(!csym[1]){nLevel=0x100; nERR=1;}else
9 I: k" g; _) J if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 @: N* G3 O! }9 H& A else{nLevel=0x100; nERR=1;}; j0 ]6 R! y$ o
break;; k; X% b5 X( V8 ?& ]
case ')':
2 s+ ?% |! V6 g: { k& l5 e2 @ {nLevel = 0x100;}break;
5 a" f) v' u2 |! o case '+':case '-':case '*':case '/':' _. |; J0 C7 x7 I5 F2 l
{csym[nLevel++] = csym[2];}break;) D, Z5 x( [8 w3 a7 B
case ' ':case '\r':case '\n':case '\t':continue;
! n# E: t7 L" E/ x default:" _6 ]- A5 h1 \" a8 w/ {( l7 t: }
{nLevel=0x100; nERR=1;}
2 ]- G8 B R6 _2 @( m9 T( a5 V }5 w5 s2 |% Y2 m& c' w" k! b
if(nLevel==0x100)break;6 v) {- G D$ x3 ~* {0 R( W* _/ [
if(nLevel&0x10 || istrin>>t[2]){$ m* J/ r, O, D0 k4 @( M
nLevel &= 0xF;& b6 L; C) {. f; S1 N0 Y7 P6 F
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 B/ y0 @: N% w if(csym[1]=='*'||csym[1]=='/'){; L" N3 R1 q. t! y: X+ L
GetExpValue(t+1, csym[1]);
8 v+ {* m& [: X2 ^& O" {/ R }
5 n( E! g1 L' j1 e* f else{
/ m$ [2 k! T4 H/ F GetExpValue(t, csym[0]);, Z. ~' V7 Q6 u- f6 z4 P, G4 e
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' ^. Y4 w# D) p5 f }/ |! r- ~: ?' n
nLevel = 1;# n. o; z4 Z( A
}6 e: Y( c9 T! z# k1 J8 {
else istrin.clear();
3 v, {1 C# Z0 G$ n) L }
- D! Z3 F5 R' h. }9 x5 k( N% k; Q else{nERR = -1; break;}/ v' G; [3 U9 X1 F
}$ e' I A: p+ T4 r% V2 @ Z, M
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; c( ~+ v+ S& _ else nReturn=GetExpValue(t, csym[0]);
* a" n+ I7 a6 H" @4 { return nERR==-1?1:0;7 q" q. `* |5 ]
}}
# a# {) n; K' c8 w5 r
% [6 u2 ?3 s% j
' R# N+ s/ c/ k# d4 J3 a9 D3 O) y% Y( F1 b/ @4 w4 |
函数模板使用示例:& e/ _; s5 ^# Z v' x/ K( V. m
在以上那段代码的后面加上以下代码:# R+ P) ]- t" }% \, v" z2 V! b: ~! M
& z* R- P8 e# T+ n9 F, c6 m) H
- e! W* }$ W& y+ x/ v5 E7 j. \6 S2 @) }: n/ g
程序代码: ; k' a F: C8 U9 X# j/ b* _
9 X- `& I$ _6 g; y' V. I# U2 F#include<strstream>6 j' D8 z. V7 D
#include<iostream>1 F5 P& W9 \' Y) N G. Q7 t
#include<string>
, i2 J7 Q/ ]9 c3 U7 lusing namespace std;, n4 r3 f$ m- q h( K
int main(void)
% b5 D" H0 h6 z9 p; R J1 j! E{2 w6 {( F% k$ a/ Y, |
string s1;; Y! G* j" [7 W4 N
while(cin>>s1)+ f' C& X9 T0 P! m: d/ i
{9 k2 g+ t# X( x, f) m
istrstream isin(s1.data());
3 n; v9 w! i2 U) v double d;
3 I+ q% q1 i: J! } if(fy_Exp::GetExpValue(isin, d))' u7 k" C! w0 Z
{/ E7 i+ [! b) R% K, ^* i" e
cout<<d<<endl;4 I4 Y) r) f0 f. F- O
}9 U+ ?$ a; ]5 ^4 Z, i d7 x7 |$ a
else# b( w7 B8 y9 }( t# g. [ {
{5 J! y5 i5 }) M% M' h4 r
cout<<"ERROR"<<endl;
( i, d! i. [# z8 X }
/ @9 j) e" ` ]2 s; t }! n" {) F5 E& ^" Z% J- [- |7 u
return 0;7 q: u- q4 }7 w$ w$ n% S
}. V4 t1 s+ d2 f+ [; I
" I/ ]5 A+ E) I8 [! Q4 N6 ^" H2 [* r3 L/ L7 @' i5 E
然后编译执行就可以了(*^_^*)& o! Z% T: E" h. B" ]
其它:TC++上一定编译错误,不保证在VC6上也能通过编译1 w5 [) S, M- `" J; o
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|