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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
9 V" S/ f% m5 u一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" _) {: j3 r) q; J. K
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 I' N4 w2 _0 r1 ^2 y参数解释:) V% N' g/ s) p& i) T
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" \ H: l; M1 F8 enReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 N. V0 ]/ |* B' M) F) d4 ]% ?返回值:$ |0 G( p. F1 e b0 h' k
返回非0表示计算成功,0表示计算失败有错误
5 R1 E. b4 B6 @6 \& T- `# ?
9 n# c2 ?/ |# x% R3 o/ C! u% h: N % H6 f$ F" r2 B1 K
5 `0 |2 d/ m1 e6 @程序代码: 6 N& {: B8 x8 M, M/ N' Y! Q, R* l
9 H) N# i. q% y- C$ c7 h& _namespace fy_Exp{
3 z, g. J3 T% t% m ~namespace {template <class _T>. H+ N: }2 l- ^6 ^% _( }
inline _T GetExpValue(_T t[], char& csym){: C) S% [3 }2 f+ w9 A# C. k
char c=csym; csym=0;
' b9 @2 Y4 B) h) u switch(c){
" r) Q6 O" ^& B1 k& `, o' n case '+':return t[0] += t[1];- p8 _9 b* g. m, D5 _. \
case '-':return t[0] -= t[1];2 r5 ]; f: L; }2 _* j' `/ j+ ^/ c
case '*':return t[0] *= t[1];
* a& n! Q8 m( o, F% ?9 L default: return t[0] /= t[1];//case '/':
+ `0 r) l+ W q, _ }) S0 _1 \9 ]' q2 R+ F" Q
}}+ P* w4 G4 a4 l; ?7 Q1 }3 |
template <class _T, class _Tstream>
! t' ~ u! w0 y, v( o4 E/* _Tstream: inputstream, _T: get return value
% m: t% d {! X* Return nonzero if get value successfully */4 I( L5 X4 R# C q
int GetExpValue(_Tstream& istrin, _T& nReturn){. Y: }* E$ o0 G2 h
_T t[3] = {0}; //雨中飞燕之作
4 O: q3 e: N( S; W0 q char csym[3] = "++";- Y8 k5 s3 H1 H; \7 O% Q0 R/ m4 D
int nLevel = 1, nERR = 0;* f- u% O9 Z- T$ U& v
if(!(istrin>>t[1]))istrin.clear();+ m$ P4 D2 m/ H$ N w$ X) j& Q5 y
for(;;){/ k6 R' P. F7 A: {& Y
if(istrin>>csym[2]){4 v5 v6 t1 H$ U- v# ~
switch(csym[2]){$ K Q* d! [! H# x4 z: B' |
case '(':
* _7 f* l( _% g" F- \- m if(!csym[1]){nLevel=0x100; nERR=1;}else2 L/ S/ _! b! M5 l$ V$ }8 v
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 R& |, C7 J2 g5 N else{nLevel=0x100; nERR=1;}2 _" Y y1 f( k
break;% V z6 R$ Q7 V, _
case ')':
8 f3 y0 r; q/ F H' s {nLevel = 0x100;}break;" N& d! a1 P+ u4 T, M- k
case '+':case '-':case '*':case '/':
3 K; a. Z( Z5 s+ h! D; S: v: T {csym[nLevel++] = csym[2];}break;
$ r5 a$ F! r- _' ^ case ' ':case '\r':case '\n':case '\t':continue;
; u- z" h# m- u& C4 x default:
' W( y% b6 M3 Y7 P" ?3 K/ g) L {nLevel=0x100; nERR=1;}
/ o! s2 ]# Y7 V, v }: |! T1 i3 Y& y I& E {
if(nLevel==0x100)break;
' X' ^5 N3 Q0 J5 d if(nLevel&0x10 || istrin>>t[2]){; `4 p6 A4 p2 {" m0 z( Q% v& r$ l
nLevel &= 0xF;* [) o1 X% {$ G- f
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 [7 ^( x) I) | p( M" E if(csym[1]=='*'||csym[1]=='/'){3 [# a! |: K5 W; v6 m( U$ v
GetExpValue(t+1, csym[1]);
! G! j! ]! X3 g( e3 ]& j }
2 S# q" l d; ?3 E. _% ? else{* Y7 _0 b A& |
GetExpValue(t, csym[0]);
5 z0 |3 p* k8 ~& X2 M/ K t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 V! h- f, L; j u7 R5 z2 l
}
6 w# `0 Q5 Z* { nLevel = 1;* A2 ^9 b% b# a2 Y6 L" ?
}& m, q' D k" @1 w# K5 c
else istrin.clear();
' x, Z2 \: V$ V+ I) P/ h" d0 l) J }
8 f9 r+ |, q) [4 ?( o P2 D else{nERR = -1; break;}
! F4 d b7 C7 n% Y1 K8 C* u B& X }
: I% @0 j" v9 N" K k if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 z6 j5 `/ k/ ?7 i, [, n else nReturn=GetExpValue(t, csym[0]);9 D R/ o8 b1 |
return nERR==-1?1:0;, h6 H a% H2 R
}}0 z" h& p) h4 Z2 D
4 C+ S- H0 Z( {" D) a& o% T) r, t; z! x* N# i3 w: Q( H9 v
+ o* u. C) j" `0 f6 D5 `
函数模板使用示例:7 P' w; @" ~; f6 P r+ u
在以上那段代码的后面加上以下代码:( c8 |% Y( l: X1 P( D8 |
0 X/ q j5 p+ A* T! V2 J: ^9 V: U* V
$ R: p& G2 k* |8 k' u
: q6 B: t0 |3 n0 k- w& `程序代码: 9 c/ C: z+ L1 S9 l* k( Q4 L' [
: D1 W' i0 f' G% `5 Z# v8 l: @#include<strstream>2 b4 e* i- \) g$ X }1 h( |
#include<iostream>, P1 {3 P) ?5 ] w
#include<string>6 Y Z- t7 Q3 P5 b/ ` v+ z8 a3 x
using namespace std;
" k9 k8 K8 b/ i) ?6 ^% ^; W' Nint main(void)
/ n t C3 f9 o# |{' \# R5 o4 j4 s5 ^
string s1; T' F4 [, T( |6 r" Y
while(cin>>s1)
. O$ `+ A: g) V; l {
8 Z8 M( ~% u8 F, i/ {! F5 N! d- R istrstream isin(s1.data()); s8 |4 b* X+ A+ y7 k5 X
double d;! ^' o( y1 P1 z: v8 y9 o
if(fy_Exp::GetExpValue(isin, d))
* l* {& |3 |; n. ^ {
" a9 Q: z! ^; l$ |3 ^% c: V cout<<d<<endl;
& j; M# Z; F$ _) u. k }
" ? N* ^* B, ` else, A! b0 ?% \7 B F% \7 A I; `
{' w+ Z+ n& j x" I) @7 H
cout<<"ERROR"<<endl;
7 S' A7 U9 \" X. ]- m }) ^. K. q7 _) y4 I6 y
}
- v3 Y0 c6 c4 ^* d3 K! T return 0;9 r/ E/ G6 ?5 x9 S
}
% a8 H7 q7 Q- Y7 M; L1 T& c" Y4 N) A$ e
1 l! p+ u3 f8 @- ?然后编译执行就可以了(*^_^*)
X- R- e0 |" O3 e3 R其它:TC++上一定编译错误,不保证在VC6上也能通过编译
, l! Y% V: n! w" c1 M 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|