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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,! e! @" \, B2 ]; ]
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 H, `$ _2 s+ ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 R- c! k s6 P/ d
参数解释:
# J; s* Y5 |3 p! l* {istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ g2 J! W6 V, M0 m# ~
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* t7 ~* @2 u6 t% X7 a/ D' I
返回值:
6 G9 `+ T* ]. S- V5 x5 [返回非0表示计算成功,0表示计算失败有错误" U/ z4 m& }7 Z9 w3 H% F
$ u! ~) A9 X: U" _5 y% B6 v
. R! Y+ u: }9 L$ R
8 f& L& B# ]8 N& B1 A6 k5 ?) U, D& K$ ^程序代码:
! V# z' z+ o: L( a6 a
7 r {$ ~, [; w/ H$ C4 Enamespace fy_Exp{
8 b2 c8 b1 W# _; |namespace {template <class _T>
8 u3 j* W0 a) j- J u! Winline _T GetExpValue(_T t[], char& csym){
$ e* ~' j1 d; x1 a2 [3 b char c=csym; csym=0;$ n4 Q0 Q ^* W, n2 t8 r: `' O
switch(c){. d M# b! p( [: x8 B1 f/ K& F; q
case '+':return t[0] += t[1];
) k8 N/ V: C- M case '-':return t[0] -= t[1];
* c% {$ {% F" L6 J5 Q7 T case '*':return t[0] *= t[1];
6 E+ P( O$ j9 s2 V D. g" | default: return t[0] /= t[1];//case '/':
0 A& }# u$ R7 N. d }! n# a1 L2 I! O) a, N1 i! z) N$ ?
}}- W: ]& q. x" s5 l$ l! K
template <class _T, class _Tstream>
) U' B2 y' F7 _! q8 _9 t2 J5 |/* _Tstream: inputstream, _T: get return value& M6 Q8 x) ?" W
* Return nonzero if get value successfully */* n) t/ ~5 d0 G: o }9 J' b1 z
int GetExpValue(_Tstream& istrin, _T& nReturn){+ U# Q4 c8 I! Z! m* ?: Y3 |4 @
_T t[3] = {0}; //雨中飞燕之作
* [6 n* m4 \7 }4 {7 N7 p( Q2 ` char csym[3] = "++"; e$ L8 p& o' Z
int nLevel = 1, nERR = 0;
% o* S: l! @$ P# m, d% r if(!(istrin>>t[1]))istrin.clear();% p2 c' A& \/ S; Z* d
for(;;){9 |' G; v7 o' K! S6 j$ K
if(istrin>>csym[2]){" [$ Q, A8 x! ]
switch(csym[2]){
/ W" k, [' K0 A+ t( I$ { case '(':1 a* i9 e# x6 x; `$ v7 n/ ?
if(!csym[1]){nLevel=0x100; nERR=1;}else
- ~0 H, w# |0 Z' V if(!GetExpValue(istrin, t[2]))nLevel|=0x10;4 l: w7 V3 }' P9 l9 C( e& S$ O/ Y
else{nLevel=0x100; nERR=1;}
9 m# m: g: V" v: L* e% e break;
2 a; U( o& w' j. t8 d- j* m case ')':. M; _2 s# B3 j- m$ [: G% _1 L, z
{nLevel = 0x100;}break;
. d0 F: Q9 B, Y9 k case '+':case '-':case '*':case '/':
7 Y9 F8 a7 [) d: q3 R/ m X. A {csym[nLevel++] = csym[2];}break;
* m( Y5 X0 {$ J* Y& p case ' ':case '\r':case '\n':case '\t':continue;
9 C: R0 J y( G default:' u. O( Z. K) c' z( S/ y
{nLevel=0x100; nERR=1;}
: h* B1 L5 U# x/ x d }
' d r) \8 y# [' h$ K: d if(nLevel==0x100)break;1 K2 z7 e! g3 z l0 I/ Y2 _
if(nLevel&0x10 || istrin>>t[2]){
: j( J, a4 p4 @ nLevel &= 0xF;
7 H/ T( L( Z- K0 q: U if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* \& S" O$ l$ `' r' o2 ?! p4 @
if(csym[1]=='*'||csym[1]=='/'){
" E5 I, U4 Q6 T+ X3 { GetExpValue(t+1, csym[1]);# L0 v' J; M! _7 }% c" b; G _
}6 Y0 Y* h6 p/ v7 T0 n7 G
else{& H( G: G3 p' @ [% @
GetExpValue(t, csym[0]); ~2 D" W7 D( Y. n
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 a& m) {" H) d0 i8 e }
9 Y! E0 v; m1 M/ h" a nLevel = 1;
0 r3 F% r Y0 } }
2 a6 }0 a! ~2 T: ?# q% @( _ else istrin.clear();
6 z6 f& P9 X5 H7 O( O3 A l2 K }
1 f: U# h6 ^ l, C" s else{nERR = -1; break;}
4 i' \* X& w. q/ t; `5 s% @ }# d3 z M6 x- c, y, F9 o
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]); l9 t- K: z+ t+ L- d
else nReturn=GetExpValue(t, csym[0]);2 Q' n- M7 Z1 G# ]" h
return nERR==-1?1:0;. ]) d* ~$ P+ s# v$ H
}}
3 n; F: C6 H! Y* p$ b
8 W& }1 @7 Y! {* K+ J
p7 `( F7 t' y; i, U8 O. o4 b; u: c$ @" j6 {$ Y6 h% w
函数模板使用示例:
e9 I p# Y, t+ I, [2 t在以上那段代码的后面加上以下代码:1 a) s& e8 ~" G2 x# p
" x: B0 |& s( i: Q
& ]' V# e' |4 m6 c$ R# A: M h! L- N! m" q& N. s. J
程序代码: ( F6 ]- X! X9 m1 I7 E; [+ D1 ^
# l! j9 r& o* e8 J#include<strstream>8 _0 }7 Z- W7 o% Q7 q* i4 U3 Y I( J
#include<iostream>
/ W% B, c0 D" Y$ \#include<string>. H$ F6 d% J6 U1 J/ S" s6 }
using namespace std;
& f/ ]" z9 {4 z/ n6 Y( yint main(void): e& n. z1 P" G d
{) s! j' o0 ]3 l# A4 v9 y& P
string s1;
9 r. v$ l U1 X; ?; N while(cin>>s1)! l3 [ T5 S& q! O) a6 {
{
0 }" ~1 r* v3 I- H istrstream isin(s1.data());
# i1 e+ E: r8 _" y Z double d;4 S+ G( u/ w, {
if(fy_Exp::GetExpValue(isin, d))
- f" u; F/ b+ R U( \ _4 v {; \% g. B9 G' A `, E( q
cout<<d<<endl;( v' ?9 M0 t" i8 R4 I2 X" S% ~
}: \9 A R2 e4 T% L
else# B [* [8 v6 k1 d7 Q6 j( a! A
{8 _' i3 U$ Q: H' ^: ]
cout<<"ERROR"<<endl;
& F5 A2 n: z/ u {, Z" p% `4 f K }
" [$ T! x0 x- s- k! p+ L }; f2 C/ }) M/ p
return 0;
: S% \ s* x! m}/ y0 O1 E7 H0 N6 @5 ^5 G* y
9 e$ [+ `% S0 x& M7 {7 G; W' R) T1 o& M
然后编译执行就可以了(*^_^*)
0 g# T2 [ E% | W i% c其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( h! C/ s% a0 N" T( U% |4 J 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|