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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,0 J( u, K5 ], s0 V5 y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- g9 c( ~/ L0 P: p0 v2 J. ^6 H
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 Q2 Q% j' b, A. S/ q. F4 O参数解释:4 D" n0 l, q7 k8 k" e9 G& ?& h$ u
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- P1 e6 y8 ~, c2 _& L% fnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
i! Y' W H- C# H5 h4 }返回值:* D1 `! \2 f* M @+ U; p" ]6 m4 ~0 i
返回非0表示计算成功,0表示计算失败有错误
- s! n8 p3 u, p% h$ F! s" H7 k' V% a, I& A' Y: v
; A* V& e5 K/ |1 ]" j( U
7 N2 f4 j" H# x
程序代码: % H$ ]/ j: `2 f, Y. t# l/ G0 L" h0 ]
8 y8 ]$ O: [- i A3 b' bnamespace fy_Exp{- d* S) L" d) W
namespace {template <class _T>! f7 ?* X+ O/ T" U
inline _T GetExpValue(_T t[], char& csym){ u1 U! ~% o2 x5 u
char c=csym; csym=0;
$ I) W- o2 e7 Z, W P! E, `/ _ switch(c){2 Y* N# b9 }3 c: B2 L% b
case '+':return t[0] += t[1];
" v8 S0 W+ W* j: V. Y7 |! y* C case '-':return t[0] -= t[1];2 t/ T# T6 b* l3 q
case '*':return t[0] *= t[1];
) J3 J# Y3 d3 y( b$ |2 Q default: return t[0] /= t[1];//case '/':1 a( z# i# L% Z) @% x! v; b) N
}( W2 I" w7 Y' t; R
}}; k! Z2 R* n# V/ n" n6 _2 |" i
template <class _T, class _Tstream> }- C W4 f! ]/ k" D
/* _Tstream: inputstream, _T: get return value
( M3 a G+ n0 N- _* Return nonzero if get value successfully */
, f% {: s4 m, F4 `. Dint GetExpValue(_Tstream& istrin, _T& nReturn){
0 x$ A5 i* C A$ O _T t[3] = {0}; //雨中飞燕之作1 @& T+ z, x! y
char csym[3] = "++";
8 I5 r* o9 {& y/ Y1 M$ L int nLevel = 1, nERR = 0;4 b6 z7 g+ M; v5 z* j+ K9 d
if(!(istrin>>t[1]))istrin.clear();
y! B8 f7 S: _& Q for(;;){
2 |/ @' C) d9 {& K4 v$ e if(istrin>>csym[2]){
1 g/ M5 W; b9 d8 Y9 W switch(csym[2]){
& e) Q5 u! T! `" i. | l5 M case '(':
3 o! b8 [9 \- [6 R if(!csym[1]){nLevel=0x100; nERR=1;}else8 J6 a1 s- O4 ~9 E4 q: I, Q* {
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) B1 \* o) v- j7 m% B w else{nLevel=0x100; nERR=1;}% }9 ?3 x/ M8 X; d6 u. P
break;* d3 \' j# P, S( J
case ')':( R8 p/ h2 Q% M
{nLevel = 0x100;}break;
6 P6 o7 Y' v, K case '+':case '-':case '*':case '/':4 \4 y$ p3 N" s Z1 o$ Z
{csym[nLevel++] = csym[2];}break;$ r2 h) R1 @/ J+ x9 [+ M
case ' ':case '\r':case '\n':case '\t':continue;9 n! b1 G8 {* K6 ^7 R# i
default:
/ \9 N2 F D( |* W {nLevel=0x100; nERR=1;}/ \# e: ?3 |/ [, V4 W! E/ w' Q
}& B: |2 m8 P" X# i- s$ S
if(nLevel==0x100)break;
5 ^: v. _9 u& v* e, J$ l6 T/ o if(nLevel&0x10 || istrin>>t[2]){
) N' U/ h* ^! L- M! i% [ nLevel &= 0xF;/ h9 q) ?9 u% V, N3 w# s2 s( U
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, H9 w0 C( ]" ` if(csym[1]=='*'||csym[1]=='/'){
: q" F" V3 |* G, k GetExpValue(t+1, csym[1]);1 u9 p' [, g( Y! U5 r6 d
}% P( W& d" Q8 |* Y5 e8 d7 l
else{
$ h h# y% \9 O: ?# r6 q& D* u4 | GetExpValue(t, csym[0]);3 ]8 T3 Y8 W9 _, l6 x
t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ d9 X, \( w% T) ~6 |
}$ n' b+ b6 f$ e% k0 @& a; |
nLevel = 1;
- F" }, j! i; @9 U }
1 P5 S& t: h6 M, i else istrin.clear();
9 M/ v" G9 Y s! z }& O0 h* [. ~9 r! o0 B7 q5 C
else{nERR = -1; break;}
; N* o# S) F6 i1 q8 t, d* V5 t }
, ^) u* z+ o- g$ D/ ^ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; G# P. H: R# w; S7 z k
else nReturn=GetExpValue(t, csym[0]);
7 K: B: ~. }/ W2 u$ Q return nERR==-1?1:0;
: Z+ i1 ~" D7 K! w6 H}}
8 d: {) U, |, ]
( H- \: q4 ~4 f9 ? f
, w" @# a' ]& p% q( R* J7 [ H9 r! q& C6 _) I" S
函数模板使用示例:0 v2 c7 O. e1 a, y8 r- C1 Z
在以上那段代码的后面加上以下代码:+ h: v+ q* B7 M& d
) ?6 q* m# w# B' I; l
( v; ~0 W/ T: w
2 L9 j# A: Y6 N: X# _4 p程序代码:
9 Z, _& R7 k. F. j6 O1 i
8 ?+ u B3 U$ d- N* b#include<strstream>
$ T1 G6 D/ R* x, `( _9 v#include<iostream>
2 ?/ W2 c2 @# R$ O" t#include<string>" z% ] I: [+ _6 w2 i8 B
using namespace std;
5 |6 Z$ e! w; r" e3 p! v sint main(void). I5 M2 {7 j- o7 _3 s
{8 w, \/ v) |/ P+ D( P/ b7 ~
string s1;
. S' _- y: s% y( f0 n. \ while(cin>>s1)
/ C1 k* Q3 M' z4 H$ q) j8 V {. [' V( G; f4 S3 H1 M
istrstream isin(s1.data());
4 S6 x! G$ f P8 Y9 \ double d;: R4 @0 N4 H7 R% y" W2 H
if(fy_Exp::GetExpValue(isin, d))
2 X1 ]# d) }; d% q( Y) J( E; A {9 t% K- I4 r) W8 T' `6 m. j& y
cout<<d<<endl;$ i6 X* q3 B# Q l9 @
}
" p8 W' `. L6 h8 I. t else
/ g4 Z4 p1 l, k$ F( R, \+ W {& n, U' v _2 J6 x
cout<<"ERROR"<<endl;
+ s% a. y: m9 v" M3 j }& B3 u0 ]! v- o+ p6 @8 R4 ~$ u6 U
}
: v/ y# r9 D$ y3 O) y+ }: G% v" ? return 0;( T! b- k) q* r5 |- ^. j# U
}
6 ~5 N/ E% B/ ?. c# m# v
! l9 H/ T' `4 `' W [2 X1 X, L a3 \
然后编译执行就可以了(*^_^*)' }: R9 N5 o( M# o3 t c* h
其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 N$ x/ B$ ~1 n" j: s# @4 t
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|