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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的, Z, h! s" R9 |+ w
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
7 |, b- Z8 o7 L6 q2 ~# [* c只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 i6 { k7 {! Q( ^- O* y% T; b
参数解释:
: V3 [: K+ A$ listrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 R/ m" k3 a4 M, z3 g# l% DnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
. F# O ]9 @$ T; X2 f1 r返回值:; o) r& P9 {7 n; |+ o) o
返回非0表示计算成功,0表示计算失败有错误 I) ?, N8 K* e7 Y4 p7 B/ g
& t: v- [; t! C6 P" J, B7 z; S ! ~6 e" X0 B6 u7 M% O" d
$ E7 M- t9 m5 E! p; v5 l( B0 }
程序代码:
/ d- R# c$ M6 |+ l z& Q
0 b( t7 O/ L8 wnamespace fy_Exp{
; f; v4 [! `- H0 D! h2 gnamespace {template <class _T>3 R! R4 ^# Q0 x" H, [. P3 G
inline _T GetExpValue(_T t[], char& csym){: h! f! N& ] S1 O( d
char c=csym; csym=0; M; c; F. T: G; q. e8 ^/ i3 h0 b
switch(c){
! d/ v9 \% v7 n1 s case '+':return t[0] += t[1];
+ \. U7 @! M- I0 F( T case '-':return t[0] -= t[1];7 b' _5 D! c V/ E5 N
case '*':return t[0] *= t[1];! A2 j$ n" e9 E' `
default: return t[0] /= t[1];//case '/':$ R# B' L" Y0 a* x$ K
}+ a+ F, R j) c! `
}}
p) h4 c! L' ]1 W* y( p, j0 z% R$ Xtemplate <class _T, class _Tstream>& R4 Q1 Y7 \8 a1 q+ n2 E7 R# K
/* _Tstream: inputstream, _T: get return value
4 m' h8 p7 z: p% g& X v" [8 Q* Return nonzero if get value successfully */ O! u, W4 p5 q! J. f4 m+ y
int GetExpValue(_Tstream& istrin, _T& nReturn){- f' N# E h4 B3 U" @1 f4 b" F
_T t[3] = {0}; //雨中飞燕之作# Z$ Z3 X- E H7 E" @4 ]6 P5 j- |
char csym[3] = "++";
0 j! W% J% G- m/ w int nLevel = 1, nERR = 0;
% H; w% k1 ^) F if(!(istrin>>t[1]))istrin.clear();
8 {. w: X& s9 {& w. j5 V for(;;){5 K+ f# V9 [5 k w* K, R) A
if(istrin>>csym[2]){ S- Q- p! e8 E+ ?8 Z0 g
switch(csym[2]){! @( u. k3 N) c0 F+ g5 M: G
case '(':
" B/ i# ] {, R/ j6 M9 V Y if(!csym[1]){nLevel=0x100; nERR=1;}else
/ u% S, g5 n! k; @/ c/ c if(!GetExpValue(istrin, t[2]))nLevel|=0x10;/ n, o: ^+ A! \* z6 ]9 n
else{nLevel=0x100; nERR=1;}/ `% r e; F s# B/ R
break;3 W% A6 A' N' a* m
case ')':* X8 m9 A: \" `% B# R6 h) L0 [
{nLevel = 0x100;}break;3 l% p- y+ B1 K8 \/ [& V! S
case '+':case '-':case '*':case '/':
, v% I" q' V: a* ]: I {csym[nLevel++] = csym[2];}break;# d& A0 f. M6 W0 W6 M
case ' ':case '\r':case '\n':case '\t':continue;
3 \, m* }2 H& B& R default:$ `- l" f5 c% y2 {$ q, X, h
{nLevel=0x100; nERR=1;}3 F0 T2 T+ F" c' H
}" Y1 A6 ]5 g/ }' E: ]& D
if(nLevel==0x100)break;1 _/ a& N, O+ d$ \8 t3 |. Z
if(nLevel&0x10 || istrin>>t[2]){
$ [' C' F; [9 M, p& N, W nLevel &= 0xF;
) G: i8 s$ e0 k e if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
5 _2 ]: @" G; Q- J if(csym[1]=='*'||csym[1]=='/'){" l- b3 g3 s" l* r& E
GetExpValue(t+1, csym[1]);: N; R. C. D& w. y
}- q' [# j( s/ A: w1 x# Q% q
else{. l) V2 X' J! a: b) @4 K
GetExpValue(t, csym[0]);
+ P9 U4 U* M1 a7 D t[1]=t[2];csym[0]=csym[1];csym[1]=0; h: p- G1 [8 D0 o
}
0 @+ x1 K/ n) O _" G3 | nLevel = 1;! p' \7 K: A' F
}
8 L, W u' y# @7 r) R else istrin.clear();
4 V2 q' ]5 z' \; Y: R }
$ O6 ~- `2 Z5 S. i( m% w5 g else{nERR = -1; break;}; T8 g$ A8 Q* c
}
% z$ C3 B8 J( \8 Q5 f1 E1 l6 w if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]); _" q7 a) [0 C; i' w
else nReturn=GetExpValue(t, csym[0]);
8 p) o- j5 B4 a5 F return nERR==-1?1:0;
, o, g }; d; G$ @9 u t}}
& Q) j8 a$ n' n$ _3 `2 b
9 C( C M, i3 F4 I
% _, `! P A! o. w: p" A7 Y" o1 [5 |% ]$ d& c0 n% E7 l/ m
函数模板使用示例:
' o; d( F; r- P; J9 b3 P/ t在以上那段代码的后面加上以下代码:
A6 d) H: Y- A: I# D4 ^" H" c0 `- s/ T9 b. c+ u* N8 ]3 O+ @- B% E
, i t3 ?5 \/ f' H6 B2 b- e
' Q/ u$ d8 E, `/ N- ] a7 \( R程序代码:
- H! D2 C$ Q2 r. c) \' u6 L# X1 z
#include<strstream>( n+ Q0 P, x; g2 A, ^
#include<iostream>/ L+ ^- H( V3 R* ]0 {* ~, ~+ R
#include<string>
8 c$ ?! h( \- _& d5 h7 Lusing namespace std;
6 m& ^- A7 u- Hint main(void) ?$ j( G, j ?
{
0 R) J& j+ e+ T5 B5 e string s1;/ ]$ }; g. \+ e- o
while(cin>>s1)
4 j) q: p6 m# J: d h ? {
; d1 ~& C2 J; W! c, Y1 z istrstream isin(s1.data());$ l: ^6 ?: n3 F# t' f
double d;/ j. w4 @7 b) l$ ^
if(fy_Exp::GetExpValue(isin, d))
7 f- d- Q x* l' Y3 ?4 Z* x0 B) R F {
1 c& ^) ?1 C. V t# O+ F' F cout<<d<<endl;% g) n: w/ q y1 m" p
}5 U9 [- f y" e+ s$ y: i6 e
else
! n, i; S! y7 P. {( p, Q) o8 [1 N {
c7 X' g# G/ i6 B, v cout<<"ERROR"<<endl;
1 G) m$ |8 ] `. }; i) \ }. ]; ]: P! `% I1 f2 d5 T: ]
}
/ l- W& [9 y" l& \: n- N4 Q; C return 0;' W) g' K! h6 ]4 \% R% }: `
}2 ]8 d* q# ~2 L2 P
& V8 q% o9 Y/ `, K* q3 `: k# n& ?; b. J1 W/ f. e* Z
然后编译执行就可以了(*^_^*)2 q1 w) C2 f5 d! b' [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
7 F- ~: c1 U5 N( j h 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|