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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,- m7 B2 d7 A/ j w Z/ ]
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 W0 N. [0 {1 s
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' W( t' b* I7 }. x参数解释:
. O T6 {, l2 m5 _) q, P' D$ ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( r' z( X) a( \) M! wnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定& q- X* M4 _$ r- X6 P" D2 M
返回值:
* {( M) C& z/ ?返回非0表示计算成功,0表示计算失败有错误% f+ p0 _. g* p) }7 z
# Q8 M/ ?5 a: z/ z# g 1 k7 K2 g4 t3 o+ A: P
% I8 b# h/ a' y* u! m! W& n4 n1 T7 W p程序代码:
8 C. `0 x0 {6 n( o, K1 m; D1 q) i, b: p3 V- v, b8 z6 O l# e' A
namespace fy_Exp{4 k* R; `4 {8 o! ]: Q
namespace {template <class _T>
- E8 W) X' W8 L" n$ d1 }* x6 {+ rinline _T GetExpValue(_T t[], char& csym){
" |5 x8 ?$ ]3 u6 p char c=csym; csym=0;
# [( n b& u% S4 q( Z" A3 e4 x* ` switch(c){( x0 r; {; |" S4 ?/ e
case '+':return t[0] += t[1];* Z0 p4 b+ i6 e6 h
case '-':return t[0] -= t[1];
f/ f9 U9 L, q# v case '*':return t[0] *= t[1];
' u$ y5 }4 E3 u }" ` default: return t[0] /= t[1];//case '/':# |4 W5 D7 y% t8 S, q
}6 a# v; i) @% l& c& x- z
}}
# m" Y. z% n$ X) z% U7 Z- vtemplate <class _T, class _Tstream>
( ?4 c3 V/ e* a- v' G, Z9 h+ x/* _Tstream: inputstream, _T: get return value1 }% l% f/ c) a c: B
* Return nonzero if get value successfully */
$ K! V# N: E! ]0 p1 J! C9 Nint GetExpValue(_Tstream& istrin, _T& nReturn){
7 |! {9 w* f/ z5 E) B ^7 ]- Q0 M! w- ` _T t[3] = {0}; //雨中飞燕之作
. A4 c% u1 c6 e; j8 C+ s& Y char csym[3] = "++";
) w/ ~0 B" w9 z9 k: I7 S int nLevel = 1, nERR = 0;" I4 U. g" d& g+ G6 V6 M8 x6 a
if(!(istrin>>t[1]))istrin.clear();4 g1 q {& s3 A9 B9 C. \
for(;;){
0 ~& n$ U: v# s/ {5 d" J ^' _ if(istrin>>csym[2]){# l$ f. ^; g5 ?0 r' s! O0 j
switch(csym[2]){4 [+ M8 {1 K, E/ A$ ?
case '(':
" P7 z' R! o' h, g if(!csym[1]){nLevel=0x100; nERR=1;}else3 T/ Z% u/ [" O) O! [% j. n1 N
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' `5 r/ \$ a9 J- b
else{nLevel=0x100; nERR=1;}5 k8 l/ u: E) y- }
break;5 ^ I, R& a( K
case ')': W% d% D( \; B1 T6 o! ]$ G' f2 g
{nLevel = 0x100;}break;/ ?% P& f7 A( D) k) @ c6 q! _
case '+':case '-':case '*':case '/':* V6 j* A9 x6 u/ d- k$ Q
{csym[nLevel++] = csym[2];}break;, q8 a1 x% j2 w' x
case ' ':case '\r':case '\n':case '\t':continue;
, q! {6 q. G1 a" U' S7 G6 C8 M default:
; O* R' Y! O* D! m- p z {nLevel=0x100; nERR=1;}& \) l' }; s8 B; g* g
}
& p# K0 j8 h) E9 s if(nLevel==0x100)break;+ `( a7 i* ^3 }5 y* B
if(nLevel&0x10 || istrin>>t[2]){. B) v6 @ V2 g/ W
nLevel &= 0xF;+ f" E' W+ Q( n$ q
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# m8 f# |+ J2 o' o+ R* _7 v
if(csym[1]=='*'||csym[1]=='/'){! Z! Y7 j" i* F9 O
GetExpValue(t+1, csym[1]);$ f! X' z. ]8 N+ {' F/ N9 [1 x
}
. V9 D' O) e% K& h else{1 |- L9 N: J. }. k. R8 m3 o
GetExpValue(t, csym[0]);
' x5 f" \# Y2 ?/ a t[1]=t[2];csym[0]=csym[1];csym[1]=0;. b1 ^# R+ h) l* O# A' S
}6 H% h) V! j: [0 P$ m
nLevel = 1;
" e r; y X* x a# U' b }$ H3 I# y/ N8 k( Y- @2 o
else istrin.clear();) u2 r) B1 y6 A2 k. ]
}
7 n6 C, W+ }5 u4 ~7 m else{nERR = -1; break;}
; l1 X4 c `" z- i5 L6 m }
" ^4 B9 r' }; D2 _" A8 ~ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' G, o2 o. c6 H* @9 w. O( E( L else nReturn=GetExpValue(t, csym[0]);2 M- f0 a' g' W2 X. X, k
return nERR==-1?1:0;
2 w- a" v7 R0 g$ N0 s+ A}}
1 n, `9 A9 Q, E4 z+ F5 k
5 ]' K: w) [" K2 `& A7 h L9 t. x! E, `% Y. [
' @8 ?" o) a, ` Z( f函数模板使用示例:
! s( s J6 H, b8 V. M: ] U在以上那段代码的后面加上以下代码:
R" i7 `) a* h% W F. Q8 E- q
3 b7 f0 l+ L' {! W; j! D. v + q7 q Z5 _2 Q9 a$ f0 C8 Z" w
1 r8 N) d2 _/ e程序代码:
) ?0 T! J b4 _* N! F8 c/ _" g, }+ r9 y5 a$ D2 }
#include<strstream>1 B1 f8 T/ ]- k/ |. D
#include<iostream>: ~8 ~8 j8 ^, `) Y* S! i5 g R
#include<string>
0 o* [( j- e3 W! F& susing namespace std;
/ x% `/ l! U3 k9 tint main(void) O- x6 Z8 @' l Y: M# { s* X1 h+ H
{' y6 w4 u; U( |1 m( X
string s1;. Y1 }6 i8 C3 K) M$ b2 b
while(cin>>s1)' b3 T+ e' W+ W1 x6 z: B* w
{
( }$ a# x1 J% _ istrstream isin(s1.data());, _8 f5 R& j, b* _$ g) E2 X3 q
double d;
( b' w' B" O4 O K, d if(fy_Exp::GetExpValue(isin, d))
3 o* q1 ]! N+ ` {
6 T/ c- J5 X6 g% ^ cout<<d<<endl;$ d# L2 L* H* o5 s
}
( K# ?7 X& x0 ~1 F" X* n9 P# T else& p4 f# X+ ]1 i' C
{; M$ V* k6 }0 ]% M
cout<<"ERROR"<<endl;
( _! ~5 c$ f( H& _& V4 Z }
# M0 m* M) v8 R1 ` E }
7 P9 t% N, M9 M/ g return 0;5 F/ R' g' |! |8 w D
}3 x5 S/ ?" x/ ?) T2 d
4 [( o- f' A, s6 J( U, }7 F+ s0 o. n! M; U' ]% Z
然后编译执行就可以了(*^_^*)$ U' Z1 J7 x2 I1 _1 b& A' C
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
- E# f7 A' I- Z: o5 { 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|