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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,7 s$ @; O$ t5 F5 {: }
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 I9 P& Z5 J1 D" s只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: y% @8 |' d2 _' d8 _0 ^8 B1 w参数解释:: I! v& [: {- K. I% I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! T' e2 _4 v/ d" T$ Y; }; S; o+ ?nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 ~( {9 x' Z) @0 F
返回值:. w% u- S' y, J1 p% Q/ j
返回非0表示计算成功,0表示计算失败有错误5 g0 m! O% ]+ C
" a' w' y% ~- @4 }' T; I) r
! D+ f+ B" f& R- i0 v' l5 \6 N' |: }" E
程序代码: 7 u/ Y5 i. Q, k- E- ~
( Z# g- o/ t x1 A d
namespace fy_Exp{+ Q* d$ N1 D$ ~3 A
namespace {template <class _T>
% _0 \- Z) b: w2 Jinline _T GetExpValue(_T t[], char& csym){0 ~8 ?$ t& |2 W( s, d. C }7 \
char c=csym; csym=0;5 W& n5 Z5 g& g0 E
switch(c){
- f$ t3 x8 u4 M2 r) A7 v4 S case '+':return t[0] += t[1];+ i% c4 V. S/ S z5 A" c6 _
case '-':return t[0] -= t[1];+ X, u8 G, R4 j! T! ?7 M
case '*':return t[0] *= t[1];
. p( e' ^: j) r, I default: return t[0] /= t[1];//case '/':8 h* e) H# {5 g- T: [( D5 x% s: k
}0 L8 q# O7 O% z: v( B' N; i
}}
( `' {( P& \* b% R0 P b* v/ Rtemplate <class _T, class _Tstream>
1 _; q/ T$ k- G. h- d/* _Tstream: inputstream, _T: get return value8 {! S3 G" c5 \" a5 B7 `
* Return nonzero if get value successfully */8 R. G) Z1 K) j/ g& D! Z
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 z2 Y) g- g. | _T t[3] = {0}; //雨中飞燕之作
5 Z4 u8 b4 \- N/ Q! [; r char csym[3] = "++";9 |0 m+ y+ L9 b: E3 i
int nLevel = 1, nERR = 0;$ L# G5 E9 U9 f% \
if(!(istrin>>t[1]))istrin.clear();$ N9 U0 }6 \( L. L/ Q* [
for(;;){' N! X* Z8 V5 _5 E0 q
if(istrin>>csym[2]){5 B! d5 g' P7 U' ]/ l/ `
switch(csym[2]){
' U' G" X$ y8 ^1 X1 k& x$ C* M case '(':
7 c4 ]" q# K; C7 E( K if(!csym[1]){nLevel=0x100; nERR=1;}else+ n; \7 r8 M9 A0 g M
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;+ I* a3 r4 u1 n6 ~+ H
else{nLevel=0x100; nERR=1;}4 Z5 [6 ^8 V3 @) z
break;$ X* A& |/ U% D+ X7 E
case ')':
. k' D- R" S( s" r8 r" L- \* l: L {nLevel = 0x100;}break;, K$ {9 n4 ~8 x1 U; I7 F% y0 B
case '+':case '-':case '*':case '/':
6 z, W& W4 k: e {csym[nLevel++] = csym[2];}break;
9 W/ q- W' L2 e case ' ':case '\r':case '\n':case '\t':continue;% V# j! C& ?* z; h+ }9 ^6 X
default:
4 E/ g, t" G7 b( G: |' [8 R0 R {nLevel=0x100; nERR=1;}
2 `2 a% B+ h# S5 Z6 O$ r! ] }* c% Z; w P9 l
if(nLevel==0x100)break;
. X0 ^8 |) ^- y' u if(nLevel&0x10 || istrin>>t[2]){
! I. I2 {( Z! ?, M- } nLevel &= 0xF;4 h0 u6 h8 ^) t! Z3 C* R p
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}' y2 W# P1 i. W
if(csym[1]=='*'||csym[1]=='/'){
. |5 ]9 `% ~" c/ _6 d' D GetExpValue(t+1, csym[1]);
' | m# j" i+ V, | s }! ?5 o' u' {6 R1 z9 z1 |% b
else{' h( z4 O' V0 K$ n8 C
GetExpValue(t, csym[0]);
: h$ d( }" S8 R3 k! K t[1]=t[2];csym[0]=csym[1];csym[1]=0;' g+ @8 E- j$ j& v
}
, N3 T7 `- b( d0 { K' ~' K H% @ nLevel = 1;2 @3 R$ K4 x4 i: t3 K6 U
}
8 ~. I9 B9 J% [. L" R9 h6 }; R: K else istrin.clear(); ~! J; b7 @8 r, R( u( `2 h
}/ g1 p: C! z9 g$ p1 t8 x4 ^$ h
else{nERR = -1; break;}
) \6 |5 `* N4 t1 q. E8 E }
" [# O. V6 h. @1 o- z if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 _# R- ]8 T$ k( K0 Z else nReturn=GetExpValue(t, csym[0]);
0 i! f: F0 `" v) G return nERR==-1?1:0;# R6 w k: }$ U6 H. e0 U
}}
4 ]$ x8 o# D) h1 n
4 m6 Q. d$ Z7 u- ]0 @. O% A- O% B9 k0 |& x+ X- ?
; ^3 A4 {) U: q/ W6 A! J. w2 y函数模板使用示例:* s+ n3 I" Q1 I7 W0 p' ]
在以上那段代码的后面加上以下代码:
, `4 d3 I" ?, B6 u' c% |/ p5 I/ ?
( w* J6 N) Q. I
2 Q- T* ~2 D4 f程序代码:
$ k4 M& b4 a, D: x+ n6 M* H: m: X6 ?4 N' S" I/ O1 j9 t6 ^
#include<strstream>/ ]& s/ J) e0 S x+ W3 M
#include<iostream>. P0 [; d, w: R: ]2 A
#include<string>
5 F7 T4 |3 X. \0 ^0 I; k: f. Y) rusing namespace std;- O ?% h$ ]0 G1 P4 s+ a
int main(void)
2 @2 N h' x6 w9 }4 D& @% @( a% @/ }{
9 O" N2 | R) L0 v string s1;
6 B$ z# d; k- k6 Z% ?( A/ u while(cin>>s1)2 F0 x7 n @0 }. F7 p
{
) E' A0 b) y( X/ D: ? istrstream isin(s1.data());
! p) W' p+ P. z double d;, ]' P" \6 u0 z( O3 h; A4 J g
if(fy_Exp::GetExpValue(isin, d))0 T% L- p8 R+ o' s+ T Q
{, b, e9 | O+ y o+ e
cout<<d<<endl;, B& R* b/ L8 Q |0 J
}8 F+ }& j2 ~- C5 [8 n6 Y
else. @( D% S4 A& E& k; n5 H* s
{
7 G5 L6 _- ~( q% h s6 } cout<<"ERROR"<<endl;
- C ^, k1 Z, ^0 U* P }+ l! D! k2 K g- _" D9 o
}; D _/ p# o" C' `1 g6 {
return 0;
; L% Z% N2 i4 D; Q5 c}: S9 d9 c4 l3 K; b
8 F) O0 ^) Q7 A v- b/ f0 O x B
n" n K* d, a0 Q% M) m2 Y. v/ v
然后编译执行就可以了(*^_^*)
1 J! b8 q1 d) K0 d其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ I% e$ L6 Q t+ m9 f# [- l& I) N) k
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|