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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,, ^6 X1 O- r/ ~8 ?
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) C4 n/ U! ^3 ~6 y" X% B7 o* H
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 \5 l" q9 z) S$ v+ O. Q: W8 C
参数解释:
( u& b7 f5 n5 n7 N) u {! ?4 D2 |istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 ]2 M- ?: |+ S5 \. b# n" }1 \
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 g, B$ I/ D3 H
返回值:3 W/ r8 @/ h. V; m
返回非0表示计算成功,0表示计算失败有错误6 [/ W7 ~: l' `* Z. W4 ?% ^) \
3 w3 {, N$ w0 X& ^9 A, W0 E. ~$ g3 w
( l2 ~5 _& j( j6 T& T; \2 q5 A1 S
6 [% ~6 p( E' x1 y+ U8 m7 H
程序代码:
* ^* S) i3 X( \+ a# I4 ?7 a7 A) y" T9 n X5 n5 H1 |! v
namespace fy_Exp{
. ?; q5 p& s E" b* Lnamespace {template <class _T>
j" K: w' G! W3 Xinline _T GetExpValue(_T t[], char& csym){& Z0 E$ T* C& B& e
char c=csym; csym=0;
" v- e4 E) b2 T: t6 f switch(c){
8 ~7 t4 ]! Y7 I- j p' \ case '+':return t[0] += t[1];
( G- v. R6 ^- a" ^2 P2 E case '-':return t[0] -= t[1];
/ v4 h# F$ T( B/ V, e case '*':return t[0] *= t[1];
. F+ ?/ g/ I/ B+ Y1 z4 [ default: return t[0] /= t[1];//case '/':
/ @8 Y" T/ |7 r& |8 g! s; c# R }
% s& l+ |0 g# N7 }4 k2 y1 M}}: q/ |+ I( D5 u
template <class _T, class _Tstream>, r% \: A$ L7 s: M
/* _Tstream: inputstream, _T: get return value
& l: e# G' j# |* Return nonzero if get value successfully */5 s K" v! t$ R5 F
int GetExpValue(_Tstream& istrin, _T& nReturn){: m7 X1 [* {4 R0 s3 a
_T t[3] = {0}; //雨中飞燕之作
. N: q1 ?% b2 X char csym[3] = "++";
$ R! g; e2 a4 f& x7 n: Y int nLevel = 1, nERR = 0;
9 d% W# z: `3 ^ if(!(istrin>>t[1]))istrin.clear();- p( Z0 p0 ^- M+ F0 u' z: I
for(;;){
' @3 j. P3 v4 I5 H if(istrin>>csym[2]){; M) g( u- k. z, ~% f& e
switch(csym[2]){8 @& z2 o+ R, e9 s; r% S) v
case '(':
+ H( n/ U% o; Z- a ^" y! y: |3 O if(!csym[1]){nLevel=0x100; nERR=1;}else
0 U: @/ M2 U7 Z& U4 C i9 _" [9 [0 a if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- d+ L2 A9 S$ Q, J5 F) m) U else{nLevel=0x100; nERR=1;}$ [* E6 j: a$ V( _- a
break;
3 a+ q' T0 o- t4 T" z4 E case ')':
I& `2 O, o1 v, r. q {nLevel = 0x100;}break;' o8 b# x$ |2 C+ y
case '+':case '-':case '*':case '/':6 r- y- V+ T3 Q3 v
{csym[nLevel++] = csym[2];}break;3 e1 `; Z3 e: \& R7 ]: Y7 p
case ' ':case '\r':case '\n':case '\t':continue;
/ W' M+ n% b: m7 G7 `0 d3 H default:3 r* Q2 N, L+ I7 \
{nLevel=0x100; nERR=1;}
) k1 n: J* S* y9 `# k4 ?1 _: D }. W# k( v& z" F* }$ y! Y
if(nLevel==0x100)break;7 C' a0 L9 [: t7 H' S6 P
if(nLevel&0x10 || istrin>>t[2]){3 r8 p( c) B! F5 R( W$ r) U
nLevel &= 0xF;
1 o, g$ y8 U Q0 O if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 b# E. j! [3 k3 r# m$ d g
if(csym[1]=='*'||csym[1]=='/'){; A: E7 N* I; s* i; _3 M
GetExpValue(t+1, csym[1]);
- I1 p: m2 W0 j1 q/ M }
7 v: Y6 |" X. @9 s6 q) Y8 H else{
) ~8 i r3 S6 r1 U/ @ GetExpValue(t, csym[0]);
+ T/ Y" M5 K. }: l% d$ }$ j1 r t[1]=t[2];csym[0]=csym[1];csym[1]=0;; Y5 K" F" o& F% D; ]/ G3 f+ h) I
}$ E4 R+ V" H, A% `+ ~4 o0 [! g* ~& ^
nLevel = 1;
* E+ V/ f- [( h! q* {% h6 c3 f }
$ K% H+ [; K2 \5 w) z else istrin.clear();
- a# j# G! U: I R }
' e* q- Z+ z" I, f$ a5 \ else{nERR = -1; break;}
. P: V+ w! l D5 l1 I }
: z0 z! j& f4 N! A3 p& e if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; I5 ^6 Q* g* B4 j; W- @
else nReturn=GetExpValue(t, csym[0]);
* U: M" N2 R8 \8 Z return nERR==-1?1:0;
% u3 g4 C8 N( X. g& U/ W}}
1 z9 ~8 e* E" @* y9 Z% J9 e, t% S$ \& F f6 a
! z4 d2 l& V3 G4 n% p7 Y" }
1 D% G/ p5 _" m
函数模板使用示例:
& S6 Y* p a/ Z \7 \6 m$ K在以上那段代码的后面加上以下代码:3 x; J( }6 |2 H& S# ^
2 o1 s3 ^0 t" k# n2 j1 ] * V. ^, w$ A+ S7 g
. l( W' g& _# i& ^
程序代码: & B, a( n9 V" c/ ]9 J$ Q
5 X4 a* X4 W; V: k9 C
#include<strstream>$ r5 k* {/ j6 r6 s
#include<iostream>
# A4 c5 t6 f9 ?7 X( `7 F#include<string> u2 e) ~( K' ^1 k ^
using namespace std;
! a, E0 {( ~& D( U4 S% V$ Sint main(void)
, F* }* M' [$ o( E1 Z1 u{* Y y& q6 D! ^8 y# N! o/ R
string s1;9 g8 N5 a0 C2 f1 K. V' y0 m3 y
while(cin>>s1)$ C' W. B) ^% r1 ], o. A5 @1 ?
{
# b% f! G2 C7 u& W! l$ r istrstream isin(s1.data());* S4 Y/ P6 I' P
double d;
* n. r$ U$ y) a3 ]7 `- \7 T if(fy_Exp::GetExpValue(isin, d)); q+ s& a) G/ v" m" i
{
$ o# w1 r. \7 j8 s- k cout<<d<<endl;: f6 a: u2 d' t7 t/ r
}3 K" l/ K2 C/ Y0 g+ @; A
else( b$ E+ P1 h0 c8 {# F- g
{ p* R% \- w; }' F
cout<<"ERROR"<<endl;. j7 [5 \1 P# q I* C
}) U" B+ i1 A, a! Z
}
7 i- ?0 O8 C. x return 0;, U/ A1 P- l6 w# P7 w
}
* f( o4 g, { V! r& e. \) C3 Q2 i9 S ^1 q# k' o7 V% P
3 ^$ t, l$ J- m. `% y) M
然后编译执行就可以了(*^_^*)' g' R" V. S) K( w2 T. H
其它:TC++上一定编译错误,不保证在VC6上也能通过编译) c3 R9 y# Z6 p l: D3 L9 F
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|