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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,; L. T4 j# q: Z$ J/ L' A0 K
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 t9 \- a$ s8 R/ i只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" m6 f7 r6 a1 l: S' C! k$ I1 [参数解释:% N' b8 F0 _$ ?) ?( R1 G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流. |- Y3 v; R# w$ \3 i1 H8 D7 }
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ B# |) M/ F5 y返回值:1 {" v9 l+ _0 \1 ?- Z
返回非0表示计算成功,0表示计算失败有错误5 p5 m: f& U- D
9 P o5 o+ x" H+ t7 B% \4 A7 O# C- P
" }; i7 z4 S- y- m3 f o! S0 z3 H
/ b. Z( }; n& o/ D程序代码: + N3 i$ z/ D+ \ y4 @$ m
, Q) z' @- m( O6 S! X) p7 D, ~
namespace fy_Exp{
w, A+ h1 G6 M8 Gnamespace {template <class _T>
9 a+ p: x0 s; P. @2 Dinline _T GetExpValue(_T t[], char& csym){
* @( I* v" ~$ v$ l4 j char c=csym; csym=0;0 \5 r0 u& p" \7 ?7 y
switch(c){) R7 `5 |+ Q8 F% b( a
case '+':return t[0] += t[1];9 R. n0 y: p0 H/ y
case '-':return t[0] -= t[1];
3 ^6 I6 {9 C/ `! |5 F$ u6 ~; e case '*':return t[0] *= t[1];
6 r; Q6 s6 ^0 u3 M$ F default: return t[0] /= t[1];//case '/':
, s6 Y, n1 K# S: Z" v }/ B6 G: O3 i0 U0 _( G* ^1 l3 y, w2 o _
}}3 E( V: z) K; Q) b O2 k
template <class _T, class _Tstream>; k P, I" e1 @( M
/* _Tstream: inputstream, _T: get return value- J k, Q8 ^/ \ l2 t1 | `
* Return nonzero if get value successfully */
1 |8 W# R+ L2 Q7 @$ Yint GetExpValue(_Tstream& istrin, _T& nReturn){
4 D% X2 y5 t' n _T t[3] = {0}; //雨中飞燕之作% z$ z+ l& h7 X* t) W) X
char csym[3] = "++";9 p% H5 F! g$ k) y
int nLevel = 1, nERR = 0;
. Q c) q5 _$ z8 S3 i- l0 X if(!(istrin>>t[1]))istrin.clear();5 W* y! y [; E8 W' B) D
for(;;){7 u9 F; ]( I+ c9 e' H" n
if(istrin>>csym[2]){- D* ~6 {3 k& f" r, }' k+ ^
switch(csym[2]){* ?7 U: f0 Y4 O3 L
case '(':
; I2 S( C. U# T if(!csym[1]){nLevel=0x100; nERR=1;}else
# ], H1 |! ~# O& G' f) Z3 t if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" L+ R8 L3 g7 D* J8 ?% G/ ?7 q
else{nLevel=0x100; nERR=1;}" y/ J- e% S, I; f. l! z1 P
break;* ?3 e) q, o0 ? |& o9 v# D; F$ Z
case ')':
- S- q/ _: D# p d- N5 \ {nLevel = 0x100;}break;( L$ R& M. T, ^* w5 h
case '+':case '-':case '*':case '/':
1 B' G; D: g4 y5 G7 G {csym[nLevel++] = csym[2];}break;2 i% _ x8 U5 X
case ' ':case '\r':case '\n':case '\t':continue;& K" X* q& T- K" s
default:
2 E: n/ X! o3 D {nLevel=0x100; nERR=1;}# o5 T: G7 l! T0 P; ]
}
4 Y* O" y& r5 B! A" N if(nLevel==0x100)break;
6 |; q7 P3 @: A* d if(nLevel&0x10 || istrin>>t[2]){! Y+ H+ `: P2 m( l; Q! l
nLevel &= 0xF;2 B( h1 [: n5 _- I( G3 {9 q
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: T/ [' [+ ~) q1 m
if(csym[1]=='*'||csym[1]=='/'){2 Z: d, _- o5 r) { N( ?- N1 a
GetExpValue(t+1, csym[1]);
' O2 L9 u$ t% i- _* p; \' _: e7 _ }
) F' j7 o5 b* S& i$ ^/ H else{0 c7 J* V, b* ]- X
GetExpValue(t, csym[0]);
& I9 x: ~ O8 ~2 K" W _! X t[1]=t[2];csym[0]=csym[1];csym[1]=0; Q1 c) {' m2 \6 p( a. C
}
" v& ]; C" m4 y' q nLevel = 1;
% ?& ?5 {2 S( Q0 ~; O }8 E9 C( O' f& S8 |7 t+ O, @- d, t
else istrin.clear();
2 `' S |! c( j }* N( _0 E$ A% s' |& \
else{nERR = -1; break;}6 Q/ Y/ n: Z0 A/ ]
}
- {: N+ J& B* r9 s3 k) L' N if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 N' R/ j" f' [0 @" M
else nReturn=GetExpValue(t, csym[0]);
5 D `: }( Q% w& W return nERR==-1?1:0;0 H7 n7 @8 N* s/ e8 C$ Y
}}
. ~) h, K0 D: K0 y: d0 W1 Z( D+ f, f& H/ \# S" t2 U; m
) H: ~2 Y5 G/ A- T2 g/ x+ x
% m& V' U, _: b0 g; _! F* S# O
函数模板使用示例:9 I, k+ ]1 a; d3 _8 ^% l
在以上那段代码的后面加上以下代码:
; C5 E; T9 j, U9 K0 U3 \7 L1 r5 y6 J! d+ l" G& A* p8 m% m
$ |; c; }9 x: b" a& h- D Z
( s( K9 M+ c. [7 N# P6 C ?9 C程序代码:
% D7 S5 i+ w; P! W: a3 ]/ k# X9 g& C6 `+ S) @6 V4 B
#include<strstream>- P1 g0 O. B: p1 u9 m. H! \ r" i8 {
#include<iostream>9 v1 V7 I: @: x5 k0 {$ e
#include<string>- G( t9 ?- x5 v6 T" G+ ?
using namespace std;
& m9 ^. \5 V. A S \# m) nint main(void)2 Q4 @. W# M- q3 O7 V4 l+ }
{$ c# o% v! I9 B, C$ C7 N1 S9 l
string s1;
9 @8 x) m% I+ K* J8 N8 ^ while(cin>>s1)1 r; ?; J2 w; Q/ R* C
{
( k+ x ]& R& }3 j- O istrstream isin(s1.data());: w V$ s) n. _$ z6 |
double d;& J3 H0 F' B5 B0 t
if(fy_Exp::GetExpValue(isin, d))
; E6 P4 a C s+ g {
. }7 ^! p' s! Q) U2 R cout<<d<<endl;
0 C' d+ z: T+ Q6 U' A* \ }
1 `0 K8 T. x. }) R' W else' m, H. }4 ? M/ D2 Z
{2 @9 K. _" v" m8 N- X# s1 _: g
cout<<"ERROR"<<endl;+ y5 ?7 u& l5 F7 m- ?
}
! l1 i3 t5 J ~ L }* d( L" r5 _5 m% f. A
return 0;
( J& J0 @% N& X. t4 p}
) b7 A, U- ]' B: b7 R Y1 l x4 G* R% @2 x% n* I
$ E# M& B* p: Z# E. I2 p% }
然后编译执行就可以了(*^_^*)
! L+ Q. s$ E( d- V4 X0 b$ ^3 D+ f5 G其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) @/ |1 h& y8 w, a, N E 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|