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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
% J- y( [1 D; y5 Q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 A* ?2 L- ]. Z; Q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 w% F( l$ @) a H* H参数解释:! S) _ p6 H+ B- f
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" @% W& e/ C; w7 V* cnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. F3 M6 n! ^( ?4 B
返回值:$ S! k7 o% Y7 y1 E: _
返回非0表示计算成功,0表示计算失败有错误
8 ~9 G& T- }0 V7 P
% `, a% k/ U# [- V( A4 e, A- k
) b2 q4 @+ E) ?3 J9 j* X* j
3 J% P! W% C' m1 z( V程序代码:
7 ~ @2 y/ V6 m6 O" j1 E9 D. k) g' m- H {: u
namespace fy_Exp{
1 d* W0 ^: e6 Y4 }namespace {template <class _T>3 f3 j2 x; F0 C
inline _T GetExpValue(_T t[], char& csym){
+ ]/ s# n# k! Q: n, ] char c=csym; csym=0;. Z1 l) Q2 Z* s9 e! r
switch(c){+ c* |) _; w4 n
case '+':return t[0] += t[1];
$ r) m: M5 S- \# `7 E case '-':return t[0] -= t[1];5 k: F: `2 ]2 N9 E9 y
case '*':return t[0] *= t[1];" S, k6 I7 N# I: o
default: return t[0] /= t[1];//case '/':
( ?! ]: L4 w1 E" J4 u. _; i5 Q: ^ }
: W, Y* D7 m* t( W* h. _5 e}}5 ^ k; Q& F4 v/ K
template <class _T, class _Tstream>; G( r8 d5 {( M# ^) m& ^
/* _Tstream: inputstream, _T: get return value/ o, @; C4 m+ n: {/ |, L3 W0 {
* Return nonzero if get value successfully */
9 q) f; B8 n( X; g6 b# l3 yint GetExpValue(_Tstream& istrin, _T& nReturn){3 J. [4 x0 J3 C( V# Q
_T t[3] = {0}; //雨中飞燕之作: Q* t, Y/ o. E: L: O
char csym[3] = "++";& D3 A1 w: {5 j( h' j
int nLevel = 1, nERR = 0;' ^( K8 D& j5 a* m' [- L
if(!(istrin>>t[1]))istrin.clear();& V) R6 C+ j! }6 Y6 I( S3 {5 L5 b$ h
for(;;){& ]9 H: K' V* A8 K
if(istrin>>csym[2]){
" u9 B, u! s) ^. |8 r2 s switch(csym[2]){
4 E# W0 I6 ]9 N2 n9 ? case '(':* j% |1 }' }) y9 [
if(!csym[1]){nLevel=0x100; nERR=1;}else( u6 ?0 N$ G7 i$ V! _
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 `- X7 g: ?: W6 z7 E# U- p
else{nLevel=0x100; nERR=1;}
* v' T- a2 J9 |, I% o# i+ ~ break;" l0 M. g: G2 p* O5 y2 V$ d
case ')':
7 t$ Q/ u" n: q. } {nLevel = 0x100;}break;
+ L7 W1 [2 M! A, l case '+':case '-':case '*':case '/':0 t$ u0 z0 P3 i' y3 q# J/ f
{csym[nLevel++] = csym[2];}break;+ e' e* A* ]! ~0 A3 Y4 E9 E
case ' ':case '\r':case '\n':case '\t':continue;+ w2 i# ^* Z, h$ v/ M
default:7 P+ p, h% [% s5 R, d
{nLevel=0x100; nERR=1;}
+ _8 L, w3 C( z6 X7 W% O }
* ?) Q$ l1 G. A+ E% w if(nLevel==0x100)break;0 F2 `. [( W( P6 f
if(nLevel&0x10 || istrin>>t[2]){
6 p/ v% X+ O7 I( m' H/ y" S& B nLevel &= 0xF;
! x: _+ D' k2 U3 f* z if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: i7 V0 ]" u3 w
if(csym[1]=='*'||csym[1]=='/'){7 z0 m& o3 `- z5 r- ^0 j; F' Q, K
GetExpValue(t+1, csym[1]);7 s7 Q4 q. V6 _5 p
}
1 Z' e4 U' @9 Y& N. f else{5 K( ~; H M; x
GetExpValue(t, csym[0]);
V& g. h5 V! W& x4 J# u2 X t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 |9 u. v& u! V G3 ^
}' B1 @. V( d+ n. @& n
nLevel = 1;
, _3 J( M& r9 Q1 d$ j7 y: N' _ }
h* u, A# N: @4 D9 Z; N else istrin.clear();
) E+ R7 m. ~8 C) k }
: S$ z. }, n( e! m$ K) n else{nERR = -1; break;}* }. I: u3 Z9 v! q; }$ [* |
}
; Q7 c3 J8 e, u: v/ A y; B$ @ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: L% T; X( M7 f% C, n$ l
else nReturn=GetExpValue(t, csym[0]);9 e4 m8 w1 ]; a& b) I: x( j; U8 @
return nERR==-1?1:0;
/ _* R& G' V9 ^( R4 E+ i/ V& m- U}}
2 a; ~% a, R8 v$ D, l; Q& @
2 V: p, e# O- ]% T3 h! @" b. \$ s0 M0 _
* v2 n X9 j( X3 v4 {函数模板使用示例:7 M. {$ R5 ^& n) l( Q! R) U0 v
在以上那段代码的后面加上以下代码:
* B: h/ L6 g2 U6 W3 @% r) l6 f! D6 i% ^6 F1 T% X; ?5 t
Q7 T; X1 l' \0 q& i
+ s6 R! a8 _+ W$ F, d4 Z& W
程序代码:
8 A8 f; k) _$ _, Z; l; _
+ {3 N7 e( j0 x: O, [. D$ u" r#include<strstream>, [) o2 w' v: ]: a1 c2 G+ |0 A0 C8 y. q
#include<iostream>
9 b2 t- ?; R _% | Z4 g#include<string> F, P" u8 K4 {+ c% i9 @5 p/ @9 h( U
using namespace std;' @% I: Q$ R& O5 {# ]* @
int main(void)3 n1 d) j" p) G! T" O
{
) }9 K7 M! m& s3 ^ string s1;9 {. s. r% m2 ]- O: ^
while(cin>>s1)
: ^( M; G3 h' l4 P+ b {
1 D9 M8 J2 h5 k) l istrstream isin(s1.data());
; V# {8 i$ A0 } double d;
7 a& p9 \+ j) R4 Z" G; c if(fy_Exp::GetExpValue(isin, d))
, G* u7 P9 ~/ |) i {
: z) ?( w* d5 W. I" K, [ cout<<d<<endl;, y7 M' h) l0 M( r! t: |
}% Q9 [& y* R( x. N g
else2 L" E- w! r8 y: R
{7 `. F& ~/ S1 s5 b
cout<<"ERROR"<<endl;
q! ]+ C* o) d4 v }
! X! h" o% u e1 X7 K }
; k$ N' t( q4 n6 z1 j return 0;3 \2 X% \# t5 [7 q# v
}7 c2 X+ z& L7 p/ Z! M# R
1 Z- t1 |6 S) r# R% p$ n' G; [
9 H$ T* R- B& Y' z% ^8 D
然后编译执行就可以了(*^_^*)* s( s7 S/ _0 q ^
其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 b' z8 ~2 z/ T0 D
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|