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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
* X8 ^" O# h+ k( C9 R一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
0 g( e v% L* v1 K: t; Y# J只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn) g, R1 S* p$ B6 _9 X/ c
参数解释:
( Y( \# B1 D0 _# _% B+ G' Ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
, S0 t B) [/ k/ r1 onReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
E- z( |! q* A* P; e0 K返回值:6 F; {# x) s5 \7 E8 X6 g: x$ T
返回非0表示计算成功,0表示计算失败有错误
C q$ N; M0 U6 S3 M' i. p- j9 ~
! t: N4 h! i d4 B# J' e6 J5 k# ] * E1 r/ i) M; A4 R% g5 a& H; E. i
( q7 g, {* r0 H程序代码: . `1 M: K1 K! j, u7 q" ]# D
9 O; z$ j6 O [0 P Z" i8 Knamespace fy_Exp{$ d+ |9 a. N) X8 k) Q# K) v
namespace {template <class _T>
- B+ H& I; ] w7 r& H w2 O0 cinline _T GetExpValue(_T t[], char& csym){
* F$ U7 ?0 ~0 ^6 ]$ q: g char c=csym; csym=0;
& q6 G- {' _% M switch(c){
" M: U0 f3 i+ ]0 r! B8 j case '+':return t[0] += t[1];4 s5 _& _+ l& P T- ~$ a" i
case '-':return t[0] -= t[1];
g/ m' Y% _( l5 P case '*':return t[0] *= t[1];. @- b% N( p2 F2 `
default: return t[0] /= t[1];//case '/':
! }% m+ _9 ?5 v. q }
& ^0 e- i A7 \) i' G}}& }- ?7 M) `1 f |2 R5 b
template <class _T, class _Tstream>, G; I `0 ~8 g; N6 n* X1 o
/* _Tstream: inputstream, _T: get return value
( J- P7 z! `) M* Return nonzero if get value successfully */
% |# e+ R6 g* r. a* Q1 r/ vint GetExpValue(_Tstream& istrin, _T& nReturn){
+ z3 q. x# h6 i, v) } _T t[3] = {0}; //雨中飞燕之作
, x2 ~$ g- H0 j0 k char csym[3] = "++";/ _- x. m1 G$ j9 L0 |5 p
int nLevel = 1, nERR = 0;
9 b- C, R$ R) Q2 K1 ` if(!(istrin>>t[1]))istrin.clear();: \8 }+ ]8 ?' t$ J- p
for(;;){
/ k: I4 T/ R/ @% K% b' a if(istrin>>csym[2]){1 A: S. G& V4 s/ G
switch(csym[2]){ |' q7 t) [- y1 U; _( i: ^- A0 x
case '(':4 ~3 J$ j* \, |# M; ]: d% L: }( s
if(!csym[1]){nLevel=0x100; nERR=1;}else
# I2 B2 y4 v. C0 d if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- n1 o' ^. _2 b/ B% ~. U else{nLevel=0x100; nERR=1;}
{/ G0 ?7 r: I$ S) S E break;
0 h* J6 W) B; R$ [4 I' x8 C case ')':
, ^: A- ~0 ~5 W0 c {nLevel = 0x100;}break;. e; c2 n$ D/ b6 J2 V
case '+':case '-':case '*':case '/':+ }" n& e$ s1 l3 o
{csym[nLevel++] = csym[2];}break;3 {3 q3 i, W' N- C) E8 W5 e% d0 t
case ' ':case '\r':case '\n':case '\t':continue;
q+ r% S% V2 L& H1 A8 J) C1 K2 W default:
3 ?( Q( N2 r" j6 R/ ?. P {nLevel=0x100; nERR=1;}8 [/ Y( Y8 X( C* f/ q5 z
}( x9 T/ f+ ]' y9 j% X0 g
if(nLevel==0x100)break;
% r6 J/ ], K# B+ B' K if(nLevel&0x10 || istrin>>t[2]){
6 h& B( O2 I* k. Q% g$ H" W nLevel &= 0xF;
: ~ k+ [* O7 Y; B. D& h if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}' U, |# r" K! U, x8 h4 x5 u
if(csym[1]=='*'||csym[1]=='/'){
0 v: z4 y# G3 E+ ? GetExpValue(t+1, csym[1]); X7 p5 _3 E- ]4 Y) z* v8 P5 I
}
( h" K4 G1 v$ \ else{
$ |, S* b' h7 ], G5 P GetExpValue(t, csym[0]);
& d% {7 _- u1 Q* O( z5 F# h* Y t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 y, u0 b2 E4 m2 n) Q
}
4 b/ G( L+ r8 r' U, E nLevel = 1;
}5 m; R/ F! m- N# p0 G) A( M* F9 ] }
! H& Y9 K* u# R9 ?: h$ Y/ \ else istrin.clear();
! O' }9 q' [6 {3 d }
5 @) e' ?/ L: v1 B$ i( b( K/ ] else{nERR = -1; break;}$ Z) e# Z, }$ c5 ?. D& k! |4 V
}
, G# b3 d8 @" G% c: i2 Z if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 Q; E6 P6 U5 E9 P* t
else nReturn=GetExpValue(t, csym[0]);
4 c/ B' j. V- r3 I, b return nERR==-1?1:0;
7 p" n2 t- ]( g) F- V* G2 l}}
9 ]- o: @5 y) `+ Y) n: y: P, x" k) ?& O H l0 a
$ F5 `1 J n- b5 T* j
% c4 p) }4 u% l3 ~! ~函数模板使用示例:
6 s/ \" P: n; [# B r# S: f9 A% N在以上那段代码的后面加上以下代码:
, P1 I; w% ^0 M4 c5 z% N3 J- m- ]& R8 e2 h7 y2 h; R
5 N4 [5 h- B# Q1 d
# L5 W! V3 w' h7 N
程序代码:
6 V# }; S6 G5 j# {# M6 h2 T: G- P( x$ @) X9 v" t' l
#include<strstream>3 I5 X/ B- q* M( U" f6 F
#include<iostream>8 U7 d1 T$ l8 Q. C' g% J2 ]
#include<string>. ?. G" {6 f! ~/ |
using namespace std;
( g. a7 X) |! o! S* eint main(void)
( ^4 w& y8 R6 x3 b: f5 u1 Y5 Q j{
2 f: E' r. U* `5 B. A% G: T3 ?3 ~3 [ string s1;
: M2 X8 `/ C0 t while(cin>>s1)
+ ~7 T8 l* w. m+ S+ L1 e5 S7 I {
9 J# T- _; W5 \( i istrstream isin(s1.data());6 O+ [# I, M$ M1 N' V$ D
double d;& L0 l- u$ _$ A8 _
if(fy_Exp::GetExpValue(isin, d))& @/ {" u* a4 i
{) L i# _& M. r4 |& S3 p4 C0 ?
cout<<d<<endl;
+ [5 L! I1 {7 B- k5 d/ P }: ~. e5 t+ F6 B8 S+ j6 n
else b( ~; s$ d3 g7 c2 q& v
{7 ]7 O7 G3 X6 Y
cout<<"ERROR"<<endl;
( u5 C* O. K# o) g1 s9 c }0 t2 J" ]/ \( F, G
}
% ?9 L$ N, t b return 0;
4 O$ F/ G! a, w7 d9 R5 a& }5 j}
5 W3 i7 B8 i/ ]* |# a- k& ]. G2 p/ W8 d$ M
& {- c$ g J$ f( T
然后编译执行就可以了(*^_^*)9 x8 p' e* l/ \; d. l) Q+ ?# j
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
- y% n3 q0 v/ j6 X 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|