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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,6 n: w. ~$ z0 h9 O
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 L9 i" S3 `5 h, o y只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 b: {0 o. A. E4 ~6 b7 G
参数解释:) s: L# N5 B) r8 f, Q$ ^' I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
9 m7 I, H0 u: T' P" @nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
, i, `: H9 ?# E+ P: m返回值:
2 J! f0 ?$ C1 D返回非0表示计算成功,0表示计算失败有错误
! P) w$ o' V$ f) d" P* \( _- \# a
/ e! `, d8 m+ W 3 ~* m$ d' A8 L, q/ m' P0 L
- j: q4 P2 ~, I Q. R$ X: R Q1 \
程序代码:
r# E* N8 ^. c$ `' p& K n8 m ?+ R; E* h% m7 y
namespace fy_Exp{' ~& J0 p# g X$ z! w
namespace {template <class _T>
- V- ^$ [3 }* X R8 jinline _T GetExpValue(_T t[], char& csym){9 f$ s0 {2 F5 J. I9 d
char c=csym; csym=0;5 e2 `: {# T& O0 C
switch(c){
5 X3 h( g+ r& ]- }, o& y( q case '+':return t[0] += t[1];
P+ m* y# d4 J. Z2 ? case '-':return t[0] -= t[1];$ s. z# }# K: \0 ~3 v+ d5 h
case '*':return t[0] *= t[1];
: U# ^; A6 J% u default: return t[0] /= t[1];//case '/':8 `$ K/ } _( x$ l
}3 \! r! e7 {6 k7 f; Q
}}
2 o& s2 b4 @- stemplate <class _T, class _Tstream>
% p3 b2 _5 z2 y$ I/* _Tstream: inputstream, _T: get return value
& o ^2 D i" {0 f9 c1 ]* Return nonzero if get value successfully */
/ i. |: [7 R$ a& B- B( f& a, g. M$ Oint GetExpValue(_Tstream& istrin, _T& nReturn){) D$ u% f- y: z6 E
_T t[3] = {0}; //雨中飞燕之作; c2 {/ \- ?4 G3 O# ~$ \; J7 y
char csym[3] = "++";
8 \+ u& L* O4 F" A3 N9 v4 @ int nLevel = 1, nERR = 0;
2 m/ O: C: U& u# D if(!(istrin>>t[1]))istrin.clear();
" u1 m8 ?# o- R0 b for(;;){5 A) a) w* c2 {, L3 }, i, s
if(istrin>>csym[2]){: g6 s: f. c9 G3 E
switch(csym[2]){* I& g" o3 N0 t/ q2 }, q3 ~
case '(':6 z' t. d- s8 o7 R0 R
if(!csym[1]){nLevel=0x100; nERR=1;}else+ @4 A7 i. ~$ a% {3 o' P7 d. K- l
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 G. k; n& A0 z, ?) b
else{nLevel=0x100; nERR=1;}; l% f; W. t1 `
break;2 t4 Z9 l) f! A: b) `
case ')':
9 v: x& ~/ L) h" R$ @ {nLevel = 0x100;}break;
5 z$ O+ L) N2 c' L! f' O! \ case '+':case '-':case '*':case '/':6 X+ q, ~3 P( X1 g3 f k
{csym[nLevel++] = csym[2];}break;
/ t: I% N. L+ p- J y case ' ':case '\r':case '\n':case '\t':continue;
+ c m/ K# x% F9 e8 X2 Z" W default:
0 h6 g; C" @1 d9 I. [ {nLevel=0x100; nERR=1;}
. ~8 k- d; ]6 t# U! m( p) q6 N }
1 R4 _! L. Q$ K p" x: b" h6 s if(nLevel==0x100)break;' ?# C# x' v g
if(nLevel&0x10 || istrin>>t[2]){7 t" @) }5 F1 `4 T
nLevel &= 0xF;# N* K! b3 n/ Z2 i/ M- C
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. o. k, r: z4 F9 [5 j* |
if(csym[1]=='*'||csym[1]=='/'){8 Y& ^3 X, P! A# ?8 y( |' y6 L- W
GetExpValue(t+1, csym[1]);; \# w& d; Y7 l. P- a# y
}1 p: r' l4 a3 K
else{! j4 |8 J1 O: C( h/ `. r
GetExpValue(t, csym[0]);
* S! c x0 w. R# G. y! i3 U t[1]=t[2];csym[0]=csym[1];csym[1]=0;
% j: o0 Y0 X; i; B, ^1 O- K: E- ^ }
2 P _2 ]: m, n4 ~5 ]' n% r nLevel = 1;; O7 K. [" M1 I0 u& x5 v4 Y
}' d0 J$ c# \4 X5 q, i8 W! T' i* J
else istrin.clear();; L' N+ v% d% r' U! d T
}
/ f$ q J! h+ w: f9 |2 K+ f3 Z else{nERR = -1; break;}
, a$ e/ b3 @; [4 D1 g& @ }
+ w3 ]/ ^0 H9 \! T+ z9 G if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ k: s7 {1 N, P, H" k% @
else nReturn=GetExpValue(t, csym[0]);
4 \: ~, \- k2 m0 v: z. | return nERR==-1?1:0;
# V! N( g6 V a$ O" y( A% M6 P) B}}
! j! H; k2 J: E1 o% M# e' f3 m0 w& T; o! S; F
( h( ~8 ], p# S
" C! ?: `/ \5 }; Y1 {, M3 _; i( g函数模板使用示例:# x% c) U* U" T3 T$ j
在以上那段代码的后面加上以下代码:! X1 P" y+ x- p+ x, r
+ \1 D4 e( l7 N5 M; _, I
+ W; N7 n! a3 ~2 S( L/ ?
9 ?9 Q' M5 Q8 c+ f+ J5 A程序代码: + \$ E j% F5 p! o: \; E
) t0 @1 T; z+ e9 ?#include<strstream>
; B' J: M8 @! q5 d+ q# N/ E#include<iostream>9 t# `& s$ e# B& ]
#include<string>* `+ x% r' L! K% x+ |3 B
using namespace std;4 m; I4 g4 c* N
int main(void)
0 C( M2 L% z6 S{
' T7 a r! T# Y, r string s1;
% v3 k% G6 o' |# F( F4 h while(cin>>s1)5 n' g; d2 a* \3 j7 f* {
{- S# v1 g6 l9 J7 M# O3 F4 [
istrstream isin(s1.data());8 I; R% E8 _ a/ f7 k
double d; D# \0 a; E8 m6 ^
if(fy_Exp::GetExpValue(isin, d))
0 ~7 d: N3 n, F2 a {& v9 N- o8 A# z; e
cout<<d<<endl;& q3 |6 K" `* K+ |8 e$ {3 S* \
}4 K" J+ p$ W) Y1 V
else
1 T/ n" y" A8 E/ u9 r8 a& c" ~1 t {& S# o I- M$ w _4 W+ [
cout<<"ERROR"<<endl;- F6 D+ [; Z3 I7 u* u
}( ?# g p$ z+ B3 I! g% b# w; ^
}
! M) o) R0 N5 |5 c0 L return 0;
6 c, V4 p4 y: H' b/ [; F" Y}
* J& B* C, F3 T
. K" c+ x# O: {2 S2 r3 o0 i& R7 O* N+ l+ s7 z# ^
然后编译执行就可以了(*^_^*)
3 m3 L0 [9 \2 M) {6 U+ D& m7 F其它:TC++上一定编译错误,不保证在VC6上也能通过编译
- M. Q! `+ O5 h0 A 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|