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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,7 D, A$ r; p8 ^# }6 V
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 s/ @, n* ]' `
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* g7 b+ b. e3 y: e7 ]8 Q" j9 N/ _" w
参数解释:
9 F/ H8 d, Z4 Q: Sistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( _6 S* c+ r& I$ `+ a
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; ^9 X9 ~/ @& F8 t4 P0 Y
返回值:2 U+ @( d+ d/ L
返回非0表示计算成功,0表示计算失败有错误0 b5 R( @; N \# F3 T
+ i- _4 g; I; i' {& Y
( x" a5 ~2 C! P/ w& v( f; f' f- p$ c% _
程序代码:
% p! X5 e2 v# \( ~9 h0 S* z, ?) I* j9 l& t. ~( x6 h
namespace fy_Exp{
2 `/ H" z6 v$ c9 `namespace {template <class _T>7 E6 ~( t& j. u
inline _T GetExpValue(_T t[], char& csym){
2 H6 Y2 b) n' M8 M$ W char c=csym; csym=0;8 }1 W5 S( g6 u
switch(c){, y. s- w1 `$ s1 m3 f2 Z: q$ b& b
case '+':return t[0] += t[1];/ c% N' l% B4 N+ R# w9 |
case '-':return t[0] -= t[1];- u7 \" M( `5 F$ A) y9 C0 s
case '*':return t[0] *= t[1];
: y* `* |5 I9 U, K, O; Q+ R default: return t[0] /= t[1];//case '/':
; S6 D( d% f0 d* j! J' ] }
2 b( j0 u6 ]1 d6 O9 z}}
' P+ K" C: s4 l7 @+ a2 Qtemplate <class _T, class _Tstream>
, r+ U) B; f" z/* _Tstream: inputstream, _T: get return value. s; u% i& L% l
* Return nonzero if get value successfully */
: x V- V* W: T7 ^: c8 u8 a" ?int GetExpValue(_Tstream& istrin, _T& nReturn){
$ R l! v1 v$ M( k/ Z _T t[3] = {0}; //雨中飞燕之作; R, D# L& L$ J
char csym[3] = "++";
5 o. N7 \! B, e" T7 k int nLevel = 1, nERR = 0;
' f+ p3 ]$ N+ t1 `+ J: b0 | if(!(istrin>>t[1]))istrin.clear();
* A5 V/ b8 _6 Z6 x3 D for(;;){
9 B/ h! u% i' ]. k$ ?* _ if(istrin>>csym[2]){
0 W# _8 k% K, L( `- P& L switch(csym[2]){
4 I' b* ?' T3 ]8 Y4 d* ?- ~4 Q case '(':
; D4 E" K* E+ ` if(!csym[1]){nLevel=0x100; nERR=1;}else: l) i$ |6 J* e2 E4 D
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
% G+ k- v' Z" B- H u9 r else{nLevel=0x100; nERR=1;}7 u5 x; N: r* K( E, J8 r! I. z
break;' e, Z9 P- z6 a8 z' X7 q, S0 c
case ')':
$ Y+ S, S/ m# N2 p& l- ?$ @# t. \ {nLevel = 0x100;}break;
, o3 E) a' B1 d7 b9 F" O case '+':case '-':case '*':case '/':4 }! B E# P* W3 R0 S
{csym[nLevel++] = csym[2];}break;/ o5 f$ V+ Z/ S3 b! k* w' ~+ w5 T8 b
case ' ':case '\r':case '\n':case '\t':continue;
4 s! C3 \( G2 U/ t* R' d default:/ `9 D1 Z1 Y- Z) j* l5 o
{nLevel=0x100; nERR=1;}
3 V+ D4 t. g: G" ^0 e }
- @' m4 P( w6 I: R. I, | if(nLevel==0x100)break;
4 l0 L, v6 W! [) Y if(nLevel&0x10 || istrin>>t[2]){
3 W4 V+ K3 T/ D8 L nLevel &= 0xF;% P* n1 \5 b# O
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 ~8 [" J+ y: w if(csym[1]=='*'||csym[1]=='/'){
6 }! j+ r! r# w$ D1 N2 } GetExpValue(t+1, csym[1]);4 L+ e( ^2 F: a- X+ x
}$ B3 X8 y9 T ^7 o
else{# p8 G+ }0 G& V: a1 G5 U6 T
GetExpValue(t, csym[0]);
# G. P3 N/ d* j' J/ Y8 |$ Y t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' ~8 s9 {& N3 N; ^! @' g }
7 D8 w8 i2 m1 ^/ M. \# ? nLevel = 1;/ D# V8 ]9 l2 s2 J+ h
}
\# M- F; m2 r$ Q6 o else istrin.clear();5 Q" [2 z! ^- ~7 _
}* A/ F' P+ F8 [: `6 n& K! F
else{nERR = -1; break;}. T/ G! T. X" s/ \8 @ f+ a$ T$ B
}- ]8 y" z( k( O% m4 x
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ I- `2 x! K+ B2 S7 K0 o. `
else nReturn=GetExpValue(t, csym[0]);. Q! f+ D$ Q3 ~
return nERR==-1?1:0;6 t5 ]; @- H3 i
}}( o' ]# C% Q3 f. E, R6 R$ \
5 R r- I! x; d& L- ?$ p
/ ?" i9 b( E/ \8 K' r ^
2 e$ {" |6 y& {7 i) t! J4 R函数模板使用示例:/ a) a4 {) J, _# R: d9 p" x; V
在以上那段代码的后面加上以下代码:
9 \0 B) G( m) O% n
9 i( A: A9 P4 S8 J( P3 a: N( x* Y9 [ ; R8 ^5 k/ F% G! w
$ w/ x# o7 M: ?) G程序代码: 3 f" ]* F! f6 l# _) K
- l* w3 c! h& R# s
#include<strstream>2 Z0 z7 Z) R# g) o+ F0 T
#include<iostream>- w0 P( ^8 m" B; F& R. x
#include<string>
5 m) v$ Y+ [% i' s1 [using namespace std;- R* N9 L7 c& T
int main(void)! l: [" I. W; k5 b; f2 {6 s+ D
{
$ c: e+ o' M+ Y/ q/ L# G4 Y string s1;
2 {' g8 Z0 `( O7 k2 k3 Q3 Z% c while(cin>>s1) e& s6 ~+ [( |7 d
{4 L7 t$ A' h/ ^ w$ G
istrstream isin(s1.data());( S. v) p1 E) M5 g6 i
double d;0 q/ h7 I) _- ] v7 G. O
if(fy_Exp::GetExpValue(isin, d))
- X# X( p) T% C6 l9 @9 R3 ~) O4 p {
6 S1 Q' g5 C' v" s/ c( ~, ?1 | cout<<d<<endl;
. W+ s" n+ Q- D, H: B, f }% @$ G5 P) z) a5 V! K: p
else
9 }; Y' l) ^" K: d9 h1 } {
; [2 E) @8 q' Z cout<<"ERROR"<<endl;
9 o( S) G; t) i' W4 T }
4 T- G g8 C- l$ l+ m }
+ J) E& V" s V# s return 0;
& I0 E* J: [* J7 D3 `}
" W& d% ~7 y( w- Z& o# X
, q7 T6 m8 f9 [- H0 u) v5 \) c7 ?6 s4 J8 M8 f0 {9 j/ H
然后编译执行就可以了(*^_^*)% ?" Z, n4 ]& o$ r
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
7 j- }, z* M/ H2 I3 H 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|