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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
0 t; j& j2 b( E9 i5 c' U% C一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- I7 C0 ]' i4 p) K
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. y5 x. V3 T7 D% J& F参数解释:
/ @; v) c- k* Eistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 l+ \& |" X; R: L6 _nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定, Q. D! u) N9 e" P7 T
返回值:
& m/ i L: _# X3 u返回非0表示计算成功,0表示计算失败有错误" Q7 U0 `3 H0 @4 c9 Z/ o: @
* u9 I4 ~* {! N- J2 q! T q- B
& f1 y* }- ~; C3 A" w3 B
% r8 ?/ S1 b: u' m! k6 [
程序代码: - D- Y+ o) b8 J. l( K" S
}2 u+ d, C1 p7 e8 j" h; E n
namespace fy_Exp{/ |- `. m: N" c" b9 M
namespace {template <class _T>3 _& }- ]4 _5 j
inline _T GetExpValue(_T t[], char& csym){4 n& F; ?: j0 D2 z- O# T7 O
char c=csym; csym=0;
/ _6 d |/ X2 X( A/ l; E9 q switch(c){$ O q+ |& s+ L" d3 c6 I
case '+':return t[0] += t[1];' g# n- T7 [5 k( U
case '-':return t[0] -= t[1];
$ p6 w' f) T' P: o6 E case '*':return t[0] *= t[1];
' O1 i- W/ o6 J. J' p default: return t[0] /= t[1];//case '/':
4 y( M% ]5 Y( R% p- T/ E1 P }
9 K8 Y) k; j2 c+ I9 B4 d4 B}}7 B" F0 e& R8 `: M5 m
template <class _T, class _Tstream>
, H, ~+ F# A" ^8 P0 p1 L5 G1 l/* _Tstream: inputstream, _T: get return value6 q$ P b1 G9 [0 G$ |7 P
* Return nonzero if get value successfully */
+ R* q' Q+ t1 |int GetExpValue(_Tstream& istrin, _T& nReturn){1 V: k" J3 z! P7 N( Z) k8 T
_T t[3] = {0}; //雨中飞燕之作4 S* g$ ~; ?1 G- M; S4 ~9 G; I! G
char csym[3] = "++";
3 A( o( x6 k% u6 H+ T l; T r- v int nLevel = 1, nERR = 0;
9 {; [* d9 d% P0 T$ q' D$ j# @. a if(!(istrin>>t[1]))istrin.clear();& F* r8 A. A1 b1 }" r" r
for(;;){
0 }+ ?* P/ W: M! ^ if(istrin>>csym[2]){
% j/ I- O# Z, W, r# U6 Q switch(csym[2]){ a$ U r2 V& C- G9 i$ ~. u: j
case '(':
; Y2 P. E. g9 N if(!csym[1]){nLevel=0x100; nERR=1;}else
3 G( g- v ]; Y if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 R% i, i6 m- _; W2 O$ [ else{nLevel=0x100; nERR=1;}
* o5 W% }5 \; n& |, X+ a break;
+ k# Z( h; `7 O2 i+ h# Z# }* V case ')':
: z+ | n2 z: e" C! g0 p1 `) G1 o {nLevel = 0x100;}break;
; h( g$ W, u) M# Y& }* d- d case '+':case '-':case '*':case '/':' @" a9 h2 F0 Z1 x. E
{csym[nLevel++] = csym[2];}break;
$ b! U7 H/ _* D* \' r7 P case ' ':case '\r':case '\n':case '\t':continue;
5 ]- R( K! B0 ^' j+ H8 c$ H default:1 A3 o, E( K* F; j
{nLevel=0x100; nERR=1;}
6 H1 ~& f' [& q* p8 W$ V }1 P9 h, \. ]* k: B1 ~7 {0 z
if(nLevel==0x100)break;9 V' w- a1 k% W4 W5 l
if(nLevel&0x10 || istrin>>t[2]){
a5 G* Q: o5 j1 S3 q nLevel &= 0xF;
' o5 R& z( F+ r/ L8 f if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}" J) F* X2 I, a; Y1 t
if(csym[1]=='*'||csym[1]=='/'){
3 \ P1 U1 i* g9 X0 T) |2 M GetExpValue(t+1, csym[1]);
& v4 G0 Q; q4 c5 A/ j3 h }2 y$ N/ q7 F; g. C; p" @
else{
6 a6 \. W' D* |8 m. q: D GetExpValue(t, csym[0]);- G) i( K" t+ H Q+ \' m j& q4 X' q( w
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
5 y8 b& Z3 ` |# a }# }7 v' t8 x8 a$ k
nLevel = 1;2 c' t+ K9 r0 v4 I, X7 d1 F1 H( f/ c
}
8 i# S6 ]& m3 F+ {1 i else istrin.clear();' [+ C2 {, G: F7 r. r, P, H
}
) L3 Z( I1 w9 D @; ]2 D; T else{nERR = -1; break;}3 Z1 r8 j0 V- Q% Q7 I! f& `
}; b/ q) I, E* s$ Z/ v( E7 V
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( b3 i- V' F0 Q( i2 H. p3 I# j else nReturn=GetExpValue(t, csym[0]);
" G( J- G9 J$ [0 F! J* B d& K# H return nERR==-1?1:0;, R0 n2 L5 K+ o7 q8 p# N4 ~
}}' t$ b% ^) `9 W/ o
0 i# D0 e4 @. C$ j$ n* a8 x- @
6 Y+ z; u' _* t) w* E+ D; g2 |- R9 w7 M, n0 o& A8 P6 p
函数模板使用示例:
& b' G. X$ O( j0 H9 A7 ~在以上那段代码的后面加上以下代码:5 b+ U m3 ]3 ^* S
) }4 R; [+ ~/ {; F % S0 ]% T1 k) }4 N! E$ l
2 r! f8 m) a6 t程序代码: 5 G5 n! r8 Q1 G0 R& O
& J0 V. B0 i2 r
#include<strstream>
' O4 y8 }% V+ k' l" V7 o% n$ ]' f#include<iostream>
! S4 Z' W! r; j% Z: K" m#include<string>
' e/ ~4 L9 t; a# ?% jusing namespace std;
' z+ V9 B4 T) N2 [" o& Lint main(void)/ {" ]8 O2 ?- y1 B
{
3 p" I& W& R* z% L* x6 r string s1;
/ A7 @$ D6 T. X/ V3 E while(cin>>s1)
' n4 z; N! O/ B- g4 x' ^ Y {2 g% s* v1 E3 m) E, q& A2 V# Y7 ^6 @
istrstream isin(s1.data());' a# M% U: g2 }
double d;7 ^- I3 N" O+ p' Q$ e: V
if(fy_Exp::GetExpValue(isin, d))
1 `+ Z& T7 V8 u2 K) h* S0 P I4 { {. m7 C k+ t. |+ u: {1 _/ T% [
cout<<d<<endl;
, a, F, A+ G# V7 C- o }
2 G; b- N5 }9 _ else
. g7 B* w# n% |" @! ~+ I6 C: R { F1 B S t$ X
cout<<"ERROR"<<endl;! } ]+ l" L, u+ y% l! u# Z
}' G* @5 `+ l( I" m0 B+ F8 g
}
5 X( f0 F& B+ Z+ o! |8 A9 G return 0;
; ?1 U0 `# [" d7 m* \0 g' N: j: H}* \9 v' S# |) Q8 | E+ x# v
% |- u# e# X( J0 W. W M5 S( ^- E
然后编译执行就可以了(*^_^*)
; k# ` K- g9 x, v9 V3 z其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 U1 W$ ]6 z! m7 u5 Z
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|