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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,3 o$ o; z, `9 `( ]
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 l! z( Y& L& b! e+ S5 [* ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% b$ k4 g; H3 X2 v v/ r6 F参数解释:+ v* `+ v( u( u9 y0 ~. X: O
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. h$ M F" A" N SnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 V5 q4 V7 U( f. c. x; M返回值:
' B) i* b! y( k3 |& d返回非0表示计算成功,0表示计算失败有错误
& n7 l) b. [2 p7 i- L L- ]
: E8 H% b" y+ y1 X: h( f; s5 ? 4 p# Z, }; i* R ]
6 B$ D* O9 n9 ^5 m" q程序代码: $ L5 a! o$ @& V0 b, F9 {0 b: z
0 Y. A( p# o1 V1 X W9 U3 j
namespace fy_Exp{
% h- L1 { x% ?1 tnamespace {template <class _T>
" { X; Y+ h& h$ G" p3 dinline _T GetExpValue(_T t[], char& csym){
3 @& R" G% h5 v7 \, V6 u: y char c=csym; csym=0;1 D: X6 N% _' |/ B. F# G! O& [
switch(c){
x3 T9 ^9 j" w8 R, H case '+':return t[0] += t[1];
0 b9 L" K8 }$ X! b" H% z0 u5 P% a case '-':return t[0] -= t[1];
/ b3 B3 t& w2 A, }! [2 ^- P s3 R case '*':return t[0] *= t[1];( Q: g3 |: }' f
default: return t[0] /= t[1];//case '/':
( a; C6 c# i' k% j }0 C& m4 ~! W5 ^: q. H
}}
, U+ @+ U$ ^+ a. d, s' |template <class _T, class _Tstream>( f; R1 F+ f6 d0 i6 N4 S+ Q- ~4 S
/* _Tstream: inputstream, _T: get return value
) T4 @, G* A4 J" X4 i: s+ H5 z* Return nonzero if get value successfully */. [) ^" t |& u/ U8 k) M. M
int GetExpValue(_Tstream& istrin, _T& nReturn){' P3 J* U/ R5 `* P3 Z9 R" r
_T t[3] = {0}; //雨中飞燕之作$ t0 C8 h2 m& ? }% C% P. h
char csym[3] = "++";3 D) ?( ~2 B% X+ _9 r y
int nLevel = 1, nERR = 0;. L& P/ m9 @( z. ^
if(!(istrin>>t[1]))istrin.clear();7 b ]. d; g+ o# D/ R
for(;;){
1 P- c, T) q1 }; X" u9 y6 g& d if(istrin>>csym[2]){
* f+ J- z/ l1 |2 Y& E' y+ t switch(csym[2]){0 ^' W2 i& O+ @* x+ Z( g
case '(':7 n2 p1 U- j4 o+ I4 B% r6 F
if(!csym[1]){nLevel=0x100; nERR=1;}else# o# O6 \8 S4 w5 z$ V
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ b" v7 i# i. m9 G6 }6 f: B else{nLevel=0x100; nERR=1;}' @+ T1 F' l" P+ g4 \
break;9 M5 f8 K- c9 I
case ')':1 M) z8 N6 R/ t; y; L4 Q& s
{nLevel = 0x100;}break;
: }% v: ]% |( C/ p% m# A6 h case '+':case '-':case '*':case '/':
- _1 M6 A' F% Q7 G, u {csym[nLevel++] = csym[2];}break;) o( U* w( t, `3 \- _
case ' ':case '\r':case '\n':case '\t':continue;0 Q0 Z8 G5 R5 V4 T* _3 Q6 Z
default:! v3 M+ P& n! d5 @* {
{nLevel=0x100; nERR=1;}: o3 |! y* V K5 g& b
}# w; V w2 D' E8 G% U5 B
if(nLevel==0x100)break;
) J' L Q9 o: v p0 U7 t if(nLevel&0x10 || istrin>>t[2]){5 v8 r3 L; ~+ C8 g- g
nLevel &= 0xF;
/ \. V; T p4 c! E0 x/ O if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 J1 ]; a# [6 s8 E
if(csym[1]=='*'||csym[1]=='/'){' f. p4 `! G6 g0 n q
GetExpValue(t+1, csym[1]);
`/ n0 c0 @$ j' g }+ f2 a* Y, A8 t$ `4 ^3 |
else{- @7 j$ y! b1 L* _
GetExpValue(t, csym[0]);
7 g6 ?% q$ Q8 u- L. V: E0 W t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' G Y' P, D! K6 W3 }4 d/ y/ Q }$ b2 O% i" o& f
nLevel = 1;
* x, Y S0 Y3 K4 a1 { }
1 x, b | r7 f9 K# Y" L else istrin.clear();5 B& j6 q- z z8 J# L
}1 M/ A6 k. n) n; M
else{nERR = -1; break;}" p: j: B" H+ n2 T# Q# \
}
4 x" h) y/ l% P8 u$ A0 D if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 F# }! W1 s! g C1 z- w3 u else nReturn=GetExpValue(t, csym[0]);0 _; P0 A+ R, ]
return nERR==-1?1:0;
0 O5 D+ V, A; p+ f; G}}$ I6 T9 i6 u. ^: Z( D4 v* V( L; O& q
' V, ~! K& {" \9 w* g v6 i
. _ ?8 }; M, J+ [$ S4 m4 ?. T
4 Z* e/ ?0 X: r7 c函数模板使用示例:. t# |3 F. ?0 Y. I# o
在以上那段代码的后面加上以下代码:- f( `4 c) l( o9 K2 N& j+ e
& ^# u5 R: E5 x$ Q3 _; q: h( D
* c- ^, [6 }; i0 _+ y% |! T- x2 v* v5 w# E/ J) N' i. i
程序代码: ! o# |: }9 O8 ]* Z& Z( S
; N5 g, M' q, v# a" g; i, f
#include<strstream>( }7 h* `& C; d
#include<iostream>) h* ]; \2 Z- W6 M& f
#include<string>
8 r+ u/ B5 H0 ?8 I& y3 k* Lusing namespace std;
8 B6 l$ C' d) }4 u! gint main(void)( G9 I3 d$ a' `; C
{
: t+ `% j6 c- @* J' Q9 ~ string s1;
% w, t9 x3 m$ C) R: O$ ~& D( F* w while(cin>>s1)- r1 p' I( C/ ]) ^9 h `! P
{" |) S& h, ~4 t# r* K9 ?& F# W. Z
istrstream isin(s1.data());4 t6 s4 f. l8 U% _
double d;
8 O) s3 }) g `+ z% x1 s* x+ d; v if(fy_Exp::GetExpValue(isin, d))
& B; t8 o C9 {+ j {
9 y8 i' e+ R& }9 K0 Y cout<<d<<endl;
0 ~, k3 H% W8 }" O9 Q4 s- f }. y8 _: U6 `3 ^. s: B' K: f1 v
else
- @) o; c, V u! s) X8 b/ s {
2 L8 P$ I0 a1 C* S. n$ i e cout<<"ERROR"<<endl;
9 D. H5 ]* z- `& c& o }
# s5 k) j- B7 Z& d. W4 o m }. X; S/ U# S6 G# q
return 0;
0 C; E; ] K* R Q}
9 H7 c. A. \- ^5 v, ~9 l- D7 K) S& v- f0 Z0 ^& X6 S# d D1 [
% t6 R/ U4 G/ B. X/ H2 U7 p4 t' a" n然后编译执行就可以了(*^_^*)
, V, F2 d" f5 |( p9 J6 v' R其它:TC++上一定编译错误,不保证在VC6上也能通过编译1 T. P# _# B2 f" m* P
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|