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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,/ Z% u, i D; P. [# L! J4 h8 e
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- F$ u4 J% v$ j3 ?8 ] x只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# t- {6 a. T4 ?7 a) T' _参数解释:) z" r$ s* H8 A% D& b
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流 E+ E w0 F, L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ d* O% Z! h) ? N% p. e9 l1 {返回值:- n5 x8 _7 o* |7 ^" c5 ~8 M
返回非0表示计算成功,0表示计算失败有错误& D$ \$ E2 Z$ Q7 j T. w2 ]
$ a+ S- ]6 \$ {( a , ^% T1 |0 k% I* J
6 p& C" t& @1 D- E- ~
程序代码: - n2 B& v) ]) q: U
- D7 \; b! O* p: e A( ?5 Q
namespace fy_Exp{" F1 f1 w- O( B5 x" S4 z7 d
namespace {template <class _T>" ^1 ^: E! k& a# N7 Z6 ~
inline _T GetExpValue(_T t[], char& csym){+ @; i6 h& f! u9 _ H3 M
char c=csym; csym=0;
5 m/ ]% C' r8 @; x7 V# u switch(c){
( ^! z$ l. y3 `, V9 n case '+':return t[0] += t[1];# s7 z; T! x3 ]" x& R6 U% g
case '-':return t[0] -= t[1];
. Z8 c" q" c# J6 @ case '*':return t[0] *= t[1];
$ `$ \2 S6 Z) [9 L% v' [ default: return t[0] /= t[1];//case '/':6 ~0 k+ |6 z) }
}
( t8 P: l4 [ a6 H0 [ I}}! r4 Z& b: ^: c$ c. Y2 i
template <class _T, class _Tstream>: h* T# e6 h+ Z L* t
/* _Tstream: inputstream, _T: get return value
2 O* R0 `3 [; R, I4 A* Return nonzero if get value successfully */$ v; f9 q! ^% @5 M1 ~
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 ^6 i0 l$ q, T t5 [( l: a _T t[3] = {0}; //雨中飞燕之作
# G4 w$ z6 D: G; \7 n# R char csym[3] = "++";) d4 `+ w3 [% F
int nLevel = 1, nERR = 0;' v) i0 e: j- M7 [: p. r
if(!(istrin>>t[1]))istrin.clear();
/ O8 T# t8 }$ i: M! v1 o/ ` for(;;){
) K1 {+ L$ V% O& V if(istrin>>csym[2]){
9 ?( h# D! P1 b" w: m# P switch(csym[2]){
1 R8 R+ a5 R( S* l case '(':( b1 \3 r7 U& |) j
if(!csym[1]){nLevel=0x100; nERR=1;}else
6 H0 D i* Q0 | if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 x% o# U$ t" s) ]& C } else{nLevel=0x100; nERR=1;}
7 ^# i6 Z+ X8 g; e j break;2 J9 h. R% B7 }
case ')':3 n1 Q/ L& w ?- B' V( B
{nLevel = 0x100;}break;
- W6 ~ ]5 ~- Y0 b, ~* q/ r5 b. d case '+':case '-':case '*':case '/':
; C) ]& o: M5 s" X9 F& E/ T5 Y {csym[nLevel++] = csym[2];}break;( J% u$ u3 r8 d: G- T
case ' ':case '\r':case '\n':case '\t':continue;+ N4 N0 _; |5 c* Q! j, t; S( x
default:
`! g# |& x: s {nLevel=0x100; nERR=1;}0 n& k) g ~' W4 G# l. |
}! W, F# e$ h# u3 M
if(nLevel==0x100)break;! W6 c& ^7 R* x1 G" P' U: q
if(nLevel&0x10 || istrin>>t[2]){: t1 P& P. A4 R; z
nLevel &= 0xF;
9 y% t! o/ c* I& ^- v2 k if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 O$ z2 t* E$ T2 r- }0 O/ L
if(csym[1]=='*'||csym[1]=='/'){% [9 R6 a _1 C$ x. w3 _
GetExpValue(t+1, csym[1]);
" s: Y1 q" I, c! C9 T/ Y }
; S. a. n. o0 b2 J, u+ `8 T, E else{) K! M6 a- }/ J9 Q
GetExpValue(t, csym[0]);2 `, h/ @) H$ p% H2 E
t[1]=t[2];csym[0]=csym[1];csym[1]=0;' z. Y+ G1 |. W+ @$ q2 i' g8 z
}
9 U2 w5 C; t/ U/ Z( o. G nLevel = 1;# c# Q% z- Q' O6 W: r; d2 Q
}* J/ O0 g2 z( P) |, c+ s, i
else istrin.clear();# @! I, l5 d* d* V
}
, I3 q% J( Q% `" r0 P else{nERR = -1; break;}% [1 |1 m, G$ ]: ~. W
}
2 [; J2 m0 Z& j if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]); E$ Z5 x) a' B3 N
else nReturn=GetExpValue(t, csym[0]);* o5 ?2 C, z' K7 z4 A. ^9 A
return nERR==-1?1:0;# J/ P# h" ^+ E1 I* ]6 p" F* c8 @
}}
' P9 Z6 R7 ?% F+ J: x/ R& J5 u* S2 J& S/ d7 k |. {
' R2 Z. `- ?8 J9 V
& |# T) ]5 f" g' P h函数模板使用示例:
* S6 B; _$ b2 {- Y/ o& K8 Z1 { r在以上那段代码的后面加上以下代码:( W% M" T- z5 H k( a+ P0 B
! P: m5 z7 @+ A: [* u
! r" n) w( }+ h" K) M
' ^# x0 [; |- g& ^程序代码:
- V- z9 f# ~' P) N; k/ v* y* w2 p( b5 u7 p
#include<strstream>0 u8 y& N9 h1 r/ j9 q
#include<iostream>
' f4 K {5 z$ N% t9 x% d#include<string>& V4 s3 u+ Y+ {" s# E
using namespace std;
0 M) X; ` j, J7 B z$ mint main(void)2 k P; c7 R* {1 |' ^
{
# G3 }) Z9 C% r5 e! i1 h string s1;
R Y9 D9 m7 t M4 V3 ~7 K while(cin>>s1)
& Z5 Z6 h3 T- K( T2 ` {
% g5 ` H5 s2 n- t) r istrstream isin(s1.data()); f6 O& K# R( ]) J
double d;
, g! Q7 v1 h! L+ t$ ^ if(fy_Exp::GetExpValue(isin, d)): i' [( j: ?! b0 {. r/ \2 Q) j7 ]
{7 g5 n/ R, N: X* p1 @+ C; `, s2 z: L
cout<<d<<endl;! ^& ?, N7 Z& @% y
}5 N8 J' u% d: Z' b
else9 R- ~1 l- x# a
{
\ }# T3 O; s) E7 i) w5 F. g cout<<"ERROR"<<endl;
2 _% g& p! p3 D+ O$ Z4 W }9 a' H7 }! a& Y$ t# o2 n4 t( O8 X0 }
}; x5 o: w2 R3 f
return 0;
; a7 `5 _/ |$ o! b}
+ _; Y. p' D/ ^0 g2 Q' I- p% C3 r$ S
! z% `. r6 u+ f% O9 \& H然后编译执行就可以了(*^_^*)0 ~/ @( J* q+ a: m/ |5 K! B% k
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% M4 p: W0 q: h4 |- V" r$ F 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|