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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,7 r8 D& Y+ P( O) d
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, B! s' D) z8 a$ U只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 d5 ~7 W8 C1 M, [" y9 K1 `+ [
参数解释:8 C/ P8 z' ~! H- q m! S
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 T7 o2 @) p! S' c7 s
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* d" w, f6 i; {" a/ \ N返回值:1 c4 \7 ^' b9 u5 `
返回非0表示计算成功,0表示计算失败有错误* \8 c0 R8 V3 c+ j! p& M [* l
E3 \0 H5 V% V/ W0 Y5 i
# y# s- B& a/ Y6 w. r4 I' K7 W4 X) f8 E4 k4 ~; w, x
程序代码: k, F8 I1 d# r, z' t% u
: f5 ]) i" \3 M6 I1 N# V# G
namespace fy_Exp{" o( `4 {( x0 p+ z5 ^
namespace {template <class _T>
9 c# a$ A% P% `8 l0 oinline _T GetExpValue(_T t[], char& csym){
$ v# W5 F, x$ J. Y char c=csym; csym=0;3 _! g) q9 o, A h; [5 H
switch(c){
/ C, Q2 L- C) o/ ~2 N case '+':return t[0] += t[1];
4 z* a, G, e2 m% ` case '-':return t[0] -= t[1];
1 U! d: f, n4 z0 d# ] case '*':return t[0] *= t[1]; v6 V( C2 s2 ^' z9 ?, S: G: i
default: return t[0] /= t[1];//case '/':' o6 |. V- t" d
}
% y- J% e% i6 v1 `( n}}9 \4 o; n5 Y3 F' a0 L% s
template <class _T, class _Tstream>: a! @( q1 s/ j. J' m
/* _Tstream: inputstream, _T: get return value( C& o8 V' f* w
* Return nonzero if get value successfully */
" q8 V& Z" i0 w' `& r) ~( Iint GetExpValue(_Tstream& istrin, _T& nReturn){- A- J. @/ }9 v0 ]3 B5 k/ t( i6 |! }
_T t[3] = {0}; //雨中飞燕之作
- F8 [$ V) Y% L char csym[3] = "++";
% s) \2 h0 j4 Z2 G! \3 { int nLevel = 1, nERR = 0;& u5 F( K2 k6 {3 C& t( I# w5 C
if(!(istrin>>t[1]))istrin.clear();
2 |. D* D: B1 M+ J, o* {( U; N for(;;){3 R7 w6 A$ ~+ E4 g5 v
if(istrin>>csym[2]){
# v' o8 Z6 }5 M' ]" A switch(csym[2]){& U* ^( B6 `" f! c8 C' G+ |
case '(':8 ]2 {6 ?9 E- u. n
if(!csym[1]){nLevel=0x100; nERR=1;}else
6 L4 a' `9 P' i8 A' f- } if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" W4 Y0 q y6 U) V( M
else{nLevel=0x100; nERR=1;}% Q! q5 D; J! @( [
break;$ s0 d" n$ ~9 r ^4 P" U# L
case ')':
( Z( `: u3 `7 V, I {nLevel = 0x100;}break;
; p' v+ P u# z3 o/ F case '+':case '-':case '*':case '/':2 ~6 K5 b6 V9 P$ Z5 c S' h& o) `
{csym[nLevel++] = csym[2];}break;) G: U$ \' z9 d' y8 i
case ' ':case '\r':case '\n':case '\t':continue;2 [& J" q* P1 `0 A( [) ?$ _& A8 {
default:
4 \5 c, t( R6 \# X% R2 K {nLevel=0x100; nERR=1;}
5 p, b& L& I' w2 r& I- Z9 g }$ L) H( q; O. y% `, x y, Z7 Q
if(nLevel==0x100)break;/ w4 @7 C4 U; T( w4 }
if(nLevel&0x10 || istrin>>t[2]){
, [3 ~( m' N" E& f: A, V nLevel &= 0xF;
; ?5 _ u/ i& D X c# ~8 K if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! \% V. K( I3 e8 l if(csym[1]=='*'||csym[1]=='/'){
2 _+ b! ?" m3 K* b( R h \9 s GetExpValue(t+1, csym[1]);
$ s4 G- _" c$ a# H0 w9 A M6 Y) a }
5 [$ d7 p, d6 b( j9 T) _! T else{
+ @. A" C" i# e7 R! T7 }; ]) h GetExpValue(t, csym[0]);
0 _& c! g# E+ x: s# ] t[1]=t[2];csym[0]=csym[1];csym[1]=0;* R C' v( u7 ?: J
}3 Z( s: D" q% n: k3 P3 g1 R/ ]
nLevel = 1;
! X( v9 c# E! V. E* \, s- e }5 M4 t8 x+ J. e
else istrin.clear();
$ f, q0 g2 U" p& a5 I2 ~ }
. Y# f* v0 S8 b3 @3 j1 O else{nERR = -1; break;}
" D+ x3 Z" r. I( E$ N }
! \0 H! p5 A. s* |2 n* ?5 w if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
3 e: H4 R- T. e1 h* r2 m else nReturn=GetExpValue(t, csym[0]);
+ Y7 y! w' k9 g0 L1 ]. [ return nERR==-1?1:0;
% z0 U e: a F+ ~2 {}}
4 w3 ^1 Y4 Q1 y8 Y: q s& U9 M4 V r
/ K5 O7 |/ K' A& ~9 {; t
6 ^2 G! B7 c" N. F0 S* D' F函数模板使用示例:8 r( d. H1 g5 h% R& t1 J# }& T5 O
在以上那段代码的后面加上以下代码:: i5 c: {% ^: J X' L
9 f$ b, {) {7 k( t2 ~. G6 } 2 n& s' [$ H& p' c/ O" e4 L% L/ \ D, N
: y7 |. O. m7 T5 s# D程序代码: # u! s( U3 e/ C, T( J+ h8 ~
! x" [5 F g* @8 }5 }; r# P, L#include<strstream>2 z1 h/ H/ I. e3 m
#include<iostream>4 d3 h; ? ]7 N- R t- |
#include<string>
9 I* r8 [" P$ g( ~- G" B9 }7 Nusing namespace std;) R U1 W# y4 a4 D
int main(void). m: r& E3 P1 O( T7 r
{# z1 A, S0 K9 }+ J) F
string s1;
: m% o) w1 e7 }) c# V6 E while(cin>>s1)! u% i4 z& C! P! t, ]" g
{+ P2 _8 ^1 i3 d+ K
istrstream isin(s1.data());# g! f x# q; e7 X$ h( y
double d;
) n7 S3 x8 x+ `$ C6 O9 l if(fy_Exp::GetExpValue(isin, d))
2 A* t! l+ P, n, W. \ {+ p4 n A {8 m7 d
cout<<d<<endl;; H' B, P" _; Q3 K: R ]
}
0 Y6 `* q z8 i2 b. I else
! H8 l$ Q, }1 N2 { {
# v: y3 y7 U% Z8 R cout<<"ERROR"<<endl;% Q0 m( F8 i# H* B
}) \. [. y+ M F* E* K, a% U/ Y7 T
}
/ `5 t1 I9 P: n: h, u$ h( c" d return 0;
6 l, d0 Y! L: k# O" Y7 j$ _5 G: {}
% O4 P4 Z, E) L; R9 F) c/ S5 @! X( f2 i6 Y: o" p. T4 w# T
# ^( H! I; a+ g1 K$ k
然后编译执行就可以了(*^_^*)
4 D' u8 P8 O8 {! G! s8 D其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 D$ q9 F% R+ u, S
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|