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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,. S1 }# @# l4 i) T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- n& e: }. a3 _: h* M只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ p$ P/ K7 M# a; ]/ u
参数解释:+ m5 g3 x, R: O* C* k; M% n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- u/ u0 M/ ?- |) O5 anReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 q8 V5 a \2 X% u
返回值:
3 q. P+ D P- v% A9 B6 M返回非0表示计算成功,0表示计算失败有错误
5 O3 ]! @: E! s2 I/ [! o* g! \( X B" ~$ `; L& `/ P
/ j A' K2 y9 D4 o
" ]& y+ Q8 _. B- b' m$ l2 Y+ }
程序代码:
8 n/ V. h2 }2 N/ P6 r* Z
+ `8 G6 U9 N( p# [9 k% b' znamespace fy_Exp{
5 z" }; Y8 L! m8 J( o9 c# {namespace {template <class _T>( r0 {' K4 n5 S& Z9 P
inline _T GetExpValue(_T t[], char& csym){
/ k$ v/ f/ i O; v+ _6 m char c=csym; csym=0;
: m9 e7 s! Z3 N) X+ Z' J0 I) h switch(c){# M1 O6 o5 Z# K6 u
case '+':return t[0] += t[1];
! `: j/ L9 D# r, @3 i% k# v4 A! h case '-':return t[0] -= t[1];8 n0 A! h0 S7 {
case '*':return t[0] *= t[1];
3 X# Z: k* S \0 e5 R8 x. ? default: return t[0] /= t[1];//case '/':0 _1 d+ v2 h" F2 R
}- q3 h* Z( C; M! _" C
}}$ G. J1 q8 @9 P6 s; @0 p, K
template <class _T, class _Tstream>( ~4 w- h2 H! K* E s( J, V2 l
/* _Tstream: inputstream, _T: get return value* S, e% P' b' P# Q6 h- p
* Return nonzero if get value successfully */* Q( |6 `1 [" @2 u
int GetExpValue(_Tstream& istrin, _T& nReturn){
! p5 O, k- X5 j" }2 z8 } _T t[3] = {0}; //雨中飞燕之作
% D% U6 b A5 U5 U! f! A char csym[3] = "++";( p. |+ a; ]# J; v( f" H
int nLevel = 1, nERR = 0;8 `8 V. }- A3 A* X8 [( l! j& E
if(!(istrin>>t[1]))istrin.clear();
! r; E, D# O; L: L" m for(;;){* s$ r$ `3 {9 U! m- }+ h
if(istrin>>csym[2]){
+ p! L9 }# i: n/ f+ t* F3 O switch(csym[2]){6 K' O! f+ x: j1 O$ G
case '(':8 O! ^, B1 f( E9 c. m5 O0 c; L
if(!csym[1]){nLevel=0x100; nERR=1;}else
" p) |! j, S$ K5 d if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. A( H# F/ t" _. g9 p$ C
else{nLevel=0x100; nERR=1;}
3 O; G2 Q& G. v- ~: y) F" [; k7 P break;8 z9 J) Z; x4 l
case ')':
+ a$ B. V9 ^; E7 h5 W5 R {nLevel = 0x100;}break;; |5 C. u2 ~" P0 o5 U& k( w* H1 O
case '+':case '-':case '*':case '/':/ a$ `6 r$ I8 r6 g
{csym[nLevel++] = csym[2];}break;
; P5 H/ k+ q* q9 ~ case ' ':case '\r':case '\n':case '\t':continue;7 ~/ m$ o1 L h) T9 o
default:
+ v6 O* C3 T: I7 } {nLevel=0x100; nERR=1;}
, \- d0 Z; C/ S$ e }8 m0 H, W. { ?
if(nLevel==0x100)break;
+ r6 q6 |6 f. A- r0 k1 n if(nLevel&0x10 || istrin>>t[2]){& c8 g9 w: V$ x1 s7 _
nLevel &= 0xF;6 G/ j9 P6 N2 H; ?" o
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 m5 l" j5 a' R* W
if(csym[1]=='*'||csym[1]=='/'){
1 x; Y) i* ^0 L3 @' u7 d! Q) [ GetExpValue(t+1, csym[1]);
W0 Q% g; Z% l# b }0 i+ a% ~8 S* [
else{
. ^; M3 j1 \! U! z$ }6 j GetExpValue(t, csym[0]);
/ O6 h, Q" L9 }" h6 K t[1]=t[2];csym[0]=csym[1];csym[1]=0;
) ~" S" l+ ?* E7 I }+ i# e: w }6 x) l% M& c
nLevel = 1;
' V0 a; n* @& G9 I. } }! h3 n1 A/ _5 Q0 `+ d8 n/ ?
else istrin.clear();
" n& s$ j: r# P }
; J1 c: }0 ?* {% C7 I3 C5 R else{nERR = -1; break;}- v: d1 {; \" o
}
! V! c3 R% P. o, o8 E" y; a if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
% m9 [* e7 M+ b else nReturn=GetExpValue(t, csym[0]);
* \) h, ]3 I; _5 i" J) K return nERR==-1?1:0;
( c6 @# {. c9 j3 ~/ X}}
' O7 d8 A, D( }1 C( S. T( I. A1 q$ [( {3 P5 {4 [3 n. Y
& b. R( J& `7 {$ v' H
# F1 c" w8 m( {5 {' Q函数模板使用示例:: c, c+ k/ q( i2 Z
在以上那段代码的后面加上以下代码:
9 y, S' ~' X) n
/ I& x1 v2 l. H, y+ l! L
u* h5 ?0 C2 X. n6 _& `
: t' Q6 [$ V/ J6 o" F& K+ j' g程序代码:
4 r; q1 f/ A4 d2 P/ P
, E0 S2 ~0 T9 H2 r#include<strstream>! V+ W) H9 n2 _8 V* f- q& j
#include<iostream>/ s2 ]& ~' l5 W4 x/ } _
#include<string>
. O8 o7 z" X$ E# V% j' gusing namespace std;) c) z. T. I1 T& k( I
int main(void)
+ `2 \7 Y, o- G$ b5 c; v{
% a; v+ O% H/ t8 Z string s1;
4 C1 Y9 D$ @- n/ i+ v6 c/ f while(cin>>s1)
" Z& l& t4 n0 R: O {5 p6 L' l; I! }
istrstream isin(s1.data());) s* G* @: ~* V
double d;4 }% H V" X' y- G# K5 o' Q
if(fy_Exp::GetExpValue(isin, d))6 c* F7 q0 J0 `# I; Q4 M
{! a& @9 E* \- z6 N' r
cout<<d<<endl;( C( {: B% p) y
}
R5 i5 W! Q; \; a: s else
# W5 ^- ]) j2 \! J$ B {
' z7 {& ~( i3 X+ s! c; x cout<<"ERROR"<<endl;% |3 U# s+ c1 c
}/ X$ Q O' p: _/ A, ^ s- `
}- K2 i( `- b, J1 ^* O9 ~
return 0;
2 z* Q* Z6 n0 `6 }}9 q m* K5 K2 p: j, {
4 n' E( R0 f: o* U3 [5 o8 X
6 k0 H4 f6 l# F8 Q/ W1 T4 ^' ~, g然后编译执行就可以了(*^_^*)1 B4 n/ C' u5 s8 y
其它:TC++上一定编译错误,不保证在VC6上也能通过编译# f \# p* Y( _ d8 u! K
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|