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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,: ]* C& d: f! [( c
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 x' q5 ?3 c% [
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- `2 u/ H% L6 d参数解释:
0 O8 s+ F! o6 O0 K! Z3 \$ R5 ^istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) M3 v+ y) u6 U, f ^5 H
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 m& m) e- u4 D! N; a返回值:6 T/ P- h, v, O! ]- u7 v- w- J* v7 H; I
返回非0表示计算成功,0表示计算失败有错误4 S% {& V9 ~. h0 a( V, z
+ Y' s$ f8 F6 S) E, C
% z8 ?! i: M2 t1 r U8 | [ O9 `! B
程序代码:
, w& z: _7 i2 D& i! R7 {' z9 I2 Q) a$ T+ W4 ?" P
namespace fy_Exp{, U q0 n) L% Z+ M( m8 k
namespace {template <class _T>" }! h* Z' I0 f, X; g) Q& t
inline _T GetExpValue(_T t[], char& csym){9 k4 K: j, o9 i& b5 _7 S" q) }
char c=csym; csym=0;
8 C) V. c7 @0 u switch(c){8 g3 }% S) d1 x1 b. Z3 D9 ]
case '+':return t[0] += t[1];+ X/ Y3 O1 C: P3 P# @1 C: f9 U2 w
case '-':return t[0] -= t[1];+ F! x( k: j8 B, I1 m$ Z" Z
case '*':return t[0] *= t[1];: i K) M8 _, g
default: return t[0] /= t[1];//case '/':3 B4 l$ t4 X# Z2 F9 a
}
+ O/ S+ K3 l# m+ ]2 G( T6 [" X}} i/ g0 S% F. _/ F* l+ G3 _1 C
template <class _T, class _Tstream>4 P3 p$ t" ?, w+ S$ I
/* _Tstream: inputstream, _T: get return value1 r1 d* Z4 {0 f; g3 m
* Return nonzero if get value successfully */, P0 j/ G3 R0 |7 {
int GetExpValue(_Tstream& istrin, _T& nReturn){9 b) [2 w% j* A; i
_T t[3] = {0}; //雨中飞燕之作/ f. w2 D; Q7 `. q, a9 q) _
char csym[3] = "++";
- ^- o2 V4 X* I; ]1 b int nLevel = 1, nERR = 0;
5 l) w$ [7 c6 t: d2 b4 s if(!(istrin>>t[1]))istrin.clear();
% M( o+ p' `4 K( X" x2 j for(;;){
) m5 \5 ~) _/ S0 p T: H if(istrin>>csym[2]){
& D6 @" T0 S+ r+ s* P switch(csym[2]){, Q$ h5 t7 `! j, V. V
case '(':0 v& I7 B: N4 E1 ^6 F' ?1 g
if(!csym[1]){nLevel=0x100; nERR=1;}else
4 ~% D$ B& |* N% y7 Z" R& Z) d if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 s7 D- z% u. W Q
else{nLevel=0x100; nERR=1;}" r& E8 V, ~/ Q& M$ R
break;5 G6 U$ v6 ~/ j+ C6 F8 \" X
case ')':; ~; } F# B* }& t$ S$ e. v
{nLevel = 0x100;}break;! z- T! T( P" t
case '+':case '-':case '*':case '/':/ Q. Z* i! p8 p! G% ?
{csym[nLevel++] = csym[2];}break;
9 j6 ?$ X! m# X- W! a+ ?8 P- S case ' ':case '\r':case '\n':case '\t':continue;
7 {1 J! G3 O) e" f" Y default:
- n+ M- y9 {) o( J {nLevel=0x100; nERR=1;}2 i' j4 k S# v+ G! F4 _6 ^3 W. a6 `
}5 t$ w; P/ D2 P) e" t4 Y0 U
if(nLevel==0x100)break;
- |, y( L5 E9 L if(nLevel&0x10 || istrin>>t[2]){ T% N! s' E0 O1 @
nLevel &= 0xF;0 U& d, `% q8 U* T0 n5 o
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 [3 Z4 x1 F' n. L( v7 Z% H W if(csym[1]=='*'||csym[1]=='/'){
t8 d7 p: V: P# h GetExpValue(t+1, csym[1]);
- j6 P8 H0 X2 ~. t }
+ V2 @) _; Y( B5 c5 L! \ else{3 n# H z; q; G* o. ?6 }
GetExpValue(t, csym[0]);
. D: F/ U5 S* }. Y' | t[1]=t[2];csym[0]=csym[1];csym[1]=0;, e: y( ` Z% D9 `( y7 Z' \( x T' J0 P9 w
}
" t( U5 n6 R; P# t; S) [& d nLevel = 1;
+ V, W8 l. z/ Y- p% @5 @) j: @ }" X" ?' U- T0 [
else istrin.clear();: {; R7 S6 r8 R) \* f
}4 a+ H- j7 k9 P2 Q# Q% p. \
else{nERR = -1; break;}( G }0 x$ K& Y2 b) m$ q
}; o# c4 F; j* N, k6 j. k$ t
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 h1 M6 T# b, S! m& k else nReturn=GetExpValue(t, csym[0]);
% K8 K9 `3 f5 J return nERR==-1?1:0;
4 x8 K& M9 u4 d}}
% F" @; X: X" J2 A1 d' W% i3 g4 S4 J- n: h: k3 z. E! w+ |9 z+ B9 e
- u5 G3 |1 m5 c! U9 }2 q5 p4 f2 e! i) I& h7 a; d/ O7 X' ~( J
函数模板使用示例:
n) x/ Q% c3 T5 M% T9 R在以上那段代码的后面加上以下代码:" U6 {9 p7 y; k. S* d, O
/ J( ~- n4 {6 O5 t
W+ u( h+ J- e- y: h( i
3 h9 p9 t$ D+ r& b( o程序代码: ( @9 u4 N8 q: d! @1 v" P4 e8 x
/ i/ j V N8 ]9 b/ d6 a- R* v7 y
#include<strstream>& P( b) y4 E1 r8 b" O, i
#include<iostream>+ N" ` A8 d& _5 ?6 s, b
#include<string>
( a$ [- V- I2 Z" }, p) Gusing namespace std;
/ b1 o( A9 B8 P( v" b- ^int main(void)4 E& ~( b+ }- J
{
7 N3 o; k9 d8 S: @" T7 \7 I string s1;9 I! W% d/ \. a& i- S! y# t
while(cin>>s1)$ \" {2 b+ F# Q" i8 B2 ?
{
7 T: u# ?0 l" \; P* ~, ? istrstream isin(s1.data());
$ Q# `9 y, L/ f2 h: n+ S2 Y4 H double d;
. Z8 k% o8 `5 l w if(fy_Exp::GetExpValue(isin, d))' O6 J$ P* J3 L# O" R m
{$ F$ X3 ]4 }8 o* ?! X
cout<<d<<endl;! ^8 B: p; P5 ~ i
}7 W0 J9 q8 x: m3 ~3 }* c
else
4 Y8 _7 o" d: v0 P/ N0 S: s {$ d n8 Q1 l6 l- a4 u: Z2 W! j4 ?
cout<<"ERROR"<<endl;3 B6 |( w/ v2 }* R9 I. I
}9 M! r4 V& x% j' h5 Q7 {' ^
}! s L; E- T: t- N
return 0;
( o8 F# B$ k- g p6 Z0 @9 {}4 g" i! e% v# z L
3 u- p0 i; A. a8 C# {
1 H P! v' `# P
然后编译执行就可以了(*^_^*)
/ a1 E" ?; i) p- ]其它:TC++上一定编译错误,不保证在VC6上也能通过编译( H7 \$ |) r+ j; L" b
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|