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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,: N% x, q; u5 i# e! a5 d3 y5 {
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 f# a& B! b" A# B# s' f8 e
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ Z! a6 H' _7 ~7 V! }" ?% G
参数解释:
; r4 a4 c; ^ E5 C9 ~% T2 d3 Yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
j: X& m! ?/ b* d7 a4 vnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; a/ z& H4 v3 i- W+ {8 m; L
返回值:/ n$ T, V" P6 L: a
返回非0表示计算成功,0表示计算失败有错误$ q! K) Q$ O( o' _
* _2 R i! W: N x. k W# v4 B8 X4 o" w
) Q/ l7 T' u1 U
程序代码:
, n( J' {+ L1 X+ p3 a- ~2 b) d+ P5 @ Q) y
namespace fy_Exp{3 [* Z: r7 R* O) ^
namespace {template <class _T>
. S& I: k4 x7 A3 ~: P5 k$ J; m# Iinline _T GetExpValue(_T t[], char& csym){
) f. A3 @, {8 \. L B" _ char c=csym; csym=0;# |" }# M) O6 Z; P# M1 d6 C
switch(c){4 s2 S# o4 v3 T% K8 s0 ]2 Z
case '+':return t[0] += t[1];
9 ^. M P# e" X1 U case '-':return t[0] -= t[1];- J9 J: j; o/ B8 o, ^0 u) b8 A
case '*':return t[0] *= t[1];# d4 q4 k' h) a8 _9 S% O# ]
default: return t[0] /= t[1];//case '/':
0 a) _' ?# I d! |6 j; p' b1 @ }8 ^' k0 m7 P8 O6 O3 W' ?' j5 `1 A- V
}}
$ g% ^, c) a6 E+ ttemplate <class _T, class _Tstream>) k, m& e" x8 N
/* _Tstream: inputstream, _T: get return value6 \ G8 r2 z; o3 c* i
* Return nonzero if get value successfully */
/ _ {( V- J Kint GetExpValue(_Tstream& istrin, _T& nReturn){
, G" G0 `2 V1 k2 j/ Q _T t[3] = {0}; //雨中飞燕之作0 @. X. _& M0 j) i8 U
char csym[3] = "++";$ ^# W( d/ K, m$ w% w' U
int nLevel = 1, nERR = 0; r- x M9 y" H. d( e
if(!(istrin>>t[1]))istrin.clear();+ \6 h- j9 d. e2 t' B6 c f1 X: S) G
for(;;){4 p$ @& R, t+ V; m/ h# N
if(istrin>>csym[2]){$ q2 L% i: q* e6 B9 n4 a7 Q
switch(csym[2]){3 y: D# J( k) K% P
case '(':! A2 ^# k7 {" W+ C
if(!csym[1]){nLevel=0x100; nERR=1;}else
, `$ y( ?9 l8 }7 z' N2 r8 w if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
# Q" K" x4 C* L; D. X else{nLevel=0x100; nERR=1;}
! E# Y5 F9 o2 Z( y( e$ V break;2 e B% k" _! `9 l
case ')':
( u; |0 E/ n0 {! l {nLevel = 0x100;}break;
, l9 C% |8 {3 B9 N* r0 i5 F8 H$ l( d/ Z case '+':case '-':case '*':case '/':3 ^! ~5 c! ?. m% K
{csym[nLevel++] = csym[2];}break;
b' U! i: b0 I4 t# B case ' ':case '\r':case '\n':case '\t':continue;
4 ?! Y; J0 N3 ]) ], t4 h9 k* f default:' G' ~/ Q3 w; q3 S+ H9 `6 F' G
{nLevel=0x100; nERR=1;}
4 L+ Q3 s$ N- X" P$ U! h }
( g2 i0 m& x; A3 b( h if(nLevel==0x100)break;4 V. E4 D# W+ B; g& s7 ~8 q' R
if(nLevel&0x10 || istrin>>t[2]){
, \( Y# v* A2 I nLevel &= 0xF;
+ r# B" ]8 F" | c: E- | if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 z, ~6 x. t$ g. ?3 v- C% a if(csym[1]=='*'||csym[1]=='/'){3 x$ A8 i( M* O( k% u
GetExpValue(t+1, csym[1]);
% g" e# L8 d; M* W }5 u1 ]+ C* E0 M4 G) @" k8 m
else{
* N% Z8 t7 \. U9 {7 D2 } GetExpValue(t, csym[0]);
% @ o! d9 r* S) O/ F* b t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 B I" O2 F) h$ l" Q, u1 E
}
; {( ?( ~5 K8 B9 B) m( y nLevel = 1;
6 I8 s7 Y0 Q9 m# n }8 L# Y1 p5 `% B7 W! H {
else istrin.clear();: s d. b3 K- s
}
3 f: P. K& N) I* F3 U1 c else{nERR = -1; break;}+ G% {" p, X" x0 T8 H$ S& Q
}
9 k/ \3 A6 ^) K& m0 y* i% Y! b9 n if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. w4 V$ Y' J: ?5 S1 t9 Y else nReturn=GetExpValue(t, csym[0]);" _' X. P- e4 N4 E7 O7 k1 U. P
return nERR==-1?1:0;
6 g5 ]1 P& z y; s, ]0 c7 q1 h" Y}}* E* x# m+ P: ^ `
' i! ?: T) U$ P* C1 U- E9 ?) t/ k
7 h H% ?" A, f; R: c8 R a) f# S/ U) y: k
函数模板使用示例:
?9 W! R- O- [在以上那段代码的后面加上以下代码:
" w5 D$ ] \* d, }' N, V5 Y) l1 K% X; ]
9 o3 M! a9 [& u8 ^7 W$ ?# o7 g. X. K7 g) j
程序代码:
' [ A8 _, x" p2 b( x/ k% Z. N S) r# t
#include<strstream>& Z6 v+ W. J: p5 o) K4 l4 |* \* s
#include<iostream>
5 V/ `$ o9 e) X: r: g#include<string>
6 I( f* H* {" U6 @7 m1 n, {/ ~% ousing namespace std;1 w' U; C% ~7 z. J# K8 Z6 T
int main(void): c/ f1 e, Q$ W; l
{2 ~6 J6 T. S9 K' Z
string s1;% e& A" p3 L6 V4 y* r
while(cin>>s1)! J A" C+ [; L( N
{4 J8 g0 I5 q' V |
istrstream isin(s1.data());/ E7 F' i Y& m, e N# R$ N- n) G7 E
double d;1 p: M7 X9 y' B6 C4 C. |9 r
if(fy_Exp::GetExpValue(isin, d)); l% ]* M/ s8 s ]6 k F- o
{) t" V/ P" q6 \
cout<<d<<endl;, ?* g! B. P, A5 u
}
+ Y+ ^* y" e& {6 O _' ], B$ Y, f* M& P else
% r* u8 _: \6 ^* R) s {) G9 ?) E7 [$ M0 C
cout<<"ERROR"<<endl;( d$ O% k0 @9 O9 ?7 ^0 J
}! o$ m, S' r" g% ~# m; E
}2 G& q* R$ `, M) Z
return 0;/ Y. V9 A7 B, k, t" G; r
}
( [, }' {4 W; V9 L8 U8 ^" I) g C: W* A% j$ W
+ x5 T4 E! n1 {0 `; ]
然后编译执行就可以了(*^_^*)
3 Q- ?, } T# c2 \其它:TC++上一定编译错误,不保证在VC6上也能通过编译- |) k$ [ s) C+ z( {2 w1 a
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|