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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,. p: U* { b5 W% y& x0 }
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% a/ c( E; a5 `$ x; C( F只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn) y3 x2 L: ~2 C! ^. R6 m
参数解释:2 `* y5 u1 f5 I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: Q/ ~! ]% I/ c5 `- h/ K
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定4 F5 |/ w; s# J% X0 w; Q
返回值:/ l! Z z# v! w' R* E. U
返回非0表示计算成功,0表示计算失败有错误# \7 Z8 ]6 w; I5 s
: S" {$ b) V5 E6 V: r& P/ | 5 E' A& Z1 k& r% D1 D0 S
5 F8 }/ B2 }3 l& g. t
程序代码: & Z1 l8 f. x5 n( d1 v( Y ?" k
1 ]+ Y& |* d5 g$ q3 b- F
namespace fy_Exp{# i' f* B2 J0 ], F F
namespace {template <class _T>2 L' N: j$ \2 @3 R$ K" k
inline _T GetExpValue(_T t[], char& csym){
1 T' q( h+ v' t" q5 u char c=csym; csym=0;
* Z( e; c8 @( {' s5 u switch(c){
# w6 q' v1 K/ ?3 I) M$ h case '+':return t[0] += t[1];* G& K& P8 j' d' l
case '-':return t[0] -= t[1];
$ ]. R& L' O8 N5 E case '*':return t[0] *= t[1];
% J$ G) H- W8 q4 y8 s7 E2 \ default: return t[0] /= t[1];//case '/':
: I6 j5 f7 g1 p% t" e. M }5 l) \6 k) e4 K
}}2 g0 z; P" g' i' M/ E9 d
template <class _T, class _Tstream>
! f9 S7 G0 O! T; y+ N/* _Tstream: inputstream, _T: get return value
' N) \ \- @2 M a% O+ s# i* Return nonzero if get value successfully */2 ^0 g A. K* @$ J9 ^( P) R/ Q
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 X/ s! F( n( v5 U _T t[3] = {0}; //雨中飞燕之作1 S: p9 z# {9 k' M" x
char csym[3] = "++";
+ }- h6 ?- J9 |1 b4 n* e int nLevel = 1, nERR = 0;
3 A9 H. `. d; N9 w0 p7 O if(!(istrin>>t[1]))istrin.clear();
( a1 \/ d1 S1 M, j for(;;){5 d6 [5 N% `6 R8 l
if(istrin>>csym[2]){0 O6 M7 [% A$ m
switch(csym[2]){
) z# t( u2 {- R5 J1 Z+ L case '(':
9 m4 q+ A e) `' D- T5 q$ i if(!csym[1]){nLevel=0x100; nERR=1;}else2 T |6 D! |" j6 [( i
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ ^% @" W8 V# o8 k% } else{nLevel=0x100; nERR=1;}
6 ]- j H! I7 Z9 | r1 F break;
8 B) H0 I, V' Z4 Y case ')': W& b2 v$ v; a/ m
{nLevel = 0x100;}break;0 P* [+ }" r I5 W* c
case '+':case '-':case '*':case '/':. ~, c& q6 p1 ], ^
{csym[nLevel++] = csym[2];}break;, Z4 f# [' x3 m
case ' ':case '\r':case '\n':case '\t':continue; L4 |. C$ C" m7 D
default:& q# p$ L8 P+ l" a
{nLevel=0x100; nERR=1;}& [0 V$ H' C; {0 t" H3 s
}5 V9 k- k, j* ~/ \2 m, p4 ?
if(nLevel==0x100)break;
. |$ n/ s* M' E& a8 C1 l if(nLevel&0x10 || istrin>>t[2]){5 e4 g0 [+ d' k1 |, C8 q2 t2 [5 o3 F
nLevel &= 0xF;4 |8 f4 ~" `: ?9 G9 b o# ^% J% O
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 f" E5 y `$ A1 O1 `0 l. D- u
if(csym[1]=='*'||csym[1]=='/'){
; v+ e9 O) s8 D4 z8 p7 E9 ? GetExpValue(t+1, csym[1]);4 |& D% K0 _" X2 U
}
0 m! t$ ~) `* e K7 D else{
/ d+ C# `! f' a5 A3 q# X GetExpValue(t, csym[0]);$ Y0 k& O1 ~) m& ]/ N/ L
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ T5 R: F, `' b; I6 Q' S6 h }
$ e& v! g6 E% o2 o nLevel = 1;
3 [% ^/ X; s0 { }
) p* n. X) o% Z8 N s else istrin.clear();7 V1 y+ y2 v, w, ^. l1 ]8 X
}( l" W& f& ?# [# f: Y$ ^! M6 B
else{nERR = -1; break;}. Q; }& G0 ]% |0 |$ F
}1 [( v, e [3 {1 o6 N
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 V* k+ Z; F) F9 k0 k0 j9 b( z
else nReturn=GetExpValue(t, csym[0]);5 z2 ~5 p W d4 L
return nERR==-1?1:0;
" s5 I* T; p, `& @7 r& D}}
( U2 d1 v9 x. f' Q2 }8 R: a% _& R; L
# L* |& H$ D! z; A; m7 b2 ~/ T
3 }7 q( o- q4 M6 A/ ~0 V函数模板使用示例:+ a# R, Z/ B0 r% t
在以上那段代码的后面加上以下代码:
& a+ c. r( ]: b) c# N) j, R ~
( l# {5 q% I2 v7 v & B3 V& `4 g' X# {) j7 a
& N! u; K4 I2 Y9 q4 j x( M9 y
程序代码: 5 U0 S* [" s" \; S6 a: ]
& R% D/ C% P+ @( E. o& P- K#include<strstream>
% W! p3 W, j/ n! [9 a#include<iostream>
! M; v( q' V& `6 I#include<string>8 I6 l/ Y) M3 N% N4 _
using namespace std;
7 N0 h3 P$ r) Y. M' A* m5 Hint main(void)7 _8 ~; T( Z1 m9 B$ m: E( J
{( M2 [+ |: u' h( G
string s1;* Z6 {+ i" m0 N2 M* I5 F( \
while(cin>>s1)3 I4 m3 n% ^% Y4 {3 o
{
7 n7 x5 {) l! E# t$ O% a$ a0 ` b( O istrstream isin(s1.data());2 f& ]0 W' v! P0 U& e, L
double d;
: K! w2 Z: z! P" y( R1 C0 A U if(fy_Exp::GetExpValue(isin, d))
/ }" a# t7 I) @ {
. r3 D0 g6 D. M8 k" k2 ? cout<<d<<endl;6 R! Z, ]/ b j [6 t* t. Z
}# |9 ~' H( P6 A' }5 S
else
# R, l, L1 n. B0 G5 Y! K {9 v, X: b' M/ r0 m
cout<<"ERROR"<<endl;
% A8 Q2 M! @, V3 O; W5 M }
' v, V; F( r- } m }. U8 i+ u6 H% R5 H( X$ G3 @3 I: l
return 0;0 ?! B9 |5 z2 E( Q# g
}
1 s8 A* Z& W) t4 ?1 ]- L" p6 w9 j# a% f# \, v
5 {' _, O, p0 f: B然后编译执行就可以了(*^_^*)6 v" u2 \2 i1 x% r) r8 D$ O+ ]% w
其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ D3 ^ K+ \" Z
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|