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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
0 Z8 Z; p4 o5 o9 P1 v% S一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
7 ^: g4 ?" n0 y% e1 ]只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( T& M6 r. S! p! |0 ^! g8 q
参数解释:$ z. ~ A r( O4 n' A1 N' `2 N$ y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" c+ ?- @8 v2 B% o( s7 p3 ?2 YnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 g: D# ^' V5 [返回值:
1 e% |; L! m- v" q4 A返回非0表示计算成功,0表示计算失败有错误
& F# g |; r) X- {% Q
1 o+ U+ u. h- |: O ) A$ i' r2 R' @" O8 S; h* r! V- }
0 u8 M+ x' d) ^' i9 W
程序代码:
: Q" ^, K) v; x: h, k- V( {
& P7 |/ O, Q% u% t& Nnamespace fy_Exp{
+ s' Y* {( A5 n% }) E: Inamespace {template <class _T>9 j5 L9 s- A- N, ]" F- Z
inline _T GetExpValue(_T t[], char& csym){
7 D+ a3 ` d; S* P char c=csym; csym=0;2 C5 ?- f! {2 x- F, a3 G
switch(c){& M' Z L8 l3 M* E7 V
case '+':return t[0] += t[1];
( E; A6 d" \# C case '-':return t[0] -= t[1];% t2 [4 S: w+ X! k. ~' o) U( O* P$ C
case '*':return t[0] *= t[1];% u1 S B: L% L2 a7 ^: n' d
default: return t[0] /= t[1];//case '/':
1 O0 ?$ R& q0 |/ ? }& B2 o* a) S8 y4 y+ L6 t
}}+ B# k8 c& z6 {5 W
template <class _T, class _Tstream>
5 ~/ W d0 a9 |; M% d7 R; p/* _Tstream: inputstream, _T: get return value
8 j/ e) I h) R) O. p1 ~* Return nonzero if get value successfully */
0 l: @2 D: f6 m bint GetExpValue(_Tstream& istrin, _T& nReturn){
) D* H B# z# \+ z. P6 q7 } _T t[3] = {0}; //雨中飞燕之作
5 G$ U, ]0 r- N8 _" Z( u2 t char csym[3] = "++";
+ G+ }( E& v W [8 B4 P int nLevel = 1, nERR = 0;5 P, l9 u' P- |) o: s/ f; H5 Z; |
if(!(istrin>>t[1]))istrin.clear();
' k/ Q6 n; O+ P0 m0 a& N2 @' d for(;;){2 l( H( X7 M8 L( r/ ?
if(istrin>>csym[2]){/ ^' {9 `/ L+ z# x- e
switch(csym[2]){
6 `* Y' V/ w- j( s: R9 E case '(':7 M1 F+ G% f5 [! c+ M7 g- t
if(!csym[1]){nLevel=0x100; nERR=1;}else
" E: a" H8 e' x8 ?+ C if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- G8 k- Y3 U- T7 p, T
else{nLevel=0x100; nERR=1;}
' y/ F* u) L. K5 O break;
. b* O: H/ s' V Q case ')':
8 ]- h- q+ W2 B% R6 G0 b m; V {nLevel = 0x100;}break;& ]& R" B0 H8 h3 Q' |6 p3 k
case '+':case '-':case '*':case '/':' X& v- G) @: } g4 l
{csym[nLevel++] = csym[2];}break;5 v8 @ J! z& }. ^& \
case ' ':case '\r':case '\n':case '\t':continue;
. c" e( n' U- u default:( o: ]/ C0 O6 Y! f6 o5 i: S
{nLevel=0x100; nERR=1;}1 r9 q! c& L. C# g _) w
}
$ T$ w ?& c! Q/ d* M" l if(nLevel==0x100)break;8 y& Q8 v+ Q6 H! h
if(nLevel&0x10 || istrin>>t[2]){
$ P' a: M& L0 M' \ nLevel &= 0xF;
3 s) {: v5 @' x @ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: I4 l) v5 L. `8 L, b7 f+ C if(csym[1]=='*'||csym[1]=='/'){( B' Z0 `/ @/ k& H- D* G) {, o" a
GetExpValue(t+1, csym[1]);
; C* j" L3 B! ^4 ]8 P- q }
+ d T1 j' _4 o0 _ else{
0 Q0 ~- I. A6 ~$ p( j GetExpValue(t, csym[0]);- J6 [; p8 m/ `* E5 m; _/ |" u
t[1]=t[2];csym[0]=csym[1];csym[1]=0;# |7 T( v8 p5 Y# ?, d
}
4 n; P( ^) J/ k0 M! }) @ nLevel = 1;
; X3 o. f2 z/ a3 w" X }
4 v& |# H5 R- u- T' I: t1 \# T9 } else istrin.clear();( e8 K3 F8 r1 E* L
}
9 M! W0 {4 N. C else{nERR = -1; break;}
2 x3 u; {' S2 P }
7 N$ i7 ]& V3 W$ N; F2 K if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);* ]' u9 E% v" N+ U
else nReturn=GetExpValue(t, csym[0]);2 A$ F# g% [! A8 V( k1 g
return nERR==-1?1:0;
( ?& K# V; C% K: D}}
9 d0 J; I. ]7 D1 t
$ r( z1 Z, P, ~: o. d& m3 B, k. f+ h" R5 Q1 m$ q; P
' e- o1 R& Y# ^. o2 C
函数模板使用示例: |5 J$ B" n" w' M3 Z0 O
在以上那段代码的后面加上以下代码:
7 q6 Z. Z7 R% g( H$ C, F- a4 r& m* F6 Q" j. P& B7 f( o9 z7 `% F
+ r+ S9 h; ~% T% |! Z7 Q4 g
+ t$ h3 n" |2 `! s' V* C2 A
程序代码:
- I6 R8 t1 M. p$ o- }" ~/ Q" p8 [- F3 V2 g" X1 L* d7 q) P% g+ s, c
#include<strstream>
5 `8 w8 C0 O; Q U#include<iostream>
1 I6 D* n+ O1 p- o+ _7 H+ R8 P#include<string>
- O, O/ ]7 |, z5 j$ O! i: ?+ dusing namespace std;
2 W; K) _! ~: ]! Bint main(void)
( F; d; U& n# e% R0 J{
. u5 c4 r7 @3 [' u# I string s1;
+ F2 Y/ E/ l; D4 H5 w @ while(cin>>s1)! }: i7 v( X d7 D# T; V
{
3 C: `5 a" M' f, e/ i! F8 |* p istrstream isin(s1.data());, a5 q. `+ n. q9 e; E
double d;; Y/ n; G( F3 ^5 `: p
if(fy_Exp::GetExpValue(isin, d))9 b! E* Y, d7 M0 T. E
{" b" r. z3 h( w7 V* q
cout<<d<<endl;
: s+ F. q5 Q3 y+ z$ z }, k1 B3 c# t2 E: n
else
9 T1 X0 z+ c; a) }9 d& m {
) [) q W; e6 f7 ]' u4 A cout<<"ERROR"<<endl;; M1 B2 y+ i$ Q( `" s+ b
}
7 F" e4 g' x: G2 r1 m }( G! q/ r0 x- d7 K8 t
return 0;5 @: ^: e3 A, x! g6 [$ H
}
( |+ _* S0 g$ U4 h% f: t j9 c( @0 x; c
n1 Y# u% x4 r0 [' U4 w. s1 b, X
然后编译执行就可以了(*^_^*)
. m* g% D8 m% N# }+ i, C) |其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( ~& h' Z4 _0 n: l8 y 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|