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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,7 k: j$ z2 d9 c% M
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 E" `% T/ A- A3 h6 U只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 r2 ]: U3 E, n参数解释:
. d( I r4 T2 b1 \ tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- `6 K9 k7 l& q/ x( M* M! o- {nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
X) B/ P* v+ R" w0 a- ]5 [: q8 r( Y返回值:7 F+ @/ D, m- x+ [
返回非0表示计算成功,0表示计算失败有错误
1 A- G' S- O G7 f% V& T
) w4 q% ^9 h* z1 I- E 6 E$ `1 Y+ o/ ^- P; \7 q
# y7 h! T; V/ P+ {程序代码: % c3 L: a6 S# r: i+ s
1 _7 ?7 E7 E w! Knamespace fy_Exp{
" u4 P T2 y% G/ Z+ g3 c) K4 Snamespace {template <class _T>' L( v% P8 x+ l9 K6 \8 Y
inline _T GetExpValue(_T t[], char& csym){1 V6 w7 l- D) \0 a
char c=csym; csym=0;
5 \$ s) R e6 z$ ]% f7 e5 T6 o4 K switch(c){$ B* n' C$ w/ o# E" |4 _
case '+':return t[0] += t[1];5 u- O) z6 V9 r3 w" {' A3 ]' S
case '-':return t[0] -= t[1];+ r7 L# p- f( b0 }. E
case '*':return t[0] *= t[1];
: ^& A6 O$ @" D5 k8 M _9 c9 t( F default: return t[0] /= t[1];//case '/':
. d j5 ^# j3 w5 b }
( C- a6 I/ a1 X}}
. c+ q) K+ O" ktemplate <class _T, class _Tstream>
( Z+ F+ s8 h5 n/ I/ y/* _Tstream: inputstream, _T: get return value" P: U, W% \0 P: }
* Return nonzero if get value successfully */
( T) v* E% k$ q3 q! eint GetExpValue(_Tstream& istrin, _T& nReturn){- h$ i' R3 K& H. S- R5 d H
_T t[3] = {0}; //雨中飞燕之作9 {$ o9 l. v1 ~5 I/ [
char csym[3] = "++";, j' G* {% `$ [+ i6 P( O# O
int nLevel = 1, nERR = 0;
# m5 r+ d+ B" N/ M8 n2 c- @ if(!(istrin>>t[1]))istrin.clear();
" S7 k( A# x! [ for(;;){
! w6 E& f4 K" |& s+ j& _8 F" b) O if(istrin>>csym[2]){
, p$ `; ~# f; V' @6 y switch(csym[2]){
# i7 n* A9 Z- J. u case '(':
& Q+ o! g) v" u( g" ] if(!csym[1]){nLevel=0x100; nERR=1;}else
& {+ U7 e6 R8 n! k. ~6 r if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 c6 y3 h5 i R4 V7 K
else{nLevel=0x100; nERR=1;}
8 I7 c& K" z0 i6 I+ ]2 w break;
0 b9 [3 y& Z% I0 N* a5 }& T( d. Q2 L% F case ')':
; u2 B8 ^1 n+ k5 B- r {nLevel = 0x100;}break;% ]" j* S+ U0 M3 T, F1 O* P
case '+':case '-':case '*':case '/':
2 ^' e8 s5 I `' o# y {csym[nLevel++] = csym[2];}break;" B( G/ c; Z' @
case ' ':case '\r':case '\n':case '\t':continue;" [" j# l$ |' a+ |. W9 g
default:5 F* K0 U6 l) Z" A3 ` w6 l: p( l
{nLevel=0x100; nERR=1;}
$ ^& q. {4 @. E6 Z) ] }
+ Q) l: N% e7 g* p9 z$ s if(nLevel==0x100)break;, W% L% O) S- N9 z3 R8 q! `
if(nLevel&0x10 || istrin>>t[2]){+ z8 z2 O7 N5 h" Z% ]' y
nLevel &= 0xF;
1 R. S9 A$ `; S6 @( x if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! p1 c F( J# n0 b( U7 Q if(csym[1]=='*'||csym[1]=='/'){! c: Z! u' O3 u5 l
GetExpValue(t+1, csym[1]);/ o3 }+ x( b& D p; k4 Y
}+ {9 p; J; Q9 \' A5 M
else{
! z% G9 x: [7 d+ P A8 q0 u GetExpValue(t, csym[0]); ?+ J4 o7 ?! ]' E; h
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& ^+ _2 S5 n/ K2 Z }+ |$ { R4 A+ M0 x! @5 V2 o5 G) k
nLevel = 1;
5 `9 d9 |9 G! `, F, y- J }
4 l* Q6 ?- @8 Y& u: [7 ^ else istrin.clear();
9 x8 @1 t( M: G# { }
0 O. @* _7 r% R5 r: D4 X" ~+ ]1 o else{nERR = -1; break;}
7 E; h4 V/ A7 b+ d" G2 x( i7 G }
+ m3 ^' z. @( G8 Q) v; A if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
\+ V0 x& u# L" o. v* S# k7 c else nReturn=GetExpValue(t, csym[0]);
( e0 y6 k9 F8 z) k: S3 ` return nERR==-1?1:0;
7 b& |' }6 R' t' H) v( N. e}}
! b' {& i3 p' g' B
' c9 S4 R, d/ b2 L4 K9 l( w4 |2 [! T4 D. ?* H- T# E8 L
3 L4 A/ X+ o; ?4 O5 h函数模板使用示例:) f1 H, _) P' c5 O9 \" b- K, m
在以上那段代码的后面加上以下代码: o+ c9 ^" e l* [
% E# G* {1 N0 o# E0 e6 L, Q
3 k) _+ |0 }, L4 R6 ^& H7 o0 E& p
9 Q' | I0 |& \9 y程序代码: . p5 x( w1 K5 d% w
- e" |& Y% {3 b. D& a- x#include<strstream>( R' |; U, o/ j6 j; e2 x
#include<iostream>9 ~ P" z) s( K; b8 {$ B, s2 L
#include<string>
" k( A# g8 x! q7 k& [8 C! Vusing namespace std;1 m" C0 I7 {5 z) z4 `" g2 e% e
int main(void)0 ~$ n% k ~6 C" e2 M
{: m J" d7 ^1 t" P
string s1;7 o. y5 ]0 M/ F) ^9 q4 D/ f
while(cin>>s1)
3 t! N, u8 i$ U/ W; k$ w3 M: @. Y {
5 ^2 a9 r* K- N: e# t istrstream isin(s1.data());
! H; k( g" S* F double d;
3 y @8 R: o8 l if(fy_Exp::GetExpValue(isin, d)). F/ O, [5 j, ~$ m
{
# `8 J& A6 o, p cout<<d<<endl;) D. K( ]8 j6 p
}; T( k& x) c! I6 G
else9 c. i- ^; y( J9 h& O, D
{* S' k4 B/ Z! n
cout<<"ERROR"<<endl;" Y n7 v% L& S- g# v7 K8 g2 k7 n+ q$ c
}, z3 h" \6 g2 F- S: a: t$ M
}
Q b9 j5 K/ w; x# H J3 B W3 m return 0;0 J$ L1 [& r" B8 y
}8 A8 {$ r @! v# a+ O& n( _1 }+ K
' L }9 \# l- V
7 W- U$ ~' C; z然后编译执行就可以了(*^_^*)$ q( O1 y! Z% u; K P+ X: q
其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 C& C/ n2 x9 ~
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|