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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
$ X2 p( Q6 y- U+ l t: }# [, f+ {" o一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 F* {& @, X. F: p: {( ]6 p只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% Q+ C! x) M" r4 W" N参数解释:
' l q0 R. m: ?5 y/ s8 {istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ q& d* q, E. g% V8 L! `nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定& r8 e( a7 B: z' g
返回值:
0 d3 J& ~( S$ w* [" X Z返回非0表示计算成功,0表示计算失败有错误
' K) m8 m$ e5 \. [ D3 Z5 T7 ]2 A8 K, `2 }
! \0 V5 c/ @; c5 J
2 B$ a2 |% N/ {程序代码:
+ h, x; }" Y) o) f) \2 S+ R, A1 r! ^" ]- |
namespace fy_Exp{0 L2 q. {$ A" t& {% X% X
namespace {template <class _T>
8 s# d6 K9 E# i9 b) D! @3 t0 T7 Finline _T GetExpValue(_T t[], char& csym){
3 Y& j! W4 S5 ?( q char c=csym; csym=0;
) x' r; h5 J; ?/ ?8 F1 a switch(c){
+ V% b; U6 k$ M8 M5 v9 T case '+':return t[0] += t[1];
0 h4 K: G* A4 Q* U2 W case '-':return t[0] -= t[1];
8 F3 X- s' g" z+ h/ @' }9 J case '*':return t[0] *= t[1];
; z2 o c, V9 \( A default: return t[0] /= t[1];//case '/':
& D1 ` }: `( P0 D$ j4 Q }
: J' l8 o" K8 A}}! z3 _5 Q- x* [7 O* g6 C8 w3 J
template <class _T, class _Tstream>
' X( q8 E+ [( m, a/* _Tstream: inputstream, _T: get return value2 ]7 |3 q* {+ v# b2 @
* Return nonzero if get value successfully */
5 p) |( t. v; G# [8 f& ?; o9 {int GetExpValue(_Tstream& istrin, _T& nReturn){
0 j8 O+ p0 E3 w0 b8 E _T t[3] = {0}; //雨中飞燕之作1 m2 P: m \) d, n7 j* }/ k& H& M6 b: Y
char csym[3] = "++";
" ?' T T. N4 c* u2 N: x int nLevel = 1, nERR = 0;% j5 ^4 W: G5 R% H2 k; a4 n) X* O
if(!(istrin>>t[1]))istrin.clear();
8 }5 r. l4 \+ b for(;;){
* h( Z0 N, u% p/ u5 ~" j5 D if(istrin>>csym[2]){
! Y, D! c: q# {: i switch(csym[2]){
$ A# J0 v' H' f; @2 y* b5 _* R1 O case '(':
/ {' n/ r' _9 f2 t2 B" N+ [, h if(!csym[1]){nLevel=0x100; nERR=1;}else
$ ?& K8 V4 Z' O: M: T5 p/ G$ l" |& h if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 ]" S7 s9 o) a- o
else{nLevel=0x100; nERR=1;}
7 j5 A& B$ G) U2 {, Y break;
- u9 Y7 r; G3 L3 ^( D1 r+ }5 Q8 l case ')':
% \4 V" h: L4 d4 c {nLevel = 0x100;}break;8 X! K* }/ k0 Q3 L5 w
case '+':case '-':case '*':case '/':
1 f3 z& z: f4 j/ A {csym[nLevel++] = csym[2];}break;
& d+ w5 O7 i# o9 }' s case ' ':case '\r':case '\n':case '\t':continue;3 p( a5 B6 R9 s
default:( e9 _' G: c+ ^, p1 {
{nLevel=0x100; nERR=1;}; N4 N: D1 u0 G4 ?
}! w5 k+ T( P( {" @
if(nLevel==0x100)break;/ ]8 Y1 K9 K! B2 Q. }
if(nLevel&0x10 || istrin>>t[2]){% I. J% r: a4 U$ u- {( C$ l% h: t1 h" Y7 M
nLevel &= 0xF;9 \! L B7 t" b4 D
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& \& y5 v/ O+ i) a2 d
if(csym[1]=='*'||csym[1]=='/'){
% S0 k' k, O2 { GetExpValue(t+1, csym[1]);+ w( S3 F- b7 P
}) O8 w" d# Z3 i, l5 `- X: b
else{! u- q' G' k# e8 A
GetExpValue(t, csym[0]);
& |2 r8 H4 h/ ]; R8 m t[1]=t[2];csym[0]=csym[1];csym[1]=0;& Z1 j3 \# ]9 d9 y4 G* Y. [
}
/ {7 M" R/ w# g: t nLevel = 1;
. m0 t% q$ O K }
* @% e. ^& @/ I0 A+ `7 @ else istrin.clear();2 }8 @0 n9 |% p& K5 b5 R, l
}
6 C' {9 M( c& Q9 O6 r1 @ else{nERR = -1; break;}
# M" |- y" a9 `7 G6 Y }! y1 e: Z% t0 U+ x! H
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: f1 \$ d: h$ J6 h4 p- f6 a; {
else nReturn=GetExpValue(t, csym[0]);
9 `# ~$ E, |3 r: E% A9 S9 W return nERR==-1?1:0;
4 [/ {' e, r. _* z- O}}, ~, u; i9 W9 V1 U o1 w6 O) x* a
9 G/ m4 f0 S7 V1 s! C
1 |, w! m1 K/ {) b. ?: C: Q- p
/ C$ K1 f! l: r& L) A8 R$ C
函数模板使用示例:6 H1 f; E# r0 J2 k5 U! f; ^% r, v
在以上那段代码的后面加上以下代码:
/ Z' n+ n. C- u/ T
5 x- T+ Q$ R8 ` 8 r" H+ K" p1 ^/ A/ N- ^# T+ k5 `# P
% @6 p6 D, ?4 Y1 k8 L& T1 H+ w
程序代码:
0 l, D K! y' K, u* Z/ E6 J9 @( k! O* b! t6 U3 z8 F, k6 w
#include<strstream>2 v+ a3 ~* S) d+ `4 s! U
#include<iostream>
/ ~5 w% o- h: x+ X; b, W2 `6 V# I) ]#include<string>$ Q' D/ N. V! ?
using namespace std;
2 d( t: c3 y9 ^, y* t9 Yint main(void)- A, r) o5 \ O
{
3 N5 m1 X7 G# Y8 @7 V7 v string s1;8 [; n1 q8 P. X, n3 X8 ^6 [
while(cin>>s1), x% x+ X) S, j* Z/ H4 o. P
{% ?; b; w) T7 V5 W9 O* y
istrstream isin(s1.data());
1 y; h! v. B5 t6 l+ y double d;' Y5 [/ M( B' W
if(fy_Exp::GetExpValue(isin, d))
4 h1 c! I( K% T+ a" D {
& i2 _) s& C O3 V6 s% C f! M cout<<d<<endl;
' f" C$ n: T( g5 t) g( N }
+ s; y0 g* o0 h% ~8 n/ U* I else g7 m/ L7 [3 z5 a0 a1 ?
{
% B' i! t& X; k7 K9 `) q# q. b0 I* { cout<<"ERROR"<<endl; _' S* f5 j2 Q$ F- ]- p: h( j( |
}
8 V+ @) X1 h+ ?8 o }
0 k. |! @% w/ W+ { return 0;
4 R0 w9 F. J: K) H6 W/ v% {}
; i1 p8 |8 ?* ?! g& f$ |
8 b) _6 r' _( a& ~8 V) Z1 N1 P i; W( U& E
然后编译执行就可以了(*^_^*)
) V3 D5 X0 a5 E: u6 v4 M9 x. W其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 E( s5 m1 b3 Z8 N+ G5 W! ?5 z
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|