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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 v5 L. I7 m! h; }- k# m一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" _, k+ m' Y0 ^& ~5 { M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* p( p( u/ Z# J% \' s* [
参数解释:" y8 ]: e7 q* A) V+ F
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& b6 i; C. T8 g- jnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 r }* S- ^' N) F* k' G
返回值:
9 a5 B7 k7 R- Z; |: [* j1 a返回非0表示计算成功,0表示计算失败有错误
: d7 b* ^9 @$ ^1 I/ s9 X) v
2 j% r5 H# ?* V0 r& Q1 g
, F" A* I9 }& V0 y1 u+ h$ J9 `# v9 i5 w$ `( n& o
程序代码:
- u+ b$ [" j, k: Q4 L' G* E
1 A/ H @* P+ x& Gnamespace fy_Exp{
" A; j! g8 k/ r9 |7 d, Y' ?namespace {template <class _T>
+ S4 v5 W9 w y0 o, w, C* l& finline _T GetExpValue(_T t[], char& csym){
) V& F$ B6 x/ l- [2 x( u- C char c=csym; csym=0;! R- Z& c0 ]- ^+ C& N" y+ o0 z
switch(c){" g1 }) Q( u6 t9 n8 R
case '+':return t[0] += t[1];! c+ A6 y4 {" e+ M+ c
case '-':return t[0] -= t[1];
M; a' ]7 ]% J t7 O case '*':return t[0] *= t[1];
' U+ w& N9 \! f5 {, R, g8 _ default: return t[0] /= t[1];//case '/':: }; H/ I8 V2 y: q* C$ A5 I
}1 n& O. q0 J- ]( e. C* C
}}
0 |# L7 A7 D2 U+ ltemplate <class _T, class _Tstream>
9 ^, r! H( B7 Q/* _Tstream: inputstream, _T: get return value
* |3 _4 Q# _$ I! _* Return nonzero if get value successfully */0 F# o; I; E: o0 ]
int GetExpValue(_Tstream& istrin, _T& nReturn){) y2 B" e) i1 H4 {" M% Z& X
_T t[3] = {0}; //雨中飞燕之作
6 G. }6 Q+ G2 c3 z- d char csym[3] = "++";
' U- w9 d, W) @3 p; ~ int nLevel = 1, nERR = 0;
) i" M( a. y' u) {- j( p if(!(istrin>>t[1]))istrin.clear();9 |5 P, d1 Y! ^5 ?4 N1 e6 {1 h
for(;;){- L) k- n3 f' @3 v# a
if(istrin>>csym[2]){* y4 B; k! i7 W
switch(csym[2]){: ^% J3 c- L# w% D1 h+ _
case '(':
4 } e" X3 i- P. q if(!csym[1]){nLevel=0x100; nERR=1;}else) H6 L9 }( G5 Z! o6 \3 r
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- r5 L. g3 [2 _5 ]% S# [
else{nLevel=0x100; nERR=1;}
" F2 K k+ C# `' ?$ B break;' L+ a! h7 I8 |9 y" y& }/ S
case ')':' J' d: Q& B- |1 r: ]! Y: d
{nLevel = 0x100;}break;
% T5 Z2 v. |/ D1 K" m6 z case '+':case '-':case '*':case '/':
8 r4 v w, w O& Q- X {csym[nLevel++] = csym[2];}break;
5 \; e9 ]( ~% e. A case ' ':case '\r':case '\n':case '\t':continue;
( A9 h" n" I; R% d: ~1 q+ u default:" F# k$ q7 n; N, Z6 V9 w1 T
{nLevel=0x100; nERR=1;}0 d! C" m; t! _4 v
}
2 l" [! V0 A. O1 X if(nLevel==0x100)break;4 t% v9 U: b& |( {" O
if(nLevel&0x10 || istrin>>t[2]){! V! Z2 i- M* y
nLevel &= 0xF;- B. e/ G# |5 d* O n
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) u3 \# Y3 E- C- J4 |# B
if(csym[1]=='*'||csym[1]=='/'){
# H- n9 C% V Z# n" c GetExpValue(t+1, csym[1]);0 G, M3 o8 |& I7 @5 X& ~
}9 ^4 G' T2 o4 D
else{' t# v) L" B( F
GetExpValue(t, csym[0]);
# b+ C6 K2 Y0 p! Z t[1]=t[2];csym[0]=csym[1];csym[1]=0;, E5 u% \1 l. Z; j i( s, v. @; u
}5 j6 |: F$ y$ z) ~2 s
nLevel = 1;4 X6 x" B7 h! s i, o2 n& D3 k
}
* X/ I: D5 u0 P- c else istrin.clear();
$ z! }* w7 _% D8 ~; Q }6 i; s7 A: A: Z h8 C
else{nERR = -1; break;}. s% D7 X! u* w! P8 ?1 J6 ?% P
}1 D; R) S0 I9 A2 C5 e
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& U7 ]1 L9 G7 Z( ^: Z3 W2 Q else nReturn=GetExpValue(t, csym[0]);3 P4 T: x% {6 h+ K* e6 f
return nERR==-1?1:0;% c' o: x! l% E5 ?" |& z
}}1 ? O# m7 Y& I+ Y q7 Y
4 f3 o' [8 \" H1 z! G
# S# Q+ f, n) \ W8 l
" e6 o' k6 {8 q; Q1 j) N函数模板使用示例:
; @( @3 m! r1 T- f5 b1 b在以上那段代码的后面加上以下代码:7 u$ t6 ?# m% q- }0 E
8 V8 Y ~& b" m
/ r# e' D8 g; }! _4 V, Y9 R
Z8 }6 L* @4 o' `) {: }9 P7 ?2 D2 R程序代码: * |' W: _1 B3 o1 G! O# X; k# g) U
! k- u* h- P" \. Q+ W) ^! A( k* I- m#include<strstream>8 |( |/ T- s- |/ X" D) e0 L" k
#include<iostream>
# o: Q" ]( [. _5 O' y, b8 ` e#include<string>
0 u3 q1 \3 P2 ?" Cusing namespace std;
: J4 U; f! R6 \7 B: @int main(void)
# l9 g1 ~% x ]{5 n+ k, f% {# d+ r. x; v
string s1;% e: w9 B N( y T6 |" K9 f
while(cin>>s1)
5 @' C$ Q- X" m5 I3 z8 M {2 B- D/ O' D; {
istrstream isin(s1.data());$ @7 f9 e& E3 ?
double d;0 I: r7 x N, s7 p) M% i7 Q7 v. o
if(fy_Exp::GetExpValue(isin, d)); }8 R9 T8 ?4 x+ [! T, u0 x
{, D- q* }' x) [ `: F% T0 b
cout<<d<<endl;% E: W: r+ A- k1 J
}
$ y# P9 h2 i& h9 S3 n( [ else
0 ^& V+ q; g6 K" h/ p6 s; J {7 ?/ F6 |( x- m4 @7 I# W
cout<<"ERROR"<<endl;6 ]2 E2 J) |% T( r& \! l
}* R F& g5 Z8 i @0 h
}
8 u4 m4 t/ C' l* v! N' G& d return 0;
6 B1 k5 t, V {0 e( H, M}/ U7 t6 B4 Q Q5 A
& _5 p9 k% A# ^7 Z7 F) H% h8 z/ m4 A; E8 E
然后编译执行就可以了(*^_^*)$ _7 h* S! e( I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译0 I7 q& r, m) I9 c" s) N
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|