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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; e W3 p8 W, x! M3 E6 X一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ [7 s% `. W# j4 v# n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), s6 L$ W$ N# P
参数解释:
9 f& e" I6 Y$ O* A" j! @4 Aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: S* Y+ q% [( O4 unReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 e, A! P* Y6 b) G/ [( o2 L返回值:
- Z) e- q/ g% a6 U+ {返回非0表示计算成功,0表示计算失败有错误5 }7 F/ m, W: c" h7 h% [1 i9 c% V
* E% {8 f! l2 d' @6 F
2 m7 y/ C5 h- M& l: j* D& l1 i2 o- j1 U; D2 z' T
程序代码: ; D# k- \' p/ y; [+ t$ {
. V# A8 k# a) e u$ f1 q2 ?& U
namespace fy_Exp{
( ]& u5 m9 E) R. w1 ?namespace {template <class _T>* D, d3 R/ [$ E0 d6 }0 R& T3 V
inline _T GetExpValue(_T t[], char& csym){- O: l2 S- Y4 V
char c=csym; csym=0;
6 n% T& a1 \! H6 K9 [8 X4 t switch(c){- N" |4 Q- y3 `5 `
case '+':return t[0] += t[1];
0 i% j% I. E7 m( ?! } case '-':return t[0] -= t[1];
h7 p7 g, ^; p7 q case '*':return t[0] *= t[1];
& G3 x4 ~4 y9 l, [* B default: return t[0] /= t[1];//case '/':
' }5 a% e k4 ~& d3 b3 A0 t/ P }- g) C) g2 q3 y0 |
}}, ~7 L. Z; o }. i( |+ B H
template <class _T, class _Tstream>
* s/ k) z( f8 ^- e% B# U/* _Tstream: inputstream, _T: get return value8 n( J1 }6 z/ S
* Return nonzero if get value successfully */. u+ ^8 Q- y4 k. \8 Q
int GetExpValue(_Tstream& istrin, _T& nReturn){5 V5 w' ~' y. g5 d3 Z
_T t[3] = {0}; //雨中飞燕之作
) i) _1 b6 [! t9 ^* V/ y' w char csym[3] = "++";
: x5 G% Z+ o; ~4 O$ ~( b0 r int nLevel = 1, nERR = 0; Y* y* U& d" l" _$ X" c+ h! x
if(!(istrin>>t[1]))istrin.clear();
" T% W; X* K3 u3 e( u$ O! f9 V for(;;){
8 | n, c! c4 q7 n if(istrin>>csym[2]){- Z5 z" Q% d R, D! j) b- X; k
switch(csym[2]){* \& _0 F4 x& t- R
case '(':
$ `( l- ^" r- Y' C: P if(!csym[1]){nLevel=0x100; nERR=1;}else, u u& k* r6 Z: p
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
% A: t: U! d s+ e# F else{nLevel=0x100; nERR=1;}
. j; O! d* q( \0 M6 n break;
2 a e Z* A }2 V case ')':* I) }# Y/ o. I1 W# Z$ _! z& O
{nLevel = 0x100;}break;/ _8 D9 d5 R5 Y
case '+':case '-':case '*':case '/':
6 S) A6 @% Y/ L) n$ F {csym[nLevel++] = csym[2];}break;+ H9 g, W1 U( W8 a" X0 w
case ' ':case '\r':case '\n':case '\t':continue;
9 _+ E) E9 q9 j2 o default:+ S* G# q. l* K$ B& W
{nLevel=0x100; nERR=1;}
: E* c- M$ Z& M# h }
3 r0 @5 j8 H- M( M2 @1 J1 v if(nLevel==0x100)break;" _8 T% E4 X& V
if(nLevel&0x10 || istrin>>t[2]){6 @* |3 u' q& {% N
nLevel &= 0xF;9 f9 l o0 {0 `) B5 R
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 \7 F- K3 {7 y/ Z& R+ ]8 X if(csym[1]=='*'||csym[1]=='/'){6 A3 @( N6 T7 d* o6 ~$ Q
GetExpValue(t+1, csym[1]);
& |) B+ N& n* v6 h! }. D( W }
1 {+ h3 C r, S else{- I5 Y2 ]6 ^# J; N- r" R y; ]' T
GetExpValue(t, csym[0]);9 q6 w" i/ S1 P
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 ]1 M8 j, v8 w% j) E }; \% Z; s G. B0 `4 Y
nLevel = 1;$ g/ M5 O1 s( @" d
}/ q, B, d' V* K2 c! K
else istrin.clear();
$ t% Z! a' f E! z }4 R [; U9 O( R
else{nERR = -1; break;}
$ ]' e8 q! p6 e d0 |7 p }" R; s: _4 M p9 A! f' @
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, o0 O( U1 i" G else nReturn=GetExpValue(t, csym[0]);
$ b/ M9 l2 Q6 J8 a return nERR==-1?1:0;4 n9 s2 g. A1 w k
}}
4 D2 P& F% \% U8 [1 X) w0 H# z0 i q7 u: f4 p6 u1 Y2 h! ]
1 u0 Z+ w( O$ h# [
2 Z, I: J- Y) h
函数模板使用示例:! V$ o6 {- L! r S; j: u, y
在以上那段代码的后面加上以下代码:; J+ @7 O7 R' V, G
- y0 W9 }$ q9 A/ u5 E! x* c7 E
5 l5 R Y6 ^) p* Z* c1 d
8 X' T, t; j, Z' m程序代码:
6 t. C3 m" m0 O A, |0 C3 H+ d. C# `3 X' g
#include<strstream># t1 _7 x6 g! u9 x! e8 v
#include<iostream>1 A5 s7 I/ i1 ^- J6 ?
#include<string>
* y: I7 U8 X. T2 {using namespace std;5 Z! z! P7 F$ L% n- [' M
int main(void)
2 D/ A1 N7 h: R{
* E; V0 f5 ?' g4 G string s1;$ X+ q; p9 ~: u$ g
while(cin>>s1)
+ _7 y( _" x8 b$ c2 a4 ~ P {* X5 u" e2 W; S" e+ ]( S# u
istrstream isin(s1.data());0 I( C& G6 m8 h" p$ |8 }) u. I
double d;, ^# {% L7 M5 M/ |: `3 C. k% ]2 K
if(fy_Exp::GetExpValue(isin, d))
; G. o( c$ _8 ~2 L2 X& @& `0 F {
( [+ e% t' w1 b% z+ ^ cout<<d<<endl;
3 o5 \4 j; f- a. S! \1 F/ |- c, C! j: a }
. F# D6 F1 ?6 G* x else% m8 m+ u# s- H9 R9 K8 O! o
{! i. U3 I8 d( f6 G( c3 ~
cout<<"ERROR"<<endl;
" B' v& X( z* l7 d }
5 ~. K4 ?+ |! r5 t @ }
& Z4 ? ^5 P9 p' F8 n; W$ P8 y0 |/ \ return 0;
2 ]/ c: a+ B% N7 x. o" J: }1 [: o! L}
% g) I/ W! x* }, ~0 n9 B6 K. m- j9 H1 D
: n j' N M2 p! w) P然后编译执行就可以了(*^_^*)1 `1 O9 y" ?% Y4 T- O
其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ z/ ] b& S/ b& S; F
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|