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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,+ y6 ]& {! }8 v2 j8 R6 N0 I* ]" d
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 @, P! }3 d/ ~ R$ P
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)" f$ t0 C3 y- H; |. }8 u# @
参数解释:
8 p3 R1 ^5 `+ Eistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ d# v! k1 ~6 i8 g, C
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* o+ Q" C5 ^' G( \' N
返回值:
& S% g+ r& L& f返回非0表示计算成功,0表示计算失败有错误
+ z0 i) p/ m% D
" p9 i/ p# C: C- ^7 b
3 A5 _# A3 Y6 g% }5 z6 k
1 x4 H" e6 M% E, X, Q程序代码: % t6 t# O! G# g' P# c P
# H) |) A1 G/ z$ n$ q
namespace fy_Exp{5 g5 M) d1 B3 Y8 Z; s# E/ p7 Q
namespace {template <class _T>
0 a1 G! r; B y1 k( a* O8 B; Oinline _T GetExpValue(_T t[], char& csym){) |) S* ]5 u1 s8 @( O. b
char c=csym; csym=0;
7 @9 P& [9 |2 J switch(c){3 z) f' `3 A* z' Y1 G! r
case '+':return t[0] += t[1];& [+ Z+ F0 u$ B- K3 l6 r% E4 H3 D% c; J
case '-':return t[0] -= t[1];
: I X% o7 B. ?( a% |6 B# |- x case '*':return t[0] *= t[1];( B1 X y$ y3 u" h1 u9 x
default: return t[0] /= t[1];//case '/':! N3 ]# B& J# {/ X7 x) X) x% Z1 ^
}4 i* T+ Y( p+ j8 z3 G4 p% _% f
}}# S3 G" q5 Y( S
template <class _T, class _Tstream>6 B$ \. W9 X( W- B' v, Y3 B
/* _Tstream: inputstream, _T: get return value$ b' N: ?# S7 `# k# H) k8 V- N2 v- O
* Return nonzero if get value successfully */
) ~1 |; x. K( j; ^% Q# }7 Hint GetExpValue(_Tstream& istrin, _T& nReturn){
; K$ m& ^& y# D+ R+ X: k _T t[3] = {0}; //雨中飞燕之作
9 {! k. J( s8 S& h2 g8 d char csym[3] = "++";
/ ?$ g4 t0 o6 z4 W! ~ int nLevel = 1, nERR = 0;
) a$ e( f: W: l% `5 [( c if(!(istrin>>t[1]))istrin.clear();
* t9 K2 k5 T) f `. W6 l# u4 L! g for(;;){5 a' P$ |' ^& L. v6 W1 J# e' Q3 C: b
if(istrin>>csym[2]){3 _5 V5 i# _5 p
switch(csym[2]){
. V+ E0 G0 H& f/ b case '(':
# J$ f4 E3 V: B- m' a) r/ v if(!csym[1]){nLevel=0x100; nERR=1;}else
$ F# C$ S& ]2 J if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% q2 G4 t7 P" [ ]( O
else{nLevel=0x100; nERR=1;}
' y# j' U6 W9 h+ W2 Q3 j* | break;8 ^/ f8 e2 P5 b) M
case ')':
: I i& s. k6 p* | {nLevel = 0x100;}break;
; |2 T& n+ u N. Z5 n( C case '+':case '-':case '*':case '/':6 \. z; k9 A8 ^% h
{csym[nLevel++] = csym[2];}break;! [4 g% s- b& J x$ [
case ' ':case '\r':case '\n':case '\t':continue;) W- U; O) {8 Q; u: x
default:. i' d' J' ], k7 R/ y( }
{nLevel=0x100; nERR=1;}) |5 j/ d1 e2 i9 G' i
}
. y' E) w% M3 i8 y' c4 e if(nLevel==0x100)break;
4 ]" l5 d( I$ O- Y' R+ V if(nLevel&0x10 || istrin>>t[2]){$ B7 d) L8 D' |+ d; P7 @
nLevel &= 0xF;
1 _5 P) F$ d6 d# F: q if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. N D6 |3 x1 @2 o) f
if(csym[1]=='*'||csym[1]=='/'){
( V5 P! E, I7 U Y% d# ] GetExpValue(t+1, csym[1]);
; h/ ?! P* Y' V2 m9 w) T }
" F- L7 F6 ]3 o9 V. f( B else{
0 r g( P. p: l X* c2 \ GetExpValue(t, csym[0]);$ ]5 E) u+ l' e# b, F% W0 g
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ x/ K. C, j. v0 }& ~- @. J }( C U! G& h2 {; e! k- r& x
nLevel = 1;/ C- P) S3 Y6 g* c) V$ N
}- G0 b+ `/ E! O: z2 h- r
else istrin.clear(); n/ U, P3 V+ U R Y8 G
}; ]9 k* y$ E, m! O1 i7 i+ J
else{nERR = -1; break;}6 _/ C+ t! z$ a, p# z
}
! w0 A; t0 q% k/ r* `4 L$ S) J if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);' P$ ?2 N! J+ E( ?( V. f1 n
else nReturn=GetExpValue(t, csym[0]);1 O' H* c3 r1 n
return nERR==-1?1:0;
- Z8 x' w7 x$ {7 S}}
0 {" i0 a9 H* q, i ~. X/ h& u; m+ M
1 _2 m$ \, u9 J4 o
9 \8 j1 g5 d6 R: V
函数模板使用示例:
( \8 Z8 l& p7 t7 t k0 C% t在以上那段代码的后面加上以下代码:4 q8 ]/ C) i% }6 s8 r4 M- \/ w
6 X9 [& t* O7 I8 a
+ t1 Q: K5 D: t" I o, H$ _4 D' r: |; S! }7 b' m
程序代码: % N( C v, A( D4 c7 q6 ~
) p. C. {: d, y, L$ t' S H
#include<strstream>
3 D) c( m! P4 [& I4 _. V+ n5 R& u#include<iostream>
$ n* y# J# Q# q' r! u. P2 x) H. {#include<string>
K1 s3 N* u' i( _1 ~; @! tusing namespace std;; a3 `# y; N* M- p' F6 y! h. q
int main(void)- [3 q) c, ~, V
{) d" n5 v" w9 G
string s1;7 Q, [& n! k. b# g5 g3 q6 N
while(cin>>s1)' F$ J% Y: d4 q8 V; J
{2 Q+ K1 `5 u; u, p, d9 G9 `
istrstream isin(s1.data());
' z. [& L& J; K" h! }0 c4 m double d;+ D% m, A8 f( J# w
if(fy_Exp::GetExpValue(isin, d))$ d" J0 v9 g% x- ^( [
{
3 D& C) [& X9 {2 X( O2 V cout<<d<<endl;
% m9 `7 y7 c0 A4 s. T9 F4 ` }8 F$ V" U* [( B& c8 h* k. Q
else7 z+ k4 I4 O- J6 y6 A
{
0 Z/ Q: \6 B1 ]# K cout<<"ERROR"<<endl;
6 Y1 n# E# u; _8 P' c2 y }
8 N; I: Y1 v9 G3 t }2 R9 K7 h o6 j# j) x) {
return 0;
% P9 G( e5 H+ _6 T}
7 \4 J" b+ \ i& A% ~' E6 S N
- o0 o: }$ l a1 y/ {. T
; i( H5 J8 n* n8 v+ m0 E1 l然后编译执行就可以了(*^_^*)
8 _. W- e- [% x& a* k其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& ]9 Q) e0 s) v/ {7 w 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|