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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,9 O) F4 F c j
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) `0 ?1 B; n g) J: l; g只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% b0 E- y! r) r5 ~( ^4 E' S5 ^参数解释:+ }# Z* K7 v9 O, w4 @2 d+ l
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 R3 s2 Z4 ^) t5 X0 ~7 O2 z5 JnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ |9 |1 K6 Q7 I3 x' b/ D返回值:
5 u( i: p4 `8 D( \( B返回非0表示计算成功,0表示计算失败有错误
& D9 N9 |3 a9 m& K: z7 L
1 d; E. ^ f+ c" o+ S
: x r/ ?; Y& L, H2 w$ H3 `& P
+ ]0 w" c5 D9 U% P程序代码: 6 \3 @ _+ Z6 y# \9 d
7 @( N) z `' B, m+ f5 Z0 b4 z( pnamespace fy_Exp{
1 ]: ^5 y8 [2 Y" ^; R0 [namespace {template <class _T>2 _ N& o3 T$ Y4 [
inline _T GetExpValue(_T t[], char& csym){
$ r$ [" p" P0 H" p# I4 y char c=csym; csym=0;
$ g% O; T; R4 L% Y) \2 U switch(c){
" V% t0 {7 s3 J7 r5 T7 D case '+':return t[0] += t[1];
. b5 @% h, x6 U' r: L$ v8 z case '-':return t[0] -= t[1];
" V$ E- Y2 I! x case '*':return t[0] *= t[1];
. Y* G |/ Y: ]: T7 D' D+ I( ` default: return t[0] /= t[1];//case '/':
; U( A ~2 M. K }
6 O1 b, h' z% O+ @5 R}}
5 `6 n/ N1 G Qtemplate <class _T, class _Tstream>
" E" f- C/ O8 Z/ j6 K1 T2 y& i/* _Tstream: inputstream, _T: get return value. E* z% h. A/ k" f& e# E; W) P' P/ s$ Q) X
* Return nonzero if get value successfully */
0 x+ G2 @% T. z# g% ?int GetExpValue(_Tstream& istrin, _T& nReturn){ P" \$ O- c( m# R5 C. h
_T t[3] = {0}; //雨中飞燕之作7 {1 \" G) `2 D5 Q5 Q
char csym[3] = "++"; w: Y% A( F2 ~0 d6 C& J
int nLevel = 1, nERR = 0;
' f$ J- T" i* v if(!(istrin>>t[1]))istrin.clear();' @0 l6 u" Q9 ^# {- t9 l# _
for(;;){
F% p3 Q8 h7 V+ C( O, c if(istrin>>csym[2]){
0 m; G. C, x. T& y switch(csym[2]){
( M8 b* t: J& q# e( L- e* m% V case '(':3 n% z( |, O& |! ?
if(!csym[1]){nLevel=0x100; nERR=1;}else5 U0 V0 D8 R. ~/ I# c0 Z3 D# J
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# T4 H. F2 c" ]. l6 e: y1 u& t
else{nLevel=0x100; nERR=1;}
$ X+ N4 p0 ~! T" j, I break;: ]4 q. `2 W. `
case ')':
$ n* j- ~1 s' ~" N$ E! h {nLevel = 0x100;}break;
/ L! h; h6 \$ t+ J case '+':case '-':case '*':case '/': p# {# }8 _) [: `/ y" G, D. W7 c! b
{csym[nLevel++] = csym[2];}break;- v: w, C+ i7 Y K2 b% I+ X% Q
case ' ':case '\r':case '\n':case '\t':continue;
5 f; C* Z& O P2 `5 m* v u1 Y default:
- _; e" A D0 l9 M* m {nLevel=0x100; nERR=1;}3 i. {1 D" W( D9 x( X$ x! G
}" l2 U6 G% c% [8 A1 O: P6 X& t
if(nLevel==0x100)break;1 p \2 ~) b6 q# O9 d2 N
if(nLevel&0x10 || istrin>>t[2]){
8 _3 S# p& j9 \3 H: S nLevel &= 0xF;4 o8 q9 D7 |+ p2 E% j( V+ K
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 z3 Z' E$ e& y, N if(csym[1]=='*'||csym[1]=='/'){
) x5 k) J, N! w+ D: \$ s3 _ GetExpValue(t+1, csym[1]);8 i- l' V0 V4 V: R7 v
}8 A' a4 O- N. }2 W* k
else{+ f2 R5 {' T e8 R7 V6 h& n2 k ~) t
GetExpValue(t, csym[0]);
: g1 ~* K2 A P t[1]=t[2];csym[0]=csym[1];csym[1]=0;# _6 j) \1 g; c2 b. J
}$ K+ t% m$ x. }4 ~2 M
nLevel = 1;3 s1 G$ ~+ k' s+ {# i
}8 D0 f; C7 r4 P# e' H
else istrin.clear();
9 s! e L+ ^! {& N4 L4 b) s }
& }1 w- ], C+ b) k! ^7 b$ o) k else{nERR = -1; break;}; V/ x8 t6 @0 Y5 d( j+ I1 {
}
( u$ B3 k* i; h3 }+ l8 |# P if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 v9 l' S# i" m2 P0 I) \
else nReturn=GetExpValue(t, csym[0]);# j5 E* \/ R- M7 \! H$ `5 b
return nERR==-1?1:0;5 T6 U7 s0 N1 m/ i, j7 a
}}6 S% ^% l! b+ D4 c; E5 T) F
- n" [; ~! ]) q4 e3 ?2 i4 b9 v
: n1 Z* C6 U* c' G函数模板使用示例:
* `: C- V" r8 M5 n) E在以上那段代码的后面加上以下代码:9 A' M8 \! N7 C
# ^. {; j& K6 {( g N4 \
1 D0 s% ]$ I" `7 x* A: q
3 E' W/ n7 W2 B; a程序代码:
% ^# Z& T L, D, x, p. y! x. N9 j% l# ~
#include<strstream>0 d1 [( d0 @ M0 W+ S H7 P- g, H
#include<iostream>8 o, ~* C' Z$ i" a
#include<string>+ i" N @( N: f% M+ Q( M& \
using namespace std;% L) p8 u' V) V9 Z$ m
int main(void)
& z4 r% }' V: q& b{2 B1 z$ M) _6 U8 `
string s1;
$ d \$ U# {0 z while(cin>>s1)# @% r$ T4 b( E. p% H; E4 P
{
3 l( g2 k5 v: Y, p' F, M7 C istrstream isin(s1.data());
. k8 H/ y6 \* V. |8 T/ k double d;0 _( c3 P* Q. n' \. U$ X+ [% D
if(fy_Exp::GetExpValue(isin, d))0 p) _/ X8 e* K1 N1 Y. S8 c
{, ], H: w% W- B$ A' u
cout<<d<<endl;# [7 o/ i, J8 W, g& k6 Z
}! M O% X( F; @3 [
else. n6 _* W9 X! G; k- S$ s5 A4 n
{: P# |0 c" L' t0 H( p- h7 U
cout<<"ERROR"<<endl;
) J; s* r8 U: B }+ |: a, O" S! l
}
# g2 J, v& y* J6 _ return 0;
( j; k7 G2 |% F1 N$ s' l. m. H}
8 C. n8 M _) Z* t( ~6 t8 ]
9 A G8 C3 O1 v; @& R' e T* M# ~1 B# G2 L3 ]+ z5 M
然后编译执行就可以了(*^_^*)
, }6 K0 ?- `# n; {3 _$ X其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 t( S6 e4 e3 ?8 p0 |
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|