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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 n4 G# ?) y' k4 c d+ e8 f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 n- p" a; i8 M3 Y! C只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* q& w( Z" l. b" e# J: l参数解释:3 T, w6 E* w$ r
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( S- u7 E y9 x x9 S5 b6 SnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" s2 V9 s, b/ B% S1 L
返回值:
3 o- [; { S- k0 z返回非0表示计算成功,0表示计算失败有错误/ ]/ W& N+ q# F# L6 q- f# W
2 R) l' r! G* A: n& B( B: t3 S s
5 g* _- W* J' H. _' F+ m3 T+ ]8 Q m4 W1 J
程序代码: 5 P8 i3 }( k! Y3 j3 J' G
3 j6 R2 _' ?9 K+ | S6 fnamespace fy_Exp{5 L+ N/ r+ ?: l
namespace {template <class _T>
) k: e5 v T6 i, Rinline _T GetExpValue(_T t[], char& csym){2 {' p7 N' I# B2 Q; I
char c=csym; csym=0;5 ^' J' q' D" s3 a, M. \
switch(c){
4 N6 G% `# U9 n2 h case '+':return t[0] += t[1];
5 F3 V( o+ a6 u; x" w* O8 B case '-':return t[0] -= t[1];
+ p/ D: r6 v' B7 ^# @) S. N case '*':return t[0] *= t[1];, F5 |* x2 i& ?
default: return t[0] /= t[1];//case '/':
! l& D0 h2 y# D" j- f9 R& [ } O$ W6 V/ X+ J$ ^0 q: k; X
}}2 U( Y; u' R7 Q h1 {" \
template <class _T, class _Tstream> @. E9 M" Z% X- ]6 R4 t* @6 n: s
/* _Tstream: inputstream, _T: get return value
" I2 C z# h4 a' I* Return nonzero if get value successfully */
[9 }1 v# k5 m4 N9 I4 |$ R" ~. W2 z! [int GetExpValue(_Tstream& istrin, _T& nReturn){
. j! ~5 V( |: H* ]! Y _T t[3] = {0}; //雨中飞燕之作
) R$ U) B4 b0 }, V char csym[3] = "++";
. z( Q+ L# ?% }5 K. I, C int nLevel = 1, nERR = 0;" W1 Q: i. m# k( E& t
if(!(istrin>>t[1]))istrin.clear();
& e8 Q+ s3 D' x+ N' h4 V( U$ O for(;;){+ A1 n- {& q0 T6 n2 @0 W* q, G
if(istrin>>csym[2]){5 F6 W' G( F' e& c6 z$ P! k
switch(csym[2]){
( j% S! \5 K, Q8 l case '(':, T6 l/ [3 C; |! G9 ?' _) _9 R9 s
if(!csym[1]){nLevel=0x100; nERR=1;}else
" E0 A+ Z" `& X0 i" n2 a* d& t3 c if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
" Z4 a5 ~6 J' V% ~: ~$ O* m; k else{nLevel=0x100; nERR=1;}
4 `9 g8 A+ J e6 { break;
" w! [! F3 T' M1 _! X$ Y* m9 ^ case ')':
% ^# e+ o" D$ k3 F {nLevel = 0x100;}break;! U& S/ O: i, X: h* y5 m5 ~# f
case '+':case '-':case '*':case '/':
7 Z' Q; Q0 c- ?6 x. U/ d {csym[nLevel++] = csym[2];}break;3 V; E) a6 ]4 b
case ' ':case '\r':case '\n':case '\t':continue;3 Z0 a& u' {0 ?
default:3 r/ ~4 _3 ]+ |( Z) {
{nLevel=0x100; nERR=1;}' W6 T) y1 |: m
}
+ @- U9 @ O: G+ V7 q if(nLevel==0x100)break;5 ~9 d1 Y. n* M h
if(nLevel&0x10 || istrin>>t[2]){2 n0 ^) r, A5 [% S/ y9 R
nLevel &= 0xF;
T& \3 Z- S j if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}( O9 y0 q+ v: P, X6 ~
if(csym[1]=='*'||csym[1]=='/'){
% ^5 s; L& ~3 z1 i& ~ V6 R7 d GetExpValue(t+1, csym[1]);
! T, y, ?% |" P: L. \ u6 Z }
& }% n' |! {+ n4 ?& b% ^ else{8 r5 \- ^( S! R) a5 A, X
GetExpValue(t, csym[0]);
9 ]# C# a' n& v9 _. o t[1]=t[2];csym[0]=csym[1];csym[1]=0;2 v- F# X% K" ?9 c
}
* r# N ^ E9 O; q; G nLevel = 1;: N6 V4 h! V9 V: E
}
3 ~, `3 ]! ?$ `! v6 H/ x6 Z else istrin.clear();
# B5 C( B2 c2 N$ v }2 h7 ~; ]0 }8 [ @8 n
else{nERR = -1; break;}& U0 @8 ~0 z: r( Y: |- A* g
}
O$ V+ e# ?( h: N if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
- F$ c2 c7 C+ C, z else nReturn=GetExpValue(t, csym[0]);
- e Q4 J1 j( c' K return nERR==-1?1:0;. m/ F+ e4 G) m9 v: K( L& D
}}4 c1 Z( ~6 P' B' _4 M3 ~! f; a5 k: c
. f. q7 T1 @' F% @: @" K5 i
6 N) ]7 ~4 }! I
$ N$ ~6 c; T) i
函数模板使用示例:" ?: Z) ^( F4 K
在以上那段代码的后面加上以下代码: V, p+ f7 p8 @2 Z
# \7 R' i+ ?5 V2 P' |/ E
; d& o* j& m' O
, Q' U8 q) s7 o0 a* ^程序代码:
2 }- F1 c- o% ? }8 @" q/ ]4 z
. O/ u* O, j; y#include<strstream>
! E8 K/ u: j& |! G#include<iostream>
% i4 V9 @( g+ y7 s! x#include<string>
2 B( Q/ ?1 e) \/ s0 n1 gusing namespace std;( \ v+ u1 |/ C6 `- e
int main(void)
- R/ _1 N' t& q- @- h' p% X# K& ~{, ~" X: q% v* {7 Q' H+ O$ J+ m; }
string s1;( w/ }1 Q `% H; a
while(cin>>s1)- m. j1 e! V, }+ ]8 _
{
$ _9 D1 Z2 R9 M ? istrstream isin(s1.data());7 U- s4 V, r: \$ T) E" H1 J$ Y
double d;) z( n& z; x# E9 y
if(fy_Exp::GetExpValue(isin, d))% g3 |* K. ~) O7 u8 ?0 w
{
2 d* f f' \7 W# N cout<<d<<endl;" ^3 F k$ y& t! B$ k
}
w; h3 n3 [2 d/ \) v. c) y& z+ G. F else! \ I+ l" T p( i4 l* R
{; R. I U0 x% a- q2 J* h9 |
cout<<"ERROR"<<endl; w% ]% {9 n9 D5 U
}' y5 k' e0 R# `6 y- e) V
}: M* @1 i1 v! W* k! A
return 0;% ?% T! \$ a. }% g6 B0 a
}: w; C$ ]$ n6 ?" `
+ `3 C& r2 ~6 H! g: n4 B) W
& p3 Z7 i j e/ ?* p9 F然后编译执行就可以了(*^_^*)3 O& f7 L2 Q7 R1 l& r& N- ^
其它:TC++上一定编译错误,不保证在VC6上也能通过编译& H) g# l1 {3 z3 Q
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|