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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
) o' N% R( L7 {4 ^3 Z一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ u ?4 C/ ]! ?, L
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ o( ^+ n L8 X w3 `7 w
参数解释:
3 w X# D2 U! t% v4 yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ a6 _) Y8 v' z$ ~& X5 x1 \* c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' [' E2 }7 J7 l) w; w
返回值:
. X3 h. u c3 \4 F: X" r9 Z$ n返回非0表示计算成功,0表示计算失败有错误
5 W' G$ u( R9 F3 V, v
; C8 T6 R' U& _+ s8 W2 `, M( z' y8 j
" z6 V7 _* `& j D; ?
2 X+ Q; Y% ]8 b$ Q: y n程序代码:
/ T1 G' W1 r2 q Y1 n7 V" T& \5 `1 ^, w7 X1 e
namespace fy_Exp{
3 t# O: R$ { p% X( Tnamespace {template <class _T>5 F- d/ z/ h2 t, s4 R6 n9 d5 |
inline _T GetExpValue(_T t[], char& csym){) f# ^! D& ]; m- X9 F% e5 D
char c=csym; csym=0;) m5 V9 B+ h- y# |, X! ~# X/ \: ?
switch(c){
# @. G5 V) O7 F case '+':return t[0] += t[1];9 }& x/ m' p9 ]9 A
case '-':return t[0] -= t[1];" D7 A# y. U3 m7 m% Y: [
case '*':return t[0] *= t[1]; W5 B) g7 N' |
default: return t[0] /= t[1];//case '/':
: D% P: g8 R: G7 L1 s" b2 { }
: p* P4 B- L* q& M0 g}}
6 {; ^1 Q p# f8 f; ~3 Ltemplate <class _T, class _Tstream>% R- ]: N. G) `# f4 e
/* _Tstream: inputstream, _T: get return value
( ?$ g; Z$ g/ O% G* Return nonzero if get value successfully */2 u4 Y! |) _! K* L6 u
int GetExpValue(_Tstream& istrin, _T& nReturn){
$ K+ Y$ q) l# [) g" k% n4 o, x6 g _T t[3] = {0}; //雨中飞燕之作) @; v3 U1 R: |
char csym[3] = "++";5 L1 e7 P! H6 o" ~
int nLevel = 1, nERR = 0;7 c1 x4 T. { {6 n7 s' \! w
if(!(istrin>>t[1]))istrin.clear();% c" d# a. w* h7 N3 I# l( @9 u
for(;;){
4 ^: m) `& Q& Z, W) N6 M) j* ] if(istrin>>csym[2]){: B6 D. `* h, @
switch(csym[2]){
& R! L5 ]+ L$ ]2 j: c3 w) a; l case '(':; q! \! m# F8 o) [# D
if(!csym[1]){nLevel=0x100; nERR=1;}else8 F0 }. H& E+ {( y! E( w* R
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;/ Z8 G7 v5 r# `2 |( _4 A" a
else{nLevel=0x100; nERR=1;}: E' G l6 R' r- ^5 p! P" @
break;" e7 t' U' \- ?5 s
case ')':
4 P" A' Q% s9 C5 t7 s4 L0 n {nLevel = 0x100;}break;4 n2 K- ]' O/ ^3 c" R2 `6 i( s! ?9 { F
case '+':case '-':case '*':case '/':$ I' c( j5 _( a
{csym[nLevel++] = csym[2];}break;. E5 R# f! D$ |" E. S3 \2 ` h
case ' ':case '\r':case '\n':case '\t':continue;
& a+ C# d! a) m1 @4 F# }1 o) U default:- S) w) F8 k3 b" d
{nLevel=0x100; nERR=1;}% u$ e% V2 M2 K4 T
}
! U2 N f" l& i. u if(nLevel==0x100)break;+ g a9 ^7 E. o% I- G* h3 c' t
if(nLevel&0x10 || istrin>>t[2]){: h) N9 V C; M) Y2 ?* Q+ _
nLevel &= 0xF;# C" `! ]; o Z! X! e. J, J' P
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! }; t, X5 C8 L if(csym[1]=='*'||csym[1]=='/'){
& ~3 I0 P6 Z9 T2 j0 z GetExpValue(t+1, csym[1]);
1 W E& p/ M4 P3 l }
2 d2 l4 U7 {' H. ?1 b) J else{
; a- u# S- M2 v# ]4 i7 A* [ GetExpValue(t, csym[0]);/ y& ?' t( L: R
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ p' D8 o g( U }
3 H4 E" M; r0 q% Z2 L nLevel = 1;
& a% z) {6 T! S6 D }
+ Z5 B# I# @+ K( T/ V5 ] else istrin.clear();
+ p4 r, h+ Z* m }
8 W+ d* n+ y+ n! j9 c else{nERR = -1; break;}, _5 k. _& T3 }! S, J1 k
}
: @" d: R( W- p if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: c3 ~8 K/ g1 C. Y+ b" e else nReturn=GetExpValue(t, csym[0]);" b! A! q( C( b% s" C6 L. Q
return nERR==-1?1:0;
( M2 w8 w; M3 {1 H+ T9 e# |}}
: Y& E# \- t6 K4 w$ M
4 u1 G4 R" m" {8 o, P4 C
; I; H( u4 q( D4 J1 |0 L% b7 S. a; d4 m2 j, L4 G
函数模板使用示例:4 k* m! o! W# @
在以上那段代码的后面加上以下代码:8 K, X$ g. k/ b; M+ \3 q3 T
; |% @8 @: i+ s
x& i7 }- r/ T6 d; ~# k
! U5 [# [" l$ o& {, O& Y b, F) c
程序代码:
9 b8 n$ _* H2 J: T x- T
6 s( J! i1 a" D% i; m: I#include<strstream>
) P# Z3 S4 _5 G% F# @, D+ g#include<iostream>
; @, G- e% @' V" o) W- \#include<string>
* F* E- x8 ^6 I' F5 ]using namespace std;( y5 D+ n8 F+ Q3 z6 b
int main(void)6 d# ~! d' _ ^, B
{
' N/ H/ \* d$ { string s1;0 G; F: V+ l* q
while(cin>>s1)4 Q' S( ]* _4 f
{
) E7 [1 v8 d# F istrstream isin(s1.data());
$ Q% E$ o$ L& g n0 @. E! i double d;
% }3 \# p$ o* E( D if(fy_Exp::GetExpValue(isin, d)), h* ^& i$ H Q+ K/ j7 h! T; g
{
# [% u/ m) |/ E& ^9 ~ cout<<d<<endl;/ c, @( G" J- }
}- F0 X8 v) S" I# I/ |: e
else/ W6 \6 q9 X5 `% q- l
{
* M: a/ v5 h& ?1 o. j( w* l& b cout<<"ERROR"<<endl;
7 S3 D1 c. o; Z% l( b }; b: O& k; E! Z. ~/ `4 y
}
: D, W8 d0 J9 B7 g3 L9 g" w8 S return 0;& U' K5 C+ Q: O8 x- B
}# q( _5 i6 r" r
6 |6 y0 e* F- {) l# B# ^( A( ?
# G( @2 c8 y3 z2 G; v ?4 G* x然后编译执行就可以了(*^_^*)' G, W% ^3 z9 k( Z! o
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ D4 G$ {. z8 D% h 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|