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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
+ @- \1 V3 g& M* v% e1 a一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( X7 h6 G, l" h9 [6 J
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ v4 u; P3 V) h6 A" u! b
参数解释:
# G5 S9 a F3 pistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% N) k4 @4 o z. }" h% jnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定6 ~( S. Q* g. e+ B- F0 b2 a
返回值:
. r9 l \' J6 e8 O. e返回非0表示计算成功,0表示计算失败有错误
9 W! @; Y- Q$ R3 R1 s }( ^! i9 }$ }% `3 P& {" y& O7 W* ~
- V* E. ]2 X: F" \* u1 P- y6 t
3 y5 e- z: ]" i) S" @, M程序代码:
1 t3 t! P. c X
4 J( U" `: Q: A# b. x/ ^namespace fy_Exp{
! ~/ C8 f! y: h' T5 ~, Hnamespace {template <class _T>
" t5 n: l( X4 G& ]) jinline _T GetExpValue(_T t[], char& csym){
, ^9 R' P! v3 }& b char c=csym; csym=0;
" b3 @2 _, J( |) U9 R# E switch(c){
( l7 W7 w' Z% H( y; Q case '+':return t[0] += t[1];
: T& ^! l: P. \0 X. F% D case '-':return t[0] -= t[1];
# i/ e3 R% u5 a2 z. @ case '*':return t[0] *= t[1];
. l" X# l" y3 F: A2 x6 E default: return t[0] /= t[1];//case '/':
. s# p1 y' l* z }# v( X& `8 V9 f0 U; _$ n
}}
) N; T% Q# w( Z: {% D( x# Ktemplate <class _T, class _Tstream>
0 Y# h( o; R' J* V- k/* _Tstream: inputstream, _T: get return value
8 n. q! j1 K/ @5 m* ~$ i* Return nonzero if get value successfully */
- \, k# ]$ s% Iint GetExpValue(_Tstream& istrin, _T& nReturn){# W$ D) S: V- M# E) H) r
_T t[3] = {0}; //雨中飞燕之作
4 o; O$ i: F# i char csym[3] = "++";/ A/ W- I. ]7 t/ X0 z- K: N/ ^
int nLevel = 1, nERR = 0;
$ e* v e* l+ g- ?& o/ A) M if(!(istrin>>t[1]))istrin.clear();; i% q6 x5 _2 k/ A/ ~
for(;;){- X; [5 S' a, a5 J( X1 n# A
if(istrin>>csym[2]){; d7 f. I/ z! B; \: i% X5 p1 _( P
switch(csym[2]){$ l J/ h: z, j3 B, h
case '(':
; Q9 f: {1 x8 t. V if(!csym[1]){nLevel=0x100; nERR=1;}else- M) ^; X" `! O! j8 l
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; g( Q- b9 w8 k0 ]: X' M
else{nLevel=0x100; nERR=1;}# m3 p+ _. v1 b" h y1 U* s" s3 t
break;
9 Z# b ^8 d1 [1 ~. J case ')':
L; `3 l4 n9 x; V {nLevel = 0x100;}break;
) ?1 u4 M- F2 x case '+':case '-':case '*':case '/':
0 `+ k% F2 v( B) O. | {csym[nLevel++] = csym[2];}break;6 J6 ^* w2 e; I% [4 \
case ' ':case '\r':case '\n':case '\t':continue;
0 T3 o9 h! l! v default:* G) W4 s! j. t
{nLevel=0x100; nERR=1;} _( o( W( h7 ~5 G
}# n* |9 w1 H- Z! e" ?% [! @
if(nLevel==0x100)break;
2 G3 O# S7 z# Y$ ] if(nLevel&0x10 || istrin>>t[2]){7 x6 ~/ l8 Q8 w; J) l: z
nLevel &= 0xF; e" D. ?4 r* Y: v- f1 j
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* t# i! P6 `4 ^5 F
if(csym[1]=='*'||csym[1]=='/'){
" r4 }) k+ r6 ~/ k$ b" m; _, K GetExpValue(t+1, csym[1]);2 [3 h0 ^7 ^& r G: D
}
" U' X& \8 ^7 V$ E( H else{$ r( a/ C$ s/ E2 F M3 o
GetExpValue(t, csym[0]);) ~$ W! W$ `( G& W" a. G/ K
t[1]=t[2];csym[0]=csym[1];csym[1]=0;. U8 Q" W& C1 P& }- K
}. u8 ~5 V& \3 j: G- D* q4 `
nLevel = 1;
, [2 ]* ^+ V- k& K: F }
$ C* S2 M0 ]4 a8 ~8 J else istrin.clear();6 l3 T% e7 F' S
}
0 j7 D0 \5 o& b# P+ T5 F else{nERR = -1; break;}) a u8 Z c; C8 Y8 T+ Q1 q* ^
}) A+ S" ]. v& N+ l
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 F" ^# | p( ^2 { else nReturn=GetExpValue(t, csym[0]);
2 ?( ?0 E0 _# J& J+ w6 r% } return nERR==-1?1:0;
- F' B3 q5 @) `$ @}}6 ^2 \& g: }1 V8 B; D6 }: L
& ^7 x8 M: B D; B
- }# W+ ^6 M$ k' L# m% X" V) _
% w6 ^- K& ^- e- Q6 F: S: P函数模板使用示例:
4 x' R5 k' ]+ m. a$ b% }, ]8 q在以上那段代码的后面加上以下代码:/ I" _3 k3 m1 `9 _2 W
8 L) @9 D0 \: G0 |! v* `+ J2 ? 1 x/ z7 t, U8 d" b5 j
X" l* j5 ~# N程序代码: $ d5 l8 I5 } h& i
$ v+ S. ?0 C9 q7 R. B2 U. P p
#include<strstream>
0 _" ?' Q$ {$ k5 k% s% ]9 T#include<iostream>
8 h- k9 V& E/ E! W#include<string>, ~. J) I( @6 N6 ]9 h' ~9 S
using namespace std;
% F- V2 s7 m# @. w/ Kint main(void)
( u1 S" v$ |6 O& d, l2 a- I{
s6 `6 ?* o0 i! }; E string s1;" B% G/ H ?0 S
while(cin>>s1)5 Y2 u) K @4 \! {
{% l% t D- _4 ^- Y4 T
istrstream isin(s1.data());8 R" P; ~3 T4 b1 n1 ]5 N* Z& k! |
double d;: N1 t2 M: m3 x1 V
if(fy_Exp::GetExpValue(isin, d))- |, r2 N8 E1 L3 q# `! N: S4 [3 \
{' Q8 N! h, g* r; i+ V c
cout<<d<<endl;5 I% p$ b: [% t l2 H% z
}. S7 E1 t4 i. g* m' c4 n
else
: x& {& S* p1 ?9 o {9 V& X0 n3 r7 _; v7 _+ u
cout<<"ERROR"<<endl;
8 \8 h' f' j. T9 f( j }" i4 S1 h, k/ _
}
2 A9 ^* U0 ]% L. p0 {$ b( U return 0;! T# Q* O" f3 i: J& E# e- B0 h
}( }7 b( {$ s: @
. J& U9 B$ s M. {
T# D9 O7 D# |+ H) W# c2 Y然后编译执行就可以了(*^_^*)2 B( S" n1 b0 z u2 B
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) h8 `' Q x) w3 y4 `: ]* N! N1 O 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|