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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
/ E5 `9 H8 [& R6 s! b一个很方便的函数模板,可以并且只可以计算含括号的四则表达式9 T; a, @- W0 [! V
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 d+ f6 z1 i' K3 S1 U9 m参数解释:
, P: J8 ?' D' R7 x1 y% d( Xistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
0 A6 O+ B N( Y8 q% y" c6 HnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定& x+ [. X5 U8 _) {* Y
返回值:( J; `3 }. d8 c
返回非0表示计算成功,0表示计算失败有错误* f1 B0 T/ D W+ B
2 D9 y; x0 Z* U/ n
/ n6 {6 p5 m+ Q7 d: u9 a" ^( \, G% C
% H- S! r0 f9 Q4 ]+ Z6 X程序代码: * a8 M, c# B/ Y1 R B8 S0 _
4 ?/ B) u' e: v) p6 M( H( \" tnamespace fy_Exp{/ u0 d! |! N# d% n
namespace {template <class _T># c- t0 n. p; F1 g
inline _T GetExpValue(_T t[], char& csym){
. X2 f- o' Q( ^) C5 T" x8 b char c=csym; csym=0;
* ~% N/ O5 f+ g7 `# F- V4 ^1 N4 a6 Z switch(c){
& V) V# U- G( U4 L" | case '+':return t[0] += t[1];
& z8 J5 D; p- @ case '-':return t[0] -= t[1];+ |0 G& I* v( ^6 f+ e; V0 B7 {
case '*':return t[0] *= t[1];* b# p2 ^% u8 _/ D1 Y
default: return t[0] /= t[1];//case '/':
7 z: ?) `6 p" M r8 H. A }. }9 ?. R e6 E
}}
: s( H$ c( b& N ltemplate <class _T, class _Tstream>
& f7 P8 \& K3 D/* _Tstream: inputstream, _T: get return value Z2 F1 L. M* K6 R: _4 c
* Return nonzero if get value successfully */
8 E, h& E) j) Z8 s% n' F# R% O9 w& Aint GetExpValue(_Tstream& istrin, _T& nReturn){. I; ~9 i4 j; U! ?6 [4 x
_T t[3] = {0}; //雨中飞燕之作
" h: U: R0 S/ V: c% X char csym[3] = "++";# W8 z% D9 y$ l0 o
int nLevel = 1, nERR = 0;4 Z. N, j4 H/ O( ~: f3 {3 m! K
if(!(istrin>>t[1]))istrin.clear();7 s2 `( n- Z5 ~, D& ^3 n2 i/ W
for(;;){& e7 T. u: Q& T) n4 L) q9 E
if(istrin>>csym[2]){
" a6 `" W* {) D1 l7 U% b switch(csym[2]){
8 H) W1 V# O; K4 v$ E5 t" W case '(':# M! l/ f) F* H5 Q( X' P1 o) j
if(!csym[1]){nLevel=0x100; nERR=1;}else. L8 T; ?9 G+ L# k; ?
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ v: n/ k1 l# p" J2 f, v/ d# Q else{nLevel=0x100; nERR=1;}, ` _, _4 k, |* i% C, h
break;
: U+ K: I6 }* X" J/ U, A4 G2 L case ')':- u# ]* A/ o; O( o0 v, h- u3 P
{nLevel = 0x100;}break;
3 d! \% E2 k2 q; N case '+':case '-':case '*':case '/':
0 F: l1 S: f# `3 B {csym[nLevel++] = csym[2];}break;
2 D0 \, s( R; a: o1 l# M/ \% E case ' ':case '\r':case '\n':case '\t':continue;/ i0 J5 K5 z2 u8 H. [# p) Q
default:0 P1 d5 Z& s, Z4 d' x, ]
{nLevel=0x100; nERR=1;}4 u5 r* v) n0 O9 l, R9 a7 Z
}
% P3 S' q3 Y* u' t9 L% k; q2 @ if(nLevel==0x100)break; t7 E# H6 _# J* g8 N& ^
if(nLevel&0x10 || istrin>>t[2]){, F: l! E3 J; K2 K3 X
nLevel &= 0xF;& ]' T) I+ b( L; J- |, v
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 j7 r% t3 h) m+ D+ ~2 B/ O
if(csym[1]=='*'||csym[1]=='/'){6 |0 S! A6 F; {( Z+ J0 p
GetExpValue(t+1, csym[1]);' N" h. C! D; @4 w2 s' w
}8 G/ t! E) V$ ^1 l/ t* [
else{. K% ~1 ?+ [5 A& \& _3 Y: O$ a; t. T
GetExpValue(t, csym[0]);9 o( O- W& ?- z8 |5 {* D) C
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
|, ?; z" p+ p6 K& Z }' }, c! |! u! \8 k R9 ^' V( Z
nLevel = 1;5 s" ~- d" L9 K b/ z
}
+ c6 g8 }8 v3 {/ c& }$ n4 p else istrin.clear();
5 \9 g4 j S; p5 f4 V q% v }6 p. x" D+ [' z. w( ?- H
else{nERR = -1; break;}
7 N' p& J7 X; A0 C f } d1 w7 U9 ^7 L
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 D/ Q* g2 o1 p; t5 P6 H
else nReturn=GetExpValue(t, csym[0]);. M8 o. H9 N. E2 B9 s8 [
return nERR==-1?1:0;
' e! D- A- n9 m! W7 c! Q}}
- `* t( D* [+ P0 R0 K: @4 R8 G' O+ R! g B
4 o' h, l! ^/ D6 o4 w: {9 ]1 T5 M* K7 d- y
函数模板使用示例:5 b+ i8 Y3 m* R: I9 C5 X- m7 [
在以上那段代码的后面加上以下代码:2 p3 i D. S- J$ E6 B+ s# N
* T( \8 I4 c7 R L
! g) F8 E l% O2 l) h
$ f6 k( y+ I+ E0 P9 R程序代码:
- O* I; b v' u% `; { Z1 y6 b
) D% ]* q% ~/ N- n4 }/ }#include<strstream>
# H, m; s7 N8 d#include<iostream>
% y: j( B5 I6 f, T8 W#include<string>
- d7 O4 ]* c3 U' m. q; eusing namespace std;
0 Z+ ^+ Q& ]4 h$ O+ J& @int main(void)' N2 W6 d/ L O
{
9 ~, b+ d Q/ Z8 ~ string s1;7 U+ k6 B y* b9 i' A" U" p
while(cin>>s1)
4 `0 b4 L$ X# b& J {
3 W1 F. r7 P# }7 o istrstream isin(s1.data());
0 `: |: O; i, a8 v double d;
0 k" Y8 O5 e+ P if(fy_Exp::GetExpValue(isin, d))
' [/ m1 O8 y7 o6 ]! Y% a# P8 e' _7 V {
9 ~, {* o6 k4 u! ? cout<<d<<endl;+ p6 D& M J+ ^2 T$ f" n; Q
}
0 m! z* ?9 {0 a# _& O2 Z J% k else
" n, n3 [7 w. }$ M/ G {
5 F1 ^1 @5 X/ I4 f3 A' I cout<<"ERROR"<<endl;
3 N( g( B+ _( u9 b$ {6 L: X }" m: U' ?% I( c
} v" x) |) a$ g0 i
return 0;
5 s6 k" A; z6 H4 C}( g" g8 M! U; a+ z/ i5 x
1 ]3 n, ]. x6 z, ^- ^2 L1 J
" L" n/ e6 T. ], r% g, F然后编译执行就可以了(*^_^*)
- F3 N4 O! [, \+ {; E" s其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 O5 A: P! u! B8 t5 C9 R' k' y 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|