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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,! a7 z. S3 O2 b: P( f# X# H5 H
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 J! M+ v& J- c7 l: i: T只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
; r; Y( t; j, H) S参数解释:# U7 E3 n5 q0 x* h6 e. D i* S
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) K2 m9 ^( d9 H
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# W( V9 _ v+ v5 j8 D返回值:
: [$ f, L9 G. x; j) O4 S; b n8 I返回非0表示计算成功,0表示计算失败有错误
' c ~1 Q0 D+ j' Q1 q- S2 F
: U7 {& r* R1 g% x% h
8 k# g6 y, q& P# C* `/ [9 U# i( E5 I u2 x- O
程序代码:
7 n! n6 F! i: f) F
" Z8 a; U5 @2 A; o, \namespace fy_Exp{
$ w* S2 q# Q3 H! ^namespace {template <class _T>) U! N# w0 R. x: G P& {8 G4 l
inline _T GetExpValue(_T t[], char& csym){% g& [1 S6 u/ @* T' s
char c=csym; csym=0;. L/ {: L: W4 g. v
switch(c){
& |, ?8 z: G$ E7 V case '+':return t[0] += t[1];
8 s2 C. _: z' { case '-':return t[0] -= t[1]; V8 ^0 |5 p" V8 K
case '*':return t[0] *= t[1];9 l$ h, }, L: j# `/ H0 B& n! u
default: return t[0] /= t[1];//case '/':
# }3 h7 V! k) N3 {4 c' e5 ] }
6 y8 P; y$ j! q6 e}}& M* I {" t2 r) x
template <class _T, class _Tstream>
9 r, |/ a2 b1 n+ }! Z/* _Tstream: inputstream, _T: get return value2 \6 N/ W; `* n$ K' T5 M9 g
* Return nonzero if get value successfully */
' d9 z1 V% G4 X! m, lint GetExpValue(_Tstream& istrin, _T& nReturn){ `2 R( q. A d9 {8 ~1 ~
_T t[3] = {0}; //雨中飞燕之作& d# Z0 E- y7 o9 Z0 a
char csym[3] = "++";. T8 R) c. l \% z
int nLevel = 1, nERR = 0;
- s$ J( q( g( \4 d" a; j if(!(istrin>>t[1]))istrin.clear();
2 m* ~. n5 d$ H for(;;){+ H5 G" w1 M- R) d
if(istrin>>csym[2]){+ N. L0 r6 _8 T, p
switch(csym[2]){0 ]& b: k0 ` M2 b0 u' d( H4 u" z- i
case '(':( L f" P8 ]$ r4 w
if(!csym[1]){nLevel=0x100; nERR=1;}else. D8 w0 E' w7 |# i
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;& }' Q2 ^% T% D7 j w& L* X% V
else{nLevel=0x100; nERR=1;}
& B$ T+ ^) W$ q! W break;% R: b$ J0 i! e5 d+ h( y5 C: d
case ')':
" H- K+ _2 b1 ~ {nLevel = 0x100;}break;
, _, p" s/ E/ z: a: n: Q case '+':case '-':case '*':case '/':: D% ^' U8 D7 o+ \9 t, _
{csym[nLevel++] = csym[2];}break;
, l! s1 r" t. | case ' ':case '\r':case '\n':case '\t':continue;
6 @' _" n8 v0 j! i+ [0 ^8 ? default:
! n/ d8 \2 \) H {nLevel=0x100; nERR=1;}3 O8 Q$ x0 u4 a$ z9 W
}# e- K$ a+ [3 ?$ W2 v p; b$ j6 L
if(nLevel==0x100)break;
4 c) ~& V1 E* Q& j$ ? if(nLevel&0x10 || istrin>>t[2]){6 N' \) E6 _- h
nLevel &= 0xF;3 T# m) x# ]) r: p$ J6 c
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 R' d) P4 P; X2 T4 L0 @( n- D if(csym[1]=='*'||csym[1]=='/'){" g. z! K* K, Q# y
GetExpValue(t+1, csym[1]);
: l) m; |0 h; N }
' f+ d; v D* q, w/ Q7 e else{5 x% l) s* O+ H2 C
GetExpValue(t, csym[0]);
! j7 S/ T' e2 W+ | t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 {) ~! ^* b/ A$ x8 k u
}0 V h* o( \: x- v( K9 @. R2 }/ T* }! s
nLevel = 1;/ q! c: _0 q* Z8 D* }0 \
}. E6 X' s' F2 J p
else istrin.clear();$ T! ?# W2 f9 w! }0 R+ @
}
' ]' t) \# Y! g0 m& ]- I6 \& M! L6 | else{nERR = -1; break;}# P% C" E4 i; Z7 e2 A4 ], {
}/ c# w) h% v4 F6 ~ J* u
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
% w& P9 y. t. c else nReturn=GetExpValue(t, csym[0]);
9 _( z$ v( X4 m! c( r3 w. k return nERR==-1?1:0;
: {' g1 ^/ n7 i$ W}}
2 h9 G$ b, w+ F- X; T+ \) O3 ~- v! e0 T9 N
( l* n# A0 \2 A7 h
" j- ~* B; m& V5 O函数模板使用示例:
- F7 Q/ s c/ n" n2 B在以上那段代码的后面加上以下代码:
* h8 f6 v( g! U( m+ \' W9 E
2 t2 f4 B* q s% R* c6 O - F; W& E8 \! C4 @; r
+ p# I1 S6 e9 R: D
程序代码:
& ^& z5 Z9 Z3 `, ^+ X( }
( w/ _# K" L% i4 z7 F0 @#include<strstream># g6 C0 m# G1 V$ N) E; e2 _
#include<iostream>
9 r1 w, F* |9 V0 x3 V! Z#include<string> a8 X' X% ^1 k0 @+ x! |
using namespace std;
& [, |6 J7 ]- w2 _4 {! Cint main(void)
6 Q' [1 A& a: [2 j$ x{
5 m5 p7 Q y6 d9 K+ S string s1;
4 S. n) I+ D( \ while(cin>>s1)
- W9 O) `( K2 y$ w0 f& ?; \# u {
4 V, N7 {/ n4 L2 r/ K" X& m" h istrstream isin(s1.data());0 P, n/ E' M0 U% Z$ _
double d;# z) Q* }2 z) h2 F. A" ]
if(fy_Exp::GetExpValue(isin, d))
5 y1 E8 g4 J1 H: K* T {
' i/ [& s5 Q: ^( u$ B; l cout<<d<<endl;: l' ^" K. E" L, w: Q _
}" O8 c8 O5 P( X; V4 a
else
* M6 u. d1 i& |) t8 G {
* C% Q8 ]2 g }% S+ N' j cout<<"ERROR"<<endl;- w4 W& J2 c. M' p7 j3 f# A) e. |
}
: i$ T' J H, w }6 {# j! G* Y: ^' W# e4 S* C+ n
return 0;2 s- ^9 I& {2 m- i$ \9 T) Q$ h
}
- \0 L; b' [* Z' q3 V
* x& P% q7 Q3 r4 Y4 t2 I" n9 V: N& R- h
然后编译执行就可以了(*^_^*)
$ ~+ q O/ P" X$ r9 O" W2 B其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 z" f# {+ \$ N8 a2 E! `! i1 z+ ]
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|