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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,2 {( m1 f; G% c0 V( s& T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式. O+ ^& U2 r1 l# M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)# @% P$ Q% B- ~4 e& ~! U" n
参数解释:
) k; W; i9 e/ Aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; k0 h% }0 {5 ?9 z& G8 M7 AnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 \5 D; B) t1 `. [) t7 `
返回值:6 I. f2 ~' s5 c ]9 r) N6 \* L
返回非0表示计算成功,0表示计算失败有错误6 m6 e" G" h) w1 Y: ]
! P9 L! f @# i* ~+ T8 `; h% [6 Z: |
, y1 C: i. N" w5 O" v5 {4 j# z
' @( `; }* [1 ]6 l程序代码:
; {3 q/ @# z8 a; X- r9 j6 o6 y, f3 k/ {9 b0 }) U" M6 ?3 [
namespace fy_Exp{" y0 B: R& z( M. `! U
namespace {template <class _T>
P) L- T0 h% d' @8 [9 Uinline _T GetExpValue(_T t[], char& csym){6 `; B( L6 Y$ t3 \/ E0 ^
char c=csym; csym=0;
6 `7 z" U& q5 ], M0 C switch(c){
7 Z% g {$ u) \, ?" v9 X0 T case '+':return t[0] += t[1];
" c) u0 p' W2 R: r7 e- z( c( j4 T: C case '-':return t[0] -= t[1];
# w4 A' }# Q5 j9 a+ K case '*':return t[0] *= t[1];
0 B3 x, X) S5 L4 j. l default: return t[0] /= t[1];//case '/':" ~# C+ j; f0 w# E/ P- U3 w0 L2 d$ C
}3 |' l; h |$ r/ I- S9 `/ L
}}' T( d8 ^4 e, v% u v' t) R
template <class _T, class _Tstream>
* i% I- h9 Z Z" V; ]) y/* _Tstream: inputstream, _T: get return value
0 Z3 F# N% Q; ?- Y5 {* Return nonzero if get value successfully */1 x* |2 ~) u1 H5 K0 G6 K1 b
int GetExpValue(_Tstream& istrin, _T& nReturn){% p+ w9 ~2 ?# J: _' |
_T t[3] = {0}; //雨中飞燕之作7 J' T. R X1 V( [9 K6 o- i. x
char csym[3] = "++";
$ p' S5 C! [5 Y, l int nLevel = 1, nERR = 0;; J) {8 X5 O8 D x' p/ E
if(!(istrin>>t[1]))istrin.clear();1 n: I7 v: f" q( k( i" X' F. S
for(;;){
& x \: Q% h6 m) x5 H% e if(istrin>>csym[2]){
) `& S6 e' S) D" Q5 P0 o switch(csym[2]){, p9 V' J# @( e# l6 M' R- `( A1 B' [
case '(':
1 c3 ]2 M, G' n2 {3 B2 V if(!csym[1]){nLevel=0x100; nERR=1;}else1 a9 w& k* b0 \# f, [% C$ |4 x2 z
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( O: a, ~! r/ B
else{nLevel=0x100; nERR=1;}
' i& ^8 q) C8 e2 F break;3 z3 |5 y. r' E% S F2 O( Y( m l
case ')':5 q, `) H9 s/ S
{nLevel = 0x100;}break;
# u9 w7 ^+ M- q6 k4 f, }1 L case '+':case '-':case '*':case '/':
# y9 Z X" b V, L7 P. T {csym[nLevel++] = csym[2];}break;
0 N$ v" \& ]9 b& u8 \; F case ' ':case '\r':case '\n':case '\t':continue;
" }3 n7 R0 }- o3 ^) M0 l0 Y default:* w3 l0 k& j5 n% p
{nLevel=0x100; nERR=1;}
1 V3 o& |- {7 E4 q- X6 o* E }
2 k" |& t1 B. q6 P5 Z8 A$ v3 u8 C if(nLevel==0x100)break;
2 |( e m' v3 V, |0 H if(nLevel&0x10 || istrin>>t[2]){& k' B; v0 b7 N# U2 P9 y; I8 y
nLevel &= 0xF;
7 D, `/ `" P9 @/ |/ \$ J' @* a if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- x0 N+ m8 x# l) c8 I# h
if(csym[1]=='*'||csym[1]=='/'){
% E0 Q5 D: x/ T GetExpValue(t+1, csym[1]);" H# Z; R3 _: I. ]
}( r7 a8 S1 g7 x/ R5 F: I
else{
9 u' L5 a6 M9 f GetExpValue(t, csym[0]);
- H( z' H& H0 t3 V3 i3 X1 g; ? t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& y0 X% ?7 m. Q+ K% L2 L }
0 `: Y$ R: ^2 z. r/ | nLevel = 1;# l' f R+ z7 j+ M0 r5 p' a- H
}8 k& E( C. X* c1 O2 b3 j
else istrin.clear();
* c! U6 s; Z1 Q, q% ] U& l }) f$ I0 ?& F5 l: E; j
else{nERR = -1; break;}# y: d$ c' k$ C, z3 }7 J9 }
}
% F. w8 ?7 S+ x$ D& U if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 u9 k- `' |7 U# j& z. A8 C4 _ else nReturn=GetExpValue(t, csym[0]);! K# P! V, R" c6 G9 c a
return nERR==-1?1:0;
: Z! {* G. [% u' e ^ C3 I}}( t% }+ C v( D% N0 F
, D$ B% m( y. K# O# `# P
8 D, g2 ~/ o! G7 F
: N# d" \8 ~* @ N9 m5 @" Y: v7 H" r函数模板使用示例:
% G. |9 x5 n7 u3 Z: l! g, u# D在以上那段代码的后面加上以下代码:0 k$ V6 S- X& Y, q( v
; B2 K: f" f$ T ( o! E+ Y. @5 `( d
, N; j8 g1 P; b/ f e- h) X程序代码:
* O. Y& Q. n$ C5 V4 C' m" A6 x# ?% b2 \, }
#include<strstream>
$ x! [9 j! c! }( w9 x" t#include<iostream>
# q; T; O' T3 Y6 ~#include<string>" [& Z) W8 c7 A9 H) Y
using namespace std;
7 w. n/ H9 A( G$ |int main(void)& X! u3 J1 J' U7 j% k( h7 G
{- R! U# L& {8 z( E- L
string s1;
0 L, V" e+ L; z+ e( V! ?( ` while(cin>>s1)5 N; s+ X8 d8 J) u
{0 P' H' D! D4 ^; Q
istrstream isin(s1.data());
/ N- x5 D2 z, }* L" Y double d;
3 y# K( `7 b* W+ [( ^" t" E if(fy_Exp::GetExpValue(isin, d))! a8 ]+ F% h8 @8 m8 z
{
" Q& q. _5 V6 Z8 T4 I* ]0 P4 s cout<<d<<endl;
5 m/ W7 a9 Y. G; Q7 [% N }+ @. L' x+ [% z0 g' D8 I/ C
else$ N6 Y0 J8 w7 T
{1 z4 c. C" @5 Q `4 P
cout<<"ERROR"<<endl;
5 R: l7 g0 }, q4 L. }+ P }' p6 p/ Z& ~- h) y* r
}' B5 Q$ x; L5 O, i3 H
return 0;
1 n( E7 Q+ T9 z}# x$ ?% r7 {4 X( `
8 i5 h( `* M4 R. W+ ^ t) @; r6 ]
$ s2 L% Y. v+ }5 S
然后编译执行就可以了(*^_^*)* j+ _2 G" R/ @& M
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 e4 k O" q0 X0 i3 V 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|