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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,6 t( o" @, X& l3 p% A; I, M
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 s0 h5 A0 r, k8 R* M1 N
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 U; K3 C ]* h% y9 p2 {* h
参数解释:
1 t: |2 I5 V; M% _# K. Bistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; d7 d- t7 F3 m( i: LnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* F9 b" I! M- W. h返回值:
' q8 t6 r( \0 w1 \4 E返回非0表示计算成功,0表示计算失败有错误+ |. F7 c/ F* C! j) K) a, \+ K! e
4 C3 |9 y, M+ e! P. ?/ g/ b
( K. e' ~1 I. m( d* e9 p) W7 a6 q- f3 S9 J; r+ k
程序代码:
( t2 X9 p+ f2 n# S; W5 M) K; ~3 ?" Z" c0 D3 D( @
namespace fy_Exp{
6 z' Z+ I' g& `+ h6 Jnamespace {template <class _T>/ {; ?7 g7 A4 `/ D& h
inline _T GetExpValue(_T t[], char& csym){
; J( Z3 [: P8 R- p. `7 f' h char c=csym; csym=0;( r8 u# v4 w8 g, \
switch(c){
& D* c/ V0 p3 T case '+':return t[0] += t[1];
2 `# J% z) z7 Z* z4 W) {1 g case '-':return t[0] -= t[1];$ ^0 A3 x8 E) P; E
case '*':return t[0] *= t[1];
% A6 L: q! p6 c/ H default: return t[0] /= t[1];//case '/':
3 c7 f+ j- A3 z2 b }6 `! d+ [4 P# a0 D7 x7 H1 ]. s
}}) m# l4 ^6 H% F5 h
template <class _T, class _Tstream>' k2 [, r% N9 l6 }- n! a
/* _Tstream: inputstream, _T: get return value
8 L3 _" N8 }% O4 o4 M* Return nonzero if get value successfully */
# Y" E2 q1 {, d+ v" q; @& ?, Uint GetExpValue(_Tstream& istrin, _T& nReturn){, E4 `7 z) z c, C/ ] p
_T t[3] = {0}; //雨中飞燕之作
1 z: o, N$ V3 s* s% c char csym[3] = "++";
! P" n5 w* E! W) R$ q3 ~ int nLevel = 1, nERR = 0;
. a/ R. c+ j! B9 ^8 z( N# b/ R if(!(istrin>>t[1]))istrin.clear();
, O. h/ r, p' H2 n1 \% I for(;;){0 n( G1 b, x \3 n6 X$ g) D
if(istrin>>csym[2]){3 L: B& N1 q M* U: F; L' v+ q
switch(csym[2]){
C, Y5 D3 }1 ~9 F; L' W case '(':
' w/ h3 F3 N6 k* }8 m if(!csym[1]){nLevel=0x100; nERR=1;}else0 \ ~0 t W7 k" \ }
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
; N% M/ J( c Q: Q+ Q* {) F b7 A else{nLevel=0x100; nERR=1;}/ Y' Y$ J, s z* T
break;
) j7 C0 D7 U' t case ')':; g2 _ n/ `9 c8 n; H
{nLevel = 0x100;}break;, s/ x7 O7 C# O* \& i9 m, R! l
case '+':case '-':case '*':case '/':
0 W2 Q3 X2 [0 o8 Y5 P# o {csym[nLevel++] = csym[2];}break;+ D. Z* ^7 _0 r
case ' ':case '\r':case '\n':case '\t':continue;
' }+ r! O# ~4 {) b5 l9 S default:& |: k! j) ]! E, N7 \9 r" \% y
{nLevel=0x100; nERR=1;}% Q* N% x4 A( W# i3 v
}
6 a' Z# y( U1 p _7 z: I if(nLevel==0x100)break;
, o& ^1 I: n) O1 [ if(nLevel&0x10 || istrin>>t[2]){
" T! e+ {; O* @8 H( X nLevel &= 0xF;6 H7 C5 C0 J+ D8 d
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& t, v+ b) _) W% s& E% `$ @* @1 M
if(csym[1]=='*'||csym[1]=='/'){
$ y' `; P/ B+ V+ N& y( D% J GetExpValue(t+1, csym[1]);
7 a$ t& [" J, K% D8 T2 W* Y }
* l$ h' A5 [; ^! q; ]' p else{
0 L9 w; v8 ?- d) c/ W GetExpValue(t, csym[0]);0 w& s) o3 B; a) `
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* ` D- E7 t0 S7 q }
7 E2 \7 d2 l9 d1 A7 a) y8 z nLevel = 1;
" D' `: A9 r0 `% |9 G4 j6 ? }
6 ^7 J$ ]& k$ A2 G7 U: N% O# L( ` else istrin.clear();0 c% ?# I5 B8 Z2 v4 W- g5 R0 D
}
+ Y% [9 f6 U& W6 I7 M else{nERR = -1; break;}- A4 j8 A, \- f( W
}
8 D h4 v) o2 K& {3 y5 J if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 U# c* M/ \% M7 ^ h# S0 k7 ? else nReturn=GetExpValue(t, csym[0]);
% V4 g9 }8 Y! g( y+ y( w. y return nERR==-1?1:0;5 P4 `' [) a! `. Q: ~5 C8 L
}}
( m+ S0 Z( j D+ i, C) M
# w& @3 x* v0 j
1 C7 f4 c' O) }3 C8 a7 i
$ ~! Y' U/ U/ ~5 \: c函数模板使用示例:
7 j, E: X3 R7 E在以上那段代码的后面加上以下代码:
' B0 s2 V0 ^( i0 B: ^8 b
5 ?7 r9 ?5 }( I( W8 r8 e
* n- Y9 {& b. O: b" B$ B9 l& z( [* A; `! p0 X1 x7 a5 H' p0 u
程序代码:
+ c# A* j( k- f2 j9 J# c
( K4 A0 G/ |5 _6 h3 ?) [$ T2 |" V#include<strstream>
" J: X, ~8 X7 p9 h" u, `#include<iostream>, X% s" B- g+ r0 w( j+ Q
#include<string>
9 S( [8 K7 d2 C. b! E+ tusing namespace std;, d+ A! y3 S% }
int main(void)5 X$ z7 q' |3 [. i8 \' t7 g' s* ~! O
{- l! I5 e7 i. G2 B# {5 h5 C4 b( g& K
string s1;
+ a0 }7 Y1 C# G) C: G) x while(cin>>s1)" h; g7 X% `, Y( F0 o
{9 R3 @3 B- z7 @( W0 \
istrstream isin(s1.data());
8 m5 D; E3 l9 g double d;7 `: H$ }0 [& B$ B
if(fy_Exp::GetExpValue(isin, d))4 c0 N ?3 ~# [" y& w, L8 C2 w
{
* q3 N* B4 }' b$ S cout<<d<<endl;6 m4 Z/ a5 W' s9 ]8 p: H7 F& n
}
1 t- ^" r7 s* b; Y4 ~ else
2 R0 \" I+ K0 G |! h0 R8 k/ d6 n {* G7 }4 {5 V7 y, i/ x
cout<<"ERROR"<<endl;
$ T' ?- v9 D) s: X }
6 U3 k6 D/ p( c1 R- E2 c }+ a# l# G3 d, f' i# Z
return 0;
( C) ^) @+ v! p. | z' x1 `" A} J8 g$ I# g4 w
* u) A& z- L [1 Y0 k: R7 `% i& W' b) a# M: u
然后编译执行就可以了(*^_^*); K* x! I; W @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 \' t! z \/ _: j8 | 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|