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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,5 K' T1 T- U0 _/ j4 C/ l
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式# G# ?( U2 l: g# n1 E/ \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
; l1 w- H5 ?3 q2 U9 b参数解释:
: H$ Q9 }3 x% \" [istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% Y8 k: }- Y ~( e3 c3 a9 `0 rnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
' c! C' D, j& n* N7 b返回值:
. p: o ~- X' ]# ^: K. B9 |# q/ _返回非0表示计算成功,0表示计算失败有错误
& a# P8 s) B$ S
$ }. f" M" v! I! @+ {2 M8 I4 U / b7 e" k2 V: f1 v
. c& @% [) L! x* p) u$ D% N程序代码: " O( ?7 J' @) e) {2 e& L6 J8 i
: V, D& R" \/ ~$ j t& X; f; l7 a
namespace fy_Exp{
$ d$ M/ C7 q8 znamespace {template <class _T>
: h( Z9 W' l" _5 T5 binline _T GetExpValue(_T t[], char& csym){
6 a# M; g0 F* p6 x f char c=csym; csym=0;6 c, s2 t) t( ^% T6 y
switch(c){
3 J, q$ k/ v3 g4 O case '+':return t[0] += t[1];
# H+ j6 z8 P# d9 Q% C9 Z case '-':return t[0] -= t[1];2 E# L; f" \# Z0 v
case '*':return t[0] *= t[1];2 O% H0 S' [& v% H4 W& u. U3 n5 B
default: return t[0] /= t[1];//case '/':
# X" `" f' V5 z$ ] }
) k$ {, n3 A' C- s. e}}
0 y& Y* \1 }8 {3 }template <class _T, class _Tstream>+ e( k+ s$ A$ l' t% L# F
/* _Tstream: inputstream, _T: get return value
" [7 M' I. w+ n! Q) N* Return nonzero if get value successfully */
* ^* c1 e9 g! ^; yint GetExpValue(_Tstream& istrin, _T& nReturn){
: S1 C) L% U7 M8 o% G- F* s _T t[3] = {0}; //雨中飞燕之作
& r9 p( e& \( l( E5 z! c char csym[3] = "++";
9 U- O$ w' g! x4 O3 Z9 U/ j. n int nLevel = 1, nERR = 0; x* D5 i) a2 V- p
if(!(istrin>>t[1]))istrin.clear();
) D. N) d k- L H/ O' C5 _ for(;;){( z @5 _, N( N& C; J* T5 \
if(istrin>>csym[2]){/ i) |3 B; o* }/ \ t7 H) S
switch(csym[2]){9 \. @' u' G* e0 N$ c$ o6 I
case '(':
3 O+ t2 V: H2 ^& B$ s; p% Y if(!csym[1]){nLevel=0x100; nERR=1;}else0 V4 [6 g4 }( f5 M6 W5 z' [
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
; V" C! |' r: G- c' {1 z else{nLevel=0x100; nERR=1;}, M8 n' p) b8 ]% D; l1 e, o4 Q6 B6 ]
break;
: t% G: i% R; ]$ v$ S8 V3 O9 |4 O case ')':; r$ u2 u) { y* |. V6 ~
{nLevel = 0x100;}break;/ c% w* M: i% Q# _9 a. l" T
case '+':case '-':case '*':case '/':& H9 Z3 g7 Z \) T
{csym[nLevel++] = csym[2];}break;
# E: A/ E$ s& a$ m case ' ':case '\r':case '\n':case '\t':continue;
1 K* y# M" ~7 B+ \ x5 d/ u( I+ ~+ m default:; c8 v2 n1 T! B& j& A2 Y
{nLevel=0x100; nERR=1;}5 s) N" n/ F2 j
}- T+ t4 i6 D! ~. S- z0 S, U9 d& w. |
if(nLevel==0x100)break;1 J& H# \/ B& ]' k0 o+ S1 \+ @
if(nLevel&0x10 || istrin>>t[2]){: `8 `( e9 h2 h% z$ \
nLevel &= 0xF;
0 T/ O" d! b. H- p% W1 D if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; D* @; K; J) E$ c2 P I if(csym[1]=='*'||csym[1]=='/'){
( l& M; C! q8 A* N; I* u GetExpValue(t+1, csym[1]);- [3 i" e) R% s* q# D6 ?+ m
}/ a0 F' \9 k) n" b) h, M
else{
1 _# _! H5 M0 z9 K' c GetExpValue(t, csym[0]);) \, o5 k- W/ y* m; B- \
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
5 j7 r, t& \$ p) o' c- \ }
! s# o: K; ?6 l0 t# b nLevel = 1;% a" F' U) b$ }8 p8 c0 X* i) @
}
5 j2 w. M5 K; _: Z4 C; G else istrin.clear();
" I, j Y. `8 d( T# J! }* e0 n7 o }& P7 `" N0 \4 a$ N& ?7 t
else{nERR = -1; break;}
" Z- j/ |# y; {8 r5 z }
" j& E8 {5 D' Z* R% Y if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 u# r6 v1 l. k/ o, t% k; p" j0 E+ i else nReturn=GetExpValue(t, csym[0]);
2 Z) T, b2 b/ l return nERR==-1?1:0;
# X6 C# v; ]) A7 p3 I( I( H5 M/ F}}/ W4 h* y9 s1 N0 {
* h9 m) J) y5 P$ N( A/ v
! {& j& C. F* ^) ?) {# O
& ^9 r' D5 y9 n+ J
函数模板使用示例:1 }$ R- d, {2 C* o% w
在以上那段代码的后面加上以下代码:
$ ?3 h: W% K8 t6 d. _$ J! L7 L1 w
) V+ V+ @9 f3 Q. G" K / {+ d4 R# l7 q/ w; j r
W' J# S2 `/ B7 _8 v- G" O* R! u, m程序代码: ! H& q2 C& }& C) M
* [1 J/ E( b/ f& n2 v#include<strstream>
* Q3 M1 [0 ^9 T5 F; e( u0 C#include<iostream>
$ j: Y: S8 ~2 g; ]#include<string>
3 l) |4 R7 T% v9 ]+ J; I0 _using namespace std;
) `7 [5 m. ~$ {# m! ?% Lint main(void)& k4 d! d- A' t
{
5 [1 ~" I! `+ A6 W1 i. T: Q string s1;
4 T$ e# I4 R" s' ~ while(cin>>s1)
* a9 }* {: L! e {
" i0 N4 ^) B8 H+ m! B% Y istrstream isin(s1.data());4 a" S* k4 f6 E6 v: E
double d;) I* f) m% Z, J: b7 p9 D
if(fy_Exp::GetExpValue(isin, d))2 ] r+ [! X5 ?) Q. {3 S
{" S, B; }, X( s4 C. B$ T+ v
cout<<d<<endl;0 G$ Q8 M, _5 s. ]) q1 a9 {
}" r" I& s$ s# C/ ^
else
! I" z( c1 M" z/ G% [: @- [ {; p/ W2 N' L9 t0 F1 R# f
cout<<"ERROR"<<endl;6 V0 _* b; F( }+ n
}" t. [2 E2 s2 V, R3 K( j% n
}2 c- U( \; H6 J2 I
return 0;
9 p- r2 g$ U" o6 A- T( A) Z1 H! h}7 [9 U& a( U( \( L% s% W- K
" c& K4 G3 u( r) Z
( D1 p1 B3 u$ h4 B$ i7 l然后编译执行就可以了(*^_^*)
% Z4 U7 Y: v) ^* L+ \+ m( J% O其它:TC++上一定编译错误,不保证在VC6上也能通过编译1 p G v9 k8 H: H5 a$ \
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|