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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,- S! ^* m) T9 Q7 B" n/ X& [( X
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 ?) O+ i( W, O, d
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( K) w" r4 r3 J/ w$ i* ^参数解释:
9 [* [. v& d/ s R& ^7 U" F9 `' `istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
5 R& F: R' B6 g. [7 b* S$ {' _nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定6 }0 X+ k( g: y* E; Q4 A ~
返回值:
6 n9 L: |! F# p. y- ~- H0 e返回非0表示计算成功,0表示计算失败有错误
! P' H* e" R- q6 H% B% F3 D4 c3 J0 m
4 L! x2 m7 j, E9 q" G
S' W# R0 z8 d
程序代码:
& m. a8 p+ w) z/ A; ^$ G" d! H x( w/ D
namespace fy_Exp{ t Y1 l" O: ]% Q
namespace {template <class _T>4 \% K+ g5 P- u6 B; s# L
inline _T GetExpValue(_T t[], char& csym){6 O6 L A, i: C; Y& a& o4 d: |
char c=csym; csym=0;+ a0 V8 Q" ?6 n0 O1 ^. V
switch(c){/ W& U- ^- t; O" @
case '+':return t[0] += t[1];- m- ?7 t) R( k- r! }
case '-':return t[0] -= t[1];- ]# B# { k) p7 G
case '*':return t[0] *= t[1];, O( L" l7 R* U* B" I6 Y. G! }
default: return t[0] /= t[1];//case '/':4 K/ X& o5 h7 p- J# d; f: I
}: _! k. ^5 J) y0 P% L3 Z3 K$ [
}}
5 G" } ^' E% k5 W, U; O9 |template <class _T, class _Tstream>
, S( F' @& [) R# p. z/* _Tstream: inputstream, _T: get return value
3 @4 c7 c( ?: I5 K* J. Y* Return nonzero if get value successfully */3 m+ V8 N% x6 k5 V2 N- h! G
int GetExpValue(_Tstream& istrin, _T& nReturn){; K( q( H, f( G I0 j# n
_T t[3] = {0}; //雨中飞燕之作
, g3 T9 m# ^% W char csym[3] = "++";; N6 e z) F, h
int nLevel = 1, nERR = 0;
* i# O: v; L. @1 o6 Q if(!(istrin>>t[1]))istrin.clear();
7 ]& F/ `4 w9 h$ i1 @6 v( O for(;;){8 W' g I, G- n+ }" O* q. a
if(istrin>>csym[2]){3 n0 n5 A; Z( d( X N) M
switch(csym[2]){- x J5 l7 n; b3 \
case '(':
( ~$ j+ ~- W8 C( W if(!csym[1]){nLevel=0x100; nERR=1;}else
, E1 R1 |& ]0 f9 c* ^1 } if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ W+ L/ x: m& U8 R else{nLevel=0x100; nERR=1;}
! g+ c, {$ ~2 P2 z6 `% o0 d) y break;+ r/ `. q+ a% U" S
case ')':6 W k0 M7 o+ f/ j
{nLevel = 0x100;}break;& ~; R* B. d$ z7 O2 b
case '+':case '-':case '*':case '/':) a. n1 `2 y( j
{csym[nLevel++] = csym[2];}break;4 Y2 U/ o# T$ G8 c1 A' W v% U
case ' ':case '\r':case '\n':case '\t':continue;2 p2 P( l: o: Z8 R6 X+ B( z& t
default:
+ D p/ M1 D1 k {nLevel=0x100; nERR=1;}# A) e9 N; X3 t; z# |8 ?: S8 k2 D0 B
}! e$ L& \% q& I. o
if(nLevel==0x100)break;
! |7 f |: Z( O7 X( o" a if(nLevel&0x10 || istrin>>t[2]){
& A% ]! c1 J1 r$ k0 v& K2 y9 t nLevel &= 0xF;
$ w8 ~& D( @6 _2 u if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# |6 Z8 d6 G2 l7 `" r. X
if(csym[1]=='*'||csym[1]=='/'){
& Z9 Y2 T9 m P GetExpValue(t+1, csym[1]);
7 l( O2 V% N( v }9 R" s- T# u' @" F) H
else{
: `* e' z+ k) M5 l GetExpValue(t, csym[0]);7 o4 O3 H& `0 C. v
t[1]=t[2];csym[0]=csym[1];csym[1]=0;, b/ v, H2 H. r. V5 M* z
}5 C7 Y+ _6 v8 c: _( m7 I) c
nLevel = 1;+ e \/ l" y3 K! p, _/ x
}
. c) h4 X& M8 {5 ?: |4 y$ I1 y else istrin.clear();5 {7 [1 ]5 `# t' j! u
}6 F/ u7 e4 b j* O! q
else{nERR = -1; break;}' g9 Y% A" t3 b; ?; X6 \; {7 U
}5 A7 A/ I/ v# J
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 w7 \4 ]6 D- g; W+ [
else nReturn=GetExpValue(t, csym[0]);
$ B( w3 I/ X! U w return nERR==-1?1:0;$ z, Q* _: D) k
}}. p4 m `4 l. e
/ ~- ]( e! j0 @: {; t
/ n* C, m. `, T4 y; R7 w. F
9 Q2 H9 s1 f7 k7 |
函数模板使用示例:% I: M8 e0 J1 h A% I' d% R9 k
在以上那段代码的后面加上以下代码:- `6 ~8 y5 m. j6 v( ]$ j% |+ j3 U
. U3 e+ m' ^* I h2 Z( p( w
& }: t: A; |1 t! V) U3 w0 z
1 M+ V& ^3 R' e7 J: Y
程序代码:
0 o: l; ^+ b0 p2 a2 _
0 q3 K0 i- f4 P' s. n+ H, G3 e; \$ J4 Y#include<strstream>" ]9 ^$ Z0 ^3 V1 [! v, |' e# R
#include<iostream>
/ y0 C% T2 i! E/ y1 l- h O! E#include<string>
$ C9 A3 B3 ]! Y; O% Ousing namespace std;# `* R+ n7 M2 X5 t: X1 r/ D2 R! h
int main(void)
# Y6 h1 Y5 s* o% N! r3 g5 O{
9 A8 m2 _# Y* r: [ Y7 c string s1;
& G" F" k& |0 A, o+ n" O while(cin>>s1)
: z7 e5 k: _& f, H$ q$ u0 ^/ \ {5 @+ m; L k& q' e8 f" j
istrstream isin(s1.data());( U! M: V: \1 E4 k7 X( F( y
double d;! W3 B: B# ~/ B; b, w+ s6 ?2 R" H
if(fy_Exp::GetExpValue(isin, d))
c2 T# d& e! r4 R/ i {
% l+ M# ?) k$ i* V d cout<<d<<endl;
6 H9 s1 u6 H: {2 [% j& L3 \ }; y0 E7 X0 A4 @9 ]7 V
else9 }% ^$ H* Z7 j/ }
{1 G; {/ ]3 |9 D
cout<<"ERROR"<<endl;3 n8 E. H! _+ S4 R, y- t
}
- j2 a! f0 M. A5 ]8 J8 M+ P6 {- n }7 z/ n1 r3 [1 K
return 0;
7 _3 b5 D1 i5 N( f) o$ D& T}: [) A7 Q1 U, W" C) Q6 h+ _
. d( k5 a, V1 b" a# r% h! j# d% ^$ K! n" o/ @: j
然后编译执行就可以了(*^_^*)
$ S) x; ]! |" W1 _) B其它:TC++上一定编译错误,不保证在VC6上也能通过编译
. ~8 k, E ]- C/ `# W 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|