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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,; h9 |3 I5 v# V( Y5 o" g
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
( o! d2 n, V3 S只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( ]* e8 E" P$ q) N! X5 r
参数解释:3 A4 K9 R' y8 F4 V% K
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
, D# W1 w' k8 u% BnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" _. J6 t/ o( h3 ^% A
返回值:
' y- ]+ D' q6 }$ f$ w6 E D! \返回非0表示计算成功,0表示计算失败有错误
1 Y, Y6 z+ l C$ g7 f
$ Y) ]6 \1 l& Z) c, B6 q' A5 b
9 I* O' j7 }' Z9 {' E9 c) m5 V
: n/ y2 e) @! E+ Y" F8 o& h程序代码:
+ v5 M% I$ Z" ?8 F! e; L$ b" T) P- c. J, p4 x. @' W/ G
namespace fy_Exp{/ a; W: |3 K5 |& X" G& Q
namespace {template <class _T>4 e! |9 _9 x# f% j- u
inline _T GetExpValue(_T t[], char& csym){
7 j2 O8 q* r- ^$ E char c=csym; csym=0;4 n& G4 E9 x# `/ p! f5 m- z
switch(c){; j, e% m1 ]$ x; v- r
case '+':return t[0] += t[1];
i; C/ d0 f$ q/ U case '-':return t[0] -= t[1];
) N( A; g! j7 D) b' e8 ~% d case '*':return t[0] *= t[1];# N5 v5 _6 ~# M7 M8 E
default: return t[0] /= t[1];//case '/':% S5 z, J9 y: V& H' w( q9 {
}
' ^2 a$ n1 E" C: }}}
6 w6 I6 p1 A8 f0 f/ I4 utemplate <class _T, class _Tstream>
" G# y# W. n X( \9 _5 A/ \2 }; U/* _Tstream: inputstream, _T: get return value
$ c6 a; [4 @6 |4 |* Return nonzero if get value successfully */8 \% Z% M+ q. R4 H
int GetExpValue(_Tstream& istrin, _T& nReturn){: t. m5 K2 _# i* _; V. u
_T t[3] = {0}; //雨中飞燕之作. q, l% w, v! V3 V
char csym[3] = "++";
' p6 f; T0 X/ [6 ~$ f% [ int nLevel = 1, nERR = 0;& ?2 R9 Q; q) e6 A% Y
if(!(istrin>>t[1]))istrin.clear();- `! P7 ?; q9 v
for(;;){/ Q2 a* |! Y% }: r- ?) z1 f4 [
if(istrin>>csym[2]){
8 g* `* v" H. C& q9 _# I6 T switch(csym[2]){
0 R7 \ k5 ^/ e* O, S0 x+ R case '(':
- D7 H# _1 ?, |+ e2 k/ _; u if(!csym[1]){nLevel=0x100; nERR=1;}else
' v0 l8 Q E! U, G6 K+ o/ ~ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: J4 q8 V# ~; O) q7 o
else{nLevel=0x100; nERR=1;}% ~' G2 n$ M+ ^ Y' M o
break;
) J2 S5 H! w' Z8 k case ')':
/ W# o5 s0 E, o! k4 a6 p {nLevel = 0x100;}break;
/ {* s; Z, m% f case '+':case '-':case '*':case '/':
+ w' O8 |" v/ V! [$ k {csym[nLevel++] = csym[2];}break;. n0 z$ X6 x; W0 i
case ' ':case '\r':case '\n':case '\t':continue;
6 Q0 N: u7 _ y# W8 g- r default:) W$ I# d5 s% Q6 [* D9 B# y5 N
{nLevel=0x100; nERR=1;}
+ j. B8 V5 e s5 a6 E }1 c L0 G! r. X c$ H! P1 m
if(nLevel==0x100)break;5 X! w$ h4 m+ _6 E- j
if(nLevel&0x10 || istrin>>t[2]){
( E2 W) r. f5 \! K nLevel &= 0xF;" D! ?8 ?* ]2 F- M& v
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! L9 h! n4 o* W* l+ |. r if(csym[1]=='*'||csym[1]=='/'){
. x3 H$ f% v* i: t GetExpValue(t+1, csym[1]);4 [6 F P$ x6 z1 _ @0 a
}
2 _7 q" y4 F( i$ E8 ], @" ^ else{
/ @6 G4 ]2 Z. |7 _8 Y" Y# |7 a5 \4 F GetExpValue(t, csym[0]);3 ?3 H; B$ }2 q5 y( k
t[1]=t[2];csym[0]=csym[1];csym[1]=0;( I* [/ O) A! Q: R! `& `# f
}
$ `+ y" L6 r' ]& Z B4 p2 Z nLevel = 1;/ J+ u4 A& |( x* s8 B5 M
}/ ?8 L7 X" G& Y0 H' T( A: p
else istrin.clear();
" L5 G4 p9 A5 w. O- I }! d2 b. [5 w0 M: p9 X# N3 n
else{nERR = -1; break;}
" Y/ N1 q2 R: |( r2 o7 v }
1 _" r) W; b" @+ d; C9 L- y if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 w( N9 e- q+ j! I4 ~/ X" L: \' |# z else nReturn=GetExpValue(t, csym[0]);
1 `, N9 K; g% i; V+ I1 x X" @! m return nERR==-1?1:0;6 D" p3 v8 s( w
}}
2 u6 F1 s$ T8 Y! D2 |6 q$ B; Y2 t: c0 t0 l
, b+ a4 f" W* u
2 X; y( t9 E+ b8 E函数模板使用示例:9 R6 O9 i: [4 K3 j1 J4 A
在以上那段代码的后面加上以下代码:
# z, P! w. e; N6 J1 a/ X% q, ~) q: d0 j
8 K3 @. C7 [% \. h
: {8 N6 t' o- Z程序代码:
) D7 o0 `" U+ R. Q5 b5 v' C6 }) n2 l7 ^* j0 D; P
#include<strstream># o! |0 i+ P: c, F0 @
#include<iostream>' n4 p/ Q/ Y! H+ x( b# q
#include<string>* w# W; b5 G- p+ I
using namespace std;
2 H5 p4 v. _: i1 Tint main(void)
7 s: V X$ i& B& |' \6 R. L- ?{( q3 Y ^7 a# ~( [% y
string s1;" M! p$ X2 }; s- }
while(cin>>s1)
, O$ ?$ ]2 ^% ]% p {
0 m' k& C N7 g3 s istrstream isin(s1.data());7 u! i. c4 f2 t& j% `8 g
double d;
3 P1 u$ D! K' X% a. c- ~ if(fy_Exp::GetExpValue(isin, d))
$ h9 u2 d* z& A) w8 X$ }, q1 ~( Q {# J. G1 i* G. y% F: J
cout<<d<<endl;
9 G& ?% s" ]5 P! B }
# ]8 X% |- |& s) M# I% v& ]& u else9 \7 N) c; U k# \
{
: A1 Y1 F5 u; {) W cout<<"ERROR"<<endl;
+ F: n; a! Q: A( Q) T }
" h& X% Y3 P" c1 C9 {( k, L }5 O* [- k1 c: T
return 0;
; S L/ i6 C9 y) `$ o" f}
, ?: A+ c6 t( u: ]+ [
: w9 e3 G7 }& |6 L; `# S* ?# F# n9 G" b# V% r
然后编译执行就可以了(*^_^*)
! [9 ~' r0 E: R/ n3 n% R6 R) p其它:TC++上一定编译错误,不保证在VC6上也能通过编译# w5 x' y) Q1 n& q6 m
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|