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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
' G& e d% S3 q: @一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& E6 S5 ^- D, B$ F% q5 f: K- B9 u
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 q% _5 O3 Q( I) [" _$ Q! L* U
参数解释:) E$ N) r- K- a) s$ a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 n' G; r) r4 @nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 K/ `' L& q6 r6 Q# Q
返回值:
' \9 n" s3 p6 H' V( x返回非0表示计算成功,0表示计算失败有错误5 a v( |; \" J* R& ^8 ]: s
" [/ e7 k* O# ~3 E4 N: M! f
% p! ~6 A7 a, [' ]' F" t: X2 Q
程序代码: 4 {) z7 y) ?, \
. R T2 O) z a7 W# d
namespace fy_Exp{# _5 D( v) O- u- w1 B' {0 [5 \ c
namespace {template <class _T>; }+ ]8 s* e! {8 G }
inline _T GetExpValue(_T t[], char& csym){ m6 a. @# q8 {3 h
char c=csym; csym=0;# n3 t( f4 W a1 S1 u2 r
switch(c){; \0 u" R( T$ j7 D
case '+':return t[0] += t[1];) c0 x$ k7 c, O, ~1 p" N) F' [
case '-':return t[0] -= t[1];( c7 `9 y s" s' \3 Z: l
case '*':return t[0] *= t[1];
- Q; c7 m7 l* }: R6 i' y r default: return t[0] /= t[1];//case '/':% F1 F% P7 ^' {2 f
}& ^/ m+ ]2 S- ]7 o% C4 q
}}
# c8 ^" _2 H/ `template <class _T, class _Tstream>
( @5 H1 [: @1 h! j' v; V9 |/* _Tstream: inputstream, _T: get return value7 _' X0 v3 I0 B" b
* Return nonzero if get value successfully */
$ M# I7 @& f9 w* S( B0 G) eint GetExpValue(_Tstream& istrin, _T& nReturn){3 Y5 F4 Z0 P6 p$ G3 d1 O1 w
_T t[3] = {0}; //雨中飞燕之作 b2 M/ M8 b) M( h/ [! O
char csym[3] = "++";7 D% ]5 Y' d- L! M8 O8 E( k( z
int nLevel = 1, nERR = 0;
7 n$ }5 {; F) `& ~& n if(!(istrin>>t[1]))istrin.clear();% ?! N/ }: r" E5 X- T# Q2 w
for(;;){/ t( L! A9 D* k/ T" [/ B4 m; I
if(istrin>>csym[2]){8 o2 Z9 ^1 R2 N# _9 S/ P
switch(csym[2]){" Q0 a0 N4 P" ~! j; b
case '(':
) {) I) e5 T! K; i' w0 F if(!csym[1]){nLevel=0x100; nERR=1;}else
7 H4 ? U( n0 S' v3 f% _ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
( I2 W5 G5 x! F else{nLevel=0x100; nERR=1;}4 X# U6 Z c$ T& [
break;2 Y) `$ |6 {4 f' a
case ')':+ _. u: l$ G3 e) }* `, {
{nLevel = 0x100;}break;
( v6 k$ K; i L1 ?+ W case '+':case '-':case '*':case '/':: T" A% n) b& ]
{csym[nLevel++] = csym[2];}break;
, v3 A" x) \: p* d5 e& L8 g case ' ':case '\r':case '\n':case '\t':continue;6 {# I6 ^8 J8 A! {7 _
default:- Q8 w2 u, |% U: [& {4 V
{nLevel=0x100; nERR=1;}
" X; P; k& }" X }- | m1 o& }( O% g
if(nLevel==0x100)break;
# _4 p. A& f% Z5 S7 z if(nLevel&0x10 || istrin>>t[2]){
+ D: K5 d' H5 m! P9 i: \1 l nLevel &= 0xF;
( b- T6 B( |- B4 X3 } if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}( A9 F/ ^1 F9 L/ s6 `- W3 ~+ H
if(csym[1]=='*'||csym[1]=='/'){
+ C; a9 O; C! y GetExpValue(t+1, csym[1]);: ]" e- l4 G0 j/ q9 i9 E
}
: S# c9 F/ B0 j( v* f else{
. C8 w$ D Z7 x# p' R GetExpValue(t, csym[0]);
2 e( z9 p* ?# u* {2 y2 f t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* W' J, o; Q+ ^! m$ q# X }1 F/ | o2 b$ j, s' e( w
nLevel = 1;" A; B% b4 j! x( k6 l8 a7 t
}' a3 {& V4 g/ r* e+ a7 W) h
else istrin.clear();
* `1 F* @% `* Y2 G7 ` }
9 G: a" j9 p; x4 l# M0 } else{nERR = -1; break;}
) h! J& \2 `- n9 F }9 F7 R, k+ C" ~5 F0 C7 _
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: j8 N- b# T# ]0 k/ Q else nReturn=GetExpValue(t, csym[0]);
. Y) O1 N0 g& y return nERR==-1?1:0;
4 q& F" s! a- i! V9 ?6 @/ M! B/ l}}
" Z3 K3 F$ j+ J- C0 s$ N2 `: c5 m* e
; q% ~( U v% A, t9 \/ E& p$ {# T
0 S* F4 g1 ~. g+ H- b" k7 _4 [/ }2 _9 j- g) p
函数模板使用示例:0 K& I, A% h: o( @/ a) Y
在以上那段代码的后面加上以下代码:
# N; g3 l6 B5 W, K9 p* D! ~
$ I( r1 @4 m8 L( ? l) O5 A9 j$ j8 P( Z. A # Q* W1 u, B! e1 V8 R, q0 |
% E" U8 K$ P$ @6 O' |! u, H# R
程序代码: , P8 _( {" ^: U& s2 K
* D6 n' h2 c) { P#include<strstream>* g) Q L( G- K. n8 P: G3 J
#include<iostream>! x( H! c$ C6 d; W- z1 E# [- I
#include<string>
' u' G0 b7 {, a Z. I& z e. r7 [using namespace std;8 D' Q: L* z2 _' X/ _, {( X' U
int main(void)( j) C9 _5 A( a2 K1 X7 E
{
$ M1 @5 [4 M% K string s1;
/ i8 o7 u' s: O; G% J while(cin>>s1)
% }6 r# {7 [; r( s9 S {4 E, e) [; i9 o9 f5 ~' e9 o& o
istrstream isin(s1.data());! k1 j: ]4 j2 P, U2 h
double d;; K7 P! O7 W0 a7 Z( p- Y' T4 }& [
if(fy_Exp::GetExpValue(isin, d))
2 _: |+ l6 u) x$ M {5 h& V/ C" ]: {1 I9 w
cout<<d<<endl;+ Q) b7 l) y# H9 c8 B
}
+ X7 \5 M: R* l else( u4 I, j8 X5 g8 |' G* T+ ?! y- ?1 w! Y
{
2 c" S( x! j, W: D8 \( e cout<<"ERROR"<<endl;
l! ? E% [- `9 Q }
! ]' B$ J" x5 O* n% W" N }1 P0 n5 ?# @! h; R% W
return 0;! U% _5 K* C! P
}
5 Z, D* G% h) s9 {( n( k. L3 \, f# _
5 o1 T* G7 p' T( x2 a7 N/ u5 q6 ~& j3 d然后编译执行就可以了(*^_^*)7 B; q9 O' R8 v- {% e! p' r
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
, f# A; W) G5 [/ ]- ]: v% X$ F7 z 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|