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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
9 U* X ^* d9 h2 a一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- V& r* X. N# @$ L: D只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' ~* k) e0 t' p& U _参数解释:
# l$ M6 y) I, u/ g2 }! [istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. T( k8 @9 U6 y, S: ~! V& Y5 unReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ B% I5 t5 j# L( _返回值:
) L9 s0 M0 Z8 C返回非0表示计算成功,0表示计算失败有错误9 ^ v3 \( N0 X' Z; d
! C6 s2 V% y/ T, I3 Z
" r+ s/ d8 K# `* G3 m4 c. T4 T
# R+ w3 A+ Q4 A$ K6 Y程序代码: 8 ~; F0 T% \* x; z) f
& i- ^! ~' I M( \5 K* M7 z7 |namespace fy_Exp{+ Y$ P, F5 ?* g6 |
namespace {template <class _T>
1 M3 ~2 C3 n' z. y' Zinline _T GetExpValue(_T t[], char& csym){( v. S3 q. O% \. F9 Y& }
char c=csym; csym=0;0 S6 n5 g/ P% C% h4 Q
switch(c){9 z* l8 k* K4 L
case '+':return t[0] += t[1];
5 m9 @ w' ~7 S6 N" R; Q4 g case '-':return t[0] -= t[1];4 e N! ?" a3 P) K: @8 y4 ]' U5 [# w
case '*':return t[0] *= t[1];! h6 E0 q* s G" c. E A
default: return t[0] /= t[1];//case '/':6 k1 M; g7 Z, X$ I+ I* \+ i$ | F
}) e' @. U. a8 \
}}
" a3 k) _) E4 e( u/ d7 x0 ^$ Utemplate <class _T, class _Tstream>" C( m) c- f; J, o
/* _Tstream: inputstream, _T: get return value
& L6 I7 @% G' ?( Z! o* Return nonzero if get value successfully */
: U5 d9 z& L7 m; |) Sint GetExpValue(_Tstream& istrin, _T& nReturn){
0 ]- J) p8 C4 L( r) J6 y _T t[3] = {0}; //雨中飞燕之作7 D) s1 J: E8 ]! n
char csym[3] = "++";) \" M: |3 O& F* a" I, k m
int nLevel = 1, nERR = 0;$ H& V/ R) z* F2 `5 |5 i( ?
if(!(istrin>>t[1]))istrin.clear();2 e2 l8 {2 ]8 q$ h4 q8 Y/ S+ Q
for(;;){
- B% B% T# q( b: c' { if(istrin>>csym[2]){
. y c( b7 }; `2 H0 ?8 U switch(csym[2]){& |# l# t0 T& \! e; ~: W! L% v1 t
case '(':" d8 _ ~- E( `
if(!csym[1]){nLevel=0x100; nERR=1;}else# n+ m1 ~& _' y
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;7 b- k) Z0 B, V4 ~8 c
else{nLevel=0x100; nERR=1;}/ _" g& _& i$ i7 d4 Y8 [
break;
7 y# ?# G2 ]4 {, |9 T case ')':
' j# _. @0 w9 H {nLevel = 0x100;}break;
% X7 z# m" q3 r# K+ z case '+':case '-':case '*':case '/':+ [! j& G; \ y3 {5 Z% A) c; Q
{csym[nLevel++] = csym[2];}break;. G' } e' D/ ^9 T. v
case ' ':case '\r':case '\n':case '\t':continue;
( \7 {# f' r0 f$ G default:
: H0 Z9 ?2 u1 l: G {nLevel=0x100; nERR=1;} F, ?1 F0 B& f' a9 V9 N1 U
}, w9 X6 ^) E0 w: b) h' }
if(nLevel==0x100)break;
, y/ ?( c" b- L if(nLevel&0x10 || istrin>>t[2]){! p4 D4 V; T, t& [9 a) ^$ K
nLevel &= 0xF;
v- B, u$ u5 a- }0 E. U if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& o) X- C/ `, M, w# E( E) {; S: s if(csym[1]=='*'||csym[1]=='/'){ L; q) F, `# \8 Q
GetExpValue(t+1, csym[1]);' A( y: z V9 a8 P" @4 s7 I
}
* n8 W) E6 I0 H. [, `0 ~ else{
, g& S8 ?6 I: W( c" c+ X. O GetExpValue(t, csym[0]);
& r: N0 E4 z/ L6 a) w- H" r* m" I5 y t[1]=t[2];csym[0]=csym[1];csym[1]=0;" B! \6 l0 V& r1 D4 X
}
7 Z s4 F- z. y$ d4 d( G5 @ nLevel = 1;# n) h4 d! N B& a3 c) c
}
$ r2 ?9 y0 N* ~$ u: K! Y/ a else istrin.clear();
* F; n/ r6 M/ P) G }
$ ]* a" F+ b6 C% U% e else{nERR = -1; break;}4 _/ F3 c6 I+ w2 e
}: {, X# g1 c; I [
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);. f5 _* }) \: G$ d
else nReturn=GetExpValue(t, csym[0]);
/ @. q0 _1 y2 P* S/ C return nERR==-1?1:0;
: \/ \8 e' i3 D/ E0 a$ s}}) o: L! K* }) y/ l. Z; b5 e( ]
8 X* }& x2 A; M/ q9 [1 ^, C6 K; U
* @3 I3 f8 S( s! z
& R4 a' [+ Q K1 Z' Z k
函数模板使用示例:0 p# W; {- s- ~3 }! @1 C! ~2 t
在以上那段代码的后面加上以下代码:1 w: _0 b7 [5 u T2 i
8 P% U0 J1 H7 g1 l# I
4 B2 S6 l2 i' t1 Q1 e# j: [
- F7 y- j% N% n. r' J8 }程序代码:
8 U$ i7 y4 b6 G1 T4 s$ f5 Z7 T* m' }% l4 |4 G
#include<strstream>
7 X c4 p" I4 v#include<iostream>
. g3 o! e* _. B" F2 S# x#include<string>
8 M7 Q) O G7 O1 b `using namespace std;
# J% q' t$ Q- y* oint main(void)) b- X! B+ b3 x; s
{/ _2 F: g" }. V! x4 k7 a7 c
string s1;
7 n& e- F. p: L& m/ O8 p! ]) ^ while(cin>>s1)
6 R0 F- A& {5 w: Q n {
: ^! t8 A9 P A) Z/ j, B0 C6 ]; u istrstream isin(s1.data());; G1 C+ }' _: {3 v& @2 [
double d;
5 {3 X/ U. X! ~/ w6 a8 e9 r3 ] if(fy_Exp::GetExpValue(isin, d))
$ k2 {* O8 ]3 O! A- F {1 L9 W! l; R6 B5 J
cout<<d<<endl;' P+ _- d- e1 E- K u
}
: k+ f3 `2 s- c$ A1 q% K% \& T7 G else
0 v& J& d* J+ Y {( x- K, d) z) [# E/ y5 f" l0 E
cout<<"ERROR"<<endl;
! {9 {0 F& Z, Y }) R4 Q! D& K4 R, S, b) z+ }
}7 K8 J- r# w% j% w7 ~ H- R; m) @3 r
return 0;/ V$ G' A6 Y$ _0 X9 \) z& p+ [
}- \( M8 T7 o* `, \& M2 j
& J' c: f+ @, |$ \" h; M/ e: j3 \2 P* G& h( [! b
然后编译执行就可以了(*^_^*)
( Q: C" q; w; B) r6 o, ~其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ d% ?& T2 Z$ K6 n5 M7 [2 }1 j. e- J
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|