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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
2 I0 R0 }+ @: ^+ C; T1 o一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 y" v: r, l) G/ I- G) K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)$ a) O: e5 j9 z. J
参数解释:
$ h! U3 l) p: a7 a' histrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 H* S6 v) c. R2 M2 |# b: q5 ]* gnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* c6 B7 X# F4 U: N# ]+ \) k: z
返回值:5 K; o* I+ j1 o$ d
返回非0表示计算成功,0表示计算失败有错误5 ~! ~# o+ V i* f0 b
, l1 u1 c! G8 d4 S9 S$ m( k
: R% R/ C, g" k- I: m" G! m1 ^5 [: g( n8 F) g1 {" e- H6 g/ k
程序代码: ) B% [# ?8 C. ?2 ~( [
& R$ m! G' j2 c. _" S7 A/ x2 G+ tnamespace fy_Exp{
$ b4 i" _1 d" B7 p" P: G% tnamespace {template <class _T> c/ E0 q+ f' E/ s u
inline _T GetExpValue(_T t[], char& csym){* ]; h5 B3 s3 y- R3 B- K, t
char c=csym; csym=0;( \8 n0 G! y) T2 K5 E7 N
switch(c){
9 H1 u( [% W2 c# i% X case '+':return t[0] += t[1];
( s, l' s: E8 _, @5 S case '-':return t[0] -= t[1];
5 T; | I3 r4 @8 p. ~' @0 o case '*':return t[0] *= t[1];/ @' L+ |3 u+ ^: q
default: return t[0] /= t[1];//case '/':
* K* P2 x' h% y: g }
0 L( _& N W# P% q2 H6 b}}" B7 ~2 c3 M, f6 C f# y* O
template <class _T, class _Tstream>
" i# O( I, A. M! H/* _Tstream: inputstream, _T: get return value. b; w9 \& K" G/ J! X1 @/ [
* Return nonzero if get value successfully */& x$ k! O' [, P# \
int GetExpValue(_Tstream& istrin, _T& nReturn){
i- D% U) v; X& z2 d" e8 w _T t[3] = {0}; //雨中飞燕之作& {. e" u& w! u5 p+ x$ M6 ]
char csym[3] = "++";
; R# ]/ k8 r& p/ @$ g2 \( X; T int nLevel = 1, nERR = 0;
6 ]$ z- S: d; b. D8 C! H if(!(istrin>>t[1]))istrin.clear();
5 I4 n5 Q# [! c, ^/ S# n& A for(;;){
# [7 w2 X6 a$ `4 f" m if(istrin>>csym[2]){1 C' L2 Z5 L) |% u
switch(csym[2]){+ B/ E8 M5 J* B _4 J) s
case '(':
( G. o( R2 g7 r6 s- D; Y) a" c3 o) w if(!csym[1]){nLevel=0x100; nERR=1;}else( G8 e7 c: ^9 k! o
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 C# E* L7 w; y$ O else{nLevel=0x100; nERR=1;}
. y% [2 |+ b C1 @- Q D0 U2 z: z) u break;- a! K$ ^) m( l- o" c
case ')':
5 O, `# e( T+ m# u2 M {nLevel = 0x100;}break;1 r# d; g" d/ B6 U( x/ h! j
case '+':case '-':case '*':case '/':* H# t$ T( r* e" z, X# O3 H
{csym[nLevel++] = csym[2];}break;
2 Z+ ^5 U: \* X- ]9 s case ' ':case '\r':case '\n':case '\t':continue;
, P3 G7 x. g$ O. |( u default:
' @3 x/ o% l) U' [6 W: r3 x* l {nLevel=0x100; nERR=1;}
3 J N& ~& t$ } r }
& K; K9 ^$ K3 M; O1 |3 ]; j if(nLevel==0x100)break;
6 r3 x) d/ E2 f( S if(nLevel&0x10 || istrin>>t[2]){& n6 I `* W2 y; E8 ]& I
nLevel &= 0xF;
# a' P$ A* o9 m1 J if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- m+ p t# b$ p
if(csym[1]=='*'||csym[1]=='/'){
% V L! f. e5 l* K+ `/ z GetExpValue(t+1, csym[1]);
& L1 S; Z0 m- s' C }
5 I3 n' R. ]$ i1 f7 ?; Z else{
$ ~5 _) v2 C/ i1 l GetExpValue(t, csym[0]);- [) f- ~' Q; `3 I) }: l3 K* w5 q
t[1]=t[2];csym[0]=csym[1];csym[1]=0; H6 h6 H- D1 q8 I
}
! n" x+ d4 h1 X nLevel = 1;
+ |3 a- R; ^" _: L& r }
9 s* D" t/ c( U+ Q: K9 u else istrin.clear();
+ L: A8 a- p& ?' X% Y) y }% l0 \( k5 R: q
else{nERR = -1; break;}- t! F, O- h8 B3 F' N5 L6 U5 U
}
5 z& u: u7 ?9 C0 i% V0 \. T8 ^2 N if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" I. W( X& G1 Z else nReturn=GetExpValue(t, csym[0]);# s1 R6 m1 @% I; W# w: F- n6 q9 g
return nERR==-1?1:0;
, e3 w: s, h( k}}/ R; D/ P* n; G; E$ e" Y0 A1 b
9 Y' ^$ S# U! h; Q( r/ _: r' B* `( C: x3 P. {: l, ]
& T! n2 o8 [* ^2 c o函数模板使用示例:6 b% s' m* j. o. v+ e% p4 W
在以上那段代码的后面加上以下代码:( Y- m% K& U& C$ k$ G
2 T2 Z6 r, n) j/ Q) D
+ [. A+ w5 s' a. a# o' l7 d4 \% b1 `. Z% D6 k. o
程序代码: ' m0 s3 m9 S$ c3 C2 E) Z+ C
7 s. r! n$ a; v1 z' J#include<strstream>4 R% u( L3 L5 b$ r6 m; G7 ^
#include<iostream>
5 v& b( r/ k+ g9 z. `, r* r#include<string>! j: O5 v$ |+ M3 d2 q* v0 A
using namespace std;) _! A3 f R9 g* g3 g
int main(void)8 c- t) r* v9 s0 q2 M. T( x
{
1 V1 i! ~! R( F6 j string s1;
2 [8 R, Q0 n9 v7 W: L while(cin>>s1)7 U0 x+ H& m, V6 g$ {
{
) C3 X0 p: C% c# w# c9 q) [6 p istrstream isin(s1.data());
w, a1 `: r/ {, g- @& T double d;; a- A# t" k1 B& L
if(fy_Exp::GetExpValue(isin, d))! P) f' T, s' ^& a& B
{
& ^1 `, k0 V! ~ cout<<d<<endl;% W6 D% H* I7 H9 b7 {+ J
}( I9 t0 F' O7 b* G# O
else
) ?: e- B- t9 U9 j- Q% J: Q {7 y4 R) r$ A8 G4 i8 F% v5 S
cout<<"ERROR"<<endl;
. P* t/ V; T! \" H+ p }. w; A5 f- v- @( ]+ f
}% H' J2 V# K& U! J3 P: f
return 0;& w: U3 q& j1 L
}1 }7 v' @4 n3 `5 M6 g5 l
2 G7 [0 F- l3 g
' N6 G% E/ Z, f$ G. Z然后编译执行就可以了(*^_^*)/ @, E7 \8 ^$ W! Z( s# z5 t" \
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 h1 s/ s' z* [: k$ f6 N 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|