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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
( p: `2 @& D* s4 R% P- F一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; v7 m1 h% B$ N8 c- p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 X. j: \5 o: U0 R6 i7 t( _参数解释:5 p( F( I# ]9 z. l p) ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流9 J& T: ]2 a- w' y% s
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定 p8 H& z! B1 _0 V) C* F, e% }
返回值:: p, _+ T* R$ x9 X
返回非0表示计算成功,0表示计算失败有错误
7 n7 R0 H K" ^6 ]1 \* b. v8 Q; ?/ _7 J& S) |
4 Q8 L( R( f6 J% D4 i4 } m+ P1 L; [7 W! D$ b I- [
程序代码:
' x" d. v3 B: l2 S' Z8 Z( a, `
' D& ^1 O6 a; {5 o: ynamespace fy_Exp{
! z% k* d6 f( n' e, J$ ^namespace {template <class _T>
. c- i7 a; r7 @4 N2 N, vinline _T GetExpValue(_T t[], char& csym){
: n, {: L. V# H* N4 A3 G- l char c=csym; csym=0;
4 r3 h4 ~& z) p V! l" e' K switch(c){
0 H( J: E3 T4 ^ case '+':return t[0] += t[1];, I: ^, }7 v' f- e
case '-':return t[0] -= t[1];
: K* ?9 f2 x( v5 f case '*':return t[0] *= t[1];
. j' S& @. \0 x. A' z# ]* M0 H default: return t[0] /= t[1];//case '/':) B0 p' `( ~- }# H- q9 w5 K
}
& V8 Y* A: ^* h- t}}
. m0 F% [8 m R: e3 Z" Z2 ztemplate <class _T, class _Tstream>- G, ]4 U' V# j% U
/* _Tstream: inputstream, _T: get return value
# N u5 o2 G) u/ B F c3 N* Return nonzero if get value successfully */* G! m+ j3 n0 P0 J
int GetExpValue(_Tstream& istrin, _T& nReturn){+ t0 f& Y+ i8 o: Y
_T t[3] = {0}; //雨中飞燕之作
+ ~ @, X+ {; b1 C char csym[3] = "++";" ?+ w! {3 L1 f3 M8 \7 _7 u, K
int nLevel = 1, nERR = 0;
$ _7 o( L/ |- t! j' E3 C if(!(istrin>>t[1]))istrin.clear();
X4 a6 Q- e/ E9 I) B# K7 E1 ? for(;;){+ U5 ^" h" }0 x% Q2 q3 Y
if(istrin>>csym[2]){; r3 R* o" T; k! s% {" H
switch(csym[2]){
2 E3 N# M5 H9 m) A case '(':( k, O, j# i+ J+ {2 }8 M5 c A- Q
if(!csym[1]){nLevel=0x100; nERR=1;}else
' C7 U1 e. `4 ` if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( d) O8 h- ?+ A3 I! M' T9 Z! T
else{nLevel=0x100; nERR=1;}
, f$ h L" q# J5 v6 U3 t break;$ W+ R( t$ _; p
case ')':2 Y" I9 M+ z% y9 M6 H8 Y' X2 k( r G* U
{nLevel = 0x100;}break;$ r( d8 u4 m7 B( X1 m
case '+':case '-':case '*':case '/':; b) }; ~: B! Q T) m/ s
{csym[nLevel++] = csym[2];}break;
0 R$ T- j& e6 J" P" n case ' ':case '\r':case '\n':case '\t':continue;% P; o2 J$ p8 y
default:
% x4 | V# A# H& d6 x {nLevel=0x100; nERR=1;}1 _$ h5 h9 L% H: [. K
}
# r4 w5 Z8 ~, r( M0 e0 K$ W if(nLevel==0x100)break;
0 G2 P/ E3 g' f if(nLevel&0x10 || istrin>>t[2]){
7 m/ _- h/ H2 X* R8 y- P; Y nLevel &= 0xF;' Y# ~$ j# ]" L2 b# h
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! Z2 ~- p Z- T- f, z$ X5 v if(csym[1]=='*'||csym[1]=='/'){
E2 E% b- x$ w/ a/ d, I! U: j GetExpValue(t+1, csym[1]);$ S0 |' |& } t9 L) i& n8 ~: g9 I
}
- T7 r8 _0 J3 @ I: q# `2 _ else{
+ n/ I4 y9 g# M3 d3 K GetExpValue(t, csym[0]);. y& v. ^2 [1 f
t[1]=t[2];csym[0]=csym[1];csym[1]=0;" w& m- d! o7 B7 f
}9 r/ k% u2 K: Z/ ^4 n4 ^8 h: \
nLevel = 1;
/ P2 d- h/ \) h! f% A8 H }
; @1 i$ S3 a8 X* s# L else istrin.clear();
1 ?3 l. ~4 N4 ? }3 s; S3 y8 j: k# n
else{nERR = -1; break;}
+ g( B1 m' L) [: h( _ }7 Q, y& |2 `9 g7 K; o0 N: M
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. o% c. B( ?- u3 W else nReturn=GetExpValue(t, csym[0]);! w' J( F9 j( |
return nERR==-1?1:0;
: \7 }" Y3 @* R+ M/ J2 b6 J}}% p! I% R8 t$ M8 O7 w0 k
8 f: v$ a w" I5 ~0 H- O: }
, ^; ?+ K/ l0 |; K: B2 b/ \2 @/ R' h7 Y6 n
函数模板使用示例:* I- o* [; L4 E& g
在以上那段代码的后面加上以下代码:
! v* Y" a" H* w& ?, b, @# @" K$ W8 y4 ]- ]
) v2 R$ M! l/ O' n3 d- Q8 T- t; G
5 a% @5 O" q6 _程序代码: ) K6 ]3 @- k# i7 x! f( t
% I, Z* l) O, [0 H3 y- g" u
#include<strstream>- Q% } a8 t3 X' X9 C0 n
#include<iostream>
9 |8 i* u5 j2 c% z+ ~6 _#include<string>6 q, t8 x3 S8 o$ C( d: J& G) B# j& J
using namespace std;
* ]' D8 f+ z& v6 d* C: t* Q, tint main(void). l; q( s0 v! |% i7 ~. G1 F
{
; D% R1 ~0 V$ c, v8 F4 B! n string s1;- S' R0 X F% Y" `; Z' C
while(cin>>s1)& ~) j! c4 \2 C, U3 ]( u s
{5 Z/ K3 f3 x. M" J. u
istrstream isin(s1.data());
4 U7 k% c% U1 R, @ double d;
" q$ ~& h4 i5 G if(fy_Exp::GetExpValue(isin, d))5 ~ m& l5 g$ p
{& e& y$ k2 r) ^. y" x
cout<<d<<endl;+ u& V$ r, L, ]7 H; [5 K
}! A# | o& y. [! O. b3 ]" Z2 ?
else
3 I4 h! I; i4 c v {
. r2 p) H8 f, i% I3 p cout<<"ERROR"<<endl;
) u& y* H# b8 h" S; e8 W }
3 G( f g$ ^3 Y7 d0 V$ W1 n5 E }
( @) d% x3 V- `! D$ C: b+ h return 0;
* I/ Y3 ^+ e( D! _6 x) m}0 r: m% G( k( t
+ e: k7 n3 k: u% t) e) ]1 l) `% d H6 ~! j Q' r
然后编译执行就可以了(*^_^*)4 L2 j7 z+ u+ m! B' j$ ~0 _
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& k2 d& ^9 x: j, a2 H3 ?: p+ \ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|