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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,9 n2 _$ e9 { h# k. T1 z& {
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( o) j/ j. G+ m
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 k, Y2 ]. l9 B4 a& r! m* }) |/ l& o
参数解释:
0 U9 |6 Z2 ^7 q( ^ J V% Pistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
r. v$ l4 d7 J% w5 D) j/ UnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 F. C# i- B! W; j
返回值:) M0 b9 @) O* M2 _
返回非0表示计算成功,0表示计算失败有错误
7 D( d2 x$ B8 D3 t' F7 N, W* m2 U- }9 V' r1 [/ o
2 W2 O, w9 n% N0 ^6 A1 S7 a
0 \# a2 |% B1 H+ f" B' z+ d程序代码:
& E9 B9 v c" p: j4 K \# d
0 T( d) [! {( ~5 G, d: {namespace fy_Exp{
$ ^6 |- y$ u8 N E: u) S9 {( F9 g- Nnamespace {template <class _T>
. E( u+ K. P6 C& Kinline _T GetExpValue(_T t[], char& csym){
5 `+ e8 N1 O+ ] char c=csym; csym=0;
$ x4 e4 I6 d$ T( D( f switch(c){
, U; ^) f, P& q( b1 X7 t case '+':return t[0] += t[1];
4 |% f6 l# P; S& o case '-':return t[0] -= t[1];
8 W9 E4 W) G1 f. z4 V" N case '*':return t[0] *= t[1];
' M1 M. z5 G" Z, q% x3 s( k# c default: return t[0] /= t[1];//case '/':: P% G* U8 S# G+ N3 c: J1 q
}
7 |7 z6 r6 U' Y2 J4 f" E}}
* {+ _+ U& u/ o! Q2 f# Ftemplate <class _T, class _Tstream>% s$ f, j7 k3 H, `
/* _Tstream: inputstream, _T: get return value
! L f1 K/ J2 o$ f1 B0 {* Return nonzero if get value successfully */
% _+ G! B' y# `" _; f2 N; bint GetExpValue(_Tstream& istrin, _T& nReturn){3 [: H) w, y+ t" n" S8 d. V
_T t[3] = {0}; //雨中飞燕之作* O3 p [: y1 a& ^# e
char csym[3] = "++";
, q) J, r0 Z j" c$ d int nLevel = 1, nERR = 0;
! E! t2 e9 m9 W2 W if(!(istrin>>t[1]))istrin.clear();' @( D d3 h" |! x# [, x, j) K; |% N
for(;;){
* N* o9 e; }0 w! \+ F if(istrin>>csym[2]){4 U! Q3 X$ t, ]4 U
switch(csym[2]){
# _; }! R1 z, z7 g' b case '(':
* e9 w5 g/ C, E6 k) F if(!csym[1]){nLevel=0x100; nERR=1;}else
( b8 ?* w0 i9 G if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 c" J) U, V0 k
else{nLevel=0x100; nERR=1;}1 T- w. K/ T, [: u
break;
' Q$ v& o. n! A: Y case ')':/ W# a* y0 K0 W0 i! g) n5 o. A( X: w
{nLevel = 0x100;}break;5 s6 n- i6 D3 j" M" b* ~
case '+':case '-':case '*':case '/':3 [; r' Y, n/ U2 K- S
{csym[nLevel++] = csym[2];}break;
+ M0 z9 N1 A7 C case ' ':case '\r':case '\n':case '\t':continue;
6 U) \: \' p \5 w6 x* I default:
8 H% C: R2 ^" J/ f& j' C {nLevel=0x100; nERR=1;} A- B2 z$ V b( o" o% P5 I; P
}
- d8 ^2 Z$ c" m: X1 a6 M( l+ ?' R if(nLevel==0x100)break;# [2 A/ v$ w9 F) \* @9 m3 ]! o
if(nLevel&0x10 || istrin>>t[2]){
6 H1 X+ j* x# I9 E9 Q nLevel &= 0xF;# ^" \+ ~" v" v6 B. @3 i9 p( k$ Z1 z
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* l. s# Y( S# u* a7 Y
if(csym[1]=='*'||csym[1]=='/'){
. c+ O, u0 }1 q9 C* X1 g# r$ V5 V GetExpValue(t+1, csym[1]);
' u& c' B! f) e# q/ z, q+ L }1 E% k$ a" j& t( T
else{7 j! d4 s7 G5 o3 _
GetExpValue(t, csym[0]);
: z6 [9 L3 C& ~' T o1 w t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 E* y" ?, X, V% C& J
}
& E, A8 a- _* B) j8 M, K7 |1 x7 O nLevel = 1;6 Y+ o" u) W$ O, \& U: v
}2 u: g _2 d. I8 }6 Y, c
else istrin.clear();
0 r7 J' r/ S3 [! l" g }
3 E$ \% p Z2 w8 y else{nERR = -1; break;}5 X$ u, m1 O0 D. ^" O7 I! l
}
$ @6 U1 ]# r2 R7 {6 R if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' w: @* d: o0 g else nReturn=GetExpValue(t, csym[0]);
. X1 c- | o% S+ K( @ return nERR==-1?1:0;" Z, @' c, T* Y
}}1 k1 \# Z+ {3 I) ]9 i3 R/ a
2 N2 S/ g. i }! B7 V) i
6 b0 s/ }, i/ @, _0 p4 [& T
/ g' e) }& F( e" @% \函数模板使用示例:; s+ h+ t4 [) \4 Y8 G; V! U
在以上那段代码的后面加上以下代码:! m1 y4 X8 \+ N: K1 t& W f' I
1 O' ]7 x Q& Q
. C% J: [+ }7 \# l+ W5 j7 G; G
$ V4 B& p; x! D3 D: k5 g程序代码: - B, b5 \5 ~% b( `: w6 [+ \
* [, v: O8 J$ }- `9 I
#include<strstream>
, _" E; `- `6 m#include<iostream>7 t* X, p5 R% e# @8 [
#include<string>( t1 X. {+ w+ C# l. H
using namespace std;' z( S1 o _+ P' B( I3 A6 x# |
int main(void)
. V' n" O2 b/ ]6 a{2 u- J$ a# C$ z6 m; {$ x) m
string s1;$ r& m; x! a+ }0 n7 R
while(cin>>s1)6 N0 E4 _* E1 Q1 H! W; p3 ~
{4 k) @- y, P) V- m) d/ u
istrstream isin(s1.data());/ T5 h1 G# h a. g
double d; |% x- Q7 W H' U
if(fy_Exp::GetExpValue(isin, d))
- Y, V1 u r V% Y5 `* F {: c' U- @- m) ]% G5 b: A
cout<<d<<endl;' c8 m/ x' v- V& ?# i7 U1 Y
}* D$ l6 E, k. Y& N: y
else+ Y2 {, }; O% m* u" v
{
2 I4 ]: u9 X9 v( O2 M& K cout<<"ERROR"<<endl;
Q7 `6 o: {9 I }( C) V# G/ t# u
}5 i5 [% q' K9 r2 p! s' d3 I$ |
return 0;2 y0 E. t5 l% y5 R& q6 M8 `
}
8 P, F' [1 ?% n/ q, w" P- C* \8 Y! ^% G3 u1 r
! ?3 ]& ^# a* q3 V( p! \5 b
然后编译执行就可以了(*^_^*)
N$ x& y% G4 w! G1 V4 j' F其它:TC++上一定编译错误,不保证在VC6上也能通过编译! b! t9 X8 g7 x2 Q+ j m
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|