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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,; B, N8 e( [+ S V" H
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
0 C/ w- I! R; y0 ^( p5 b A5 [只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), x G; F. W9 m. s/ ?" d
参数解释:) b& Z8 w/ | b# n3 ~' \ ?
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流- D3 @2 [$ l! d
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ Z6 t9 C/ V! z) e o% R返回值:8 O: o* o& H; U% b5 O/ q
返回非0表示计算成功,0表示计算失败有错误
( l2 N! G8 C% n3 ]( c. E1 E: \1 {/ V) H. f* j9 d4 C
7 G4 f1 ]1 v- d9 y, l2 I5 z
5 e% B2 W$ O+ W6 o' R1 n1 w程序代码:
" V! t$ J( U' v4 X G+ N0 f1 o1 ]( L0 N3 Y
namespace fy_Exp{
D8 F# p! e( S, b; j) Nnamespace {template <class _T>0 c0 }1 F3 B% A; y
inline _T GetExpValue(_T t[], char& csym){( o0 G' t9 ?$ I* ]5 Q b0 I
char c=csym; csym=0;$ p% W2 N( O& z1 }0 Y0 e( k
switch(c){
3 \7 e( G4 |/ f, V2 {9 @ case '+':return t[0] += t[1];' _" w7 K0 N& v
case '-':return t[0] -= t[1];; [, I, z7 `8 K
case '*':return t[0] *= t[1];0 F0 c x" |1 ?; }, U- i
default: return t[0] /= t[1];//case '/':
1 H0 B; J* W; i }
5 M% L+ E: H6 C1 E& F0 I}}
, b7 x5 L$ v% x* atemplate <class _T, class _Tstream>. y, x6 U/ l9 S
/* _Tstream: inputstream, _T: get return value! }6 I5 D7 D; A% C/ v# Y- q1 h
* Return nonzero if get value successfully */
3 R* l5 i$ R+ ?0 bint GetExpValue(_Tstream& istrin, _T& nReturn){
9 z) Q7 M. y- o: s _T t[3] = {0}; //雨中飞燕之作; @8 a2 ?( F- B8 A$ ~( S
char csym[3] = "++";
0 x8 S; C0 @9 j* r8 t int nLevel = 1, nERR = 0;, F X. C* B& Z) _; i
if(!(istrin>>t[1]))istrin.clear();
/ i. i& m. t' y `8 {5 d for(;;){
) c' J5 }) k! [$ L) n if(istrin>>csym[2]){
: C( k( ~. ~3 r! h+ | switch(csym[2]){. _7 ]$ ~- T# Y
case '(':& [* }0 m. F0 w. @! \( Z+ {
if(!csym[1]){nLevel=0x100; nERR=1;}else
; d8 z! y8 v1 b3 W. z% Z if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- i5 s6 f8 q/ n8 A! W' ` else{nLevel=0x100; nERR=1;}
4 ^$ ~$ \) l( d7 T break;
0 U1 i2 U0 U0 s& F case ')':# S. e. O2 C, ~4 R' h
{nLevel = 0x100;}break;' c: f/ [( a! n& g
case '+':case '-':case '*':case '/':
0 W) B- u9 q+ { {csym[nLevel++] = csym[2];}break;
6 o; v" @7 d) p& Y! d+ W1 Y& d case ' ':case '\r':case '\n':case '\t':continue;
7 \. V- j6 A" a' j' L default:
/ E! f2 f6 p$ N9 V. q* ~ i9 G, `( E {nLevel=0x100; nERR=1;}0 r" \2 R) y: `. V0 V) }
} ]6 S Q3 ?6 r6 E j3 ^; h" S
if(nLevel==0x100)break;
4 n% [1 x+ e. G5 `' D; D3 ^- B if(nLevel&0x10 || istrin>>t[2]){
1 H2 P; d( f$ D8 H nLevel &= 0xF;$ ^& n2 H a W- m' y5 ]' i/ u
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. ?! g% B% w5 v( A if(csym[1]=='*'||csym[1]=='/'){
, ?2 B& s# E" A; V' h, \9 Y+ D GetExpValue(t+1, csym[1]);6 T# o7 ]9 R' Q" ~% |
}
4 ~$ T U5 W" g5 |$ n: o" | else{0 Y/ B0 d) j; e, q7 `
GetExpValue(t, csym[0]);7 H% z4 U' B* F) D7 o/ \& M% U6 l
t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 {) Q+ d0 { L; A+ h! F
}
+ c) u$ k# `! ]* E% q% K8 { nLevel = 1;
. ^$ p5 o( J Y6 N! u: V. j }
6 c+ }+ {# |% S( }: } else istrin.clear();
. p' c0 c; \% X3 _; L }
1 S$ _& T6 v) i& W1 a3 s3 g else{nERR = -1; break;}3 E) Q( e7 S2 I0 V. u6 U+ T- B
}
7 [5 V5 k5 n5 A8 Z if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( T- ?8 Q6 t) K4 a" Z
else nReturn=GetExpValue(t, csym[0]);* X5 o( m# E5 M7 A4 Q9 z/ H0 h
return nERR==-1?1:0;- |) J# [! `6 }5 N0 D- [! W0 W; ~
}}0 } m& O4 d% O
* L9 ?" s/ [2 _+ J
& L& y0 w4 g8 M! T k) B' W
& W: d# E4 {& Q
函数模板使用示例:, c. H9 z; }( {$ m" o5 y2 p
在以上那段代码的后面加上以下代码:
: n* k$ M6 r; `& ~1 m3 Z- L9 A; H8 Z* N* f) q( n
9 U7 V' g* E4 P( l, n
( a6 w; U: n6 t# L1 U" O0 Q6 F' }程序代码:
9 a+ Y; Z2 Q8 h, B" J$ k! r! N& k" ?8 M* p' H' M# S
#include<strstream># r# e) A! ]2 a* ~7 t3 d
#include<iostream>
6 n# R/ }" \/ w+ F#include<string> t3 ]7 a8 i( A. v' J9 a! x3 K2 N
using namespace std;# e) ? R1 j* \+ r9 ]+ q& e# ?
int main(void)
6 `+ s ^" _& i6 y0 c{* x+ _& \" d T
string s1;; i4 a# f+ o5 e8 \2 T5 n7 K) g
while(cin>>s1)) B! _5 {0 t5 ^
{! @% F- t n2 v3 c* m: ~) N
istrstream isin(s1.data());
: P: A4 @+ C4 n3 A+ A8 T+ p double d;
9 O+ V2 j2 c' x7 W6 ` if(fy_Exp::GetExpValue(isin, d))
; D+ \& N3 H% w- a* p5 y {! `' s7 z, N; g) z* @2 J8 p
cout<<d<<endl;8 M7 U* k* _5 j4 Y5 S3 r" N
}
- \" U$ o9 d; ^7 \* c; _) g4 q else
' M p3 v" l+ u( r& @3 _ {+ b6 S" X5 p) i5 p! O
cout<<"ERROR"<<endl;5 A$ r& v5 i6 f" K( m: h
}
" v$ }& [ z, l4 u% g; u }' s5 V, }5 f7 o [) I: ^* C0 J
return 0;
$ u2 T* [! A( y( q}/ m: Y$ \. @- l/ B$ l k: }: Q, i
$ E& ]' q; {0 I4 n1 u: n' J
, I7 ^7 A" D; R; x3 Z( |# l然后编译执行就可以了(*^_^*)
) l" G0 E" C5 c+ ` y: |0 o( A其它:TC++上一定编译错误,不保证在VC6上也能通过编译% u. ]# A H* W! @% x6 ?
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|