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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
) l b+ p3 {, O+ Z* V一个很方便的函数模板,可以并且只可以计算含括号的四则表达式: ?1 ]+ {- U5 N# G7 o2 G
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)0 c4 h) j* f5 I/ x7 B# T$ C
参数解释:% u1 [' a; T5 J" o
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! m& }5 a' Z/ r1 ^, _2 ?9 w
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! c- P- D. c% K3 t2 E+ J( A返回值:
( u* N% D9 D. z3 E返回非0表示计算成功,0表示计算失败有错误
* z: l: K( A0 s% D9 c. z9 y
! W8 z {1 X' Z5 N ! X8 s' N7 U1 i' ?2 Q' ~
! L4 u. r. v! @) U) N8 N
程序代码: , E9 Y" ~, J8 `# _ m
! [4 }" u {1 H8 w" G6 D' A+ a" W
namespace fy_Exp{
- J& M( E& i- e) A- F8 k# \# inamespace {template <class _T>
0 c) J2 _3 D# ~0 a/ V1 l" zinline _T GetExpValue(_T t[], char& csym){% B" v6 I ^* |$ F: V6 \
char c=csym; csym=0;
9 ~$ R; t( u$ L0 J7 D+ F. m switch(c){3 x7 e+ Q9 m& N8 h4 |% Y( _! y
case '+':return t[0] += t[1];" o+ T! }! i0 T0 |5 v( y) `
case '-':return t[0] -= t[1];
: R9 O4 w6 v- i3 y% t5 a case '*':return t[0] *= t[1];
( O p7 a+ Q! [/ I5 E: f+ h default: return t[0] /= t[1];//case '/':$ Z! k5 A- H1 J/ U( ~- C
}- E; q5 E* v! R3 B
}}" t* p! h, u- e& }
template <class _T, class _Tstream>
5 ~0 o7 f% T9 q9 j y5 U# J/* _Tstream: inputstream, _T: get return value
. H" ^& T! ~& J& g& @& `# W7 `* Return nonzero if get value successfully */
0 W6 l0 q/ b$ ]& X2 P: [/ Yint GetExpValue(_Tstream& istrin, _T& nReturn){
' f3 b9 Q! w: m6 s% ?3 @ _T t[3] = {0}; //雨中飞燕之作: }: A3 F' z( r* z8 t3 n# `' i
char csym[3] = "++";
3 K' ?/ i9 D1 } int nLevel = 1, nERR = 0;
3 l2 v8 u4 z! \8 h if(!(istrin>>t[1]))istrin.clear();1 q( \9 Y/ V( w N$ p- u
for(;;){
2 h# q2 R: m3 H, |3 a/ } if(istrin>>csym[2]){
5 G. P! c6 J- `) m switch(csym[2]){
) r$ w4 x( x3 A6 d case '(':
) X, L/ T, @7 q; z4 R9 q if(!csym[1]){nLevel=0x100; nERR=1;}else
7 F% s4 `+ ^' y# K$ t4 M! T- T* m) W if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! F) ?$ V( q+ U& G
else{nLevel=0x100; nERR=1;}' m3 n' v7 y# v
break;
0 f& g! ]% I' C: X } case ')':. t' c3 G8 X, I; }0 ^
{nLevel = 0x100;}break;/ X& T4 Z+ |3 d* v4 {; P( N9 i
case '+':case '-':case '*':case '/':5 T) R; ?, W+ R0 C( X
{csym[nLevel++] = csym[2];}break;% R% S' E* l! P( p
case ' ':case '\r':case '\n':case '\t':continue;
$ W- O( R: W* o; x default:
# w, J& ]" Z2 r2 B/ ^! x3 s' T- v, f/ J" n3 J {nLevel=0x100; nERR=1;}" q; w8 h/ [1 m+ l7 q
}. ]* C: {" F) W
if(nLevel==0x100)break;
8 v% {' E% C. e J if(nLevel&0x10 || istrin>>t[2]){
/ i, m9 e6 g7 O# L. N1 ~ nLevel &= 0xF;
9 t4 O5 L& e+ G if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& W+ S& v' q( O3 _/ p9 n/ i if(csym[1]=='*'||csym[1]=='/'){
6 ?0 l9 R; d3 P6 C& k5 T! y1 f GetExpValue(t+1, csym[1]);
' c1 }8 J+ {% d$ K# W( [! R }% b" R+ g# U9 [$ q% L3 G' k. L" ?
else{
- V% ?8 T, h! C; [. c8 N GetExpValue(t, csym[0]);& m9 q" J: D Q' y0 E
t[1]=t[2];csym[0]=csym[1];csym[1]=0;! O. g+ h8 J: A! ]+ [. Y) }4 f
}
8 q$ }8 U% c! d; u nLevel = 1;" k" L& T3 E0 }8 E% q a c+ j
}& C; k A, d0 ]0 R7 A% `3 ~* }
else istrin.clear();* W$ w: Y, N) u& W9 N) N C) Z' u# e
}
; Y$ o8 m4 k* O) d7 L9 Y, X' D else{nERR = -1; break;}
! O% v8 S# T, e, o }4 ~/ t: f, X( I! C. T
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);' ?/ u/ y* E1 k3 a* N
else nReturn=GetExpValue(t, csym[0]);
: H: F+ `" d* |, | return nERR==-1?1:0;
( o( ~, C5 m& X1 e( b}}: c6 T3 k6 U. o% @! D
( @% q; d5 m6 t5 K* g
, U2 M/ Y4 l6 R, \5 s
3 J# F, U3 v7 c6 Y0 y" D# b函数模板使用示例:2 g5 s8 N$ m: A
在以上那段代码的后面加上以下代码:
' ~ b$ A7 S, R9 z* u; r1 ]; P5 k$ D1 q( Z0 c9 @% | y: c6 z
1 C# ]6 `) e8 G7 c& l6 f$ s9 B0 `; ]. i$ v: a! y3 S- `
程序代码: % N! q0 m' X T2 M2 G7 b+ h, f ?
% f2 |; G7 ~/ n* j ]#include<strstream>* Q6 @& S: W5 G: r7 y) L. z
#include<iostream>! s4 C6 P( D" S2 u2 Q
#include<string>
9 Z9 s u% d. h8 U9 \0 _using namespace std;1 ?& K$ w o+ ]8 l: H( v
int main(void)
, F6 t, {, g8 o4 C7 k7 i{) H0 B0 t1 N& d1 L+ T }
string s1;( S9 c3 V' X% O5 X; k, X
while(cin>>s1)
9 Y4 a4 X) g+ C, ` N {
( t7 _* } b- n/ X2 `6 p, \ istrstream isin(s1.data());
5 n. W. @ ]9 [) ]! i double d;$ M$ G# f j# {& Z
if(fy_Exp::GetExpValue(isin, d))
( U/ I! I. W* W' j {5 e- E0 p1 i, k2 Y
cout<<d<<endl;
8 \1 I: Z5 ~/ m6 B: P/ r }5 z" h4 b, o% l4 m3 T/ n" O \# R3 m
else
# M* q# D: ?# j9 y {
$ S" ^* k5 `9 L3 `9 W cout<<"ERROR"<<endl;. @1 X" r, ^: F' Z: ^
}
& M1 N' k- O1 j* D2 k1 S9 Y) v; ? }2 j4 _$ d+ ~) f3 d) {
return 0;
1 z. _1 t) \/ m T$ a}
% ^# g+ j: x0 |! L! n8 x l, t! a
6 j, x2 u8 _$ q+ D! B2 s. L* m% b+ K
然后编译执行就可以了(*^_^*)0 z4 U. x6 K( i% K- ^2 @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译1 R% t; @( f. D3 ]2 q' \" L/ Y
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|