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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
* w; j9 o2 P# N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; m' N5 g, l! [
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
2 s6 y* C( K) c, q% W! r: \参数解释:
/ x. o; E- W- V, ?( t# N' i5 ^istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" |5 V6 f1 {- L: M: xnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) q) m% J. {% n+ n1 i返回值:4 o9 ?$ U2 o3 Q: w$ O1 _) I
返回非0表示计算成功,0表示计算失败有错误
" F$ Z$ R' k, Z+ ]! G! j/ P1 f1 N& I+ e) I* ^8 K2 m
& Z6 r% B# ~- e* X- O$ D- l; L
1 a3 z3 ?- x. s0 g3 x& h V( |
程序代码:
" M' I- l$ w9 I2 K3 k' s! D4 i/ F; X: U9 X g* r( x; T0 N
namespace fy_Exp{
0 Y) n- w9 o/ f+ u. @7 D4 r8 nnamespace {template <class _T>
; e+ v1 f3 G$ ?5 @inline _T GetExpValue(_T t[], char& csym){
- m& l, s3 t; s; H2 }$ C char c=csym; csym=0;% Z, q* @" t0 m$ S, K8 h# z/ o
switch(c){ U' p% y5 m7 w% F' r _& ^# |
case '+':return t[0] += t[1];+ Q: n/ \7 C/ O0 l
case '-':return t[0] -= t[1];/ P' c% i; o. G |8 r
case '*':return t[0] *= t[1];2 K7 ~ q9 R& o- I1 A
default: return t[0] /= t[1];//case '/':8 Q$ l/ H1 O5 t) a
}' u5 N/ K4 z6 k" b9 ]" l
}}
; h, d' a. n0 o- P3 R; Ztemplate <class _T, class _Tstream># k. \, n" h: F8 C- ^
/* _Tstream: inputstream, _T: get return value
: S$ r6 B: R: m9 j7 l: Y8 F* Return nonzero if get value successfully */5 X2 j/ E2 r: Y; |& V0 B/ q2 D3 {
int GetExpValue(_Tstream& istrin, _T& nReturn){; \( i! v l8 @" w2 ~) T! d
_T t[3] = {0}; //雨中飞燕之作
: c: K6 `; N, P. i2 q% m( I/ x char csym[3] = "++";2 V5 s. Z# N H
int nLevel = 1, nERR = 0;& W, ~2 ^) g# u8 c
if(!(istrin>>t[1]))istrin.clear();
: U1 s( h8 z& |# p for(;;){) f# C' D7 E6 X' v
if(istrin>>csym[2]){* d+ O. [+ [% b+ u
switch(csym[2]){& H1 S+ l1 _8 n3 e7 x- a$ J8 {7 C" k
case '(':
3 C/ j4 H+ c% X; g) a if(!csym[1]){nLevel=0x100; nERR=1;}else: U/ l/ d% i: ^, {9 v
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: F1 ~- }* D, m* `* ^9 s8 c: U else{nLevel=0x100; nERR=1;}
2 e7 i- n- x5 J. [ f1 P. R break;
+ X( o8 [( m( P! A case ')':
/ E7 e1 ?) y8 }5 P* S7 S8 h {nLevel = 0x100;}break;
6 o7 J" `4 l3 O: L$ A case '+':case '-':case '*':case '/':) k. j+ V" L# R# }
{csym[nLevel++] = csym[2];}break;
" C) t/ Z* a9 g2 W- k; a case ' ':case '\r':case '\n':case '\t':continue;
0 o$ y) T$ @( y' g) b( C default:
. r3 J1 e( f/ u1 H5 { {nLevel=0x100; nERR=1;}" e& `. _# k3 |& s* H
}& ? T5 \& S7 S1 t8 A
if(nLevel==0x100)break;% d6 h9 V9 P9 h: P8 f/ N
if(nLevel&0x10 || istrin>>t[2]){6 Q1 k# C- h8 K! k& y
nLevel &= 0xF;
% L& {. I) |* C9 l. d$ W4 P+ _1 e+ u0 \ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; r- o. S; |$ C1 e9 R8 t) a6 G if(csym[1]=='*'||csym[1]=='/'){6 z1 {9 ]- M" m
GetExpValue(t+1, csym[1]);
- y% X7 o, t: V }) ^0 C! j N3 u/ Q" `. J) i
else{9 w8 e, ?& r1 ], C
GetExpValue(t, csym[0]);, H. y* X4 q0 P8 B) W3 X4 A0 t
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
: y( _# I4 I7 `* n3 i }
! o2 ~; M& E0 B% |6 R1 I3 r. I( w nLevel = 1;
a0 C% r, H; `9 j }- a" {: p1 l, n$ }% m% b D
else istrin.clear();
/ _: c2 A; c1 @% X: l# `& { }
) ~/ F" r- e5 f& o else{nERR = -1; break;}0 c/ ~" d! J# g3 A) O m/ T8 c* h
}+ ^9 T. S' @: X' u8 e
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 u' h0 j5 {& Z8 p. q
else nReturn=GetExpValue(t, csym[0]);
4 p; t1 f# B* Y. l4 c+ v return nERR==-1?1:0;9 d, q, {; e4 G& _
}}
) s3 @+ ^, A% [* g; J8 D. @# E; y* i+ V
/ u. T; a- u, w1 a. x
, \- r8 R/ y5 y* v- B! T) x( C3 H! L; t
函数模板使用示例:
7 I3 n; R! s }% M/ \, d在以上那段代码的后面加上以下代码:
) r$ v2 H0 i9 {8 j, b
" o* A4 V, q# S# T
, }3 Y: [; u4 n; A+ L$ N% Q4 q( v+ {$ h; r/ o! w6 s6 F
程序代码:
' `& k! R& R. q6 h" b R% F# {
: F6 H1 H4 e$ c& _2 b#include<strstream>7 ~5 Q. P F& v0 f0 t Y
#include<iostream>
- X* L. |* h5 M5 S. }#include<string>
, C- A! x! P! l) F& ^: M8 y6 Gusing namespace std;) o' w; G2 E+ X- d" R7 A
int main(void)
. D) \6 r* |* ?' |$ f* ?3 n{
. c4 S& G, c9 A9 ~2 Z string s1;- T* Q6 k8 ~) M- I% ~! l
while(cin>>s1)5 g6 o- m; c% Q9 W' W7 `
{" O0 P! s. p- O: A# A7 \' Q
istrstream isin(s1.data());
7 w- e: t9 _) F, B% D+ S/ k double d;
5 e( ]+ F+ C, `- v' e3 ^# S. X if(fy_Exp::GetExpValue(isin, d))1 c0 K. q' K' O' L
{& G" v2 b) C+ K
cout<<d<<endl;
9 t8 E2 `# E1 R; g% t }% l- n: B) ~* p% }
else
$ I# G4 a( I! [% G {
& U* c+ l" l; k# f0 E Q$ G$ h) @ cout<<"ERROR"<<endl;1 c7 P9 Y: y$ S& F3 r) ^1 ~
}
' y' Q2 }( n% B! {: r" n; P. u }
& M% ]) T3 f; U6 ~- a; F( T return 0;
3 A) k7 h! A* I; K9 v- }- a}! `4 [# C# @1 V T! r* f
0 y- f8 j9 u) g+ b) B0 P
2 j* d5 ^ g! g5 X% }
然后编译执行就可以了(*^_^*)" H# o' g, Z! m; y3 x6 S
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 [/ n, x3 U1 E* v" O! m# ]6 E w 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|