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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
. O- p+ W1 R% f% s: k一个很方便的函数模板,可以并且只可以计算含括号的四则表达式. j" F$ o6 p6 n% e+ F
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 K' \( p0 P, S* ?4 }% ~* z) K参数解释:6 y1 }. y/ D. c+ _
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 h0 m. q0 V6 w, v; N A8 \
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' @6 l4 ?( _, s% }& n( t
返回值:
) i/ p! o3 s$ c返回非0表示计算成功,0表示计算失败有错误
r7 R& }2 m* x
& M1 f: B- k. j/ j1 p" U 6 V2 T+ n3 l8 `/ J. L/ Y, l( L/ u
( i7 S/ K# t# O( g6 a
程序代码: 8 u+ C) z6 n, D: g9 z
4 Y# u+ G% m( H N [ z1 wnamespace fy_Exp{
! F2 B, J! I# u& o2 z( F: Q& b0 Inamespace {template <class _T>
+ T7 ]& Z% r" w+ g- y! z0 u3 |" Rinline _T GetExpValue(_T t[], char& csym){
* Y$ N: [ K$ C z' L' d char c=csym; csym=0;( r4 } d8 D2 \2 r
switch(c){
0 P( G% ~2 t5 j8 w5 f4 O. a case '+':return t[0] += t[1];4 u& t* W2 i4 R* P7 S
case '-':return t[0] -= t[1];6 v' `' r! `0 e: @- Z
case '*':return t[0] *= t[1]; Z4 f g/ R2 a/ {# n y+ j
default: return t[0] /= t[1];//case '/':2 ~. ? s7 g& \; z
}
2 s0 z, h9 x- z" H}}
X0 g" r {" C& P$ ~# |template <class _T, class _Tstream>
1 `0 K" D: N# t1 ~3 k5 L/* _Tstream: inputstream, _T: get return value
9 Q4 z7 Y3 h# C, S( l5 K; Y6 P( w* Return nonzero if get value successfully */
$ a/ d9 @3 W) G/ Qint GetExpValue(_Tstream& istrin, _T& nReturn){8 U$ X( [: t( ]3 r/ ^# `4 F+ H# p+ D
_T t[3] = {0}; //雨中飞燕之作
' q. l1 K' a$ P8 F9 A char csym[3] = "++";( v* r9 X9 \2 N# l* m& N _
int nLevel = 1, nERR = 0;5 R7 Y( o: L* x/ ?
if(!(istrin>>t[1]))istrin.clear();
4 x) a" V& o& u, v! |4 G3 v for(;;){
; [% m. [( e# W( V, s* W if(istrin>>csym[2]){- L: _1 n1 _1 ]; A$ n
switch(csym[2]){
2 h2 t% G5 g: F1 d6 \& O, ]* n4 J case '(':
( N# V% r; H: f' l; {7 s) V+ ? if(!csym[1]){nLevel=0x100; nERR=1;}else8 p: _/ J2 ]8 {$ y# o3 g3 a6 R
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# N% L- K- d( b f, g3 s+ K6 t* A5 \
else{nLevel=0x100; nERR=1;}4 c! N1 v$ ^7 d/ ]9 c" u+ R
break;
( L6 D( e7 T7 Q1 f; g" ?6 q/ J case ')':
# d8 T2 y4 Z5 x: w$ S {nLevel = 0x100;}break;4 z. Z0 `2 h7 D
case '+':case '-':case '*':case '/':* d& A3 ?- `; a5 h3 ?7 T* S2 c6 O
{csym[nLevel++] = csym[2];}break; I, y' p. r* J9 N1 P
case ' ':case '\r':case '\n':case '\t':continue;
* j" e: a5 E# v+ ` default:
+ s+ r( P: T7 D5 t) g' V# G, y- v8 ~ {nLevel=0x100; nERR=1;}3 p( q; t( U7 m
}
+ ^$ P+ L' `( q% j if(nLevel==0x100)break;' w- P& T+ y# v9 y2 o) c
if(nLevel&0x10 || istrin>>t[2]){
* m$ a9 f5 Y+ N8 a- _) [" d nLevel &= 0xF;% T% w) h3 }# F. e# f; d
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 a' t3 m+ n& l7 S9 \; U" h if(csym[1]=='*'||csym[1]=='/'){# B+ E" W; P8 r3 Z0 q; s+ i
GetExpValue(t+1, csym[1]);
7 [9 J3 d* G( b/ |- u }, D: G; W/ ]" z5 B
else{* V& g0 M6 W; v4 Q/ e2 i$ x
GetExpValue(t, csym[0]);
& ^' k& z- _, w3 X9 p t[1]=t[2];csym[0]=csym[1];csym[1]=0;( |! Y& `7 l: B3 F g v
}. N2 O7 q. K( ^
nLevel = 1; M( r8 C# _: V3 b
}7 O+ [1 ?. g+ _2 p9 P6 }& k
else istrin.clear();* X5 y- E( z- C5 n- M
}
0 x7 O" D: \& k* G# m" H else{nERR = -1; break;}) ?$ L+ S- v' J
}
- S ^ n5 G! g if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);0 S" o) B7 Z9 ~& D
else nReturn=GetExpValue(t, csym[0]);
3 N7 H7 d3 ? D1 S; I return nERR==-1?1:0;
7 ]# @( m. }2 G# x. l/ v9 B6 U# {}}. D$ I- p4 Z. a$ i4 s9 E3 q2 v
/ g D8 V$ ]" r2 C" B6 A6 |0 ^
+ x8 Y3 V5 M7 h, e
3 W) s% a5 ?7 ]" @( Z/ _函数模板使用示例:
3 Z2 E; Y- ` P在以上那段代码的后面加上以下代码:( h( x& B% o6 u7 j% z8 I) `2 ?
" a7 P% ^1 A4 c6 n; F
! V% w7 a/ ?6 ^; p3 S$ c r/ F) J; t/ v. M4 K8 x( ] `5 ]
程序代码:
) Y N9 U7 y* `9 e! g7 d. L7 x
* t0 y* N; @, T/ _5 B) M5 |1 Y" g#include<strstream>
# E! Z5 t2 v9 ] R- z2 `#include<iostream>
/ j. r$ \4 ^! j' H" m0 M#include<string>
0 `6 g3 ]# `+ c$ ]! wusing namespace std;
0 i1 t( i% g1 h. s. U% Y: fint main(void)0 k, E, Y7 S- b6 ]- C4 W: P
{
0 E* D2 d( ?7 _ string s1;
* } b8 Y: m% Q: a while(cin>>s1)
, I! s- r$ K8 T" t {7 e- [8 d0 E% T" p2 B7 j8 o
istrstream isin(s1.data());
# B2 H* u% r1 C. }1 y6 R. S double d;. i7 J7 k' x8 C* V& o6 a
if(fy_Exp::GetExpValue(isin, d))+ I5 S% t2 `3 h8 {2 L& D/ C
{
4 `+ i$ i7 G) Z# k' M cout<<d<<endl;
6 y3 ^, B' C1 s. x }
6 p1 B6 |3 V& B, G) ^1 }0 D else
5 s( C6 g" w7 d/ q& b) Y( X {5 \$ Z8 w w: V
cout<<"ERROR"<<endl;
4 k& r" B$ G3 L }! Z, ^ H5 h* E+ k8 g' M; @- b) Z+ |
}
: U2 u& L- j: _. ^% ~) V4 C return 0;
7 p6 h2 v! x J6 C! {}+ x3 w7 S# j, D2 K" y
; \0 L5 y) H# u0 I- d. K# U
c, r7 ], p; i3 z/ _然后编译执行就可以了(*^_^*)
" p9 b; Q: s2 D8 j$ v其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 s- {1 @2 e& i( y) [7 S
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|