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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,) `# M! o. L9 z! ] H3 W
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 l; ?5 z, s* S" Z1 W- T
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 l' Z0 Q- `# P" n6 {7 K
参数解释:0 W# x' P' {- j% D/ S" r
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" V+ t! r# i1 ^& @nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
% f; _; l5 ~/ A& S: W返回值:
* ^1 ~& C q. @6 c k$ d返回非0表示计算成功,0表示计算失败有错误. g! `! P1 ?, Q3 d, U9 K5 F/ K
. K I( C, ]2 X' |6 u, g) F2 W
2 P6 Q- R( s' p4 Y* o
* y' F' n# E$ x& D
程序代码:
; @1 y! J$ g7 s* t* y
^1 F( O; v% D# r& U8 W0 B( ]- i0 d. Onamespace fy_Exp{
9 k7 }$ S" p7 e hnamespace {template <class _T>
3 U4 Z( O5 t$ F+ n& l( M/ dinline _T GetExpValue(_T t[], char& csym){' o* w1 Q2 B2 G# w9 M M* J) r
char c=csym; csym=0;; c2 N: Y3 X& J/ E4 \2 J6 }: F
switch(c){
% D$ W& l2 T: N g case '+':return t[0] += t[1];
1 U( N/ H8 }) x case '-':return t[0] -= t[1];& J, J: a; s/ r. }2 R
case '*':return t[0] *= t[1];) }4 |* O5 t7 r
default: return t[0] /= t[1];//case '/':) X* Y1 [! s5 w2 b0 B0 G$ R
}7 }9 @5 I6 f. g- J# J6 F. e
}}
2 R6 ?( V, b$ W; y7 Etemplate <class _T, class _Tstream>
, q. h( Z& m3 g" C- J/* _Tstream: inputstream, _T: get return value' l/ o7 a1 M- C, o6 y! L* q
* Return nonzero if get value successfully */2 U3 E$ K1 F1 `& @" |
int GetExpValue(_Tstream& istrin, _T& nReturn){! O3 Z0 @1 [) x( }+ C4 b
_T t[3] = {0}; //雨中飞燕之作
2 x( i0 d% Y$ u+ e7 I6 I% a3 d char csym[3] = "++";
# `; P" M# D9 y9 C; _ int nLevel = 1, nERR = 0;+ ~' N0 L2 } s& K* d" g& Y
if(!(istrin>>t[1]))istrin.clear();: q5 u: U9 D& E) T' F
for(;;){% }, p8 e5 X" K2 C! ]$ `
if(istrin>>csym[2]){
6 K, g% p" W1 F8 X7 s! l. [ switch(csym[2]){" l# b$ `; \/ p
case '(':
1 {4 E0 s3 _) i if(!csym[1]){nLevel=0x100; nERR=1;}else
% Y* w% Q" Y; F# ?9 H! O if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
* b3 j: w$ z2 \ else{nLevel=0x100; nERR=1;}
" g [: [# i5 ~/ O: f. ~ T* S1 C0 | break;4 x7 ^ e; j7 T4 u$ U' N `4 F2 b
case ')':
: U, o/ {3 _5 N+ m! n {nLevel = 0x100;}break;$ F, @% F0 r Q' s+ w9 T' k6 R% x
case '+':case '-':case '*':case '/':2 E7 Z5 K$ h2 b( ]* S
{csym[nLevel++] = csym[2];}break;
- H) N2 D: k: i3 \# |) c8 _, | case ' ':case '\r':case '\n':case '\t':continue;
8 m; R5 ~3 h; A0 Z8 F* G default:
& V" m4 p+ S1 b {nLevel=0x100; nERR=1;}
9 Q7 ]0 q: @ D' @# @ }" ~( A2 t3 z% w
if(nLevel==0x100)break;
* ]: i' X2 R7 K' Y; o9 v if(nLevel&0x10 || istrin>>t[2]){
9 z5 N. z% A- X9 r: J; ~ nLevel &= 0xF;
$ S3 m; t1 Z8 W6 ] if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: i+ C2 m/ M# P" G l+ A7 [$ U8 \
if(csym[1]=='*'||csym[1]=='/'){
- _- ?: z* i$ Q3 f! R$ M GetExpValue(t+1, csym[1]);
: ^6 c4 W' y2 `+ I }
: I6 C% \, j' D/ T else{0 N. ^' } x; A" C
GetExpValue(t, csym[0]);
8 T/ k2 H' o- O# j( A, T' ?0 Z2 [$ Q t[1]=t[2];csym[0]=csym[1];csym[1]=0;, p, M* v8 ~' t: ]& l
}8 v1 U* ?' ^: o: h8 G( l8 |- p2 q( Y
nLevel = 1;
4 Z5 n' ~1 x' m7 U# M }
: s+ r, ]6 ~) o4 _% X7 ^9 R7 x0 e else istrin.clear();+ x/ B0 j- [6 A. i5 D2 ]
}
, b+ t A+ Y4 e; s5 R else{nERR = -1; break;}
' @ f6 ^/ S+ N6 I- G0 V \ }( n/ V$ E- o' r( z; \8 `
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ M* e+ r7 e3 p0 J' j- E else nReturn=GetExpValue(t, csym[0]);
7 k% |6 Y7 m8 ]" m I return nERR==-1?1:0;
+ f5 _) R4 M8 ^$ w}}
2 Z! U7 {. S- u- d! j
5 q3 ~5 R# t$ f: M+ _$ s# |. ~6 T& y, u5 w( ^
4 z3 R$ v2 _+ `; C) Y! k) ]
函数模板使用示例:
' U# @' w& m- w% L8 ^在以上那段代码的后面加上以下代码:) ^0 B m1 u/ y2 q+ b9 D4 a: I1 n/ i- T
) @9 M" H1 W [! x0 v2 s v' i6 W3 }. H D) s6 K q% W
# f9 l- [* \+ ?# d% H
程序代码:
+ {7 \* ^1 l" V2 w- N
% p% {3 N6 x- Z+ X w9 M& x#include<strstream>5 V: a8 ~6 f3 {4 ]
#include<iostream>' I; c2 W. n6 a3 C Z* s% X
#include<string>9 B8 a+ _ s$ |2 f f2 P; y
using namespace std;
( P7 h, R% J- J4 T/ E% j0 F' sint main(void)# z% M2 R/ @! P( Y" k/ r
{8 F; K& l B' ?: O2 M& z
string s1;0 x r( ~1 S, b0 q' `
while(cin>>s1)
3 \& S+ Z- ?0 u( n& { {: Y, Y8 B: F1 G. q" T
istrstream isin(s1.data());
& y3 V6 S) r& o6 B5 ?' V( | double d;
" d! Q) D, B. m% L, [ if(fy_Exp::GetExpValue(isin, d))
/ w! `- [+ Z7 V! W# x- v# I+ C' r {
9 |* A _! C7 r' R, c/ L2 c cout<<d<<endl;- s" u: L3 B0 q1 j) Y+ C
}/ { n' X5 H9 _) B: N
else% f3 L1 V0 I' A7 r( z/ f# H. |7 m
{$ T* @9 H2 C1 j# n0 t6 m( B9 ^
cout<<"ERROR"<<endl;
4 {9 T9 v4 K% w9 J+ j1 ?% u; ] }
# D1 {& I9 L7 G) \ }
2 G3 P& C" F1 C return 0;6 t/ f* U9 a2 ` |: K7 g5 ?
}
, H, l6 C( P+ I( `5 J& D! j+ E+ Z7 N/ `( o) U' k
" Z" @3 y- R$ @/ A* K3 w然后编译执行就可以了(*^_^*) G. p7 c* @( U+ n4 `: ~! c& j( D
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 g8 R& G( H# y' x* o1 b [" x8 m; I 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|