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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,1 t0 J8 \ _6 G% e, f" w$ a
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 d3 O8 u2 ~) q0 S' r- J( @
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 t# F1 k' N1 W) u; r$ v
参数解释:
9 P4 b- l0 Y. n" p r, H! @) J9 xistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 t8 G+ ?+ l0 h' F; p; b0 Q( z% b
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; N! r9 k- B4 r; S$ x: l' ]
返回值:
2 T8 N/ W+ K1 t0 ~& V返回非0表示计算成功,0表示计算失败有错误6 }; a9 N0 z# |
- O( c h6 U" T( @" K- C0 c * R, Y( q3 M6 U" _3 E: T
+ ~0 @$ E+ G- t" Z C" Y/ o2 O# s程序代码:
! X$ M8 b4 _- t, g( {5 p$ [9 ?# z: D) |4 M
namespace fy_Exp{
. w. U- R# U4 A, Inamespace {template <class _T>; i* M) |' L5 V2 t0 Y
inline _T GetExpValue(_T t[], char& csym){
& z7 s& F0 R. D# O char c=csym; csym=0;4 _8 g9 {$ u- d- m& [$ C6 s
switch(c){* z5 m. A% W1 e2 C9 x. \
case '+':return t[0] += t[1];1 J% d& {- x" Q) e& X* X) o9 R/ g
case '-':return t[0] -= t[1];/ {; G( O, _" ^: A! i \5 f, U, a
case '*':return t[0] *= t[1];
" k" n0 e( a. c. m9 ?& e) f( ^# o* H default: return t[0] /= t[1];//case '/':
9 ^& I; C9 Q1 P x b }( F* G9 J. b5 h) _
}}( U4 y/ b) ~5 I. j2 J! ^- u
template <class _T, class _Tstream>
' v& A1 ]. k2 [3 K) a" A/* _Tstream: inputstream, _T: get return value
/ K) C/ X4 W2 |8 \* Return nonzero if get value successfully */: X7 p. k+ ] w
int GetExpValue(_Tstream& istrin, _T& nReturn){; D$ X E% }' C4 j+ I6 e( C) m, B
_T t[3] = {0}; //雨中飞燕之作7 [! L" ^$ T8 d/ z
char csym[3] = "++";6 J8 _+ `. j+ `% }! @) }4 v S- {# l
int nLevel = 1, nERR = 0;
; [2 V9 P4 ]1 V( [7 Y% j. ?, x if(!(istrin>>t[1]))istrin.clear();, z. U4 k" | W8 P
for(;;){
1 h" Z3 W: G, v! @/ T if(istrin>>csym[2]){
! N. b( t8 b- l8 z. N2 X switch(csym[2]){( P- X9 A* W: o9 a
case '(':
6 S2 X; e4 J8 |( h; w if(!csym[1]){nLevel=0x100; nERR=1;}else
5 e% H/ A9 f7 v1 [4 E. j if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
R5 z4 V) e( [8 d! b8 J else{nLevel=0x100; nERR=1;} J/ C8 g0 |) b
break;
5 V0 B) ^: C! ?6 {' @- X case ')':
2 X2 }9 \: r$ Y+ W {nLevel = 0x100;}break;
2 Q- W# G- Q- G( N0 ~ case '+':case '-':case '*':case '/':/ h" a+ [; u3 e0 R0 R& X% v
{csym[nLevel++] = csym[2];}break;
# M% g- a. Q8 l) g% u. y4 U" @% Z8 W case ' ':case '\r':case '\n':case '\t':continue;
8 Z1 \* l# W6 ~. V k. H3 S default:0 Z& p5 n2 P4 \1 O( r" H& i$ ?
{nLevel=0x100; nERR=1;}2 H1 g( d4 f# L* b
}3 g, U* [! n" U5 F5 i( j* d
if(nLevel==0x100)break;" B+ R" b/ D O/ Y: w+ o
if(nLevel&0x10 || istrin>>t[2]){
% Z% w: l2 u+ E* a* n/ c* u. i nLevel &= 0xF;6 u d0 H2 B) V! h
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 K8 o: l) _, {( L, e. [) S, p) t if(csym[1]=='*'||csym[1]=='/'){
6 J& m5 A/ u1 w9 ~ GetExpValue(t+1, csym[1]);4 U0 p( f1 I+ J* t& n* L
}. \2 B( {" n: Z" T
else{
) H2 B3 R* h8 p8 [ GetExpValue(t, csym[0]);
% f8 w4 }( U U: n3 a1 k- l t[1]=t[2];csym[0]=csym[1];csym[1]=0;2 t6 W( }; L7 n5 w) q2 ?& W% j! ~1 s5 X6 t
}
0 s( F) Y6 V8 z1 Z* N$ z" ^ nLevel = 1;
% K7 s& _ Y9 Z x }
4 F4 p m( a: ]# [) { else istrin.clear();
! R6 H* i6 N/ ?2 D7 O% X, E4 S }/ P! O) `) q' {. E, V! M. J! F/ {
else{nERR = -1; break;}
j) H8 J+ M, m' V' i4 \ }: P9 l* y4 ]. ?/ k: [* x* ?
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 W8 q! r' L( n: B9 ^ else nReturn=GetExpValue(t, csym[0]);
9 A' F' L' ?' } return nERR==-1?1:0;
9 C& @ w% \7 t5 Z4 u}}
+ Q3 I ]- C3 Z$ n4 V5 L/ Q7 o/ R( @5 k
7 _7 N n5 n' y! W% J `+ ?4 g
$ h! i* w% m4 D4 |$ ?- @5 ^3 k函数模板使用示例:
* U9 g( |( A0 n/ [: z; ~在以上那段代码的后面加上以下代码:6 T2 V9 s1 U* z; D+ G& v7 e
. a/ y& ^+ A8 o( @4 n3 p
/ m8 O5 ]% [" R6 n* E( X- z
, C* C: J" O, B) ]# u$ b) z程序代码:
G4 g4 H- ?$ y4 O" V& X1 T: C% g: c
#include<strstream>$ h3 T2 V7 M# N; r) d/ C
#include<iostream>7 b" _6 b7 E% p8 R7 Z1 W) g
#include<string>
- J' I2 w- j! X. Tusing namespace std;' p6 D0 T u, c @( _3 j
int main(void)9 `& |! L( o2 }% `
{
2 h/ V# w; b3 h! m string s1;; n- D# ` B+ r$ Y* \& m
while(cin>>s1)
8 s* x5 D' D' U, `" q {
+ T7 Y7 T, d) u# o5 y# l# w istrstream isin(s1.data());
$ ~. o2 I" u J7 j4 F* y double d;$ B# k8 Q5 V& Q+ j; H
if(fy_Exp::GetExpValue(isin, d))( P; f/ J$ ^4 b! k5 O$ }
{
% P/ a/ z; l1 K6 f. D) {% c cout<<d<<endl;5 |% O1 c2 e0 C. l
}
1 _2 I1 s! K9 h5 P7 `0 S3 W else
( z; E( m; d- {3 y/ N {
, W! `1 u V% {: m cout<<"ERROR"<<endl;
8 b2 e+ v! j' K3 w: p: G8 {4 `9 l }( J8 S! ` `" k
}2 t4 i& y( Y6 C7 {7 l/ n5 j
return 0;3 t+ `: N( b1 i" Y$ [
}/ {9 S* |/ v4 X9 r/ p
' ~! \6 v" `% F4 P Z
, U1 d5 ~- Z: y
然后编译执行就可以了(*^_^*); t$ |( t3 d% u) m8 e6 h( R0 [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" C7 X% Z; C( p t- ^ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|