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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,+ s+ C' L. b3 Y% |
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& a$ a. l1 u% B7 N
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 V! h2 W4 \3 b
参数解释:3 Z( L3 v. V) X; s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( G7 P6 ], l. _" I/ m+ |5 v7 PnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" j! M- R2 X$ _- R/ R返回值:
1 b9 t' K5 W! ~0 x: x返回非0表示计算成功,0表示计算失败有错误
1 @ {% P+ f8 L2 w! ?+ i% ~
$ T- u* m* y4 D$ J! _; w ; }4 N$ S$ E! U4 A3 J6 @+ c! S8 G1 R
3 w7 d4 }- ~4 H) z) } k0 H9 K
程序代码:
1 Q- M3 D& `/ H ]' A3 X+ p4 k/ L; Q7 P& r+ D; ^" o/ _
namespace fy_Exp{
# ^3 r8 L& X7 v1 V1 n unamespace {template <class _T>- S1 m$ J6 r6 d1 U: X( A) k
inline _T GetExpValue(_T t[], char& csym){" G( I }5 R* O' k- c9 P9 t ?
char c=csym; csym=0;
& B X+ P5 P8 f$ y1 a* I! _# l switch(c){
) _9 e( g( K+ v; }9 {: j" o case '+':return t[0] += t[1];
: t2 A5 j. J* q3 j6 j4 q# w- a case '-':return t[0] -= t[1];
! l, `- Z( X" E3 A5 A case '*':return t[0] *= t[1];
1 H' \4 i; O4 b0 k; t. P- d default: return t[0] /= t[1];//case '/':
! ^+ g% n# e; f# a! e }
5 A: \% d, i+ x6 B: U9 E}}) g1 q8 p4 d" T) x2 C" z
template <class _T, class _Tstream>
$ r% S' S! d6 n) {! n" \/* _Tstream: inputstream, _T: get return value
3 E) t3 W" u( s! L* [4 v, [* Return nonzero if get value successfully */$ S. W7 t: N e! [
int GetExpValue(_Tstream& istrin, _T& nReturn){# I% w! D. H, {; r3 S: Y: O: z% n
_T t[3] = {0}; //雨中飞燕之作% I7 K( R9 K% m8 |" p. `4 D0 O
char csym[3] = "++";
1 e" v: @" |% S# u# j5 _: U. n! @ int nLevel = 1, nERR = 0;
1 U# g. Z$ p( D6 E- L0 ~ if(!(istrin>>t[1]))istrin.clear();. y" L) ^; V' K" O7 Q, c0 i
for(;;){
' s7 o6 B! }1 m4 o if(istrin>>csym[2]){
# z9 P$ P+ Q. `5 X% _& V" u switch(csym[2]){- _* z5 y7 a( n2 e+ ~
case '(':
! L1 I8 a: {) O, n& p# [ if(!csym[1]){nLevel=0x100; nERR=1;}else
" L/ Z( Y* \ D4 y1 h) V: v: [- L if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' _* m- }3 v# X9 r1 d0 \ q+ v else{nLevel=0x100; nERR=1;}
& U* ^! Z7 M$ {: A- v break;( N( i. z5 o5 P3 B/ E0 ]
case ')':* X1 M. K0 B/ e( Z
{nLevel = 0x100;}break;' b X, P. J l( J5 p
case '+':case '-':case '*':case '/':! b# z0 K0 b" R! m% ^- U' B
{csym[nLevel++] = csym[2];}break;6 p# P: \9 o/ C7 r
case ' ':case '\r':case '\n':case '\t':continue;
: r' m* o ]% C default:" L X) U, D H8 D# }9 a
{nLevel=0x100; nERR=1;}/ u! F, K% d T; }' V
}
0 W0 G& ?+ \+ p/ F. Z$ W if(nLevel==0x100)break;$ j+ x Z$ i9 w* k
if(nLevel&0x10 || istrin>>t[2]){
% U3 |, s/ }' Y' I9 Z9 F5 e2 K nLevel &= 0xF;
2 L" ~0 j9 w E7 ? if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 b1 x; n: L' I. t7 [
if(csym[1]=='*'||csym[1]=='/'){
/ ~: X+ H* y7 E& P* \7 H' ^ GetExpValue(t+1, csym[1]);
# q8 [& }- V S% M0 Y% @, g }
6 v& P d1 j$ |* ?! z, Z else{
4 T( c* z" N) q4 d GetExpValue(t, csym[0]);
- G% H3 \, N+ G- T+ ? t[1]=t[2];csym[0]=csym[1];csym[1]=0;
P0 H) j i# u% z! {5 K }( e7 A7 r9 J% G5 K! t
nLevel = 1;
: e7 b6 `% }5 @" Q& Q5 m1 c }, M% T( g5 S- I1 b e0 F
else istrin.clear();1 a4 K0 ?% b- `/ f, Y/ w
}
! J% p3 D+ z4 i: x( X# N& G, S' y2 \ else{nERR = -1; break;}
+ w( i: r+ v6 h" ?' ` x6 Y# B }
( z4 N8 ` N( n0 M. U; T9 n- R if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 O+ s1 Y2 h2 i* m
else nReturn=GetExpValue(t, csym[0]);
' f) h8 |, w! a: e" R0 \ return nERR==-1?1:0;5 {# W) i; @2 g& g
}}5 Y: D) R, Q$ h5 E' D
1 B* H. s" h L6 ~6 I0 \/ U. N9 [
7 l6 L9 T5 s1 Q8 K L
' k! N7 Q$ c6 v% ?1 Z$ I函数模板使用示例:) H0 o' L) k' F5 x/ z
在以上那段代码的后面加上以下代码:3 h6 g9 j+ f0 K8 h! R
6 C' e) ?) v `2 }& e( d! V ; e3 ^" S( p0 H1 L4 Y1 w4 O
; @- d/ `- g6 W程序代码: $ L4 x0 v2 f9 K1 V( }% n, S! c
/ l! A; z( o# w. V
#include<strstream>
( a0 R9 ]2 }5 Q2 {1 v" `#include<iostream>
3 ~% ^0 B: a/ l9 Y6 z#include<string>/ z8 L+ p; T( i! J3 a
using namespace std;( G0 \+ J$ `7 K* |
int main(void)1 D& K2 `6 [+ g8 x8 d
{
" j& O4 o5 z5 o( W" E1 T string s1;
# v7 c; w" Z( I; W while(cin>>s1)
! p! B( w/ Z$ h3 o) d- t8 q3 c {! B% c% O/ H7 @: A# ]9 g6 L
istrstream isin(s1.data());* K# z" v3 Y! z5 I
double d;
; t) ]/ a7 L/ b1 F6 R' v if(fy_Exp::GetExpValue(isin, d))
! w1 ~+ ~+ G2 A% P {2 V/ j* J" ?5 [0 r5 G7 o
cout<<d<<endl;
* ], B5 i, E3 n7 H+ b }; r6 w" G2 D. W# h/ P& p3 i$ a( K* w
else1 l8 n4 F2 h/ o0 N$ V
{
7 b) y. T' @1 j( Y& H! f cout<<"ERROR"<<endl;: Y; K) K1 y! z# n
}+ m# f, o9 t. {/ e% p* s
}
5 H' S+ W3 N! m% \6 K& y8 ~ return 0;
; Q! d3 |% w X- w* p}$ K+ R- g& k K, H; |) p6 H
; ~2 {) z) S$ U5 F. @5 _! g3 ?* j, j
" Q; t6 A7 G$ U) |! T& m# _! u0 f然后编译执行就可以了(*^_^*)
7 j% r1 Q$ \4 C# k2 ~- z. G其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" ~, h8 X6 ~% m/ R1 D: E X2 m7 S* v0 T 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|