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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
$ x* S! _, F: o( n% r' ^) N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! U' z) H+ A g9 m, Z: m
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ ?0 {- {2 U+ M% [( B4 t2 J参数解释:
- Q6 E: g9 L$ n* Yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
/ l' C6 e9 |' k( z: OnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: c& K* t- R7 L+ C; t返回值:+ q1 B% D$ w E" `, v5 k; B. r7 ?
返回非0表示计算成功,0表示计算失败有错误
) I. J% _$ r e1 y# `" i8 E; s E
: @/ t! U- l- l& R4 e$ S2 r: a! l
" L7 r9 N9 I* Y+ Q程序代码: ) c/ f, m! ^8 D& P
1 o5 `4 H1 O0 T- V+ ^
namespace fy_Exp{/ z2 d1 }4 W. U( m# \. v
namespace {template <class _T>" W/ K2 C" D% y5 \& J
inline _T GetExpValue(_T t[], char& csym){
9 T7 A$ _" ~9 c( H9 H char c=csym; csym=0;
$ p% G+ i0 {* M" k, s7 H$ _ switch(c){
! h/ d- Q' u" ?2 U case '+':return t[0] += t[1];2 ~$ i9 D% ^3 Y4 ^: M' a' o' x' y
case '-':return t[0] -= t[1];
8 f9 @: R3 I' a+ l7 }( v case '*':return t[0] *= t[1];
. Z$ `7 m4 ^, b3 K default: return t[0] /= t[1];//case '/':0 G' y' I" h" w7 f
}
7 I9 F' }6 u6 b" @9 O}}' z9 u0 T2 c, _- n& Q* ?6 M- C, i
template <class _T, class _Tstream>; Y+ i# y! a% @- K6 D
/* _Tstream: inputstream, _T: get return value
8 O$ B- w# a7 o* Return nonzero if get value successfully */1 x" V8 K' s$ O. x- }6 a0 f* U
int GetExpValue(_Tstream& istrin, _T& nReturn){3 B+ Z$ ?' n( E; a
_T t[3] = {0}; //雨中飞燕之作
" m( ]0 w* V( z3 A char csym[3] = "++";! K" s( z& M# o' ?( L
int nLevel = 1, nERR = 0;, O6 d+ t7 l. I! ~- y9 s5 O/ L
if(!(istrin>>t[1]))istrin.clear();
7 d6 {7 F5 @0 \1 D9 v for(;;){2 g9 C: P: y9 \ i! b' O' ?
if(istrin>>csym[2]){8 E) O' y3 y- o1 G0 X
switch(csym[2]){
$ Y- x$ |- c4 C& q \% s case '(':
, a. e6 d) X# E c) R2 L if(!csym[1]){nLevel=0x100; nERR=1;}else
- {0 i& O+ N+ d# D$ F if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# @& e7 g/ t4 ?+ v$ _
else{nLevel=0x100; nERR=1;}: Z9 t- i, y4 w# A: c
break;( g* c0 i0 J6 S
case ')':
I0 m- L7 y' q3 Q% b6 C" f8 {9 l" s {nLevel = 0x100;}break;% l) y' U8 ?( ^* X
case '+':case '-':case '*':case '/':
' }( ?* @( M) D+ H+ E {csym[nLevel++] = csym[2];}break;
9 y" O# V2 S! \1 r8 K% A case ' ':case '\r':case '\n':case '\t':continue;
/ W) z- \3 A8 R* a! i default:2 G) j& a, q. U5 w0 i
{nLevel=0x100; nERR=1;}; K4 X8 J( A: b! w: v& q
}
4 u; e K8 f( g- Q o9 @, F' `. [ if(nLevel==0x100)break;( W% h5 `+ N, M4 J- `* {
if(nLevel&0x10 || istrin>>t[2]){
" q, A; W5 r/ ^+ q# b% ? nLevel &= 0xF;
( X7 y8 k" o+ [# V* Q6 ^ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
4 L$ _% O2 F8 H$ O# U% r+ S* T if(csym[1]=='*'||csym[1]=='/'){
# Y; m$ O4 j9 g' w; b- X: T' w) v ` GetExpValue(t+1, csym[1]);
& f. }' k, i) K+ n* F }4 W/ {2 f$ A9 X) d6 t. r
else{, @+ b; O& U, }: Y
GetExpValue(t, csym[0]);/ {" B/ _; F u% \
t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ P; x( E% b* P$ s# k: I* O% T
}: n/ l& T: x# K6 t
nLevel = 1;8 Q5 b: }, p4 S( a+ j
}# A$ x" e9 i1 T6 f: |5 B8 z8 V
else istrin.clear();' N. t/ K4 A! ]
}
( ]' [8 p5 V- }! H G& W else{nERR = -1; break;}* o2 E. l7 K Z! z, |; X; \1 [
}* A/ S% `( G& v8 X. n# ]1 i
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 [0 G3 Q: ~1 N9 O; b+ _/ Z* k# V& G
else nReturn=GetExpValue(t, csym[0]);
9 p+ H, V" v' p6 A return nERR==-1?1:0;
& P1 r6 D6 v; K" b g}}
/ x+ y# N0 ]; i& E3 p9 |; d/ s! w% N# d' d: X- M7 {
0 R" V# j- ^$ q4 |4 }
' F n) o2 I: M0 p# c7 D+ _函数模板使用示例:; i$ {* a0 g4 z k t \0 V' o
在以上那段代码的后面加上以下代码:
0 f) b6 G3 n# g1 `
; m9 k" m& S: X
& ?6 z8 l( V: Q3 v. G8 {! _
# H# S5 J4 v5 m8 I程序代码:
! b8 Q$ _% D4 k I5 d* Q& V
, `' M% I, @4 o' n" M- e& t6 o& y#include<strstream>
/ r% T9 |# n, S. W a#include<iostream>' |, T. G+ B# ?/ X
#include<string>6 J5 {# F1 Q" ~+ Z% [7 r/ P/ V
using namespace std; b1 E R+ L/ |! W
int main(void)
* k! |+ d" z3 C( {{
% Y+ Q( {( O4 i* l string s1;; c. K+ S* j. G9 ]
while(cin>>s1)
+ v. X# U- g! A/ f! ?2 i {
( Y4 ?( v/ X* \ istrstream isin(s1.data());
0 u- R8 a# X- p' h4 P/ \ x double d;
& @7 |! w' x! m, p& s2 J if(fy_Exp::GetExpValue(isin, d))
* T+ X1 d/ r9 ?: y {. W5 u8 W3 S1 l: @( P5 w
cout<<d<<endl;' f* f3 ]* D1 F2 T8 i. V
}
: ^* ~) F4 {; Z1 T) V else' q0 q$ F0 D3 c* J D: L
{" C$ B* _% }! g- L/ J
cout<<"ERROR"<<endl;
8 d! T0 o8 h$ b1 V }0 c5 e) j2 @- ]$ i( J/ l
}
0 R( C. E& F3 a; t0 A _0 O return 0;4 G- W% e3 o$ x& H
}9 ]9 f: ^7 f" u( d2 e1 g. {( X
- ]* X: _8 N# X9 s% [/ L5 J/ F
* P+ c- N K2 c! M然后编译执行就可以了(*^_^*)
" @6 z9 ^/ o% b& _8 T6 r其它:TC++上一定编译错误,不保证在VC6上也能通过编译- D- Q5 T. _2 t1 y9 |% c- e/ P
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|