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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,+ D2 ^1 N6 v8 u# i) \% r( ^( b' _% l4 }
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 y0 v; ^+ {) D) U0 j% X1 C
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ L9 U% B1 T% A: C( R参数解释:8 J( |' m7 o+ t" Y) }8 o, {
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 h2 U( @6 c& d* R; znReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
1 m! U! k2 y) R9 }1 \返回值:" H$ c- d( r$ r( d1 E" n
返回非0表示计算成功,0表示计算失败有错误0 D% v, e, L1 t0 G' X* o, f# O
! H4 j% {, I2 ~8 g9 a3 ?
; i4 c# k: O6 Q* j% w! x8 }$ \% N5 _3 g. o, Z" V0 g! \) ~
程序代码:
/ j- q; m! n: j9 [/ W- m g' D9 D p k: H" b8 z+ S s- q3 E
namespace fy_Exp{; h: b: L B0 n4 e
namespace {template <class _T>
& U; Y( m2 p8 T2 V# @- n# kinline _T GetExpValue(_T t[], char& csym){
. \7 U) i+ n! Z* O J& c char c=csym; csym=0;
! A( w# o0 [# O$ h0 I! F5 y switch(c){, a" Y, U7 _/ B& Y
case '+':return t[0] += t[1];2 V$ y+ F1 P; y0 S5 v
case '-':return t[0] -= t[1];5 e: J$ V( d$ \8 ^/ r
case '*':return t[0] *= t[1];. R. i- @, ~$ g7 x
default: return t[0] /= t[1];//case '/':$ c/ v2 c" r8 D: L
}% O* W! S( s" s" Y, F
}}9 |( _- c" c: W) E' ?' B
template <class _T, class _Tstream>
! c6 p) U s8 }6 W2 L8 @: k3 h$ U9 G2 |/* _Tstream: inputstream, _T: get return value
8 {1 B; P8 K( F) N& x* Return nonzero if get value successfully */
X0 N5 l% f4 j9 C& bint GetExpValue(_Tstream& istrin, _T& nReturn){6 B3 `0 a. t- z l5 A
_T t[3] = {0}; //雨中飞燕之作1 W7 t( c& {' ^# Y5 u% ]/ ^- r
char csym[3] = "++";
- M! [/ n; P0 b* e. d, ]. }* E, @ int nLevel = 1, nERR = 0;
6 E4 w5 x: A8 _) X" `" J4 U4 `1 w% ~# @ if(!(istrin>>t[1]))istrin.clear();
" @) w( m) B& n" T for(;;){8 p* i' \+ C2 L
if(istrin>>csym[2]){& j+ i* m2 D/ B: L4 `
switch(csym[2]){
& @* d' H: m5 f; F case '(':% y0 X0 X, T! w
if(!csym[1]){nLevel=0x100; nERR=1;}else5 ^" y% d0 `$ ~0 T1 R9 e& s
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 u; E* D6 `2 s9 s+ }4 n0 |
else{nLevel=0x100; nERR=1;}* _! f* W+ y5 i
break;
7 R* d, M4 K2 a* ?' V, f( B case ')':
8 s# A0 b1 Q4 E {nLevel = 0x100;}break;$ _# w! u% R1 E9 D5 k9 O, W) u
case '+':case '-':case '*':case '/':" v8 q. n, L( Q3 R/ s# d `& @& p2 o5 _
{csym[nLevel++] = csym[2];}break;
/ D1 K8 G+ O- Y case ' ':case '\r':case '\n':case '\t':continue;( C7 C4 ~" R6 s
default:
9 k7 k( i& H7 H9 }) o {nLevel=0x100; nERR=1;}
+ {% [' X3 W. w7 T }
* \. V7 ~8 U9 A, z0 I& a if(nLevel==0x100)break;
0 D4 L( K Z1 n+ m5 @ if(nLevel&0x10 || istrin>>t[2]){6 ?# j; A, n. H' F
nLevel &= 0xF;
5 r/ b; G& {$ R8 O9 f if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. E, [! U6 x8 ^ b7 C if(csym[1]=='*'||csym[1]=='/'){
2 \. s% S' G! J6 k9 r5 x GetExpValue(t+1, csym[1]);2 i/ M4 |$ R F
}6 d" z7 ]9 g$ ~4 i
else{" N' @' z. u: a4 u2 \* w
GetExpValue(t, csym[0]);) o% r% `6 ]' {5 ?' l
t[1]=t[2];csym[0]=csym[1];csym[1]=0;, g+ J- G* M0 s. E" d
}1 _: v) Q2 ~# {: a
nLevel = 1;
2 {5 ^4 V$ t% L% u }
; a8 G @$ a+ n, d% b8 ~" v9 T else istrin.clear();6 L; [& l( R( ?1 ]% O. `
}
/ ?$ M. N$ j" p: r9 Q$ [% P else{nERR = -1; break;}
6 V! w; }2 X( V; S2 P2 W+ W }
5 }, _* [9 {1 D3 O4 t if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 a% ]) d& E. s/ s' I9 J
else nReturn=GetExpValue(t, csym[0]);& P3 W+ U( Y* i
return nERR==-1?1:0;- i! g" M6 H: l9 n; ~ U
}}
. g g/ Q; p% x, g. q
. r3 s& J" R' W" s; U
3 w4 q# c. s. ~: P1 _: N
* ]( [5 v0 s- O+ x, Q2 y, Z函数模板使用示例:
" n% @. s$ ~3 H7 ~* x( `2 u: o3 j在以上那段代码的后面加上以下代码:
0 i) b1 D# Q, x3 U: Q7 z* G" Z i4 U) f+ x$ f' N2 N
9 A( Y! }$ i( ~5 ], Z; k8 ^
8 y8 x8 m& a% |) }: \. C" x: {
程序代码: 4 K( @/ A! S9 L/ F6 x4 w$ X
+ p# c4 I& a3 y
#include<strstream>
+ H8 a# b7 J3 n/ L8 ]#include<iostream>
% I$ x/ @- b' n9 j#include<string>( i" j; @9 u2 {0 @; g
using namespace std;
1 g4 f; R- c2 y6 |6 vint main(void)* O, z* x: T9 ~; L
{
: Z6 T5 A, {( b9 Y6 G& N string s1;
3 |9 y3 S" X" F K6 G while(cin>>s1). r' L" z8 d! s" J9 l' H9 k
{
$ ]' K3 J0 x, D% V6 R- z1 e istrstream isin(s1.data());1 x+ T0 L \ Q8 ]; A
double d;% p6 A( i9 Z! L
if(fy_Exp::GetExpValue(isin, d))8 _ H( L7 u" j
{
5 D% B% z, X( U+ @" P; A: } cout<<d<<endl;
# E, ^1 F0 r9 u7 P3 B5 g0 M1 [ }' k; w/ o. Q' V, D& ^; V
else- I4 U4 T O$ l _$ t! \
{
/ Y6 \) C0 L0 X% W/ Z- T1 S cout<<"ERROR"<<endl;, `9 Q! B# | a' m8 n/ V
}
4 u0 Q9 \+ C& |/ C }
. ]8 x' {& x9 r y# p: _7 j return 0;% b: w5 ]: S# ^; K" U$ r. N5 ]
}) R8 Q1 Q) P1 Q/ X- j
4 ^( K' m6 v# {6 \9 s
. j& j$ V# \5 l/ o然后编译执行就可以了(*^_^*)
. S* i2 ~9 \, }+ v& S其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 F2 [9 e V4 A% W
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|