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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
# j6 w' P/ p; g0 W一个很方便的函数模板,可以并且只可以计算含括号的四则表达式8 y8 m+ ]- b# o$ Q8 R+ N
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)& T: M' L; w. {8 z6 k
参数解释:' T, k- ^& [; u1 g, f
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! W& Y& Q6 M' h1 |1 z. F' x, V" `
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 M' t& G @+ ]( L0 d( ?
返回值:: q/ Q; f5 P" M# R
返回非0表示计算成功,0表示计算失败有错误+ U; d# X* b# ?! |; |3 V4 C+ y' {
7 W, C5 B3 u( Z9 |' s
2 r- C: A4 j9 d* T- f: j$ _
' Y1 K; H6 U ~% O; \程序代码: 4 G# N; `' N7 m) T8 x3 ]$ J
! Y2 |! E" D3 w' v; k; ?namespace fy_Exp{
/ T+ |2 I' w* P1 }6 jnamespace {template <class _T>4 S" ^1 b/ H" H& z n
inline _T GetExpValue(_T t[], char& csym){
% E, j' y7 o2 g' |7 p char c=csym; csym=0;# K g& W. E% W! C1 d
switch(c){7 `# }: d& d, h3 r
case '+':return t[0] += t[1];8 p* b" `5 I, C# j
case '-':return t[0] -= t[1];, \" p* a' ]( D4 G4 B. W5 N& v3 [
case '*':return t[0] *= t[1];1 }& W/ I( m7 z X, H
default: return t[0] /= t[1];//case '/':2 [0 X1 _! R& u1 L- `
}- i4 B# P h4 H* e; m
}}$ W6 `6 r }5 S1 k" y
template <class _T, class _Tstream>
% B s6 ?. }" G; l8 p) ?* W/* _Tstream: inputstream, _T: get return value
' ^4 {7 h5 `) Y* Return nonzero if get value successfully */
3 x% z9 [6 N) r4 \# e" Hint GetExpValue(_Tstream& istrin, _T& nReturn){ p! ?' P' m3 h0 b, r! z
_T t[3] = {0}; //雨中飞燕之作
5 M0 r* V% c8 T' {. j! q: a7 L char csym[3] = "++";7 h. t" F) s( Y3 X4 {8 H
int nLevel = 1, nERR = 0;( p: j9 E- b( H8 s) P% z
if(!(istrin>>t[1]))istrin.clear();
+ l/ t- w7 r* J6 l! I1 r+ O" [3 [ for(;;){
$ {# Q: w+ X" u& O if(istrin>>csym[2]){1 O" w" T: j& [" h0 b
switch(csym[2]){
' o1 J5 u# V( {0 \! S case '(':" k! s5 L5 [$ _& F& S% D. G
if(!csym[1]){nLevel=0x100; nERR=1;}else& Y! C# [8 Y7 M, b! P
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! i* O3 }- n1 K' |$ r3 W
else{nLevel=0x100; nERR=1;}
, `4 Q$ L9 z9 Q( Y b break;" }- E' T, I, p1 \
case ')':
/ {0 G7 n! o# R: A {nLevel = 0x100;}break;3 }9 X9 z$ v* ~: b4 A5 C/ m
case '+':case '-':case '*':case '/':, H: J. ^& |6 M9 f4 F9 S
{csym[nLevel++] = csym[2];}break;
# c/ t/ B2 J6 k case ' ':case '\r':case '\n':case '\t':continue;
6 ]2 u; I! C1 x* b7 i% u default:+ v' x- b6 ]8 l
{nLevel=0x100; nERR=1;}3 l0 \, p) M0 ~% H
}& D n/ ?# m4 \
if(nLevel==0x100)break;' I2 a& r5 |; n+ W" R
if(nLevel&0x10 || istrin>>t[2]){/ o. C, M# Z: q& y; V
nLevel &= 0xF;: s y8 D6 X$ |- u# K7 }
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
* n# b8 M) Y2 n { if(csym[1]=='*'||csym[1]=='/'){
$ D& ], P- t3 I+ o+ U GetExpValue(t+1, csym[1]);: D, \! v' \0 Z0 \# o* m+ f0 |
}% }( A0 g ~) Z! V, M0 o
else{
' ? e8 W3 J1 y p% ?) d GetExpValue(t, csym[0]);
& z/ M% c( }8 K ]' z3 \ t[1]=t[2];csym[0]=csym[1];csym[1]=0;5 n: i* j/ P% T- n) U
}
6 v3 F1 o1 o! r; C1 C1 b0 T$ \ nLevel = 1;& H" B2 W+ f( K
}
) s+ |3 G& R/ n& R$ _" J else istrin.clear();
# F9 H J8 I# z/ S. E: ?5 l }% i" @: ?+ L2 L8 M8 [
else{nERR = -1; break;}
5 k3 ~- M; F0 _& R0 P! s1 j7 {: D( m# X5 s } j2 W. o$ j( c3 R
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 ^3 q9 |+ M% j0 J6 u else nReturn=GetExpValue(t, csym[0]);
! P2 o' I9 f' E* A0 ]! G return nERR==-1?1:0;
" D: \: c5 O8 z% u7 n}}
# p7 }) [+ C- X! k- I$ B
6 n7 y1 {; @, A3 c
% o8 }3 }9 [" P- X. S2 y% }: H- Q0 p M+ v! @" _1 a
函数模板使用示例:
2 X) f% n3 {4 V( N在以上那段代码的后面加上以下代码: V& b/ J4 C7 ^0 T5 o% D( }
" L0 ~1 e1 p! M/ [$ D8 @
& L1 H, m. ~ V7 Z
* _3 \2 J, p$ }8 k, i! @8 I) d! b程序代码:
# M5 c+ W9 L2 d9 ^8 x6 Y; g
4 O; K) u/ j+ w( O- m#include<strstream>
. h7 A( K A( W/ b( W#include<iostream>/ E; t) q5 n2 ^. c! D2 u
#include<string>! T7 O6 f; x% H$ Y
using namespace std;
% W; X7 O5 w1 T# J% w2 bint main(void)4 W. ?+ Q4 E V
{' d* e9 R' L1 h8 s* d. ?
string s1;
- }# a7 M4 u6 L% H" L while(cin>>s1)2 X# ]! F3 g$ v; `; |. P
{& |; g9 _: h: ], J3 g; T; B4 g
istrstream isin(s1.data());. ^; N7 M" b# z' L( D4 {
double d;
" K! u& [) W1 ]- K( @) G; N if(fy_Exp::GetExpValue(isin, d))
2 y, B. q* e7 v$ @) n {) Q7 T6 f2 B2 `* |9 Y1 M
cout<<d<<endl;/ E# Q6 I, G6 t% [5 k; I
}3 O4 q3 x- ^( {, S
else3 M+ M* `/ b- |# }: F e4 I. P
{& n' M; \5 E1 h# F) c- o* e
cout<<"ERROR"<<endl;
7 f) `5 K; n1 Z! D J }
" O( {. ^1 }) d( I+ e: u; y& S }
% n6 G+ T% z+ O" A/ E3 x return 0;/ \4 \- a$ _, J+ \! B4 N- V
}3 E) h0 j# M B& z; t+ v
5 |+ v6 e1 Y+ y" y3 C/ Q& G, k
+ Q! z }5 f, t9 ~& h然后编译执行就可以了(*^_^*)2 d) |% r/ R$ P2 n! V& g }
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ z y/ Z2 ?# w& o. T8 q
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|