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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,' S, _" K' R- {3 f, h3 r$ ~3 e2 i& T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 t- F! Q. c( }0 h: g+ b只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' S$ A- Q! t/ }+ j! G3 @
参数解释:
# u: r/ J) _; u2 Yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 S2 _4 x v* MnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- |9 z; p9 Y$ H! a; `8 e1 I返回值:- E! J! X$ ^3 _: c3 y
返回非0表示计算成功,0表示计算失败有错误+ V7 | w4 X8 n, W! K. ?
( N- k; ^; `( J1 n0 O 9 X. r1 W: e F3 d+ ?0 o0 f$ D
" H0 |' n c1 f1 D! g程序代码:
+ ]6 Q& {5 o/ M. ^- m( O# l* G4 e
namespace fy_Exp{8 M1 c& W( _) b* ]- l- Q; U
namespace {template <class _T>
7 l6 N7 c# @, u, S2 k/ V; Z/ U# ^; ainline _T GetExpValue(_T t[], char& csym){
$ f7 O) i# E& Y# } char c=csym; csym=0;. h4 _: r# _; F! ?
switch(c){
. r+ j5 m! J8 m5 N V, A9 [ case '+':return t[0] += t[1];: O$ M! z- H$ R4 ?: E8 R2 m
case '-':return t[0] -= t[1];
! v+ `1 @; N9 U3 h# W case '*':return t[0] *= t[1];
& R. B: S, ]5 Q6 y$ ^6 s default: return t[0] /= t[1];//case '/':! h2 ~9 l$ M8 @+ ^
}
: @! c1 T& g$ F; p6 @}}- m8 X3 K* i! F( L% T9 j( n
template <class _T, class _Tstream>1 k& f1 d. Y0 c
/* _Tstream: inputstream, _T: get return value
& G( }) g4 O* l* e6 r `* Return nonzero if get value successfully */) L0 S2 ^+ v7 [& {
int GetExpValue(_Tstream& istrin, _T& nReturn){! }: p% v0 E: r, M+ ?6 h4 E
_T t[3] = {0}; //雨中飞燕之作
. ^( O) E$ v# b char csym[3] = "++";
+ I) @" P7 C2 t! P! u3 j! }% p int nLevel = 1, nERR = 0;3 K! M1 H5 ^1 Q" C
if(!(istrin>>t[1]))istrin.clear();6 G* I- R2 K. w9 r5 |0 s$ N
for(;;){
" j. h7 O u' H" v! d if(istrin>>csym[2]){' S! g' m+ {. J% r ]6 U% R* e
switch(csym[2]){
- @2 n0 [' I0 O3 F$ S' z case '(':( e0 \; A" d6 X# [2 K
if(!csym[1]){nLevel=0x100; nERR=1;}else
( g7 B! D3 r8 x; ^9 S% J* S! [/ L if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 |( [: z( |& K; `! f2 y else{nLevel=0x100; nERR=1;}
$ P; U3 |& r: C; p8 b5 b0 M( c% _# F. ~3 v break;
( P6 O, ~' c3 U, P% T- Q case ')':
, ~4 I: S; G/ r9 d8 F {nLevel = 0x100;}break;1 D+ L5 d& e. k W& g4 ?# \
case '+':case '-':case '*':case '/':; K" I$ m2 O5 Y$ B! t$ }
{csym[nLevel++] = csym[2];}break;
2 o+ C3 ^ {# }" H! b case ' ':case '\r':case '\n':case '\t':continue;
7 `; n% n" _; |+ R: m0 a8 ~ default:
, M" A* t- Z9 W# x6 _7 s# F* L7 K8 Q {nLevel=0x100; nERR=1;}# u# J0 [$ F% N7 P$ O
}' `, M# d0 ^( ]' o* G- F6 O
if(nLevel==0x100)break;) ]' J" e' C5 z J# K
if(nLevel&0x10 || istrin>>t[2]){
' |% H! e$ N9 S( | h( a nLevel &= 0xF;
5 s( i% h; V+ v7 h if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. {# P0 w# I. }( p i: {
if(csym[1]=='*'||csym[1]=='/'){! @: j/ G5 W( k. c5 v. k; R5 t
GetExpValue(t+1, csym[1]);7 _9 j2 I- F S' p
}
z ?/ r: v) y# n else{, P6 P" X B& T4 U& U
GetExpValue(t, csym[0]);9 v7 g0 Z- c4 a7 t& q6 e$ T5 N0 y/ [
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
: ?9 g J0 m4 O* h }* D4 F& H7 B4 c B. K7 |
nLevel = 1;
8 y/ Q% P H/ { c7 I% }$ E }0 ~# D; t. i" y. M i" g; E
else istrin.clear();
, |- k1 f7 D' V" ^& r/ Y$ i3 A }
2 ~' r7 X" d; T! N else{nERR = -1; break;}
" M8 Z* ^2 \$ h+ N7 C } ?9 M# M( { z
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 v+ B$ p" o: M& ^. K
else nReturn=GetExpValue(t, csym[0]);
9 n" ?6 @. C# z5 ]8 e4 } return nERR==-1?1:0;
4 s& o) a; D. N7 Z" s}}3 f" l- i0 `4 }- N3 y6 N
% L3 Z7 p+ V# l! w
& y) i6 o- f/ R, ^( J
1 [/ K: |' J) J% R6 ?函数模板使用示例:& h( m1 m7 r3 ~* J4 p6 w
在以上那段代码的后面加上以下代码:/ u; z9 }3 j5 e0 S* o: h% I
* H7 b; \. {5 A" A3 ^0 n y
, ?3 o* V9 M; H% Z8 ?1 C5 B U9 J4 t, S/ P. R
程序代码:
3 S: }+ g# b3 V0 Q, ?3 J1 U: x4 L; Y, M
#include<strstream># E* @( a- P1 A3 O9 P/ ]# V0 n
#include<iostream>% C1 a7 d9 ^# f8 `5 m" u
#include<string>
" E( R( s6 D" H Yusing namespace std;/ N( m q. M8 f. p- e+ }
int main(void)
' M% W( l. A+ T- r0 g) ?. a4 |0 R{, `/ k$ x; l3 g0 b1 u& P
string s1;
% z' U5 u" T1 c- F. l" U0 F- R+ T while(cin>>s1)7 U( B" |5 t) ~6 L
{
# `0 y, K9 B6 F% ~7 ] istrstream isin(s1.data());
7 O& o `- I# \4 b$ w double d;
# n/ ^2 V( l. U: L, o$ U! s if(fy_Exp::GetExpValue(isin, d)) H4 |( J2 i5 {4 [# o
{2 M6 z$ g+ s( t7 d: r
cout<<d<<endl;
3 ~' `6 [/ {: g3 p" @ }
+ w# j9 J8 U7 i/ b& Q2 J, g- P else' N, h( w/ j. C" ]7 g
{
8 U+ }1 S. ]4 x! M! q* o cout<<"ERROR"<<endl;1 |; ?* d% E4 s
}( P0 I! w7 s+ O( o0 s3 n. C
}1 L- {$ }* j1 s- {7 Q( W: v
return 0;; q/ ?' Y7 _0 Q# E2 f* @7 Z
}
6 x4 J( B' q" {4 |6 S; a: u" r
( ]4 s6 U! q ~$ |
; a& _$ j+ W6 s- ]7 W- G: U然后编译执行就可以了(*^_^*), F" Y$ [! O1 V" x& _& w
其它:TC++上一定编译错误,不保证在VC6上也能通过编译" Q2 s- M7 k1 S, o: G
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|