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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,' N9 D: s* R2 q7 X8 j- h6 I, |
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: C* R( M9 T r. U* J: U只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 U6 a8 j# F, T w/ ?/ i4 L v参数解释:0 f4 `, s: ?. f+ D' V/ f" P
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流& T( I( K3 V* y2 ^8 I- n0 d' }" `8 u
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 j. _: r- i, _& c4 h, o返回值:; i+ a' y x$ F4 v* |! L: G
返回非0表示计算成功,0表示计算失败有错误
4 w. U8 s1 a1 j: k0 Q) c a/ v) c1 b* @! I; x
; [" F% h: w3 w ]! M* j
" b0 X3 G! B! k: A1 h5 ]程序代码:
' D8 `: W$ l" l# c# D [6 p' n, I4 Z% E6 D
namespace fy_Exp{
' h9 @. Q% [, w: u M! vnamespace {template <class _T>
^3 r# N5 Z* ~& ?, T( w, kinline _T GetExpValue(_T t[], char& csym){
$ B' A; k, _+ j/ \! P9 g9 a char c=csym; csym=0;! T* z9 a' [; p$ V1 Y* v& A
switch(c){. ?! n: C+ l! K; ?. }
case '+':return t[0] += t[1];
, k5 h# \6 ?1 _- s case '-':return t[0] -= t[1];
7 D9 o. s6 w* ?& P case '*':return t[0] *= t[1];4 D, C' b$ a! u" ]9 g
default: return t[0] /= t[1];//case '/':3 X/ _" `9 g4 B! O1 c( f
}7 v' k) X X7 p0 T" c8 z
}}
- p/ F; X1 `2 P! L1 q5 C0 @template <class _T, class _Tstream>: V7 c* u" ^! _! L- o$ S
/* _Tstream: inputstream, _T: get return value3 \# W: U' e9 y+ A
* Return nonzero if get value successfully *// s) i1 n% ^% v* M( }# T
int GetExpValue(_Tstream& istrin, _T& nReturn){
0 ]4 T! |; q- O- ]5 P _T t[3] = {0}; //雨中飞燕之作- B {) F9 ^1 _ `5 Q
char csym[3] = "++";+ R$ t( \: K* K- l/ w5 m0 D; K, w
int nLevel = 1, nERR = 0;
6 H% z, y$ @, Z6 K# h. b- _ if(!(istrin>>t[1]))istrin.clear();
d) X7 }$ D1 J$ v" \4 b for(;;){
) e, I+ _& o3 g2 [- b. h1 n if(istrin>>csym[2]){
; r3 Z( i% w0 ^, y switch(csym[2]){
; U) r( f# ~5 o* b9 t* Y- @( u case '(':: B* {1 j0 q4 w, p9 b
if(!csym[1]){nLevel=0x100; nERR=1;}else2 N- M: j2 y5 ~% z! R+ V
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ E' v! u0 }0 N$ u1 V else{nLevel=0x100; nERR=1;}
3 T) r, z( f" `3 B- u( d break;; L' a. L, v- x& t
case ')':, s+ y. l+ Y. J: m1 ?. e
{nLevel = 0x100;}break;8 X V8 B" v6 h. j4 _5 y
case '+':case '-':case '*':case '/':: N6 ]: V% ]0 z: @* n% {, m& B
{csym[nLevel++] = csym[2];}break;
5 a+ |9 d ~2 @) o$ X case ' ':case '\r':case '\n':case '\t':continue;
3 ^6 O7 Z! w T0 t, T default:5 u! `7 L S# S% ~$ }
{nLevel=0x100; nERR=1;}& y# [7 E5 C: s) ^- d
}
0 F% C3 ~: t5 s4 C; O if(nLevel==0x100)break;
6 N& Q1 ^/ E8 o$ d W if(nLevel&0x10 || istrin>>t[2]){) x2 z) R, [ z. e
nLevel &= 0xF;
. q5 x0 ]( `; H if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; o8 s0 W9 }4 u3 }
if(csym[1]=='*'||csym[1]=='/'){
# ~ |8 ?1 i4 F0 I+ }' E" l GetExpValue(t+1, csym[1]);7 C( H' [5 J+ {; P& t) v( G* Z/ P
}3 `- ^/ H( p8 D
else{) C, D4 ^. t7 p& k- \
GetExpValue(t, csym[0]);' o0 `0 ?+ m: H% g" ?3 S
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" Z$ c# Y( F; H* _, }( B }! t, q8 f& p' v' v1 l* S7 m1 E' U/ o
nLevel = 1;
0 K5 f0 W2 l; T; J8 s. K7 {' u }; V/ R0 n3 G7 S+ D4 [& a/ a
else istrin.clear();" Z# P* J( [8 |# }$ b0 F
}0 r' ~% {" I* g& V: C
else{nERR = -1; break;}, C6 J. o# Q' X; p2 i1 E' B
} t$ M" S9 h4 x. o
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( ?: F/ t3 m- O8 ~6 y$ h( e else nReturn=GetExpValue(t, csym[0]);( j5 O- K+ k! a x$ w3 q
return nERR==-1?1:0;
/ }5 T0 w3 }- d' q}}$ [7 I' D5 w' u1 z& E# S/ [
" O; s$ ?% {0 j& ~0 n* X! k) I+ q
, d; N0 s& q. n2 H0 o, A# P" V* e0 {' S' H$ B: ^ x b
函数模板使用示例:5 B- E" ~. ?2 A3 k, f! z+ e7 T+ ^
在以上那段代码的后面加上以下代码:$ Q$ n: Z- J, `6 q8 b2 @* X
, Q* f9 |; }. H/ J5 D q' X- i9 @
9 ^6 @8 V3 I, q2 X2 x
. P0 B5 _# v" V+ \2 P
程序代码:
% {( F7 ^/ R5 C) w4 b0 @ k/ c, c9 v$ ]8 |
#include<strstream>
2 b0 e' F P& o9 g, U#include<iostream># P3 L- B/ [1 R3 g( }7 o7 |
#include<string>
: |! m" q" x( _1 S/ uusing namespace std; D0 q" z7 @- A- E
int main(void)
! ]* i% N3 N* {) R$ X0 w{6 o7 L; w" l t
string s1;* \/ ^; `" V6 h
while(cin>>s1)
4 b6 c4 c/ r0 g) y) h {
+ u! n7 c0 Z( I; y* W! P5 d4 i! }# o istrstream isin(s1.data());
6 [/ `* P0 s2 a7 D( N double d;6 y* @+ r1 x* Y$ }
if(fy_Exp::GetExpValue(isin, d))
2 h" E& |4 P; u5 q/ _( K5 Z. x {
$ i* z! N- h: N4 r% J cout<<d<<endl;
- M, M. M+ m) o }7 M; f5 l$ Y3 X! n" X' j+ K
else4 P/ e% N% a# ]& l8 @
{" R; y% G$ S3 d
cout<<"ERROR"<<endl;
% z" C" F! N* C* ^$ r# [ }
* o* h7 _+ n/ m. s- Y) A6 G5 Q! c }% [/ V3 j( w8 E1 t; t
return 0;
% |4 |2 q0 q. j}
7 L0 T6 \; z* l% t& ?4 m" X
/ E. f$ _* d( L6 H+ U0 H
8 U- B3 i! [' }1 q然后编译执行就可以了(*^_^*)% S, E4 [5 x' J$ i1 U5 Y; d, ?! Q3 \" O
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* v' \, u& D! q3 P+ A# i 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|