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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,1 e; P' B5 _0 l/ o
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式: S6 D! K8 m0 f3 W8 k# _9 }
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)$ M) A; {4 t; V3 T3 _$ f b. V
参数解释:
" v' x' d7 f+ G& C5 Gistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' j) E8 }4 x9 r9 g b. s% \
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
q' i6 m5 h- o* M返回值:2 m. Z3 D* X- n
返回非0表示计算成功,0表示计算失败有错误
. h1 ^ ^ S) b
0 F* G" A8 [$ C ) N6 N4 x1 e$ @- L5 T6 G6 U
4 Q. s8 o# Z& Q' a: r" y, L程序代码:
. H9 G7 B8 B, Q0 S9 Z( d7 |0 {6 Q: K
namespace fy_Exp{" Q8 b/ o2 J$ i5 q3 i. Y5 y
namespace {template <class _T>
9 e# L* p) b* iinline _T GetExpValue(_T t[], char& csym){
6 u# C) k5 d1 P$ D Q char c=csym; csym=0;( C$ ]" C* U4 \1 B6 X$ L% p u
switch(c){
# N7 v: F% [0 y) L0 [+ q9 G% p case '+':return t[0] += t[1];
. P. i1 l E' A0 ~+ f" { C case '-':return t[0] -= t[1];" |" `2 U9 H# A$ G7 ~+ c0 n9 u
case '*':return t[0] *= t[1];- k, c$ ^* K+ m. a) o( S7 e, l: X
default: return t[0] /= t[1];//case '/':' i1 E( K, m# ]
}, z2 N. w; o! W$ }, V
}}3 X/ G( S% x+ g. K* E2 q
template <class _T, class _Tstream>
9 _- R3 G" P3 Q* f8 N. u X/* _Tstream: inputstream, _T: get return value6 f1 F0 @+ \$ m# y' r2 G5 N/ I- D6 \
* Return nonzero if get value successfully */: g; Y' y! J4 q# v8 w! R4 D
int GetExpValue(_Tstream& istrin, _T& nReturn){
% X# [3 e- ]* h* b0 p$ z7 c _T t[3] = {0}; //雨中飞燕之作
# G2 ^* \5 A% a8 M char csym[3] = "++";% f$ l9 x) |3 _8 Z9 b* i! B
int nLevel = 1, nERR = 0;7 s+ p2 P" Y( K
if(!(istrin>>t[1]))istrin.clear();
) B8 ^: r2 x: Y$ p4 J" b for(;;){
+ \3 V% x' i& Z6 ?1 X if(istrin>>csym[2]){% `% u. `3 v% Y0 |/ M% k" j
switch(csym[2]){
+ J& `$ d6 L1 ` case '(':
B! j6 ?# j! c' L9 Y. R& O, X% Q if(!csym[1]){nLevel=0x100; nERR=1;}else7 W' ?2 Q- F" ~# P) e6 G+ t
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, K7 u; I; M; o0 \, l V7 z( W else{nLevel=0x100; nERR=1;}
1 o# e- K3 K' C* F( Y9 @ break;) D1 X$ R7 A2 n4 F$ f
case ')':( ^ y0 p$ J& T: d% N
{nLevel = 0x100;}break;. D; L4 Z2 f! _/ Z5 X4 [$ ]
case '+':case '-':case '*':case '/':& ]' K! w2 }3 P, y$ c; O2 E
{csym[nLevel++] = csym[2];}break;) @2 p$ u5 P) L Y( C; ^2 \+ z
case ' ':case '\r':case '\n':case '\t':continue;% f: ~/ |1 g1 P2 R" E; d7 R
default:
6 B! P+ X; A3 C( t. | {nLevel=0x100; nERR=1;}
' [7 X9 ^" P/ m y* y }; y" B: b: x! j8 v1 I) g+ A
if(nLevel==0x100)break;% F# H0 t7 k m
if(nLevel&0x10 || istrin>>t[2]){/ O! V: z5 b) C, \
nLevel &= 0xF;
0 s/ x8 K. O3 t! Q$ ` if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
7 a; @5 L) g" | if(csym[1]=='*'||csym[1]=='/'){
4 [% X! r6 C. P4 `$ g3 C GetExpValue(t+1, csym[1]);0 b. J: b4 e$ k7 R4 x) I3 J4 I, U" Q
}, }- h1 N; L+ g* \
else{
: j( K4 m: S1 @5 z GetExpValue(t, csym[0]);
; {7 |" |9 \8 v' U4 } t[1]=t[2];csym[0]=csym[1];csym[1]=0;
0 l7 d1 t6 e! E5 V3 t. b, o }5 ^' e8 g" G7 ~4 \) s/ h
nLevel = 1;
8 r8 `' c) X& c* C t/ D2 j" C }/ N$ I5 H- w, m8 @ _# n# w
else istrin.clear();/ Q$ z) r6 \. D% s! r
}. H d1 m5 a( d# w
else{nERR = -1; break;}3 D4 b8 x* [- m' \- d$ e* W
}% n' M& X' M* |4 e
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 i: g5 ^$ M4 C else nReturn=GetExpValue(t, csym[0]);
, C3 T$ Y( o- J. S. j) o, n1 J return nERR==-1?1:0;
# G$ [% W& ?. T$ X9 h3 S% U; W- e" F7 q}}
( p, P" A8 L! U- Y/ L( i. `* Q# w; a( W6 V+ J) A- g5 p. }
0 m- p' J7 r% A: |) R
# Z4 s0 L- w! F函数模板使用示例:; A( D9 X c1 s3 u, t& ^
在以上那段代码的后面加上以下代码:
& _. H4 X8 h1 ^3 j! a5 b7 a& `( V2 a& D
( m8 A' g4 n( S2 K9 ~
! L4 G6 l+ T) x7 O$ A程序代码:
# _7 a+ L* i. _! q
7 ^0 D/ {" t2 _#include<strstream> C7 d# a- _0 [* `' }/ `3 [( n
#include<iostream>
% `0 R: C8 n% }#include<string>
/ R d+ v4 Y D2 w/ H% J' k1 t5 ?using namespace std;$ G# T# @/ b/ t' {, j7 T1 c k( O
int main(void)
; e5 V* Y; V! `' L5 Y: V{2 y# @1 O$ q$ y4 P8 _
string s1;1 ]3 r7 J7 e8 f' K# [& Y
while(cin>>s1)* ~- v, a0 ?3 [0 X; p7 f( [* R7 d, Z
{3 b& N% ? j* v) J7 ]# D% l. z& j
istrstream isin(s1.data());0 e% K9 J% \- Y' t
double d; {7 P9 L+ s: h8 j7 A# }5 K
if(fy_Exp::GetExpValue(isin, d))
+ _& h' v4 `6 ~+ s {
, H* n* b' Y- Y. a& H cout<<d<<endl;( P/ p$ _, v2 Q( F3 \
}1 `" y" f6 n" y! t% _& O/ i( p
else+ _4 c S1 T) N o+ I
{
( r% i5 v- I% {& J k3 w2 C cout<<"ERROR"<<endl;* ~6 J1 s: C. S: u8 V5 Y9 [
}8 B8 `2 m8 C1 E/ Q! l5 O
}, `0 ~1 S' {, K% L# p* P
return 0;
) b! T& J9 K; F8 R+ k. P}
6 A: b( l( [8 }; y3 |& [8 Q0 V t1 f7 Y: O+ [3 \4 q2 G
' K0 g' p$ l- J+ ^
然后编译执行就可以了(*^_^*)
; @* ?& f E \+ i5 T2 p4 y其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 B9 @5 K* Z. O. s7 b" j1 S
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|