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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
% Q7 t/ \1 `) L2 o- w一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! B3 s i7 C2 n. U只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); T# r. d5 \: D& W# K
参数解释:
7 o4 }# E1 N- d: Fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: F7 M% V& H4 }- k& Z2 [7 _
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 V. B! f2 W8 C9 C [返回值:
y- Q& l# Y( f7 B) V7 ^ t返回非0表示计算成功,0表示计算失败有错误
7 E4 `) @4 W* L/ W. n/ }
8 w' @- ?3 `9 v) N0 C! z# W
; b' {/ I! y$ t
+ F) x3 Y! G2 h1 @程序代码:
5 B. U! q* O8 g: O( u: p
& E! [1 Y$ u7 c: X8 a: V; Znamespace fy_Exp{
6 R: n" n. r4 t/ ?, l9 o) n3 ]% knamespace {template <class _T>
|+ R- `. e8 C* s- B+ tinline _T GetExpValue(_T t[], char& csym){: a; Q& t2 T0 W; v
char c=csym; csym=0;$ \- n- Y# z7 w- Y8 B0 _
switch(c){
5 A/ ]/ ~$ }- S case '+':return t[0] += t[1];+ T2 J: s0 u$ S: X* W5 |
case '-':return t[0] -= t[1];9 R$ I* Z& D) Y) C/ L
case '*':return t[0] *= t[1];
) k8 u" D: j a0 H default: return t[0] /= t[1];//case '/':
$ ~0 h9 L# e, ~" {4 m& U0 d }) g0 `! o8 \0 k$ a; l0 c6 J
}}
( |. c/ y e% }6 ktemplate <class _T, class _Tstream># G9 i6 Y% l" e w! s( W5 ?
/* _Tstream: inputstream, _T: get return value: |- \" n: \, c( C' G* H5 Q
* Return nonzero if get value successfully */
4 k. {1 G. B O: @9 u/ x; j; i7 Mint GetExpValue(_Tstream& istrin, _T& nReturn){# ?8 d7 e% H) ]
_T t[3] = {0}; //雨中飞燕之作
6 M p3 D7 i/ R- e/ I0 t char csym[3] = "++";
: ^! o. Y5 g7 ]2 u int nLevel = 1, nERR = 0;! Q1 k2 h: `: {: u: M
if(!(istrin>>t[1]))istrin.clear();
" j/ ~3 K2 Z# }7 m6 f for(;;){
; ~& R, J# Z; R }4 e if(istrin>>csym[2]){
! L+ n3 X0 b+ B! F# t switch(csym[2]){) O% Q) W) l9 e; z
case '(':' O) a2 \% j" Q) R
if(!csym[1]){nLevel=0x100; nERR=1;}else7 h- m1 ^ B8 a7 Q# g
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- g1 J) g; b& O. j# ]) P6 f
else{nLevel=0x100; nERR=1;}! H ~6 R8 J( T1 V" l* K
break;1 t( k/ j% \( S" Q% f/ d
case ')':
! d9 \* F" ]; A2 h! Q+ S1 b# @' G: J {nLevel = 0x100;}break;
! t: r! H3 A/ }5 x1 a case '+':case '-':case '*':case '/':% {1 G2 l- ~6 F0 p; Y
{csym[nLevel++] = csym[2];}break;
1 e8 j9 g1 e8 C! Q' E case ' ':case '\r':case '\n':case '\t':continue;1 {9 n" I \9 Z, U- R/ S! B1 j
default:
6 |2 x% d* }4 f/ {4 X {nLevel=0x100; nERR=1;}
- A5 E2 B2 U0 j1 x2 u }. d/ u6 i/ ^9 A, ]4 H
if(nLevel==0x100)break;( F/ ~8 H& c0 z( h, O2 e
if(nLevel&0x10 || istrin>>t[2]){3 _9 V+ h! T4 D8 O# Z" d3 Y( l
nLevel &= 0xF;( B% [ M0 A' Q4 W& q
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
/ E, G9 M5 H5 A if(csym[1]=='*'||csym[1]=='/'){
2 v" m9 P: x5 c8 ~5 d, C GetExpValue(t+1, csym[1]);) N* @ n" Q4 I& Z8 D: t
}
/ a% _& o. q# y% D7 ~( a else{: f2 Y! ^4 t' E8 B
GetExpValue(t, csym[0]);
7 U. t+ w% {( t) j7 b$ d& v t[1]=t[2];csym[0]=csym[1];csym[1]=0;
9 S" u" n" C+ ? ] }5 n" j8 _7 l/ O7 F
nLevel = 1;6 t$ p8 I5 [# f* E
}; Z3 {& L( n% X0 [$ e2 d
else istrin.clear();8 k3 ~' T0 C% K1 ~
}
( x1 R% h- s- ~* o2 z9 ? else{nERR = -1; break;}
4 G8 o( X' X, S9 R5 e Z }# H- X+ U* H* o6 A" d. f
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 ]- U( k& }) z" |& ^( m
else nReturn=GetExpValue(t, csym[0]);, H: X6 U0 A& ~4 Y% Q' K6 ^+ I. p
return nERR==-1?1:0; i; q* H% a7 H: C
}}
, z' J# D+ c6 g x# c0 d: O+ S# [# F- k. D3 g
! M( w0 N2 Y0 W1 B. B& _( H
9 }' d1 H' @" i! [/ \$ w4 A
函数模板使用示例:
& @) K* J4 J5 ]" P3 G }在以上那段代码的后面加上以下代码:" K; H" }% D& W
8 C6 @2 Y5 L( v* g0 i ) x7 Q4 u& o {) p+ O- U
5 N" O. T' Q: I* n1 Z. o4 M程序代码:
, l5 M3 q$ p; B/ A! ~9 o$ E& D6 P0 M0 m+ K V$ t/ d
#include<strstream>
( X2 P9 F( T/ O8 _9 H#include<iostream>! s5 D8 o. v1 `8 ~
#include<string>
. D2 L" B9 U# {( K' z8 z+ pusing namespace std;
1 |$ A5 d/ ~. G) l1 @+ lint main(void)) h9 N) k, v% F; q
{) U4 Q4 Z3 I0 C- o
string s1;
. L' T X6 c" Z while(cin>>s1)
& [& L" l& @* J0 B* T- L {
* |; G. N& o5 r2 i& Y6 P9 U! e istrstream isin(s1.data());6 ~' K2 [+ {- [6 `! _0 Y9 ^
double d;
! Z& g, X3 z# j; V! r if(fy_Exp::GetExpValue(isin, d))7 k7 X$ K! d, \
{
* o) j1 q1 J. J/ x4 j5 q7 n cout<<d<<endl;
: P3 a* @! ~0 k5 W. H( g }
( M" L) _' O9 R# S- D. n# { else- }3 D& {9 I% M& b) ]/ x4 K
{
]3 r* m, _! {; f cout<<"ERROR"<<endl;6 I# A! x* F' a) [: u* l8 n4 n
}8 Y0 R1 t* {" q8 g
}
4 z6 N: S% H( S& ? return 0;: J Q$ J* Z" y& V3 I( N/ V
}
. A5 |$ r( w+ j* x9 p% ?( U0 r# q9 }7 U% l0 E& G4 m( X4 k
% d. ?7 z8 M+ x1 G, m
然后编译执行就可以了(*^_^*)1 ]( J: v& t- z8 u9 `
其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 Q2 ^. k5 B2 z5 @2 \% t
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|