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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
I5 d2 @, u6 S& I& Q3 r1 a8 Y4 \一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" N1 _& y8 h: L8 Q. L3 Z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 V/ N7 l8 L* E# g% U参数解释:# [1 s9 `" r! N
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 L* q9 w' e( @* L2 e7 d
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 b% z6 V- e" {& t& \& |返回值:
# _: k- I0 k) A6 m返回非0表示计算成功,0表示计算失败有错误" e# t; l2 Z8 b
6 Z# B: I5 b% V) Y+ Q
, K8 E' S! _7 X9 D5 m/ a( y
5 g3 h) r5 |; s程序代码:
: w( t( `3 P6 {5 F+ g, ~2 ]* N+ b# h+ R( A( k& B+ E/ r( K( o
namespace fy_Exp{
2 b1 h! |- B( E# fnamespace {template <class _T>
0 I1 m- A+ [) E7 L- [8 I; x% Ninline _T GetExpValue(_T t[], char& csym){, z' [* @$ e5 b$ _& @
char c=csym; csym=0;
! ]# m0 a8 ?6 K9 m. J switch(c){" a' s7 I( b! G* I9 w! A
case '+':return t[0] += t[1];
* ^6 T$ o7 B2 R# I9 ~! _ case '-':return t[0] -= t[1];
; k4 V& Z) t5 O. i* o5 B; N! n case '*':return t[0] *= t[1];2 V) V( D, x/ p" C4 K8 H# j
default: return t[0] /= t[1];//case '/':
4 L) X9 f5 D# [; _+ m( r9 t }
% }5 q+ D4 _! h) Q, [/ v ?' Y4 f}}, x' ~0 B1 c; G, s0 l5 S
template <class _T, class _Tstream>
1 p, G. F9 ?0 {/* _Tstream: inputstream, _T: get return value! r- y- p# i& H; a% V
* Return nonzero if get value successfully */
; j. D+ P. j+ R, J3 E2 s. O% |& Z; kint GetExpValue(_Tstream& istrin, _T& nReturn){& P4 R8 X( ]+ a% f' X, i
_T t[3] = {0}; //雨中飞燕之作
& [) M, v' M! J9 B) w char csym[3] = "++";
' i% B- d8 q% G% U int nLevel = 1, nERR = 0;0 p: m7 a( G6 A3 U( Y* X
if(!(istrin>>t[1]))istrin.clear();4 _. i+ [! B! H V3 n% @
for(;;){# Y4 ]: q, E) L! g! m
if(istrin>>csym[2]){# W1 X$ C7 e2 D6 \% t. e! O2 n
switch(csym[2]){
0 _7 _- ]. O( @8 N g, r, j case '(':
& b. ]! T. O6 d; h2 L8 R if(!csym[1]){nLevel=0x100; nERR=1;}else
. O6 R9 }; t. m. \$ l# J: e+ | if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
6 p& p& J( s) z' D, P/ S. ~ else{nLevel=0x100; nERR=1;}, G+ u2 @' z" g$ a
break;
; N/ }) w: A1 E+ q. `9 D' M case ')':
- ^) P3 R8 H/ @6 B0 |7 E1 u+ D2 g {nLevel = 0x100;}break;
( Q2 _, N q+ p& w0 O0 K case '+':case '-':case '*':case '/':
& e8 q, D* [. @5 b2 @# w {csym[nLevel++] = csym[2];}break;
, c H- Z. R4 d4 a8 V ` case ' ':case '\r':case '\n':case '\t':continue;
+ c& L+ w& T) f, s' o ^1 H+ p6 E default:
+ ]5 @, r8 {/ C4 n1 {* k$ A {nLevel=0x100; nERR=1;}) B1 G) ]7 z+ k3 W
}
; _( ^; u" S. M* D" u* }3 c: j if(nLevel==0x100)break;3 [2 p9 P3 l$ r6 {, p
if(nLevel&0x10 || istrin>>t[2]){" S2 a- W' j4 l& M3 [
nLevel &= 0xF;
# r# ^$ r* p9 r6 C: _$ U; [ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 X( W$ l0 M# O4 J* k5 F
if(csym[1]=='*'||csym[1]=='/'){
. m- P1 P( N& q+ Z, q0 P$ X( Y0 T GetExpValue(t+1, csym[1]);3 G, h9 G# F# A" t5 T9 _
}
, B! Y% I- c) I! n: b4 y4 } else{0 g8 p( @3 j6 }8 l7 N
GetExpValue(t, csym[0]);) w& N M- I, Q8 x0 x
t[1]=t[2];csym[0]=csym[1];csym[1]=0;" t; ~$ m, \3 _
}
# t, u% b g n' [- c" n nLevel = 1;) [( s3 u$ B" `% E3 S3 W7 I' k6 c
}
5 `9 i0 P$ e3 L3 k( y) M else istrin.clear();0 \! u7 v" E4 Q' h' ~
}/ k' p( B; Q! l' T2 j
else{nERR = -1; break;}7 ^( h3 D+ {' S) J- f9 j
}
( _3 }0 K: Y5 m! D! Q if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& e. S9 f! ~" S else nReturn=GetExpValue(t, csym[0]);5 u$ [9 H/ X( F* [$ c
return nERR==-1?1:0;4 d! N& }! K) S: \. _1 T/ Z
}}/ A/ v5 F! `! b
9 w8 s1 _' u' K+ I) u/ p+ m) a! L
1 y7 ~# Q f: g: u
$ s$ r. j) Y3 `) C/ l. L a函数模板使用示例:
- t) w" G- S" w2 g" E在以上那段代码的后面加上以下代码:
2 M1 f5 ~8 c$ n, e/ r4 s" H9 ~7 \" q4 F2 z6 Z2 x& D4 J* S
" ^6 K* F2 e' r' h
- d& I' R" g2 O& D" s' i* x. I程序代码: ' z$ c$ |# h+ C6 T% J
' W. n( L( a0 I4 _ v$ k
#include<strstream>
( @- h: w! ~" @( S2 u C" Q#include<iostream>
5 E& m! F. ^" J! o; g+ i#include<string>4 S' L. _9 d& ?4 Z: Z
using namespace std;
8 V1 b" G% g( b4 @4 ]1 E2 d: Tint main(void)
- O9 k% [$ g9 C- e{% x) T2 w* X0 O8 D- u; L
string s1;6 K3 ~4 S) j3 W$ P% I: n0 ]$ u; M
while(cin>>s1)& E( |* |4 c, p/ `8 S9 `. L2 U( y
{. z$ V/ d4 y4 y' ~6 U, Q( s: z
istrstream isin(s1.data());2 z$ I9 [) Q2 e) g) l$ x! W( o
double d;) D) {0 d" I' b( f4 j
if(fy_Exp::GetExpValue(isin, d))
, C) }2 s. [# ?! `+ c7 V {
$ u$ f) u2 C* Q; A u3 u/ n cout<<d<<endl;
7 D* P+ {( b$ ?1 W7 E# K5 s }
' L5 Y& v/ _) t" o else
: y S/ T2 y z) Z7 J9 k {
, L1 j8 i, F) N7 m: T [ j cout<<"ERROR"<<endl;
- c, M5 _6 o" o. p" } }7 p4 a. X( T+ A* C
}
2 p7 T, @* W1 d# ? s, H- O0 z' d return 0;8 J- m& N9 B+ P: v% i! o
}8 h' m- I9 J% y) }3 L; s
1 A! r l& k- S' x
1 `0 C1 F* F% |/ k7 f/ O
然后编译执行就可以了(*^_^*)/ P8 D7 n: j1 Z, T Q
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* r r1 L2 j/ _( c% y$ }$ @ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|