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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,! Q% B3 l* B- o% _2 h F: f
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
0 `7 F% K. J5 {/ H只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)" J/ w' q `, B+ M* A: ^: s. W$ D
参数解释:
( k; N4 x- R! S5 r8 J0 Eistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" h) D0 v. ?* Y, wnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 s$ `2 _* ^% @. M5 G: u5 X
返回值:
2 H( e d2 _: k% j返回非0表示计算成功,0表示计算失败有错误5 G( n8 r+ D2 H0 Z- c7 a
1 e9 I, b1 Z5 U* N8 C, w" }
& F& J1 B9 v J H+ q% S2 F9 T2 p- @
* P0 L2 z' J/ z) @; b; o程序代码:
, j6 C v3 e1 @; M- x8 g: I% F( u0 `& t$ K" b
namespace fy_Exp{( U9 x$ _" K' f, G7 ^, u; ]
namespace {template <class _T> r0 {$ I- q; G& U/ \6 W
inline _T GetExpValue(_T t[], char& csym){% U6 [% I6 w! S+ r
char c=csym; csym=0;- ?3 _ g0 Z* \7 u7 f
switch(c){% t D! ~. V% H. r; F: I
case '+':return t[0] += t[1];% ^& S0 i: S* I5 k' Y
case '-':return t[0] -= t[1];
/ ~0 M1 U0 A, I; H$ l- k case '*':return t[0] *= t[1];' v: Q1 d, U6 L) D8 K
default: return t[0] /= t[1];//case '/':
2 @) W0 h! w. n4 h/ i; Q* V) H/ M( B }+ p+ T9 F: U$ Y' E4 l; Q& W w& I2 x4 D
}}
5 |2 A% a4 N" X& f; |& l7 a! }template <class _T, class _Tstream>% g) k; ?9 G' C9 i
/* _Tstream: inputstream, _T: get return value+ ?" _; o. d& y
* Return nonzero if get value successfully */
. c$ {& B2 E7 I+ w; ~' {int GetExpValue(_Tstream& istrin, _T& nReturn){5 x$ |% I' w3 y* Z! G; B1 }. T1 j
_T t[3] = {0}; //雨中飞燕之作. e% a+ c3 Z! r* S; Q
char csym[3] = "++";( t$ O0 M; s8 ~$ q$ J6 w% U
int nLevel = 1, nERR = 0;
# c! H2 ^+ T* [" y1 x+ ?9 p if(!(istrin>>t[1]))istrin.clear();
. _ H: m' a z- L for(;;){2 w' q: T# r/ q
if(istrin>>csym[2]){. i* F1 B# j: A
switch(csym[2]){
& U, H4 E) z }! y' z* k; J case '(':1 w& ?( Y; Q9 q$ t
if(!csym[1]){nLevel=0x100; nERR=1;}else
k: P# ~' S. H/ u if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
* x9 O. l2 e/ f, i8 w else{nLevel=0x100; nERR=1;}. g7 k% h& Z8 z& k4 P4 Z. _
break;% E; _( Q' B j
case ')':
% ^5 H/ Y! d- L" { {nLevel = 0x100;}break;
7 ?9 m# z, r! \1 X case '+':case '-':case '*':case '/':
9 f K- L( E5 w' t" ^ {csym[nLevel++] = csym[2];}break;
& w8 `) I/ D; ]. G! y6 z; E case ' ':case '\r':case '\n':case '\t':continue;& r9 }! v9 M+ P" H4 k5 W
default:$ k2 u) j! k& ^1 r7 E h% N" a$ |* P
{nLevel=0x100; nERR=1;}9 V$ n: g# Y" Y
}
3 B! s5 @+ \) O% L if(nLevel==0x100)break;1 n7 X5 i2 G, _) D, K3 B) t% n( G- S
if(nLevel&0x10 || istrin>>t[2]){0 r: v. T' N( a, {+ H0 ^) Y
nLevel &= 0xF;
1 K$ h! g$ C1 _# C3 ^ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 Z, G g \; S' i6 J if(csym[1]=='*'||csym[1]=='/'){
9 M1 R- n; O1 j2 X! c/ P GetExpValue(t+1, csym[1]);5 B6 {4 x& e$ b t: E5 e$ w
}1 [5 a, N/ S0 `1 O1 e5 N
else{% o; _' E. P }4 H% l: m
GetExpValue(t, csym[0]);* Y/ ~) Y A' J5 l* z
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- @3 Y, J' C* I9 Q }
5 T. x/ X% Q3 A: v) @8 _$ | nLevel = 1;
" X7 ?! _, B. w* H- b }: W3 e6 c5 K: _1 x! [
else istrin.clear();' t+ J7 W/ f+ h8 m6 m3 c! [" G( C
}' U r# F* y4 c8 b
else{nERR = -1; break;}
) t, N- u, f6 W- i" W+ ` }1 }. P+ P2 S) m/ i4 c; R
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& y2 M2 ?+ b8 o9 B- v+ D else nReturn=GetExpValue(t, csym[0]);8 l# m& p- r. \, q
return nERR==-1?1:0;
9 |, H; x+ k A}}
8 Y$ P" D3 P& c
" Z) i2 X2 V9 C. @4 F: J8 T' V, o1 P1 W4 W5 [+ v. I& c, m; n
g M% H; ~& ^5 ~2 _* \函数模板使用示例:
& [. \! d6 i1 T在以上那段代码的后面加上以下代码:
* R! T5 A4 J5 E4 z) ^" M( C$ S" s8 J- V% C' s- _3 A/ I8 Z
8 h* o) N; [& t1 M& F: M. M, Q
+ D# S$ w; }* }% [1 v: w3 \程序代码:
/ J+ _2 o- x! _7 L5 m* S6 W. L, L! p; Z! \& r- I# E5 U! m) v
#include<strstream>9 d+ E3 |: [! w- n' a9 X
#include<iostream>3 I* |" b7 |6 Z. I
#include<string>1 m" f1 i% R6 y' t+ e
using namespace std;
+ i9 k2 A/ Y8 {) L6 j7 P- \% rint main(void)+ P# R: R* S' f+ g$ K
{3 X% u# e6 L+ s# s# |9 K- r4 S
string s1;
: R1 d" `2 P, O$ W- B6 ` while(cin>>s1)
2 D3 ]- @, A+ o- a! |. n& N {& _) d( o! i1 o" i
istrstream isin(s1.data());- } U! k; [0 p" W2 |+ f) r) F
double d;
* o) q( D& f$ v% d6 g if(fy_Exp::GetExpValue(isin, d))
6 F" q: L) D6 ]5 U0 f" z$ T {' q& M, E$ o" [: x3 t; P; |5 U
cout<<d<<endl;) @* i# r* s/ U) [. ^
}/ Z$ M }& f" Y% b) {) o" w/ m
else
5 _* k( M" S8 m2 O _% f {9 J- a2 F" r4 N% }( f$ a9 q
cout<<"ERROR"<<endl;
! J7 x( P: c% G; O/ R9 }0 {; a) Q9 S; { }
; ^: u7 u8 [% G: J4 h% x }
3 h& z7 E! F0 f6 U return 0;
4 a6 B4 o* e8 l( W+ Q7 E4 t* y}
8 A, K2 L1 c, l
5 b$ O$ u7 z& b. o+ ^" t4 A; _7 d% |% d
4 _* s3 b9 w5 T+ A. E O+ R1 T然后编译执行就可以了(*^_^*) h) q4 W( w- w( o* z
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: m9 C& W& \, E S1 O 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|