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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
8 i1 F7 Y5 {8 N3 v1 D8 K+ u4 P. o一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# n5 I& `9 O+ S' S- x只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)& i0 @4 C, B' ?4 v4 ~! g3 M- n4 a
参数解释:
' V; Y$ u3 Y- b ^+ v8 H; distrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 _ Q3 J8 L4 L# i: L' W, D
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ ^- T5 f, d% l0 U. U ?返回值:
7 i. V- ~2 V9 j6 i/ Y6 n4 D) k, P' D返回非0表示计算成功,0表示计算失败有错误6 `( x. C) B2 }
, u8 G- I0 V+ j
5 l0 T% j }5 j* ~
0 F! s/ H+ t: _" k% d
程序代码:
7 g2 I! T' g: R* Z$ r
" O: x) V: _% l" {namespace fy_Exp{
4 v6 J u3 J% \& O: E/ |namespace {template <class _T>
2 Y }' o; }# Z- w; {8 Sinline _T GetExpValue(_T t[], char& csym){6 Z; N; u6 V; s) b9 x0 d* z1 g3 H
char c=csym; csym=0; \# ~& R$ ^7 C% C; v
switch(c){1 Q. L0 d8 [% w5 P$ }
case '+':return t[0] += t[1];
& p% F: n" ^+ \1 p# G+ u9 H. ^ case '-':return t[0] -= t[1];5 y6 M' a5 F" t+ _& w
case '*':return t[0] *= t[1];
/ V/ E) E2 k( c8 L* ^ default: return t[0] /= t[1];//case '/':% x3 Z& D0 C9 u6 W1 n
}
. z2 L1 C9 W+ H7 n; v) S0 f}}
9 U4 ^& j# k/ U |$ Htemplate <class _T, class _Tstream>! X+ U$ P/ }) l$ {4 l# ^
/* _Tstream: inputstream, _T: get return value$ C- v" v( r* t3 R. J2 v. g
* Return nonzero if get value successfully */
( N- ~; c" R$ Mint GetExpValue(_Tstream& istrin, _T& nReturn){/ h" o5 e' g1 q1 i! j+ ]1 G) ^
_T t[3] = {0}; //雨中飞燕之作. h _1 ^2 B/ U% `
char csym[3] = "++";, z' }3 I! X: _+ V( R
int nLevel = 1, nERR = 0;
# O$ W6 `( R5 O: J& O if(!(istrin>>t[1]))istrin.clear();& R' j( F# z5 e& L3 z) ^
for(;;){1 Q. l' Z( H" ?8 o! a
if(istrin>>csym[2]){2 ?3 J) o+ a* T1 F! z
switch(csym[2]){
7 X- N) N' _* O6 Q6 u7 U& a: \ case '(':" Q7 Y/ G6 r& p5 c
if(!csym[1]){nLevel=0x100; nERR=1;}else ?& V: o: n. E; m( J# X7 C
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- C @/ j3 s; y( W( C* v
else{nLevel=0x100; nERR=1;}
3 O j8 a0 v6 `; j: q break;+ Z2 l- W: Q- ^$ [8 l/ [! b
case ')':" r+ z0 m) o# E: B
{nLevel = 0x100;}break;5 X8 g% T8 U5 F$ k/ A
case '+':case '-':case '*':case '/':5 i3 e4 O, S) g4 p( @7 d
{csym[nLevel++] = csym[2];}break;: \$ m/ M+ B! e, J1 v
case ' ':case '\r':case '\n':case '\t':continue;+ `: M* g& C& R9 |; ~6 }* u$ H6 d
default:+ M7 x- y ^4 W6 ~* D& u! b5 J
{nLevel=0x100; nERR=1;}- n9 i0 L2 q, N7 ?+ B/ F
}
6 m4 h9 V. X( u) T( C* o if(nLevel==0x100)break;
) F$ `/ m& \9 E6 N) u8 f9 H; U if(nLevel&0x10 || istrin>>t[2]){( r9 `, h/ K+ u, y. V
nLevel &= 0xF;
. N% c- {8 _( d3 N7 B( t7 Y if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" q7 Y: }" b# @; z if(csym[1]=='*'||csym[1]=='/'){
7 r! L! i9 H( a! M GetExpValue(t+1, csym[1]);
, ~6 k! z' J @8 V: f; [ }
, z5 ?4 @. k1 C U$ ?, \ else{
: S/ k+ w! ]/ ]1 [; O GetExpValue(t, csym[0]);
% g7 q* K7 k4 x3 k6 W9 R t[1]=t[2];csym[0]=csym[1];csym[1]=0;& m& Z) D, O* X: N" K* s
}4 j: f+ M* }+ q3 z& }& O, i
nLevel = 1;
% P( Z# k7 g, B0 h4 R4 H v }8 k f4 H, s7 t: n# d
else istrin.clear();/ z p5 K; \+ A0 o4 f
}/ c6 k3 P3 { y* V M5 ]9 Q! G. g5 Y
else{nERR = -1; break;}
2 y/ M% R3 G1 {, |& O" W; T }
# A/ B& r3 ~4 q# g% A: Y% K% D if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 N% E1 N7 ^* a n* B else nReturn=GetExpValue(t, csym[0]);
5 k- u+ i5 U5 D- X% U! E1 d return nERR==-1?1:0;
: j% N) e+ S. e}}
6 \; g/ X! Z; ~' A7 X
5 u8 j& Z; c. W- k T: B( u- e& R/ G9 D4 \/ m8 y6 E
4 X6 J, W( k: X) V$ y" K; C8 r
函数模板使用示例:* Y3 ~* Z$ a9 ?( h/ T7 V
在以上那段代码的后面加上以下代码:
) V9 b9 A% l8 C9 S3 I1 E* j: u7 f
) \6 d3 A/ v4 S9 o
% k! d- M6 {- x. O+ ?
, e2 U2 n. t5 S程序代码:
+ I# K, d. s7 i: \ T5 r( W3 X5 f1 \8 l+ B0 A0 V/ i' B. L
#include<strstream>% L* f0 q3 i8 q: F
#include<iostream>+ P* _& G% _9 f% w$ U- Y2 K
#include<string>+ V4 e$ F. m& J" J0 P
using namespace std;
9 u# P; s$ F- O) V, aint main(void)5 Q J3 z% z6 ]' \2 [" A( c
{
- M7 S, |, l" W7 k: M2 Q) f$ i" A string s1;
7 V7 ~) q' M8 K/ `% N0 Q while(cin>>s1)5 e5 l2 f# W1 z: k3 p) i7 P
{3 O- ^0 H; F( H; R {; [
istrstream isin(s1.data());* e- Z# K) q0 Y1 y$ g
double d;: h3 g! [% Z$ E9 F C
if(fy_Exp::GetExpValue(isin, d))9 z7 ~# Q: r* }2 C/ ?' m7 }
{2 Q; ], C/ z9 P
cout<<d<<endl;
! w) L4 g8 @. \0 G }- k8 A" u: f$ n5 O9 h6 p
else1 P9 d* N6 Q" f" C3 k6 ?5 x( @
{$ r' m9 E) d- k/ m
cout<<"ERROR"<<endl;% l: d: F/ n- }4 U" @
}7 T, u* B* d& P" _0 z
}
6 h; U! a/ k6 {; \5 P/ d return 0;
6 E8 H m# B1 R# @- p$ D}
3 F0 G7 q; A6 s6 u
C0 I' S9 u! X3 n" Y7 s% G: V9 i
# H4 l7 ?$ |* h2 n& I然后编译执行就可以了(*^_^*)
3 {" p: t# G5 l2 F9 g9 C其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 J1 o- b' I! m' y, U1 w8 C
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|