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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
$ V* i* N) T# I% w一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
7 \1 ]& Z9 l d' Y只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 |- C* t$ I F& w8 r' E. }
参数解释:1 e7 w1 _7 ^3 t- ? k
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ h2 B6 S7 z' S" p. [
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" A( U" o ^7 w* S
返回值:0 H9 y5 N0 G" l$ p
返回非0表示计算成功,0表示计算失败有错误, Q+ t/ W3 a6 Q) |% l* g
% y6 t1 p5 k" }! {2 H6 B! A- y% L
$ o! p/ ?/ I5 x$ [- a/ u* P: h( S. c# L
程序代码:
+ c1 e! P+ ?% `+ i8 c2 I# K6 P) A' Y- F# A
namespace fy_Exp{
: t9 L# `% T& pnamespace {template <class _T>
7 f; ?* M2 e! Dinline _T GetExpValue(_T t[], char& csym){
% P$ L) V! p1 k2 `+ B. K char c=csym; csym=0;
! A0 H# `' S- t' x0 Q switch(c){
+ Q3 _: T+ b- y f* n5 q9 Q5 T case '+':return t[0] += t[1];3 ~3 O! [( f" m2 N, `3 m" f
case '-':return t[0] -= t[1];7 p. U& C9 M+ Z( Z; [/ c1 s1 L& _
case '*':return t[0] *= t[1];
# D- Z! k8 [+ |9 B. y6 M; R' B default: return t[0] /= t[1];//case '/':% d+ J" r; c0 i$ d/ ~( }
}- t) g1 G2 Q5 x# q6 M
}}6 s7 {0 m! H" s/ |0 m
template <class _T, class _Tstream>6 T$ C, c8 h& P
/* _Tstream: inputstream, _T: get return value
: M& S" Q0 q. M, a* Return nonzero if get value successfully */4 g: z7 \2 d+ n8 H x9 n
int GetExpValue(_Tstream& istrin, _T& nReturn){
9 F/ w' j! s; C' O0 `. Y _T t[3] = {0}; //雨中飞燕之作
3 V- x. f! T; Z8 c4 L+ I4 v; L& U char csym[3] = "++";
! ?: x Z0 h; d4 E- x, v int nLevel = 1, nERR = 0;8 t6 `2 i4 ~7 @& Z7 ~1 a* z
if(!(istrin>>t[1]))istrin.clear();* b: q' h+ T% W9 X" v: g0 S
for(;;){, e8 W) m# A0 W% T" V6 h( [
if(istrin>>csym[2]){
# M3 u8 E6 p9 j4 D5 W2 T% @ switch(csym[2]){/ g+ @7 O; k. }0 x
case '(':
$ B" N8 @2 L7 S7 G2 | if(!csym[1]){nLevel=0x100; nERR=1;}else
- q4 ?/ W5 }5 d/ n. B' u if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ ` {& M M- O else{nLevel=0x100; nERR=1;}1 I1 m) Y" D' p
break;
8 j' x# c# h$ R/ _: v/ q; b# F1 m case ')':5 {2 x6 ~4 U' `: x' C, Y3 U
{nLevel = 0x100;}break;& L) t4 v4 C8 ?: P# ?7 |
case '+':case '-':case '*':case '/':
8 y) [( O; I1 o& I( c, X" E {csym[nLevel++] = csym[2];}break;
- I# B/ M; Z0 V. v6 @0 I/ X case ' ':case '\r':case '\n':case '\t':continue;
i4 i% N2 k- O3 n4 {1 C8 { default:
2 s* z* T. g6 A, G; Y5 u1 z; p {nLevel=0x100; nERR=1;}2 X& V K: G" o8 X0 ?( x
}) H, u$ L+ }2 n
if(nLevel==0x100)break;
0 w6 y, i O* |7 ` if(nLevel&0x10 || istrin>>t[2]){
6 {3 C; l) M, ^' j* X6 w( e) s, M nLevel &= 0xF;
; V3 _8 G5 g& w( l4 T8 s* A* T4 \ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. L+ `# U9 Y3 q8 C# ]
if(csym[1]=='*'||csym[1]=='/'){& p) i* t* V3 H: C
GetExpValue(t+1, csym[1]); `5 B- n$ ^1 h% l
}" a9 T9 h' D* a) [( q. [$ T
else{ z' g9 b ^* d- K; Z+ i. m
GetExpValue(t, csym[0]);; A. w: {* l$ r- F
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ s8 s4 \* \( q O1 H. M* W" \ }
: ~" g' S- t; @2 c( Z nLevel = 1;
. H$ W2 K- p3 V: j" F7 d }
, Q4 Z- O" y: M4 M* a else istrin.clear();/ W% A. p3 `* M
}2 x+ P& u: a0 ^5 e0 D1 Z
else{nERR = -1; break;}: h9 X. ?0 C3 W3 n; a/ n ~
}6 u- M: a" J$ {3 D7 V% R. w
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 y2 e5 J! a6 A else nReturn=GetExpValue(t, csym[0]); F6 `+ F2 G2 P9 g
return nERR==-1?1:0; o' x. q3 G' r& Y- W9 x) u; X
}}2 G; i0 k. {, k, {1 E2 X
4 D" V. F4 r% H- K, ?* v) M3 ~% t7 b# w' x
% z, P. ]( ~, m, l+ |2 U7 ^, i
函数模板使用示例:* X' E5 ~' M$ \1 v. B1 M0 m
在以上那段代码的后面加上以下代码:3 I$ A1 V2 t' W- L2 d4 u' t' B
# | w$ k) Y8 D3 Q# n+ E & D( ^; A3 L4 e9 X& x; p. k7 m+ A
' u2 \1 H& O; |$ U& q6 G8 C9 Q
程序代码:
0 `# r8 r! x- f, m. v9 @& ]6 ?* n$ }" y
#include<strstream>5 k8 a: t8 J4 Q
#include<iostream>8 A7 u: E8 Z; @; ?4 q
#include<string>! [) r. @3 h: K- s
using namespace std;
# v! M9 B \( _$ e( g) I2 t( E: Wint main(void)
0 W0 a9 J1 F% R7 n7 K8 c{
/ P' n! V$ X) x: `# c string s1;
7 h" a f3 y$ ]/ f [ while(cin>>s1)
$ N1 P9 k) f* D p {+ @# ^3 r5 ^2 ]- _5 i& B
istrstream isin(s1.data());
: _5 Y9 F) U8 c# f" I double d;% c6 @3 |* M$ Y3 [9 |% E' s
if(fy_Exp::GetExpValue(isin, d))3 Q' T3 A' m, X6 X5 l
{
1 K) m9 Y/ z* k6 ?+ P cout<<d<<endl;
8 v/ D- B" E0 f" w4 V1 u9 m+ u }0 k* w4 i3 ]. k0 [/ {. H
else
; O# b( q2 G2 b9 J* }8 k: R2 X {
8 ^& Y6 w( c- r% V cout<<"ERROR"<<endl;
/ \1 t3 t) L q* x7 z }4 J" z0 p& {) _ h' S
}) S+ q- P) H' q( Y
return 0;$ w- s" z, h+ Z# x% x
}& u; |% q- V {3 \$ D I+ p
, o ~! S- i: ] t: V
$ |; z$ @1 N5 K然后编译执行就可以了(*^_^*)3 _: W; n: W6 _' ]
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 K! G$ X" z1 @6 J1 {1 a$ T3 g# r3 t 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|