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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,- @! Y1 `5 Y2 h ]& U( B2 D
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 T# n( P w( |. S6 v( v1 n" ?
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)# K1 {# ^# d, i4 S8 R
参数解释:3 x# c- _. g" q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% W4 P+ a% s& j# p4 tnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 @) {1 a$ c/ \# Y v
返回值:2 K6 V! f2 C2 o. r. l3 k
返回非0表示计算成功,0表示计算失败有错误) f) v, e ]( f. A% }/ s$ F
0 |, L' O: `: Q* a8 r" {
5 r1 F# Q4 e- L# m/ s- d' I B9 W; K7 M
程序代码: ; \1 p# p6 b: K, I6 g% H
; O& w3 e# l$ D- W$ Wnamespace fy_Exp{
) ~. x0 r0 f9 x; J( ^: f! Tnamespace {template <class _T>
# F5 _1 b; o! t; {) \8 o* ]0 Uinline _T GetExpValue(_T t[], char& csym){
$ r5 A% M7 O/ Z6 F& @3 {5 r, W char c=csym; csym=0;7 g$ i l+ u) _3 @0 ~ I& _0 V. \9 ^1 Z
switch(c){
0 V3 }8 s; G. `. R$ w case '+':return t[0] += t[1];
) g2 z2 ~" r$ l: b2 a case '-':return t[0] -= t[1];' D) O' w' g0 N& f0 W+ C
case '*':return t[0] *= t[1];
' o) Z5 V7 B7 r" y0 s, Q; P, v) s default: return t[0] /= t[1];//case '/':
) M8 u: z' e3 G7 R5 Z. d( | }2 ~% I+ C( r8 a/ ]( m0 I/ t! L P, a& @
}}
6 O3 g8 X: i) y X: {6 rtemplate <class _T, class _Tstream>
+ L- f1 B4 x3 E/ j9 @/* _Tstream: inputstream, _T: get return value: q# R) N% R4 M W) u& X) V8 e- t
* Return nonzero if get value successfully */
2 `6 @7 |$ }9 X. B" ]& Cint GetExpValue(_Tstream& istrin, _T& nReturn){1 G- ?+ f: V, }- R3 N- Q
_T t[3] = {0}; //雨中飞燕之作
& v3 y7 O# y8 N, x; v! z char csym[3] = "++";; q* I2 ^; q+ [9 |2 n! K h- _
int nLevel = 1, nERR = 0;
6 p5 Y6 O+ ?: x0 I! { if(!(istrin>>t[1]))istrin.clear();. i6 _2 X0 V* \7 \
for(;;){, k( \8 i( W- W9 q; P Q: S# y4 h+ r
if(istrin>>csym[2]){
. S* L1 P7 f5 k switch(csym[2]){& U- c6 Q" K" Y" I0 x9 o
case '(':8 b7 i C" C% D- {0 ~) @
if(!csym[1]){nLevel=0x100; nERR=1;}else2 x) I z! J3 ^6 H% F9 D3 w
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 O1 [. U, J: B' {9 S else{nLevel=0x100; nERR=1;}
/ B& y. p+ B: d break;
* z$ d+ I' l' O5 v case ')':" e: d$ `7 }3 G1 H+ U2 n* `: `
{nLevel = 0x100;}break;# p& T6 `& h' ~* V) M# f2 Q8 ~. _
case '+':case '-':case '*':case '/':
' P( ^5 |: }% _4 R$ B: W {csym[nLevel++] = csym[2];}break;3 k: m" l1 C" P# y6 p
case ' ':case '\r':case '\n':case '\t':continue;
& ~5 m! ^- X/ I+ h default:
5 P' d1 N1 p# ]7 V# R" q {nLevel=0x100; nERR=1;}
7 \' _' |+ x+ @ }" j1 U" X M6 @
if(nLevel==0x100)break;
% ~: N# ~' C$ ~ if(nLevel&0x10 || istrin>>t[2]){
; N' r$ v' C2 Y" ~% V$ _6 w nLevel &= 0xF;: e; T0 X' h- c$ N; H
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. N$ P; r+ \ i
if(csym[1]=='*'||csym[1]=='/'){8 g6 d v3 Y5 _; R o0 ?9 x
GetExpValue(t+1, csym[1]);' Q" Q7 t2 Y4 D4 T y' V9 z9 `" G
}
0 C0 t! o' k. \3 v+ L; a else{
/ d. R1 `7 W% h0 B7 O) a GetExpValue(t, csym[0]);
5 f# j; i7 D+ Z. [9 g+ c! T4 n t[1]=t[2];csym[0]=csym[1];csym[1]=0;; z3 {% L: o9 m) o$ ^
}
3 l$ y8 v2 P7 s nLevel = 1;% {( Q" T9 `, z8 a A# ]7 {; t
}/ \' y" X$ I7 _5 J6 ?5 B
else istrin.clear();& Y& B; j2 T9 j9 v3 U b5 k) Q4 w
} u. }2 m: L9 P5 x
else{nERR = -1; break;}+ d6 r6 V" O, ^$ {
}
/ S9 s+ t; ~3 L) [$ y* _ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 a& V2 o! ?) Z9 S- l7 Z4 s! p1 h' M else nReturn=GetExpValue(t, csym[0]);
& h9 @$ R9 w) Z) p return nERR==-1?1:0;7 j) L) W q$ n9 X% d( d
}}* n. Y5 M' W U" n
6 T" S4 N- o1 C/ \& x8 t5 K+ T0 s& y5 P6 a" W
3 a& @& ^( ]' R/ d) K' J
函数模板使用示例:: c& _- n+ z( I) B, h) e
在以上那段代码的后面加上以下代码:, w2 |: _% {* A9 ?% z
) r" n! H) U9 J9 V- }0 _
; Y& ?+ c" u3 X9 }4 x, w K+ B
3 ^3 Y6 S+ K' I程序代码:
& i, G* V8 Q0 p2 P& m* ?" u# [3 @7 s% o d) H" v% a* @
#include<strstream>! F( q8 M! }) ?, W) m
#include<iostream>
) `* X2 N% a# Y#include<string>
1 A) v& n. I; c+ jusing namespace std;( g2 y7 B3 J0 s+ r+ y$ g+ H
int main(void)* n7 y' H: _( U- C, y0 r2 X0 k
{1 d2 L# g/ i/ B2 w7 m9 Q
string s1;; T+ o$ A- q4 ^+ d' x, s7 R
while(cin>>s1)
& k, i( [$ a8 p$ n& V1 R1 B {2 i# w- w$ w" e/ I1 A& {0 j
istrstream isin(s1.data());6 ^- e1 W* W( a8 O( X3 F9 O! X d/ z S
double d;
5 p' N; I) ], q' L1 N; {3 X if(fy_Exp::GetExpValue(isin, d))" p7 A- K3 I' [/ s
{ ^/ W; v6 W0 b0 x% }7 v
cout<<d<<endl;( M' N5 u; A; c0 `
}
/ x' ]. k6 V( z7 i" N else
w" o' l3 r- c1 _) D {
z& h0 ^1 P" B8 a cout<<"ERROR"<<endl;
. z# |1 [$ A6 J* |- n1 N% o }& s2 ?5 {6 O! S4 v* ]& v
}
" @3 T( i. H( ^1 P9 s) w- h5 g( x return 0;
" {) _+ T7 b, n$ q}
9 F6 o. ]' ] K: e( D9 L- y7 P4 @
5 Q( O* v$ u- L; `
: B+ p H4 l- E: [然后编译执行就可以了(*^_^*)/ O! G4 A% k: | V1 o" N. L; c
其它:TC++上一定编译错误,不保证在VC6上也能通过编译! o+ z9 ~" C" j+ g% U- H! U* G9 a
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|