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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
/ } A# a( ?6 ], h) F6 M% q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 ^0 T6 h$ I' s5 M1 m# `. r
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, ^ p/ L" J- ]2 L9 m参数解释:; S, t: y0 X, C+ R
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
9 M K* o6 L+ i( E' ZnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
7 D/ `7 M5 a/ e$ O返回值:# Y, y0 A# I; f9 f) d' x8 W1 \
返回非0表示计算成功,0表示计算失败有错误3 L' o3 J z# s+ y
3 j) m# s, z" R: K' c8 V
Q0 Y" a+ [* ?8 e& b0 {7 s4 }' a, o( t
程序代码:
3 f* N( m/ |) T9 D* X! m" Q& E6 V) t/ c2 `' k- [% [, o1 S* [' y/ d
namespace fy_Exp{/ k0 L" |5 I$ x/ E' `
namespace {template <class _T>+ |+ \7 k8 i3 v% o: v4 d
inline _T GetExpValue(_T t[], char& csym){" k6 I, j, Z8 K, t% P+ W
char c=csym; csym=0;( O0 |$ o! r$ @! C3 j
switch(c){* R" y1 Z3 U* ~0 n! G
case '+':return t[0] += t[1];8 j- P/ E1 Q$ A+ k5 S9 `& \
case '-':return t[0] -= t[1];
. R, z, i5 `5 Q( Z case '*':return t[0] *= t[1];
! p* o8 n1 Y% @6 e, k7 b default: return t[0] /= t[1];//case '/':
* L9 {4 F- l, n }
. Z# o5 E/ S! Y8 {; g}}1 ^3 ?" Q- {$ x/ z$ [
template <class _T, class _Tstream>
6 e, r( a# D. h1 n4 l! |/* _Tstream: inputstream, _T: get return value
' J4 M8 W2 M9 O' X" z, q. K3 P* Return nonzero if get value successfully */, t' | q6 `9 e" |" ~2 m8 O
int GetExpValue(_Tstream& istrin, _T& nReturn){) O: ]7 W( R( K, h/ N5 s' r7 e
_T t[3] = {0}; //雨中飞燕之作" o$ e0 T3 [$ G) q( `6 @9 i! G% H
char csym[3] = "++";2 K9 ^. C0 F. o6 E
int nLevel = 1, nERR = 0;# l% ?/ z1 c- h- |7 z' s' ~
if(!(istrin>>t[1]))istrin.clear();
& D: }+ N: U3 i2 A# p( O for(;;){
: f7 V: { k5 {& p3 ]/ Z, I: N if(istrin>>csym[2]){7 l& Q- i V. z, X, }8 T2 `& Z
switch(csym[2]){5 u* V/ \: w3 }, I# @& Q
case '(':! X4 ~3 V; k6 Q. F) @
if(!csym[1]){nLevel=0x100; nERR=1;}else
3 S5 a6 \/ L& v% j6 q if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' U: q5 E i& y5 W/ E else{nLevel=0x100; nERR=1;}
( |2 Y, b7 v' {( d- F break;
6 s: @* c2 l* x/ l case ')':0 p* C, [ D6 B8 P
{nLevel = 0x100;}break;
3 u$ ^) o- J9 _( f case '+':case '-':case '*':case '/':
$ v- o' S5 n7 G {csym[nLevel++] = csym[2];}break;4 ^4 Q0 z1 E3 s/ Y
case ' ':case '\r':case '\n':case '\t':continue;
7 f& E/ A1 s0 j' X" j3 ~ a default:
' Y6 \) F5 Z" Q" K8 [ {nLevel=0x100; nERR=1;}& S" u5 T6 |8 I9 ]
}6 ^9 U# d$ B; ]9 k
if(nLevel==0x100)break;
" i+ ?2 a- z" ]* e7 ^6 W7 S$ a$ T if(nLevel&0x10 || istrin>>t[2]){1 T% F. K A/ r/ d
nLevel &= 0xF;
: l- A( ]5 C+ a+ J" x! I" _ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! Q4 P4 x' ]3 l+ {, |* `/ ]) W& d/ f1 J
if(csym[1]=='*'||csym[1]=='/'){
4 v* a6 u2 a! q- V% m9 Q GetExpValue(t+1, csym[1]);2 ~6 s J8 D. s4 G
}
& q* m, k# ^, y else{
: |. M) s F* o GetExpValue(t, csym[0]);
, s5 V+ j4 q- u q9 ~- s t[1]=t[2];csym[0]=csym[1];csym[1]=0;
) e5 t" q6 h7 I: ^' w3 z2 p }/ B7 o) Y! i( V
nLevel = 1;
8 [: O P" g8 {4 m' ^ }
7 v% b+ V t. c else istrin.clear();! \) W% i$ B3 N; y/ t& s7 S
}9 ~. d0 z$ j2 t
else{nERR = -1; break;}( i0 f3 R& W- `! A' [
}1 D( f5 H8 N1 F; u% n: B. N
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) v' V: r2 e$ g1 m& I
else nReturn=GetExpValue(t, csym[0]);
% C5 z5 K' ^- @0 y5 l( H- ] return nERR==-1?1:0;# J, M7 O: j' }
}}/ {* D7 R: @6 n+ b9 K* m
) |! v' x9 ^. [# n# K
8 V7 x8 h1 E6 X) g7 [& z
; ~% s- `, q/ ^! p) i; {函数模板使用示例:( U9 q3 g$ I! |8 E' u
在以上那段代码的后面加上以下代码:' R2 S: D, p: Y" E2 m: _
3 \/ I9 U" O& w, G
% l1 C% t$ }8 B' p7 N/ Q: `& y$ \! X8 H: q; _$ N$ P1 V
程序代码: 5 H/ G0 z) |9 }# ?' p& h* U: O
1 x8 f( d0 N9 s0 i8 ~: j& _8 g
#include<strstream>+ q' U3 y6 g4 S
#include<iostream>5 l/ K" R3 J* Z6 P" _* f
#include<string># U- L3 v8 R y7 w, u
using namespace std;
3 H" L+ z$ z. Z' W C# Gint main(void)" b @2 J) H5 L3 t9 U5 f. J+ x
{0 t: a2 ?) j) T" T: \
string s1;$ B( J$ I" C j; Y j
while(cin>>s1)
5 K5 w$ p. Y8 H, O {
/ ?% j7 W2 U2 `# w1 u( e istrstream isin(s1.data());
2 P4 Q$ g2 ^) q$ @ double d;
5 o. N7 {8 R/ O9 @ if(fy_Exp::GetExpValue(isin, d))/ z) l1 q* ~0 ^7 o$ g
{: w: C" v! U W4 P
cout<<d<<endl;" e( d) Z: q+ I5 v' g0 k! }% E
}
0 b4 O" P. D7 b0 n& Y else( v+ N0 I8 n0 U3 B* R, n$ H
{! ?6 r" B4 S' Y! l+ Y
cout<<"ERROR"<<endl;1 l6 P4 ^4 T# ]& A }
}
: J5 Z0 a7 ~4 Q( k L4 f }
4 W. F# F& h1 @3 b$ U return 0;
3 z) y1 w( K9 ]}
w& \- T0 f# V: Y/ T3 c% n& F, N# N0 r K# N8 W0 M5 ?$ `( g
1 M) `& l7 r/ N" M+ i
然后编译执行就可以了(*^_^*)
3 V& a/ @- b; Q% R" m其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 J" s6 z# u \4 t! B 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|