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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,' G4 M7 N G$ x7 c( p- e
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
* ]- L- y, m7 a' b7 j只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% Z) A) G" A; u) W5 T! A8 p3 a
参数解释:' A- z! [( i* Z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 Y) N! Y4 |/ E4 C* l8 W: W$ {& c# Y
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% e K0 i, M/ e
返回值:
9 b3 J9 `9 l' M5 T: a" m- S返回非0表示计算成功,0表示计算失败有错误7 D+ @# i4 O! ` i
& T: ~- k5 F ~( m) Z. {: S7 U3 |
. e7 }: d. ?0 {# G5 d3 }# J; d
' p. R5 H6 h' H% P( {7 U( n程序代码: 3 I. @1 F4 x% Y
4 m/ K P7 ]% Hnamespace fy_Exp{
, j; S- J& ]$ g$ ?$ c. tnamespace {template <class _T>
$ p1 H' f" g4 [1 minline _T GetExpValue(_T t[], char& csym){. b$ L7 C3 ^+ b
char c=csym; csym=0;4 X9 _# S+ Q: r, ?! x
switch(c){
9 t' |4 X; L* I; t" J1 C case '+':return t[0] += t[1];0 \; L9 K/ l ^
case '-':return t[0] -= t[1];
; p) f3 P4 @& |6 r$ a7 o4 Z4 { case '*':return t[0] *= t[1];
' g* p. q7 n0 D2 q1 I default: return t[0] /= t[1];//case '/':7 J- K: Y) s E" W$ ~- D* n
}' X( h& a, h; l
}}
+ C" q) v" V/ K" }6 @. ntemplate <class _T, class _Tstream>
# L7 c. y1 u9 [5 w7 |# C ~1 k/* _Tstream: inputstream, _T: get return value/ `( p% C. U& q
* Return nonzero if get value successfully */7 D4 c& c; i3 r+ g; `& h5 U6 o
int GetExpValue(_Tstream& istrin, _T& nReturn){
2 I% ~1 ]1 B! |# j& a _T t[3] = {0}; //雨中飞燕之作
) z u& b: e8 p2 m! H char csym[3] = "++";0 h; p% V7 x- W0 `( a& y
int nLevel = 1, nERR = 0;5 i6 i" S" V( C) g$ H
if(!(istrin>>t[1]))istrin.clear();
/ n9 z$ |8 Z7 \9 }7 f. j [ for(;;){1 N* b( J5 c5 R ?1 \# C" s+ v, `
if(istrin>>csym[2]){ \: y* O* [& U% T& Y
switch(csym[2]){) Q* E. p6 Q/ t; @% z d/ A; G. I
case '(':
: a$ G1 M, l7 E6 `/ m if(!csym[1]){nLevel=0x100; nERR=1;}else
& o0 P5 m0 U5 L if(!GetExpValue(istrin, t[2]))nLevel|=0x10; h, }& g2 H1 T3 w" g- c/ c, V; p
else{nLevel=0x100; nERR=1;}
! @( t( W% _# C# |6 R% R1 B; X break;$ U; ^3 O2 {5 P( s& j
case ')':- R H, ~2 x' j' N
{nLevel = 0x100;}break;
) N2 Y5 S) N) q case '+':case '-':case '*':case '/':8 \# X1 c) g1 R& U5 e8 d
{csym[nLevel++] = csym[2];}break;, y1 x0 T: X* p( m( j9 y
case ' ':case '\r':case '\n':case '\t':continue;
: A0 Q* O: L/ G9 q default:5 Q& f* f! x/ N+ h1 m* z& k% V; ]
{nLevel=0x100; nERR=1;}0 c6 u! n1 r- n. z, X" a
}
3 k9 ~+ a4 L5 X4 ]8 N9 F if(nLevel==0x100)break;
/ Q1 H% g5 m! A" B if(nLevel&0x10 || istrin>>t[2]){
L7 l. q' n! @2 t nLevel &= 0xF;. x2 p/ X/ K: u4 f
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 J9 n i8 v [ if(csym[1]=='*'||csym[1]=='/'){
7 |7 ]( ^/ A1 ~5 d0 s GetExpValue(t+1, csym[1]);
& ~$ V# K6 y3 l Q4 V2 w }
; d" p) D8 O4 }/ l) j3 Q$ e8 g. S else{' j! g% _. A6 z+ n9 [) w$ p4 w
GetExpValue(t, csym[0]);
9 _) F, W8 ~! O1 Z( k t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 j9 D' O3 p3 x }
/ Q- e% K/ i* a9 c nLevel = 1;/ b3 D7 \6 `: ]" |
}2 G. |1 P5 a D9 E: `* F
else istrin.clear();
$ j$ B3 B l- [* V' w8 o }4 @% u8 e) D- N8 j$ u1 r; ^
else{nERR = -1; break;}
: W1 z5 s9 f& J }
, e1 ?3 _! W1 u if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 e; o9 D7 n( K
else nReturn=GetExpValue(t, csym[0]);
, u5 }+ u. A/ |! R5 F9 U return nERR==-1?1:0;
) c# [# e& I% }: E; o}}: w& Z0 z8 L7 p) O) O* ~: g" s
/ `2 i# _/ I, C9 c
0 E+ Q0 s7 A8 j4 ~
3 u. |6 v/ T6 A函数模板使用示例:
; f: d( w- B. X( e6 i) ]在以上那段代码的后面加上以下代码:0 d- w6 }1 n: m! n" R' r
5 e# D* V% m! K9 m; \
; R. C* e/ m6 Y3 E8 x" ^1 V7 ^, U
B% H4 J& [2 Y+ [程序代码: $ J( W( u1 J1 ^
8 M1 D) Q/ N2 ^2 A3 x% A
#include<strstream>
D+ V, M0 I) U4 f! z0 g* B( X#include<iostream>
' V1 ?9 L4 s0 C! E" }8 m# x, v#include<string>, J4 ~: k$ q, S6 r1 J2 `
using namespace std;- G A" c5 q$ V2 _( f
int main(void)
9 r6 T: B4 ?! w; J. n* w5 s# @{) T- G# p+ V! _% P" f: n/ t4 c$ N
string s1;, Z. D' {$ u% ?" C ?7 }
while(cin>>s1)1 W1 A- O$ j4 N
{
" ^- m" m- d" I, M! k istrstream isin(s1.data());
0 i. V% {1 T: j+ \ double d;* ~" ^) g7 }& ]
if(fy_Exp::GetExpValue(isin, d))9 e3 T: `& z. _6 o
{
* c4 A. R- b& V- M1 H cout<<d<<endl;! Y* F, j9 k6 _
}0 S* I- j+ O3 Z0 E6 F; i# p1 C
else
# w1 M3 h* v! v {
2 n" B+ N h8 }, {3 i cout<<"ERROR"<<endl;
, ?3 V" \( s) a/ e4 t: B7 } }
3 P+ D7 A( S0 N6 y4 }; R1 h/ J% Y0 x }
% j7 B. L* O. @2 Z1 o, u6 A i3 _- ]% U return 0;6 n4 l- g+ Q& j. O
}6 { i& R, g, u6 Z- j
8 W9 _. d+ ?) \) u; o! V
. K/ u. d% z6 _ }8 e然后编译执行就可以了(*^_^*)- ~7 O7 z* y( ^
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& Z& R& f8 n ~, U 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|