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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
, X& t4 C' B7 o一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' [+ k# F1 \. W ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn) n9 i7 p" U+ K2 `& F: b. h" p+ N
参数解释:5 H3 l3 b$ L3 H2 U2 R& q* ?' G! F
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 h" {/ @8 t% x! @/ [
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ p- q$ a7 L9 \8 O+ W7 D& u' P返回值:
" n3 ?/ i# f/ B% L; d- M返回非0表示计算成功,0表示计算失败有错误
3 g; g# L. m/ z3 h/ J, u4 V2 v. e8 t
. h" h" Z1 ]6 d3 L6 B
2 q" t$ q' |/ l F程序代码: 4 P" j' {5 e- ^% O1 i$ g
# X& b, Z; v9 r! Z' r' y. ^
namespace fy_Exp{
8 {3 g8 c. H9 c1 }3 b" Dnamespace {template <class _T>
8 H" D4 s+ J# M7 ^inline _T GetExpValue(_T t[], char& csym){8 s' f) `/ Q. p
char c=csym; csym=0;0 V7 [/ G2 T0 X5 _& r
switch(c){, X. V' o; B7 N/ }' c# o
case '+':return t[0] += t[1];: b) A- t" l5 M+ C# [8 n
case '-':return t[0] -= t[1];2 \# a7 z; T) k% h
case '*':return t[0] *= t[1];) v; O U- W& K5 O Z
default: return t[0] /= t[1];//case '/':
# [* q* |( e9 |5 u. g }0 W) P: U. a% J( S8 x+ p- L
}}8 E% R1 Y8 B) b4 @$ C+ c
template <class _T, class _Tstream>/ k* a# @. k7 m: y* k
/* _Tstream: inputstream, _T: get return value+ f& E0 a0 s: Y* v, t; B6 }
* Return nonzero if get value successfully */0 D* m, n! Q& l* Q7 x
int GetExpValue(_Tstream& istrin, _T& nReturn){
6 `+ ~3 j! q G: h _T t[3] = {0}; //雨中飞燕之作0 E R/ i8 F# R
char csym[3] = "++";2 l# T- E" @: [1 i. m
int nLevel = 1, nERR = 0;
* { m' x4 U! q' R if(!(istrin>>t[1]))istrin.clear();- E. a2 s1 z5 a# Z+ A7 N& Z1 V( Z$ b
for(;;){
; p' C) D/ R" m6 S& \ if(istrin>>csym[2]){, C3 C1 g; v: a! p9 A* X9 ]7 y9 s
switch(csym[2]){) k/ U( _% g! M6 i. x$ x* v; {
case '(':" B! o; d3 P- [6 J- n, n
if(!csym[1]){nLevel=0x100; nERR=1;}else. X1 P$ G, ]3 `/ b
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ o2 X/ ~. i: v+ N- f1 P else{nLevel=0x100; nERR=1;}6 ~. B! U8 ]+ L3 x" L9 R# Z( `
break;; I4 Y. c; J$ g1 f
case ')':
: y$ X& W9 `1 L8 @ {nLevel = 0x100;}break;
- c* R3 w; U# X7 D7 P- ~. a case '+':case '-':case '*':case '/':2 H/ A6 I, F6 C
{csym[nLevel++] = csym[2];}break;
3 {7 ^5 f) ~! {$ w! U+ d2 V case ' ':case '\r':case '\n':case '\t':continue;
( C/ w5 w: Y+ u default:
; l& z8 S+ X& H: Y" o {nLevel=0x100; nERR=1;}% |# Q0 D8 c. j% } e
}
% j& q2 r% d6 q if(nLevel==0x100)break;. T# k) E; _3 h7 l$ m& j
if(nLevel&0x10 || istrin>>t[2]){
3 ]4 L' g( O8 t) O, _ r nLevel &= 0xF;
1 `4 f3 B- A# b. j8 x0 p8 e/ O if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
/ ?; M3 d! G4 J# R4 H) {1 @ if(csym[1]=='*'||csym[1]=='/'){& J w% J7 k; H: D
GetExpValue(t+1, csym[1]);6 M9 M! a8 D) w" j% m
}
# ^4 O4 d- G2 g2 _ else{0 f9 h' T9 _1 d9 l
GetExpValue(t, csym[0]);
! s6 t: N6 R% H" _. m; E: J t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 W5 v% H9 ~! C3 T% w
}8 M/ d% ^; q- ~, y& Y- M
nLevel = 1;
) K. v; A( ^# f J! n! [. Y }
. x* z# N8 [; O) ?& ^ else istrin.clear();
2 k9 u0 Y; R ~" q$ V6 S }
9 V6 h o1 j+ h. o else{nERR = -1; break;}
; l* b! p3 J7 [# K U, c: Y, o) w0 M' c; c: K }
* Y1 a3 q0 y8 x if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 S! _3 C) _" t. C& o- ~ else nReturn=GetExpValue(t, csym[0]);
' I% `* r, v$ J( D: y J8 P; r) b! e return nERR==-1?1:0;
( @! e* Z( l8 r}}( }( u/ k3 l7 n/ m& E
* E% [& @4 f( [$ c4 K# Q4 {, A( V p" f1 `2 p0 f0 K
. N8 d7 O+ \0 H/ W函数模板使用示例:
4 c, V2 J, N8 h% L! L在以上那段代码的后面加上以下代码:
( V/ K3 t, b7 o1 e; f. k/ g3 v
+ t, u8 E% }2 J% S8 Z 5 F' u1 W+ S# w1 _8 T
?) |3 x* y9 D, \% c5 H程序代码:
& N! Y R" n6 V- m( K0 L) @; F' x7 E l
#include<strstream>2 d3 ?8 |; D( h. r6 P* ~' d1 O
#include<iostream>7 ]: {" I) K W& x% u
#include<string>8 U. V" f; W# x, Z+ z. D
using namespace std;6 d. C2 @, _% s. y* y
int main(void)1 u& l& N0 O9 H {
{
4 ]1 \; G6 g% \4 M- _) ?) G+ z string s1;
' Y# v0 J' c6 z \6 k while(cin>>s1)$ o$ @; ~! S! }+ v# X& b; `
{2 A" j6 E* N: u2 ]4 \+ L
istrstream isin(s1.data());- }2 D: {& B( s+ J' M- y
double d;
8 ?. e8 f1 l0 p" A1 ]) {& ^! @ if(fy_Exp::GetExpValue(isin, d))* P& q* c/ U4 B: ] q$ P
{$ }, G. |9 V+ z9 f/ W3 r+ w2 T
cout<<d<<endl;3 {1 c1 e' y* E" S8 F q
}
. A0 G, F9 L( |/ F% o6 I else; n* K% K, B3 g
{
, V3 Y4 _0 w+ i& d3 H/ R cout<<"ERROR"<<endl;( X0 a- f( z9 {2 ]
}
* {$ |# [% w3 W) z6 W" p }
- u3 t/ }( _6 \5 K7 c& W+ W" z return 0;) a4 B8 b- r: n8 p q7 [# v Y
}
' k$ I/ H3 O$ Q {0 i
; F6 [- j& E6 }1 k( J1 R# B& q6 ^, ~3 P
8 R8 @! d" l( W5 R然后编译执行就可以了(*^_^*)
8 @) t8 [3 t" ]7 X. k8 S" J其它:TC++上一定编译错误,不保证在VC6上也能通过编译# D/ |( e5 I! e( Q$ \1 v
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|