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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,7 k, @1 A- d0 w5 Z
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- T- X+ f% x/ Q, u w7 D3 t1 {只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* a6 D% \2 s; D. [" ^7 d: q' {) k参数解释:
) F6 x: B* N- q" ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ e v. y1 l, A: b" g
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 T7 v3 b, i2 ]
返回值:$ S. [1 M& \# V$ B" \* T
返回非0表示计算成功,0表示计算失败有错误
7 ?, R _) b- T; S, I
# M7 x6 u' |+ ~ 4 k3 ?9 N1 O: G6 i, ?7 M) A2 O
8 a( x: }) T* p4 J; I& }7 @程序代码: 0 y {$ V' v' u" Q7 L. H7 A/ s
( u& A \# H! r, Gnamespace fy_Exp{1 S k- Y7 o. D8 a
namespace {template <class _T>
$ [: `/ P- G1 a1 \% t# l. W# Dinline _T GetExpValue(_T t[], char& csym){6 `! p" ]$ q# r5 w" b F8 Q! m
char c=csym; csym=0;
% A: }" X' Q( ~. B/ j switch(c){) |/ X; H) J7 @ v
case '+':return t[0] += t[1];; O ~# N. d5 U6 k
case '-':return t[0] -= t[1];
% G! N+ J0 J! q' g* i* | case '*':return t[0] *= t[1];
) u6 U) z* V5 Z8 R, \4 p default: return t[0] /= t[1];//case '/':
) ]& ~1 J! s+ R: y2 y( M' e }1 P: m B* A8 S. U# E/ v8 E
}}
) i: F- t& k e0 h2 y6 n$ Z$ r5 ~template <class _T, class _Tstream>0 ^& G/ _5 n# W: h3 m
/* _Tstream: inputstream, _T: get return value
" f, f; j F+ o1 z* Return nonzero if get value successfully */
+ n: T& v& o1 e; t# S0 rint GetExpValue(_Tstream& istrin, _T& nReturn){9 I8 j0 G' T: q$ v
_T t[3] = {0}; //雨中飞燕之作, q& c* N# a1 \) H
char csym[3] = "++";
. C, z5 `* }. F" S3 F int nLevel = 1, nERR = 0;' Y. M# L* S. [& e
if(!(istrin>>t[1]))istrin.clear();# {) Y6 _( r3 A9 _' b( j3 X9 t
for(;;){8 ^8 Y3 Y4 _6 I7 \, j
if(istrin>>csym[2]){3 ^0 U) o5 N6 f$ h
switch(csym[2]){
* T! _# L( j+ m8 t case '(':2 z2 N# u i* V1 N
if(!csym[1]){nLevel=0x100; nERR=1;}else/ k' y5 f- V7 T6 ~% P
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- M3 j/ W9 {1 F0 `0 z l4 G! s
else{nLevel=0x100; nERR=1;}5 h y5 E) _( q
break;
* n% P$ @! t3 U$ b6 K case ')': U. f2 @/ l+ W7 L( d6 v( C
{nLevel = 0x100;}break;/ m, Y# @5 C4 `# M& }
case '+':case '-':case '*':case '/':$ @, y2 H5 B6 E/ W+ y0 I
{csym[nLevel++] = csym[2];}break;% q% l; L1 J' {+ {! g% b) W* z4 r
case ' ':case '\r':case '\n':case '\t':continue;
/ Q. I1 B3 J8 B9 c& z$ \, h& \( c default:
4 m k9 y8 C/ l {nLevel=0x100; nERR=1;}" y- m/ y) O0 D0 B n8 b
}' o% y9 w) ^# I, w2 s* W a2 s% z
if(nLevel==0x100)break;
% w% \, D% a( m# S ?+ u if(nLevel&0x10 || istrin>>t[2]){
5 N2 K0 I& E+ ?9 w nLevel &= 0xF;* E! m9 q8 [8 X6 @9 D- o4 M
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 O; s7 m! M6 P R5 { if(csym[1]=='*'||csym[1]=='/'){5 o# O2 C" w- K. E; u# D. a
GetExpValue(t+1, csym[1]);: ?4 E, N# ?# j( M7 o; d! K
}
, b1 a& {+ Y! z else{
% k) E2 d' e% k/ J* R& }- Z GetExpValue(t, csym[0]);5 X' _7 |$ {/ q% @6 I7 ?2 X
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 ?. X5 I# G/ |# Q }
* W* |- R, p7 Y- R( d nLevel = 1;
% u' A6 y: b+ I/ q4 k4 R8 p }) t4 ?: J" ?' y8 B- M
else istrin.clear();" O5 V( G# f$ U9 s- N- q2 O1 b( _
}' d, d! V4 H5 n& @* U6 Y( p
else{nERR = -1; break;}
% u+ l0 ^7 m! s- F; v' W }" P! A; n. P2 Y- ]# Z' K0 P
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 ?# G' F( ?. y else nReturn=GetExpValue(t, csym[0]);5 w* q# }# Q7 S* J7 |
return nERR==-1?1:0;/ X7 M( c( P: ]' l- d
}}
1 P( i# d9 [6 A8 h- D; I+ x+ Z2 t3 `7 ^- M% k! H
( Z' N# f* D! f% S& c# k8 s
+ @& V1 j& _) q4 n+ F. C* I
函数模板使用示例:5 D9 R1 A- O/ U+ }: @3 A w
在以上那段代码的后面加上以下代码:& [$ f# J3 m! X+ S8 M P4 Y# `
. |+ B9 `3 ]6 k. F/ y0 @6 m - S; ], w/ d9 `+ p: F; f5 K p9 z
7 r$ M6 R o; [2 q+ W( C: M
程序代码: ( p# e) F0 T- ~4 h
7 l1 N& {0 Z* L x; a0 b: z5 \
#include<strstream>! `2 H0 ~4 y7 I6 o" N
#include<iostream>. l- E4 a7 q6 t: s9 q) P) g
#include<string>
" r7 D" p8 s+ e8 I! Q7 Vusing namespace std;4 I1 Z$ q3 n! N$ X* \! S( \
int main(void)
p. }% j' O7 |) U{
# [; \1 P+ W* @. \' R string s1;3 p7 i) C, h% e6 O& e3 ]- C
while(cin>>s1)* K& a: o! N) F* x5 R6 E% v
{
, {: [9 a: |) J- L4 [1 ] istrstream isin(s1.data());
# ]: w' m4 k5 A1 L7 N2 @ double d;& q: p" ~! D: M' O
if(fy_Exp::GetExpValue(isin, d)). G+ y' g! z7 k7 S4 u; \8 a
{7 z, N, X8 q q2 V) M
cout<<d<<endl;& J- N1 [$ s8 P0 U. W
}4 Q, x) k" o) P" s
else' z+ E P$ U5 s2 t/ D& S
{9 l1 h, x4 r0 C% N: M4 v4 c9 ?( Z
cout<<"ERROR"<<endl;% r+ {! {* z6 | ] m
}% R3 n7 J" [$ r2 L/ X
}0 B w8 b' L) B3 W& l( H
return 0;/ |# m/ y3 X0 Z7 a
}
4 j1 S0 k2 U! Q6 Z y
9 [' E% A3 o3 R, L/ X g5 j9 E# s# {- u& H9 v2 k$ _ b `
然后编译执行就可以了(*^_^*), _! j( F- ?! ~6 j- I0 K! C
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# S* H/ k$ T8 T) B* M( O0 ]9 F 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|