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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,+ ]5 j, v7 J/ k: U5 J R
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式2 x0 u& P9 E# s- K" c" v5 F
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 W. C, n6 ]( k5 A) \参数解释:
1 V) Z9 F- V* d& `' listrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" H4 b% O- B7 MnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
; @. N( Q& @+ l6 I返回值:3 X) }. A$ I6 r8 s3 x& o: i
返回非0表示计算成功,0表示计算失败有错误" c1 U" r' r9 v( g
$ s: l, Q1 j; m/ i/ r2 l: W8 p7 P , v3 v9 B, ~; P* d- N. j9 k8 q4 L
, q" b8 ]! B8 u8 l7 [6 p
程序代码: 5 n$ ]. p# @1 m7 z6 u3 E
" w% E- e( p" o( E( P
namespace fy_Exp{
$ M9 b; s2 z' U2 u* `6 N, Gnamespace {template <class _T>% t, o' e+ l+ {- q9 ]4 g
inline _T GetExpValue(_T t[], char& csym){
) J% _# s; p% Y3 B* o char c=csym; csym=0;
' \0 W' H! i' _/ ~# y% x& C switch(c){& T* y- r2 u, N1 I6 \; Q0 s
case '+':return t[0] += t[1];4 T! e' }* ^& D" Z# _
case '-':return t[0] -= t[1];) N5 v8 p' X2 S1 J
case '*':return t[0] *= t[1];% ~3 W9 f) D# G3 U# o7 X/ Q/ R: z
default: return t[0] /= t[1];//case '/':
0 [& X3 z8 F3 k1 C2 V1 g# F: } }
- C- X6 ?, v9 W/ ~1 E}}' C( a) x/ O( X1 v. g0 V1 e; G, Y
template <class _T, class _Tstream>
" s2 y. B! H: c7 [/* _Tstream: inputstream, _T: get return value
' F1 d3 E) x. g \* Return nonzero if get value successfully */
& h) O7 D. C5 Eint GetExpValue(_Tstream& istrin, _T& nReturn){
2 q: L3 T/ V: z2 \- q _T t[3] = {0}; //雨中飞燕之作
% v7 g" q2 E; F char csym[3] = "++";5 j; j1 ^3 ]# e& L0 U. |
int nLevel = 1, nERR = 0;
2 L( e5 y: U1 D. X& G6 r' B' d if(!(istrin>>t[1]))istrin.clear();$ @! h( i+ V4 z6 j; {# x* U" r
for(;;){) e! `- z- z8 w$ E" `0 i8 m, \
if(istrin>>csym[2]){
) P( a9 N F- A" A) [+ V1 x switch(csym[2]){2 ^1 p* e, z, j1 o) m2 f) U. K
case '(':+ z8 `, I- v7 G3 G a+ m* e5 k
if(!csym[1]){nLevel=0x100; nERR=1;}else8 e f5 y6 P+ w( w) D
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# {0 Q- \: V1 C$ r
else{nLevel=0x100; nERR=1;}4 e: T! i3 F2 D7 Q* q* S
break;
, ~& R0 q- J. x1 |* B case ')':( I. E3 }- d. {7 C/ Z4 Z0 l
{nLevel = 0x100;}break;
2 W, H5 b5 H3 j( m7 u+ C case '+':case '-':case '*':case '/':8 E3 i# P) E% {6 J8 @) O$ Q. e
{csym[nLevel++] = csym[2];}break;
# V( o6 `3 x7 a" d6 ?; D' b5 ?2 T case ' ':case '\r':case '\n':case '\t':continue;
, p, t1 N3 _" E! j5 J r default:
1 n- i( S6 [" O/ Z4 g {nLevel=0x100; nERR=1;}
! z0 @0 ]8 Z5 b; R7 Z- x' O }- H( m. n8 K% z' E) y* c
if(nLevel==0x100)break;
4 p. ^/ t4 c1 K+ c( S5 X8 H& n if(nLevel&0x10 || istrin>>t[2]){
0 l( s# g6 A/ t) P V* E, I nLevel &= 0xF;; M# p+ Z1 Z: O+ q% E! @
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
/ a) T# L% i, X; p; P7 Z. {5 F if(csym[1]=='*'||csym[1]=='/'){1 x. r$ S( ^" z8 o$ V# `
GetExpValue(t+1, csym[1]);+ P: ]3 n( O+ e
} S( |% {* s+ I `: s7 I
else{
! }$ z% L( n: ~$ Z GetExpValue(t, csym[0]);1 s! ]2 a/ }' X% I& b9 X
t[1]=t[2];csym[0]=csym[1];csym[1]=0;% U& q: u- ~( K* i6 Q8 i
}
5 b' F9 ?, d+ F# ?/ B nLevel = 1;4 I. s# i$ t( k S& w
}* b& Q! Y& t' C3 A1 D
else istrin.clear();& `8 D1 j- G* o( V2 q- n
}
6 q" |! D+ f2 q& f4 Q) [/ N else{nERR = -1; break;} t, c$ x% T1 ^
}
5 D2 ?$ l; k7 E/ M4 B# P if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 \9 B ~4 x+ O. C4 G$ \ else nReturn=GetExpValue(t, csym[0]);
; D1 h" g7 E9 t return nERR==-1?1:0;4 X; I0 R3 I( `; Q, o
}}8 q" \) A* |& y( ]0 ?# e4 Y$ J0 V
4 F5 j* Y& T# j3 q, ?1 M) ]4 j y- h
" [: Z5 b' h; C4 D5 v函数模板使用示例:
2 { U$ ~8 j5 t1 w. L7 a# p }0 v& _2 I在以上那段代码的后面加上以下代码:5 }3 h- f6 q2 {7 X* H
% c g# @3 S6 t: Q$ \, }2 l' W* F
, {0 O2 z3 D$ f; L* q
" t4 s% u, X4 x- x程序代码: 3 v% v# r6 {4 D: d4 ]( B$ q- j7 B1 s F
" ]6 [7 v5 q! P: {3 X' C7 y# ?
#include<strstream>
& v) ~2 k0 v. K( W9 x#include<iostream>3 c# ]4 N5 ]% s$ b
#include<string>
( t" P- S% J8 \# i! a6 cusing namespace std;
* r# z J' \6 U5 c8 _( `& }) tint main(void)- I$ ?$ m( z c
{
* R* A' Z h0 M% w9 v string s1;. u& m! }- n- t" f1 M
while(cin>>s1); T7 w K9 C, |. f n% R5 [- \
{
+ L, Y: L- N) H% ^- a- [ istrstream isin(s1.data());
9 ~) i9 _+ E/ i( U; m# |- b double d;
5 Q5 G' o. V) P6 F+ r; |1 f if(fy_Exp::GetExpValue(isin, d))
! `0 L7 w& u! U, H- c {
- c8 o2 Q* K1 g9 Q cout<<d<<endl;
1 M$ b2 X) a1 K4 C/ O }
2 U* Q& W/ u7 C0 O$ n. e* D; ^ else. E! c" R3 u. A( W: b1 w
{
: i5 ]7 n5 C6 r* I$ t cout<<"ERROR"<<endl;
* C1 A! x9 Z3 y! C8 ^/ g! l }
: C, ]4 O! v) p8 U2 @6 X0 T8 R }
3 o% x. n! @2 o! S$ m return 0;
) S0 e( c; m5 }2 ]3 D% p6 h3 S}
& A# D0 f: g) _3 O$ O8 _1 H4 p' d% }0 R7 M1 W
; N' v! A) @' ` R+ p' z然后编译执行就可以了(*^_^*)% T7 U3 F; ~, T# u Y
其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 o6 `4 t' `" x/ m. F
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|