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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,2 I2 x$ ]& c. \* u) M
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" k5 s7 ?7 n6 {5 _4 Q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 B1 j1 `2 B1 J! }
参数解释:3 C5 \5 k& v# y5 Q) q3 v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# ]0 B% f& y3 J/ O4 y4 p& m8 vnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 I9 L( N" @8 V9 H1 _4 B
返回值:
8 c+ ?3 C: X& b# O# e- p8 o返回非0表示计算成功,0表示计算失败有错误
7 K7 u! b& `4 c, {
# P- u) q: i; w% J$ A1 f! A- R
4 D0 @+ ?) t9 a) g& q5 R7 c4 ^4 Q1 \. Y& l
程序代码:
7 _+ h4 A) ]% T3 L: d0 N. G$ Q$ h5 E$ ~3 E7 R. @) V
namespace fy_Exp{
: h! z7 A, B& I9 Qnamespace {template <class _T>5 n i8 M8 ]3 h- M$ b: r
inline _T GetExpValue(_T t[], char& csym){6 z' R% L+ k5 ^: _1 O
char c=csym; csym=0;
' |* t% n) Z2 a' {, V switch(c){
$ k- x. Z3 k2 @2 B8 N% b; C/ X' r: q case '+':return t[0] += t[1];2 Y7 @& N' ]1 ?/ w
case '-':return t[0] -= t[1];
2 k8 [! w$ Q' G' T case '*':return t[0] *= t[1];9 `- Z) ~1 L1 S
default: return t[0] /= t[1];//case '/':
; i) V& L8 F+ O& L1 E/ M2 ~ }
6 C: E" g. i0 L3 D8 Z0 Q}}
0 A# j* ~5 a b2 Htemplate <class _T, class _Tstream>* D6 x. W) Q0 Q# U( R( E
/* _Tstream: inputstream, _T: get return value
6 o1 Q* Y& t6 D. ^* r% y+ j* Return nonzero if get value successfully */+ B5 E6 J; t+ n0 N6 x. w
int GetExpValue(_Tstream& istrin, _T& nReturn){
+ Y$ u/ W$ t, d, i2 M5 L _T t[3] = {0}; //雨中飞燕之作
! I! @5 d3 X" q# l4 s" g m char csym[3] = "++";7 n% L/ T+ b% G `
int nLevel = 1, nERR = 0;
4 U% B# D/ D! |* g. y if(!(istrin>>t[1]))istrin.clear();* U# D, D% A! O% c S! Q; S
for(;;){! ^' c% O, [- W* h5 L
if(istrin>>csym[2]){5 k Y0 \' R5 |& F# w; G
switch(csym[2]){& |) [0 F% c x7 [% J' k2 Y
case '(':. K- k6 @' }9 ], V" w" T7 O8 ?
if(!csym[1]){nLevel=0x100; nERR=1;}else3 K% C( Z" u b
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
% D% Y7 P" W$ E* B else{nLevel=0x100; nERR=1;}
1 U5 @# `/ q2 {: \ g U break;
+ I' ^* W4 Z4 w4 [7 ^ case ')':( Q" E8 [+ L; `( q9 L2 l; X+ B
{nLevel = 0x100;}break;
, [* _6 x( I# x) b" I5 K9 j3 K case '+':case '-':case '*':case '/':
2 K* e8 X/ j) e. r8 ~6 L: _ {csym[nLevel++] = csym[2];}break;
$ S7 s7 `% O6 A* t) [* p case ' ':case '\r':case '\n':case '\t':continue;) }& K# l, _& U* n: S+ H
default:
7 h! ^3 d! E. u( d' Z) v {nLevel=0x100; nERR=1;}
^$ {( H c. z+ y }
* k# l$ e5 l5 y& F3 t+ L% @ if(nLevel==0x100)break;( b0 Z5 z+ }! y& k: e
if(nLevel&0x10 || istrin>>t[2]){
0 F! A# u$ Q! b# q0 v* z nLevel &= 0xF;
& I1 Y# S4 e5 { if(nLevel==1){t[1]=t[2];csym[1]=0;continue;} P( E2 s: Y4 B \2 v- q
if(csym[1]=='*'||csym[1]=='/'){
% h. Q4 o4 m# s GetExpValue(t+1, csym[1]);
2 X6 U2 m- a+ F6 |. r }
( t, Q0 t7 S9 m+ m9 |8 ~+ S# t else{* B( E* R1 L$ l5 @
GetExpValue(t, csym[0]);
. Q* A8 ~, I- F- r; { t[1]=t[2];csym[0]=csym[1];csym[1]=0;
) y! R' P% m7 u4 K }
: x. U$ M% W/ d- o* B nLevel = 1;
4 \- E3 h. O: f h) N }
1 K$ r- \( g# d; y- M1 O5 v s else istrin.clear();
" w' e! M. P9 H o }
" {! H. G/ j4 _' X0 l6 u else{nERR = -1; break;}
0 a3 B4 t: B6 k. Y" o R& n }2 R- a x' M5 ` m7 e1 V6 J3 _
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
3 \7 {! |$ e3 b! L' D else nReturn=GetExpValue(t, csym[0]);
& @ o( L* M: y; n1 V( ] return nERR==-1?1:0;
+ @: U4 G2 q; L" g% U) }}}
( K7 K9 ]% H( m! U( |9 w
; M6 V3 L& t+ ~2 V2 r* x8 ^% ^. G, j
3 e& x; b. W, J( A3 X! Q函数模板使用示例:
5 N9 p8 A+ `* p/ }- O在以上那段代码的后面加上以下代码:
! [4 z# L+ H6 Z; y
" Y( u" N: k) z4 n/ P! T( t& ]
' u X8 M" N* e6 G+ T
6 J% o4 l% G0 v, l, U6 F* W程序代码:
* S# `( U$ s& [) X) \) P; f6 B" s/ H3 W" |9 I+ ^
#include<strstream>
- C- g# w: v8 x! R#include<iostream>8 d( ?; \0 M2 o9 _1 m2 {5 w! K( \
#include<string>
) p) a) \; ^8 U7 x' u6 ?* O1 [using namespace std;
% h5 a2 Y; g# H# M- xint main(void), n6 [7 y6 _" y8 m- B9 U
{, t* B l% w" a+ h( |: Y
string s1;0 ^8 u6 V% W3 z' W! n$ q4 O& J8 Q
while(cin>>s1)+ a: w! _0 f: s7 U
{
( [( z, N4 f- r5 y istrstream isin(s1.data());6 f2 O% m, \, R. p" q2 o& u
double d;/ y, a0 c# H4 _0 }1 Y4 C3 g
if(fy_Exp::GetExpValue(isin, d))
0 n9 ~' Q( I3 [5 R/ g7 j/ N2 I {
8 E2 g' w/ o0 u- y3 l1 N( y W cout<<d<<endl;
( \. c0 z+ p& i8 p! p% i/ i }
# ^9 |2 q2 N/ s7 O6 g; j else
3 g. O B3 |3 l, S8 E$ c7 s {& a: l3 h7 O' B; A3 ]
cout<<"ERROR"<<endl;; Q# i3 k$ ?5 I$ z
}0 o" v% Y0 I2 p5 c) c7 R9 h
}1 x9 I. v; a8 R7 o' d
return 0;6 Z5 [- [$ P% @& L4 j h
}
! M+ X% v$ `, \/ p0 h
' t. B. C7 A E) ?7 {* V( p
$ C$ d f: ? v- ^* @然后编译执行就可以了(*^_^*)/ f5 @& z s, K
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; @ B# C$ T7 y7 I9 r2 E" R2 ^ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|