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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; o2 [5 e% R$ h一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& }7 L" x5 W0 r$ i( g只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% `. W& B% o! K3 g" `4 L3 [) S" h
参数解释:
. t9 d2 J$ J" }4 Fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ [2 `) T2 e* {3 j
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
' {* E& |' C4 z. D) ]% m返回值:
6 R9 a5 Z# `4 g: W& ~2 W返回非0表示计算成功,0表示计算失败有错误/ Z: y; n1 E8 W
3 R1 A" ~6 n+ E- q" ?9 Z3 s; k# C
7 m" p# O) l, H! C6 G. T d
2 R0 n$ E0 H1 F f0 G! y程序代码:
. J/ @9 E# Q) j. O- C( l+ T" K; ]3 W! V3 b
namespace fy_Exp{
( o. ]- D0 ]8 Enamespace {template <class _T>" l% r& _# ^# a( f0 h+ ?' r5 R3 R
inline _T GetExpValue(_T t[], char& csym){
$ U2 d' l; M& M& M char c=csym; csym=0;0 g1 @. f2 M: M [$ Z
switch(c){
! }4 e5 _) B3 ?* [$ z' F$ M/ f$ u9 A case '+':return t[0] += t[1];
1 B) e2 ]& Q+ A' B case '-':return t[0] -= t[1];) S: ]' ?2 t9 w- c8 o5 w& N4 G0 ? M
case '*':return t[0] *= t[1];
; m4 H; ]8 ?1 V3 q# H default: return t[0] /= t[1];//case '/':# S, B7 M3 ^! K8 P. p7 Q4 W% ?; P( B/ N
}: U- E b5 ?& O0 I5 |7 U
}}, h7 s2 `- F7 B9 u$ F; y8 m
template <class _T, class _Tstream>* E+ D7 C; d$ G- ]
/* _Tstream: inputstream, _T: get return value& j* g4 ^$ n" c7 Q3 ~. b
* Return nonzero if get value successfully */* ^; a V+ I; j3 K
int GetExpValue(_Tstream& istrin, _T& nReturn){! a( u. J: c) n! d( E1 L9 F! q
_T t[3] = {0}; //雨中飞燕之作& @% Y9 x- ^ e1 g; U2 J3 i' N1 b. @
char csym[3] = "++";6 Y- W; Q6 E# P* }9 E
int nLevel = 1, nERR = 0;
; ]' r+ D# n/ Y; g, S" `5 }5 ^ if(!(istrin>>t[1]))istrin.clear();
$ Z! z: E9 v- l$ k* [/ F3 m' Q for(;;){
) u/ {4 p2 E) L& w+ N/ x if(istrin>>csym[2]){
) B- u# O0 R: x7 Y) o7 ~ switch(csym[2]){
& i3 n- `# E, U6 u9 d& X6 n case '(':
$ N0 l6 u! x: Y1 D& K& M if(!csym[1]){nLevel=0x100; nERR=1;}else: s- U, a6 O/ h( T) }+ p7 S
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 I: r, F! G5 K3 p8 E+ B! e, a else{nLevel=0x100; nERR=1;}% k w1 m$ g7 X
break;* e6 J4 \& Z, q6 v! P5 T
case ')':) @& R7 y+ r- M$ I. S/ x
{nLevel = 0x100;}break;
8 G* N- g: Z' |) J# m. s: { case '+':case '-':case '*':case '/':+ O. ?7 M+ b9 u" c
{csym[nLevel++] = csym[2];}break;$ n' H6 M' P5 K2 \( M9 P
case ' ':case '\r':case '\n':case '\t':continue;
: I2 m( f0 B/ W# c" G$ q default:9 Q6 ?5 R/ q7 i( \& U1 w4 d" n( @
{nLevel=0x100; nERR=1;}
, T# h! F! d5 [+ U }
Q& f' q# T! I8 `7 t! X+ o5 q if(nLevel==0x100)break; ~. i- a+ D. t; z3 M
if(nLevel&0x10 || istrin>>t[2]){2 A2 _6 O% e/ e& f0 L
nLevel &= 0xF;
4 u" d4 \0 G9 n/ Q# U! {5 N9 J# l if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
5 o" C+ ?* R" w' H6 q if(csym[1]=='*'||csym[1]=='/'){
5 N8 O1 d0 h% C9 A3 K( R @ J GetExpValue(t+1, csym[1]);
+ K) |3 D! f" l }; i6 p0 C1 G* x
else{
/ A* E9 R1 T9 s GetExpValue(t, csym[0]);
# q, ]- \6 Y' H- }8 U* Q8 f2 _0 c2 V t[1]=t[2];csym[0]=csym[1];csym[1]=0;" R; I Z2 {* j. I7 e
}/ Y& H/ u) u+ Y9 p
nLevel = 1;; o# m( v b5 b# x1 ]
}
5 {% ^) Q+ n; R* E else istrin.clear();
# ?) c+ [' D ~. {4 M }5 x* ?. }, B" g
else{nERR = -1; break;}
" [* \9 f2 c& u, \/ w$ Z* {: G }) q5 u3 K H3 q
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( y3 q9 P/ I% U6 G! F: |* ~ else nReturn=GetExpValue(t, csym[0]);
0 K6 B, T8 m0 V; w return nERR==-1?1:0;2 S7 T0 c' a7 |2 s% G
}}, P7 `! u3 \, k q
e. J# _( C- v5 z8 _; U
7 @# v0 ]. ~; I% M5 A6 q; D U y1 ]0 w5 K1 `* _5 [
函数模板使用示例:
4 ~. [0 l; N: Q! B P在以上那段代码的后面加上以下代码:6 Z+ K! e" p/ l% B7 C) j* f6 \$ W
2 t% n7 R* j& Y8 M2 E$ F4 {
/ p7 y5 y. D# J- J$ g' X* P/ Y" }2 p) i Z( K, K
程序代码:
- [$ M O; G* F- c$ j# d6 d+ F+ W) e+ d5 O2 ]' _5 s0 ?
#include<strstream>
) p1 ~. p5 J3 F4 p( r" y' V#include<iostream>5 |% w9 Q) O7 Y7 l3 L j
#include<string>
7 c' h1 ]. ?; Q# \using namespace std;
1 d! z% |" N5 q' G) F* }" f% k3 a7 Fint main(void)( i' _: o' B' ?, F3 h& O( T8 I
{
6 t- a- Y$ p8 c; {6 M/ z/ D string s1;
2 z1 s3 |7 F7 ^1 Q while(cin>>s1): `" {' Y9 Y* ~, U5 q: k
{4 C6 b& Y% K: P; T D5 y! P/ b* C
istrstream isin(s1.data());6 z) X, m' q& I" w* `1 A% N
double d;* ?: Z/ f- G6 a7 R7 j) k* l1 f
if(fy_Exp::GetExpValue(isin, d))& d4 y% y2 u* `" F0 x8 G4 D
{* C, l2 k9 N2 F/ }3 M
cout<<d<<endl;8 O) H) O2 X7 `/ P S- g% p
}9 Q! T/ A* j# Z1 a1 A+ T
else
3 ?* N- ]! s( s0 O9 | { L$ P% j+ Z) w6 p. K1 X) V
cout<<"ERROR"<<endl;" ~! x# }% A4 G' h1 Y# T" K t5 J
}
0 d* n! F9 I) Q' ]7 ?* m9 O0 p }+ @; W& l5 F; G |1 c8 b
return 0;
2 T! u1 h. R- Q) H1 G7 m2 {6 ?+ j}
# D4 L7 n% G2 n( x9 N' M
- n/ V" T t2 Y9 Q+ D- a. X5 O+ _9 X6 {
然后编译执行就可以了(*^_^*)
' m$ c- y! F3 y1 U4 L其它:TC++上一定编译错误,不保证在VC6上也能通过编译1 p0 Y3 X5 T: f+ U4 @! {$ j
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|