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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
% Z/ H8 m" B# _$ A3 r一个很方便的函数模板,可以并且只可以计算含括号的四则表达式2 U$ c7 B1 B( q6 N$ k, W
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
0 z$ L' T4 k) O' C% S5 V5 K参数解释:2 J2 {: e# `# a7 f; J
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% q# x+ d1 R7 Q8 \) Q7 P6 Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 W4 b: Q. {$ u" V/ r! y
返回值:
7 S1 L; }4 \6 E9 u/ V: S3 m$ K返回非0表示计算成功,0表示计算失败有错误, w( y1 K7 z i2 f2 r% a7 y. p
2 `$ Q; R5 N3 ^/ P( u
9 r- H1 J) W: O9 Z2 O; K$ n% `0 g, R( p0 ]
程序代码: f! x; x1 @% y* h
M% u- W" A! T, ?3 o( Z3 j5 \
namespace fy_Exp{
! ?: j/ j# n8 @# A/ u( p pnamespace {template <class _T>
( }0 Y7 i8 q' S% c! Q. dinline _T GetExpValue(_T t[], char& csym){
& h; [) r1 I. q& O char c=csym; csym=0;
4 ?% v, [. J4 p, g switch(c){8 y1 }9 h/ @4 `( M+ @! B1 _$ `( k
case '+':return t[0] += t[1];
4 M& y ?" p# c X! b! M3 X case '-':return t[0] -= t[1];8 ~; P8 I, E) N$ {; e5 T, @
case '*':return t[0] *= t[1];
& J( l8 S" x2 Q2 U# a; i- [2 ]+ K default: return t[0] /= t[1];//case '/':! Y" _/ t: `8 _3 v; ^* u+ i% Y
}
) R8 l0 K/ G- ?- p& g}}
7 U. C- B) w1 p8 x/ `& {template <class _T, class _Tstream>
$ C) P, M7 n; u: I, ]3 ?5 r8 {: Q& C/* _Tstream: inputstream, _T: get return value) D$ h" U% ~7 l+ {
* Return nonzero if get value successfully */
( I$ c5 O" b5 g0 R7 Wint GetExpValue(_Tstream& istrin, _T& nReturn){% i6 N8 O% i1 I2 {! l1 |, m7 \
_T t[3] = {0}; //雨中飞燕之作- b( x8 i H& C9 S. ?0 r
char csym[3] = "++";" C* q3 n; J: D3 N: v
int nLevel = 1, nERR = 0;, k) O6 c, W& \. W! v3 Z0 n
if(!(istrin>>t[1]))istrin.clear();- d7 L: ]6 P7 x9 B( V! T% ?
for(;;){- k7 q$ I9 d/ C6 O. `! m8 X; W
if(istrin>>csym[2]){* V* C4 W9 I* Z6 y G9 H
switch(csym[2]){
. X. `( p" T: F0 g8 c5 ~ case '(':
0 e; _/ ?7 f# ^: N+ a if(!csym[1]){nLevel=0x100; nERR=1;}else8 ^( m7 q) E2 }1 H" D( t: t, |/ k
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 [5 h3 o6 I; S8 B* k
else{nLevel=0x100; nERR=1;}, u/ X. K2 f6 P2 Q ~6 }5 ]
break;
' M# |2 D+ f" t7 Z4 i case ')':* Y5 w7 j7 E3 V, N. I! Z
{nLevel = 0x100;}break;2 A' ^5 H( n# c$ P% _8 i: N2 y
case '+':case '-':case '*':case '/':
4 J' J% R# r+ i) c! q# q5 { {csym[nLevel++] = csym[2];}break;
* \' b3 B0 P: E t3 w case ' ':case '\r':case '\n':case '\t':continue;6 t/ N( i8 T. Q+ y
default:
: |4 Q3 p$ ^" f1 b( ?% e {nLevel=0x100; nERR=1;}
, D) G* Y& G4 f9 J* ? }
D5 m! T2 y" z, x/ r& p( d if(nLevel==0x100)break;/ [ j( E( Z. H0 w- b h" h# Q7 U; `+ _
if(nLevel&0x10 || istrin>>t[2]){: M d0 U" h7 ~4 O. _9 ]
nLevel &= 0xF;, @2 d. d6 `* U
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# `) _5 O7 z3 Q
if(csym[1]=='*'||csym[1]=='/'){0 Z0 b4 O' M# S" G$ e
GetExpValue(t+1, csym[1]);
( Y; I. V. |5 k* P5 Z }9 Q+ u* S" O7 _$ U Y! G
else{# l1 K1 A* \/ t) `0 B; V
GetExpValue(t, csym[0]);
8 M8 Y6 W3 t, h) |" p% ?5 q8 ` t[1]=t[2];csym[0]=csym[1];csym[1]=0;
( m+ j3 H7 J% l: ?2 P0 A9 ? }
. ]# g4 L* v# q1 S1 T, q. ] nLevel = 1;
$ F9 |9 a0 N! A( w- | }
# L- r/ J- C0 w else istrin.clear();
% d: v& i3 U! e, Z6 \ }
- W; r8 c! t# C$ C, T& C else{nERR = -1; break;}* c. P- Q' ^1 S. p
}
! ^( z& m% j* j0 } c if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 r; c5 u4 _/ u3 x/ A else nReturn=GetExpValue(t, csym[0]);
9 r7 T3 ^/ C8 ^0 O; x6 `. j$ F, ^ return nERR==-1?1:0;
V% m: |% T4 a/ Y# V/ O0 b}}
9 S% x8 F: s, R+ N+ j% K: m) @2 c/ u3 h- j8 C; Y3 a
- ~3 }) N6 g8 ] d: ?
L4 B4 n T& {% k7 S% O函数模板使用示例:; i$ ]! d8 K) E% a# J" v, R
在以上那段代码的后面加上以下代码:# U5 L8 f2 c* W# x+ v1 \) V: B
' B+ J. N% y* x, A5 k- U1 U$ Z
* d* v/ |0 S: n k
6 Z# L3 L1 g" c `+ ~% G
程序代码:
/ {" z5 X* [/ d$ J( e4 T) x' s# Y1 @0 E; L
#include<strstream>( y4 C- m% x. j/ T- W3 J9 s' q4 |1 ]
#include<iostream>) y. T6 Q* I: H9 n( p) _
#include<string>
: o! j, D* Q) q: T$ D$ O! ausing namespace std;& @: f0 D0 Y! L8 P
int main(void); z8 I5 k: f6 N* Q
{, A" i7 d2 D- M" U' N; k8 c' _
string s1;8 V# _* O4 d! g7 b
while(cin>>s1) k0 J3 Q% K! x: p8 o$ _& P
{3 H' {) T2 }( U ~5 n1 O' m
istrstream isin(s1.data());
. v! U4 m6 o* A; }% w double d;
" I7 F# i \/ M W7 U8 c if(fy_Exp::GetExpValue(isin, d))
. y" V0 L9 x* j3 i/ z9 V$ z& v {! s b4 f! K8 b5 M, u/ S1 F1 X# T
cout<<d<<endl;
+ n+ @) r$ ]& i% E V0 q. [ }+ n+ @; K3 D2 U. F# G' `* W
else
( v @7 K4 R& N1 l) ~( l- S {7 A$ G0 I4 z8 W# U
cout<<"ERROR"<<endl;$ c8 G9 V8 M8 ~! V( R t2 x
}2 _" _# e+ ~# S* @! n a, z
}
1 a- O0 z/ |" {& Q return 0;
4 K: b* o L) t}
3 U2 r! u; S2 D1 w. H& P1 J
: Y8 N% V4 L( I1 l/ P; N I
& |! H: m$ }1 O然后编译执行就可以了(*^_^*)4 {# ^. K# S7 T6 A4 Z
其它:TC++上一定编译错误,不保证在VC6上也能通过编译' }0 ~! g$ g( ~5 j
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|