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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
: ` g% E0 M! P7 H* R% ~一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 g7 H" H6 d$ R
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) X/ W3 X( r7 }参数解释:% U2 c0 M5 O5 n% |5 i
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 U) l' s/ y! B- m# M ^
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# M8 T7 B: Z3 ], H7 x0 Q( k0 C返回值:
/ I: b7 S/ u8 F' B4 _/ d, G- X返回非0表示计算成功,0表示计算失败有错误
( C' }% m- s) ~. [3 |0 E) `9 N2 ~. L, k ~7 j X: w
M! k) L/ r* G7 T& {7 I
& j6 s$ ~ {2 Y0 F) G# ^- F. B程序代码: / B, T- `/ q5 u) O& }! g
, y( H1 B% |) j2 R
namespace fy_Exp{' z9 e3 M: s2 Z3 |* B4 q
namespace {template <class _T>6 m% |) k1 i4 |2 A! _
inline _T GetExpValue(_T t[], char& csym){
' l* E( A) I" m) X char c=csym; csym=0;
( X4 z5 O% i8 s/ p6 K switch(c){6 f+ e: g1 c7 ]
case '+':return t[0] += t[1];. p- R6 ]7 Q" C8 b1 O
case '-':return t[0] -= t[1];: n; _1 Z) v& |3 u
case '*':return t[0] *= t[1];; `5 M% R, W( t5 W$ I! q, a
default: return t[0] /= t[1];//case '/':2 N* k/ s: w7 s# Z) |
}" H0 z4 t4 O" |$ M
}}" c |( J& l) U. l
template <class _T, class _Tstream>
/ c, e, g( u5 _/* _Tstream: inputstream, _T: get return value
' ^( f- i* }; {2 b _7 t: i9 @* Return nonzero if get value successfully */
1 @0 q2 P: G, a' _int GetExpValue(_Tstream& istrin, _T& nReturn){) O0 w" ]+ t$ Y' a B
_T t[3] = {0}; //雨中飞燕之作! ]' O. W9 |1 b+ @1 ^
char csym[3] = "++";
1 S5 O' {- b6 s% |# E+ C int nLevel = 1, nERR = 0;
4 v. W0 X7 o% c0 i# \: q if(!(istrin>>t[1]))istrin.clear();
; j4 n2 b" b; J for(;;){
1 c" f9 `1 l( X3 V1 ` if(istrin>>csym[2]){: z( m2 [& P3 z2 }
switch(csym[2]){
8 o; Q7 S! w7 ]* a case '(':
l+ d6 t( w. M9 q1 c$ t7 ` if(!csym[1]){nLevel=0x100; nERR=1;}else
y/ M: c. z8 S8 ? if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 i3 o" _+ K7 [: b5 p' m. E6 q else{nLevel=0x100; nERR=1;}& `/ X0 t( i9 t# v- [
break;; u. Q) I, v1 L4 U9 k8 m: W' @
case ')':
% p5 v2 H$ r# ^& L {nLevel = 0x100;}break;
/ V7 j+ {6 d6 U& }4 ?/ s# I6 R case '+':case '-':case '*':case '/': v0 m0 _; J8 j9 u
{csym[nLevel++] = csym[2];}break;
0 t6 e+ H% |9 V- D7 _ case ' ':case '\r':case '\n':case '\t':continue;
' j4 s. b+ @ C U- T$ o default:' }2 S7 S1 [$ F
{nLevel=0x100; nERR=1;}/ p, p- G% t Q7 {3 f. a
}3 l+ ^, L' j& \$ E' A6 B) a
if(nLevel==0x100)break;0 S$ O" E+ w3 _' ^9 \
if(nLevel&0x10 || istrin>>t[2]){
4 i+ S+ F$ l( ]# Q nLevel &= 0xF;
: f2 V0 k% V6 U if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- S9 g1 H9 j; s$ q* a. H if(csym[1]=='*'||csym[1]=='/'){' N) n( t( R8 t" G5 y, V2 x
GetExpValue(t+1, csym[1]);
6 d9 @& M; ]6 V7 Q) Q }, y) }3 o3 }9 R* ^2 v) [5 ?( }# n# \
else{7 D, C9 o' }' P, r1 t8 G
GetExpValue(t, csym[0]);
x* f, {8 ^/ s- n3 X6 l t[1]=t[2];csym[0]=csym[1];csym[1]=0;) H9 a* F, H D6 X! L: T
}
0 ~, e+ K. P, i' m L nLevel = 1;
6 w, o, N: W' h }
5 E" c9 L2 }' p, q/ `2 P else istrin.clear();' d% G; S2 M3 S# [5 {
}
6 V7 [8 I2 ?0 B* |1 H else{nERR = -1; break;}
1 E: P7 F! B) `. r4 _ a }9 B! E9 c: ?2 u
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( j [4 r/ ?" n else nReturn=GetExpValue(t, csym[0]);' g5 P, k, M Q5 O5 p2 t7 x+ V5 R
return nERR==-1?1:0;) A1 i& |5 t# ^% Y
}}
' e7 M3 l L6 P; S0 E
- {8 }! R! s( R6 a1 o2 |% @4 a" t+ x6 ]% C/ b6 [ S
5 X* J+ ^$ W$ h) M" i) h+ N函数模板使用示例:" i, m% s" \6 J5 E$ I
在以上那段代码的后面加上以下代码:
- w) V9 U: q. \+ I( X
5 e* F/ h* o# t5 i9 `9 e
3 K# q, Z* r% {; K4 a9 A0 N$ b& n% r8 i5 n
程序代码: 4 S7 @# ], c1 E* i3 z! i5 s$ j
' @" y, q# ~1 O% e: g#include<strstream>4 [8 S7 _ |% ^( ^# V' k) G
#include<iostream>
9 W" w$ W0 }2 t1 v0 E#include<string>; v0 S( G8 l" U y5 W! I0 h4 R
using namespace std;5 L8 V+ z) V4 o l: r
int main(void)! s' {6 ?, T* Z) w; t, F
{
6 C0 |- J I5 T5 s( M. e8 G9 ~) _3 X string s1;
0 q' R7 {1 l3 f% z; W' L( e while(cin>>s1)
, W$ i) r2 J2 e7 L, j1 D) t1 y" _! B {0 z4 I. v4 a' F
istrstream isin(s1.data());
; _2 H- \: ?+ Z& w' G3 S- m u double d;
: P6 E9 F- b: `+ d* R. M) b if(fy_Exp::GetExpValue(isin, d))
! i/ `, b1 z: t# k# p0 Z/ K& [ {, T3 o5 O" f1 X: q
cout<<d<<endl;" e- D2 A4 B" a& l! Y
}
, ~) _( `2 D' j else* ^4 c0 { l; @% C% l
{
, ]6 G, h f( u; @- H cout<<"ERROR"<<endl;
8 ~9 |- N3 g4 K! w2 M% R }0 U( [9 ^) o" z8 g
}, y( i& v5 x& y! @1 e
return 0;3 `7 F1 T" o: Y; Z
}% X9 d% _: }* R5 \0 B0 i: _
- U# n4 h9 x, ~: ^, W7 ~+ x, D
4 p$ V( C& e9 ]% G
然后编译执行就可以了(*^_^*)+ S/ h6 @ M& y' C. i* f. D' k2 P& _( C
其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ Z$ H& K$ x# t- i
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|