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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
# S6 O; h2 Z& a一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 t9 w% A! D! j( F+ G' F! j4 G% @只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! L6 v; D) |3 r* ?/ z; a参数解释:/ l+ m7 a w4 `3 j' X# i
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' q, Z8 j- ?* G7 L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
L3 H* U- s! i# y3 O返回值:6 r' c4 @, D* g) B" L1 q9 N
返回非0表示计算成功,0表示计算失败有错误0 J& m; M0 J* R- z7 \- Q' E
4 C; L; h- y* v6 S! j6 P/ o4 o 0 B" |0 y+ I3 j6 v" n- ^8 C
/ ?/ Z3 o q" n' }
程序代码:
- _' X7 J8 B) b: j p- O9 a" e
- |; r6 i2 }1 fnamespace fy_Exp{8 o9 m/ i) \; g5 [3 \8 C
namespace {template <class _T>0 n3 l* g9 h i+ P. G
inline _T GetExpValue(_T t[], char& csym){
- Q2 f3 N8 q+ I4 g6 ` char c=csym; csym=0; F+ J+ x4 J3 y
switch(c){
- b2 p1 \ o" I; F4 p+ e% T case '+':return t[0] += t[1];
: {. C- J7 n7 p2 p" G- p case '-':return t[0] -= t[1];
' j, y% @. E. g8 I" {+ K case '*':return t[0] *= t[1];6 I" H* E6 l7 a0 r% G, O1 `" p
default: return t[0] /= t[1];//case '/':
2 y& e" [ P5 d, G& j- | }2 @9 W+ v! \: R4 ?
}}% Q8 S5 r" [7 m0 y
template <class _T, class _Tstream>
8 D% `7 p3 w* `8 n4 {! ?/* _Tstream: inputstream, _T: get return value* `. Y) j, A/ T- R! d' @ `5 F
* Return nonzero if get value successfully */! p: S: B5 o E) @* X+ ?
int GetExpValue(_Tstream& istrin, _T& nReturn){
+ O+ c5 O# e# D: D" { _T t[3] = {0}; //雨中飞燕之作) V) c. s" z& O" k5 ~8 _
char csym[3] = "++";; `8 x3 z$ }8 d! S) w% K% A
int nLevel = 1, nERR = 0;
' i' w8 N- i" c if(!(istrin>>t[1]))istrin.clear();
/ U. D, V2 ?. J for(;;){1 r6 U- `: K# i7 z0 c; W, A
if(istrin>>csym[2]){1 y0 f- X7 K* C& N' N, T
switch(csym[2]){
2 q1 n# f3 h# c case '(':
+ T [1 T0 A% V0 `( p if(!csym[1]){nLevel=0x100; nERR=1;}else! p# `/ j! `9 ]3 ~
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' z5 @0 L7 O9 V a2 O7 j7 d else{nLevel=0x100; nERR=1;}
\3 u4 m$ t0 s5 B+ D2 v0 c break;1 N" J( W( Z8 a* `. i& b, g/ a9 N
case ')':
6 Y7 u5 F) x3 @# P {nLevel = 0x100;}break;
* F9 M. W8 |0 ~7 r6 ~ case '+':case '-':case '*':case '/':
( S( y% l" `1 N {csym[nLevel++] = csym[2];}break;
& m" R7 J7 X% o! o$ R) ^ case ' ':case '\r':case '\n':case '\t':continue;! c7 i! F; k) s
default:
4 ]/ S# V$ b5 k3 u {nLevel=0x100; nERR=1;}
# P$ R' T. Z) g& @# g }
$ r# L6 L2 i# E$ Y8 C if(nLevel==0x100)break;0 k: _6 t+ S" l5 Y
if(nLevel&0x10 || istrin>>t[2]){
2 b) l( ]. b W nLevel &= 0xF;, l; y5 q+ K! p
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ U& M& T+ v6 T5 Q2 m, M
if(csym[1]=='*'||csym[1]=='/'){! p+ r# I9 ?0 o J! f, b
GetExpValue(t+1, csym[1]);
w B. v; ^4 x6 }! B# M }( H) m7 m; J1 B9 V) L L, ~
else{
8 z* v4 I% E6 q8 M5 m GetExpValue(t, csym[0]);
* u- `4 \( r4 n1 ~ t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 C) w1 T4 m$ ^) @
}; D( V6 O0 f8 A$ |, r, W
nLevel = 1;0 n2 j* W0 |% p$ n
}
# o" q. V9 ~. J& q else istrin.clear();
6 z [# z2 q, _) D }7 ~0 t/ [; N8 |" @
else{nERR = -1; break;}. y/ R1 x" A' r, B
} l( ?# q8 P+ [8 o! D8 h% e. K
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
- t6 g! K9 l; R4 N; T6 S else nReturn=GetExpValue(t, csym[0]);( ?' }; |* C* k }, h W" z
return nERR==-1?1:0;
s' t9 P( R' b6 `/ w* E) F) d/ }}}! G/ f: l. G& C) C& A1 m
' o* Q; D I/ Y- h+ n( Z+ E( o: E1 K/ |1 @4 R
9 f/ x- b! ]5 i7 P0 }2 T4 L9 Z- o
函数模板使用示例:
# \ t5 v% u( x( e在以上那段代码的后面加上以下代码:
7 V5 {8 e3 y0 [4 e1 G/ N- n" l. j& w7 G4 I/ _6 W
0 Y) u+ t5 d$ Q* @
6 ~3 `% E6 Z' q程序代码: $ q( d. G. {/ H* R; x- r
) ?- }+ |! S; X3 ^! g8 E! O9 B
#include<strstream>% `3 p( ^6 n& I, ?1 B
#include<iostream>7 n7 M+ F! Q8 s6 P
#include<string>; i9 C/ `9 x( q# u' A: \
using namespace std;' S, n5 `4 X, I) k7 j
int main(void)* P! E" }+ D2 r, m
{+ P. x( `/ k0 M2 e5 q; {
string s1;
3 y& |/ Y2 b! |7 W J, ? while(cin>>s1)( Z4 p; X0 D& ]* x; C9 H2 r3 _6 G
{9 G2 f( `8 C2 a8 Z
istrstream isin(s1.data());; P# s8 W* G- K; t/ ^ _
double d;( y1 ^. S4 X) o0 ~
if(fy_Exp::GetExpValue(isin, d))' i" ~: V* m* k
{9 v( q; ~2 n; x+ t4 X3 {
cout<<d<<endl;9 }, Y6 ]/ Q& w1 {4 K3 f
}& k1 j4 U6 s7 B0 G5 t" q3 _, V
else
( g! o: O6 Q2 ^ ~/ i( [8 R' j- A {
! g! p; Q& C/ ^0 N cout<<"ERROR"<<endl;. \3 }0 |! }# D4 o3 _/ D9 K1 j
}& m. Q8 C+ Q) g
}
( N& T9 y4 t. s return 0;
! a: e2 ] _- }3 ~) D3 Y/ N# @+ |}
1 M! W0 s- J, y3 Y0 m
& E8 j$ [7 ^* E: R: x: `. c5 f6 \- q$ T( p8 O+ @8 U# B1 E
然后编译执行就可以了(*^_^*)
# M- u1 ]; Z7 {& e其它:TC++上一定编译错误,不保证在VC6上也能通过编译; ~; L0 ~ h/ Y) i
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|