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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,$ ~* F3 L5 ^7 J6 a$ Q: k8 N; u
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) p3 ~" T G) p" a' {7 @, y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 }" B1 Q- c6 w N" m
参数解释:0 `- t y* {5 a: ^9 N
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 Y _7 q! I2 r- x6 f
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 t$ `- J$ c, B s
返回值:5 `1 g2 I; K D1 l
返回非0表示计算成功,0表示计算失败有错误7 n8 f. V7 O0 |7 F! y# b
- t- U/ l4 m K- U; i* Z+ x) o
4 ^$ f! W/ _- [
9 z t$ F4 H' J0 h- d' Q" V程序代码: Y9 H' u& ^& }8 g% Y; ^
( \( p1 Q$ N1 G- ynamespace fy_Exp{
" e3 v0 Q1 X$ g) A5 Q% e$ ]/ ?namespace {template <class _T>
% K. s6 r; t8 ^, ]- T8 M) k/ |inline _T GetExpValue(_T t[], char& csym){
: U- F- [/ k; f) j# [ char c=csym; csym=0;
1 M3 j7 \7 N( @- ` switch(c){
+ v& ?0 w& T; _$ T2 `, k2 m5 ] case '+':return t[0] += t[1];
7 k% x& i9 V! N+ j; d% J6 j case '-':return t[0] -= t[1];. X5 t ^; y5 ]1 v5 Q8 X
case '*':return t[0] *= t[1];8 ]* l9 a% s1 M0 j( O5 ?4 P
default: return t[0] /= t[1];//case '/':
! {' J. m( z. Z: D% p }
% v; N( n4 O( n* W}}
; G4 E. R; k' g+ J0 D$ \# N; j0 Utemplate <class _T, class _Tstream>
/ i e4 v6 H: b* m c/* _Tstream: inputstream, _T: get return value C! r1 A/ [0 l5 b5 `$ |: G8 M
* Return nonzero if get value successfully */0 w$ _8 d* K/ V7 {. \
int GetExpValue(_Tstream& istrin, _T& nReturn){! b$ {: k! @' k% c6 u; a. A; {
_T t[3] = {0}; //雨中飞燕之作6 p6 u6 y# ~* h' }+ b" O
char csym[3] = "++";
8 q* E+ ?( b' `( K) q7 v1 Y. j% h+ x int nLevel = 1, nERR = 0;/ _% ]. m: U6 ~+ V2 ?5 x
if(!(istrin>>t[1]))istrin.clear();
+ s) L3 @+ _! X for(;;){
V( x2 `7 T* [$ M+ K! t* l% [ if(istrin>>csym[2]){
. t8 o7 X r% r$ A/ l switch(csym[2]){
9 _) O8 a6 e! B" \ case '(':
2 O1 T7 u4 J( N. ~. u( O" S if(!csym[1]){nLevel=0x100; nERR=1;}else
7 }8 |7 j8 G% F- ~) W1 W; ]" w if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 V. U6 m, O) c |
else{nLevel=0x100; nERR=1;}
. ~0 {2 P. U" V# i, g3 M break;) \9 l9 O3 N: }; x9 D
case ')':' X8 g5 \. _, p( N$ Q
{nLevel = 0x100;}break;, y+ P; U) v9 `: k+ e* ^
case '+':case '-':case '*':case '/':
( @) [' K$ Q0 N1 @ {csym[nLevel++] = csym[2];}break;
, i6 A Q/ c ]5 [9 o$ g case ' ':case '\r':case '\n':case '\t':continue;9 _+ A$ F9 S) u" q0 n+ a3 r" @
default:
% S2 z; R4 t/ K7 D# o {nLevel=0x100; nERR=1;}8 D' S) @4 f/ o, M+ N9 ]% v" f
}' L" N$ r$ a B5 S" o9 I9 J! O
if(nLevel==0x100)break;
! @3 d* w' P3 F1 q8 [$ B& d; y if(nLevel&0x10 || istrin>>t[2]){
5 F& G: l$ ?& x/ `5 f: I; b) f# g nLevel &= 0xF;
8 ~* p3 c# L7 O" H1 C if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 ~, l! e- p; H! M0 B; n/ G
if(csym[1]=='*'||csym[1]=='/'){
0 E0 Q1 J- H# B2 y) E1 q* p- U GetExpValue(t+1, csym[1]);7 T8 S+ g# b i( o/ s
}
: f1 e X) u7 o O* b! Z else{3 {! }, Y1 ?- u7 N, D& f
GetExpValue(t, csym[0]);" D) a. K6 N, G/ i, T( e, G
t[1]=t[2];csym[0]=csym[1];csym[1]=0;- B* b! X, |; R8 N) k; s* H
}- W* P% k4 k. P) h$ S
nLevel = 1;8 f/ l/ f! V1 z5 `+ ^- b: R0 M. ^
}
1 v$ t% e8 s0 q g2 u6 Q/ w else istrin.clear();
& W; _2 s( j' D* [ }
. i& j* }( g6 y0 Q9 N( Y: \3 Y% c else{nERR = -1; break;}! s6 |! d8 y4 d) m
}
$ J9 i6 C% N% s8 A1 q. M8 J1 f if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, q0 _7 ^; {4 s0 z/ u" N else nReturn=GetExpValue(t, csym[0]);
1 U3 l9 Q3 S7 H7 h" ? return nERR==-1?1:0;
" h1 z9 B: P$ Q}}
- u9 ^ @& e/ \& ?3 Z3 D6 {3 u6 {1 `4 [1 m- g. q) }% c
) O T8 v4 s# q% F* S' d" ]0 |# |0 k v- J
函数模板使用示例:, ?! k8 ?* ~6 h. d
在以上那段代码的后面加上以下代码:0 U/ f: U3 V0 C# ?4 K& N
0 R- b5 t6 m! m3 v& U: ^! F x5 A6 \* ~1 f5 d% g5 N: ~" V
$ j& V+ y0 E; d% A
程序代码: 3 m, N6 K y/ r; r
7 j6 g: m4 F$ M/ p3 C
#include<strstream>
. B, _5 i4 z- b/ h* E T#include<iostream>5 Y: W- V% O4 ~5 l1 D, B) p5 K
#include<string>8 J+ a# I* p& b0 U: `
using namespace std;
0 l+ e; G, V3 O& _& tint main(void)6 L+ a' {+ V: s
{
( r8 O! A9 y: W string s1;3 i7 Y7 ^; Z& D! K) |) F9 R9 e8 z
while(cin>>s1)
1 m0 I+ T( Q* Z1 u9 U# P" B {# ~9 @6 ^/ z& F% P# \6 _' T" V
istrstream isin(s1.data());' A$ S( \" H7 M7 q
double d;
0 d# H4 S% ]! u! K3 H9 ` if(fy_Exp::GetExpValue(isin, d))9 M0 U* C; |+ h3 F3 J
{2 H+ ~& C/ Q* U# V8 G
cout<<d<<endl;) H3 Y' O( K M% z9 A5 u6 s* B
}3 J9 n) E6 l( H- U) d$ \& `" L n- {
else( _* c8 r" ~; |0 G
{2 C1 b' @3 y2 O
cout<<"ERROR"<<endl;
+ R2 }! R; Q5 B% h' I }
1 Z$ g) P- J; Z# i }: | s7 _- Y* O( A4 ^
return 0;4 {( f# I& {( _
}2 _* y- o8 z- B# z4 e) {
4 A4 w2 |% x; q, d3 f
5 o& A$ a1 R. D6 U% j
然后编译执行就可以了(*^_^*)% t$ Z+ X$ \/ I6 {
其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 {8 {6 K* v. B7 R* v$ i+ g/ t
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|