标题:
一个计算四则表达式的模板
[打印本页]
作者:
zw2004
时间:
2008-1-21 20:17
标题:
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
8 P- j! @# ]. p7 \$ h
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
0 z2 _% w# |3 \+ Y9 S
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 o9 Z" |; R9 ~" R8 Q& m
参数解释:
3 m0 y" \: ? H1 L- E, R; @! {+ h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. v) \( d/ j1 {( `. [: r+ @
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 H% c4 Y5 Z9 j1 E
返回值:
! [+ O! ?4 z- p' a3 f
返回非0表示计算成功,0表示计算失败有错误
/ p$ k& g9 Q5 _+ ]1 a a( }. Q
# A: B2 f( \. G, p; S: K' M6 X; g
! {* Y) p( `/ |1 s ]1 Q) V! ]
5 |) q; c1 O& C$ ]: O
程序代码:
6 F, j/ M1 a7 @+ H
; J* }' N* e7 p# T3 N' s! k7 v8 D) D
namespace fy_Exp{
3 n4 y# a2 q( [/ y$ m% E
namespace {template <class _T>
8 N/ N' \) w+ Y" J- {. E
inline _T GetExpValue(_T t[], char& csym){
% e7 W( V0 ?: F2 g: [
char c=csym; csym=0;
% I0 P/ m1 y \2 Y# j
switch(c){
8 j- M' W6 ~3 ?; ?! B
case '+':return t[0] += t[1];
% B6 i4 v% ~( w2 u2 K
case '-':return t[0] -= t[1];
8 v4 O2 N$ J6 k2 R
case '*':return t[0] *= t[1];
3 I6 o0 b* `% P- i# K
default: return t[0] /= t[1];//case '/':
( p) N: B" O) B$ @1 y3 c# b
}
9 I/ S" f/ m! I: `+ k* R4 @# v S
}}
& }$ r3 G& Q+ M8 `, z( `
template <class _T, class _Tstream>
}( b3 B- W$ F8 l% ~; A2 i
/* _Tstream: inputstream, _T: get return value
: K/ }2 g# G% `9 j8 A: K7 E5 m
* Return nonzero if get value successfully */
: x7 e: C$ r: m+ [7 a- z1 ^8 b
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 I" L0 c' q7 U0 u
_T t[3] = {0}; //雨中飞燕之作
" U7 `% j5 g9 S1 B0 n# n
char csym[3] = "++";
/ Y8 |" E. N' |. X/ r8 F) k
int nLevel = 1, nERR = 0;
! n0 ?* X. q& w6 R: D; t
if(!(istrin>>t[1]))istrin.clear();
, T$ \! h9 d% }- V' r
for(;;){
2 i3 } o1 F6 X9 c+ c W4 X
if(istrin>>csym[2]){
' o! y1 \5 R9 J2 R1 x& x5 A3 g
switch(csym[2]){
/ e5 k& Y4 ]) h/ E
case '(':
$ U3 [! Y( c. |! P. w
if(!csym[1]){nLevel=0x100; nERR=1;}else
$ z L3 K3 B6 X" t5 T: b
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ Z4 X4 B1 k8 G, t0 P3 o
else{nLevel=0x100; nERR=1;}
0 c$ i* y: K( F& C! d: S; U5 T( _
break;
" J! K7 G2 }4 F+ Y3 r
case ')':
8 T0 D1 ~' i6 F j. F1 ?
{nLevel = 0x100;}break;
) ^( J+ J) m* I) f# \$ z6 t, W
case '+':case '-':case '*':case '/':
' w" m% Y1 e; |+ q8 e, ?
{csym[nLevel++] = csym[2];}break;
i. x& h* h+ P5 _* {
case ' ':case '\r':case '\n':case '\t':continue;
7 i# U5 `' \3 F
default:
9 U: ^' j; q7 Y; K/ f, t
{nLevel=0x100; nERR=1;}
0 H$ t2 ?' z# B6 P7 |
}
6 w" f- ?' @" H
if(nLevel==0x100)break;
3 Z1 \) }( ~1 F) [
if(nLevel&0x10 || istrin>>t[2]){
' |* U) k1 Y" n4 \
nLevel &= 0xF;
. w }, X, Q- D9 ~' P
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 c0 d. @ c* b4 k2 o
if(csym[1]=='*'||csym[1]=='/'){
% w9 C6 l; a. c% n# S- d- h) \, I' m
GetExpValue(t+1, csym[1]);
" K" {- M. F$ ]6 f0 g
}
* K, q: Z$ ]7 x; ~/ H
else{
8 M/ y& U) r0 c, a
GetExpValue(t, csym[0]);
' V1 c) f. L4 D4 L/ }1 U$ Q
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
; s* V9 G( Z. a2 p' z6 t+ f* B
}
% q8 C( S Z* Q# |3 w: T- a
nLevel = 1;
0 i& n# U, E# m% S/ U/ [& X( ~- B
}
3 N, u0 T r/ M( g; L
else istrin.clear();
3 Q6 i; [* i2 |6 U
}
/ M _, C! `9 V. c3 v( H* W
else{nERR = -1; break;}
. V7 G& Q7 z( Z4 I! h/ u" x
}
: Z" v/ h/ ^' ^ U* E) [1 h- s/ f0 `
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; [4 \0 F! B/ C/ e8 \& ?
else nReturn=GetExpValue(t, csym[0]);
/ { `; ]! {. u! |% c R
return nERR==-1?1:0;
5 n. r; }% y# u/ P4 ]9 N9 U
}}
' ~# X) C) [0 r9 o& E4 {8 O
! f& j. s0 r/ @$ S4 M
. d5 P( Q- c0 t" `
. m' A5 f( b+ f. A. r3 l
函数模板使用示例:
$ j: l; o1 p5 p8 P1 _) F; S
在以上那段代码的后面加上以下代码:
0 m# i3 I( G+ o* q, X& N
, C5 a& D9 d9 O% ?! O/ T
( c. b% W& q7 B' K, _
, c. V8 h8 ~7 H U" K% M2 J% E
程序代码:
, j4 L$ H" e" g' b+ [! b9 h' t
% ~4 ?1 P( T# M' x. N$ n8 V& C5 o. t
#include<strstream>
. `- b4 Y! O: ^' B
#include<iostream>
( Z( S" Z9 x0 @, h9 r
#include<string>
9 _2 x8 M/ _2 }2 f9 y5 Q) Z
using namespace std;
$ s5 p5 z% @) ?; ^+ f/ ?
int main(void)
. n+ x+ N* I: e5 P( L
{
n8 Z/ N# k' d# ~, k4 j9 \
string s1;
( Y/ z1 c. P& l8 C3 \* O
while(cin>>s1)
. U0 d! L% g7 w9 O: G
{
t& u' ~( v3 D7 s5 B( {
istrstream isin(s1.data());
: s# I/ U, `- {- `5 j$ k* ^) v! a
double d;
" W+ D$ {' U5 K% ]" {
if(fy_Exp::GetExpValue(isin, d))
) g! F( l; X @! ]
{
! B c1 K/ E/ V, o( S6 o
cout<<d<<endl;
! T- z1 j$ m. X& x/ }
}
+ m* `/ K9 b6 [, h: W( A
else
0 D* G8 [0 e w5 S; N1 [
{
8 H$ z; B0 ?) a. f
cout<<"ERROR"<<endl;
$ |+ Q. g& B; c$ V. L
}
* p) U/ s4 ~0 f' H; @% X
}
) b; G4 b( e7 a; K! R
return 0;
- D5 U. I, R6 g: V8 F* A
}
& {& z# E' |$ t' K2 o9 C
/ M, j3 |3 @3 t B. T
* h, v% d8 y: m/ P
然后编译执行就可以了(*^_^*)
( i7 ~ ?% r; t# ~" L! w
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
' B3 [1 w% W {* h7 r& I4 o/ t( V
建议使用VC7或VC更高版本,或者使用GNU C++编译
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2