标题:
一个计算四则表达式的模板
[打印本页]
作者:
zw2004
时间:
2008-1-21 20:17
标题:
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
. m D# e9 V/ T6 {. X
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
* L! l. O, J/ ~
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
6 E( N q/ i1 f, Q, w& {2 a
参数解释:
: L7 e' o0 F9 @9 R g: q @
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
0 L7 W* M4 j8 j
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
% l' {. M& |. i, A* ?4 }9 a# c- X
返回值:
9 H: Z" n- G, x
返回非0表示计算成功,0表示计算失败有错误
. d' p/ R, V' R# y' E) J
y1 }7 y5 [ e/ ]% z2 J
: L% t9 g: ^; J# W9 T8 v
7 G3 ]+ Y, R* b! I/ ~) A8 X3 i
程序代码:
' t' i/ G B7 W% r6 m1 {
! [+ C# y* f. I1 B+ Y
namespace fy_Exp{
0 C3 {$ X2 H( B. n
namespace {template <class _T>
7 h+ ^1 `1 U- x( o+ g
inline _T GetExpValue(_T t[], char& csym){
' p5 k: ~ j& t$ _% t/ _9 q
char c=csym; csym=0;
6 R$ ~, ~; E% C1 B8 c, b
switch(c){
/ u* e# B' U ~( w$ x# A
case '+':return t[0] += t[1];
) S1 N: B. D+ F, O+ K2 S8 G: [
case '-':return t[0] -= t[1];
) s# L7 d/ a+ a3 |
case '*':return t[0] *= t[1];
) B7 h& B4 N. s/ d8 l$ q9 |
default: return t[0] /= t[1];//case '/':
0 t. g" G. S) p2 C# o1 j( k z, s
}
, O8 N" I6 y) {/ P) V- N& x
}}
( ?" _6 l4 M% r/ B
template <class _T, class _Tstream>
6 u1 }! H V5 D' V3 g
/* _Tstream: inputstream, _T: get return value
b% L0 R* y) b
* Return nonzero if get value successfully */
* J0 H4 ~3 y- B9 t
int GetExpValue(_Tstream& istrin, _T& nReturn){
* c% p& s6 x n0 {. c1 F
_T t[3] = {0}; //雨中飞燕之作
6 i4 \5 q6 k% s4 j5 }. y( N
char csym[3] = "++";
2 q; o3 S" ] M7 W* V6 W" p
int nLevel = 1, nERR = 0;
. }1 L* [) f' R- V5 X; p
if(!(istrin>>t[1]))istrin.clear();
% ~( P( T, Y5 V4 M) @5 j! u
for(;;){
& c$ i8 ^+ [% f$ ?
if(istrin>>csym[2]){
( j/ B# S: E) Q r9 t7 c+ t
switch(csym[2]){
, F3 W+ T9 C) Q) X# d1 Y' T
case '(':
6 |/ |) L! g# N. O' \
if(!csym[1]){nLevel=0x100; nERR=1;}else
6 R4 S) o( |0 P/ L/ |
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
! a$ j: E, g0 |' H# J1 D7 u7 I
else{nLevel=0x100; nERR=1;}
! n5 w5 ?. }5 i' N5 s: I" w8 D0 H
break;
- I( Y |$ N: ~6 U! X& [7 n
case ')':
; t: o/ J' q& ~) B8 @
{nLevel = 0x100;}break;
: i, v% E3 _) m. L
case '+':case '-':case '*':case '/':
4 `* b* y- s2 L, N) h; E; ?
{csym[nLevel++] = csym[2];}break;
+ B, f+ J* V3 z! ]: r/ `
case ' ':case '\r':case '\n':case '\t':continue;
j8 Z2 [+ H! a" Z; t4 V; }$ M
default:
* \- x7 w8 Y( _" A+ ?5 Q% n: } O
{nLevel=0x100; nERR=1;}
* @5 y2 P! g6 q0 S) i# @- a" U
}
4 I5 K2 F( c9 q: O6 b) |
if(nLevel==0x100)break;
' W m8 z1 `5 X4 a! T
if(nLevel&0x10 || istrin>>t[2]){
( K% z0 i9 C/ Q: t3 ~/ R$ Q
nLevel &= 0xF;
# ^# w" v1 M8 E0 S' s+ {$ e: n
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" r, ^$ L- U5 Q1 ^7 d
if(csym[1]=='*'||csym[1]=='/'){
+ V4 \$ x9 b, ~" E; `
GetExpValue(t+1, csym[1]);
- ~& q9 B) P9 P" |
}
$ V. m* [0 W( U( K
else{
6 P( v& m& X( m& u1 @* [) [
GetExpValue(t, csym[0]);
( x. v4 r: f8 C6 |% P1 ~" C0 V4 L
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
0 `( {5 G( N8 K0 ^& g! W, Q5 R/ J
}
8 J1 h" f ?/ x/ _
nLevel = 1;
0 }, Y- G, V c& I k5 R! W5 k0 j
}
6 ^3 j" _% ~+ n0 |0 J: n0 {
else istrin.clear();
$ Q/ S0 b/ x* z2 m* x3 W
}
3 y" H' j8 j8 B
else{nERR = -1; break;}
/ }( n0 k2 X5 r. {1 Z0 F# N P) i
}
) Q g- W/ }' B0 R. ~
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 |3 y% O; `2 e5 L8 _
else nReturn=GetExpValue(t, csym[0]);
: p# p l; y& p
return nERR==-1?1:0;
6 X6 k9 t% |$ t. K' O+ F$ Z
}}
7 w9 ]/ }4 Z: B9 @+ x2 |: Z7 Y, @
/ F+ W }% T$ o0 ^
9 e! v! A) x ]& S- f( k! v; E
* q5 h5 Q2 z. u$ d P: |- ^6 |" v% W
函数模板使用示例:
" x: X# X H8 h4 ?
在以上那段代码的后面加上以下代码:
0 Q1 o3 @' u1 l4 W! R- j7 Q
+ [; l& o1 B' j9 U0 I* F% a. x2 ^
6 l. o9 e; |& o2 K
4 P' X" ]+ k- ~; L6 I
程序代码:
! c* E2 w/ b- U3 u# z1 o8 s: J
" l2 T- L6 M( B! \
#include<strstream>
4 R4 R5 F8 G& y
#include<iostream>
% c$ ~2 T |9 B0 s
#include<string>
6 i8 Q3 F) u' `
using namespace std;
- \, O; G, s( Q4 n6 k6 S8 F
int main(void)
|0 b% n$ Q% y* w- h2 \5 v- z
{
' G1 j. ]6 ^" E* {$ g; m; k) W
string s1;
- A5 b8 H" L$ _6 h' _; s G1 \
while(cin>>s1)
$ p: i5 I1 B- j2 ]1 Q0 c& H u
{
5 K- [1 E% y2 f$ Y0 {7 ^3 b: C/ ]
istrstream isin(s1.data());
- G2 i! w9 D$ N; U
double d;
6 ?, h4 h; o5 h& h
if(fy_Exp::GetExpValue(isin, d))
) t, I6 o0 m: I3 {0 V
{
) N1 r& y) @2 O9 l: h' s% {
cout<<d<<endl;
/ h/ [4 G/ O) M; l
}
; v! u+ @3 ~- f5 ~ N% w1 \: Y
else
! T. f- C" A, `% x
{
# H. n7 g& r9 O8 w F/ @
cout<<"ERROR"<<endl;
# X$ u( w4 }3 K B# l/ T0 B; h1 _4 u
}
7 u, x9 D+ @ t: D
}
5 U. F- G- q( {2 B) |4 ^8 s& e/ j
return 0;
+ G4 P8 O, p7 \
}
. i! p; G3 q/ h- _' }2 S! Z
# ? ~' t% v( r
- D6 E3 K( g7 I+ q. o7 R, j
然后编译执行就可以了(*^_^*)
e5 R3 w* j7 \7 s2 K+ ]
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 e. {1 e$ ?0 M9 l3 b" \. s6 n" W
建议使用VC7或VC更高版本,或者使用GNU C++编译
欢迎光临 捌玖网络工作室 (http://www.89w.org/)
Powered by Discuz! 7.2