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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,* }8 i. C0 w1 i& J& ^
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- ?3 t" h4 H8 v
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" L/ k" r# q/ V' k+ J+ y参数解释:# n+ r0 |5 Y; g( b
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ p# Q* l/ E: n2 X9 M0 W+ {7 Q
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
a, H1 F. c& R0 X2 X6 B \返回值:
" ]3 A0 R+ J" c1 W+ u+ H y返回非0表示计算成功,0表示计算失败有错误. J( o& k, ?. g8 I- E( W) T( o3 s
/ G0 N' v7 n. H; G- U
7 I) z- M5 z, f" k
9 N9 q, A z a" `程序代码: % m$ U3 w( u5 P5 a3 X
9 w: U& ?, V1 K; m8 {( l$ m
namespace fy_Exp{
y* y: E: H/ v3 k0 i7 dnamespace {template <class _T>
3 q6 k) [$ s% e" k( tinline _T GetExpValue(_T t[], char& csym){
, i+ x0 |5 P0 h& [- j' A char c=csym; csym=0;
- W+ [' [8 j, b" } switch(c){
" o; g7 z; c9 |! d6 V% E case '+':return t[0] += t[1];
; O, k' z/ {. U case '-':return t[0] -= t[1];
, f$ _; @8 E3 _; U6 D case '*':return t[0] *= t[1];; T1 Q6 z$ s( W
default: return t[0] /= t[1];//case '/':
& p7 r7 o5 P+ s/ z" B" o8 z2 y }1 I* R2 ]2 V9 c4 |# L/ c
}}
* Q' Q- O7 c4 }0 `2 l( |; R% jtemplate <class _T, class _Tstream>
5 F5 u' `% \ G/ Y/* _Tstream: inputstream, _T: get return value
: m7 O5 q v: P* Return nonzero if get value successfully */5 M' _# `1 X/ j9 g% V: T' Y: \
int GetExpValue(_Tstream& istrin, _T& nReturn){ Z9 d0 Y. l9 Z( _+ [
_T t[3] = {0}; //雨中飞燕之作
. L" c- n& u2 f+ I! k char csym[3] = "++";
$ M" ~4 h( y# X" b int nLevel = 1, nERR = 0;
% Q `5 y) R1 @ if(!(istrin>>t[1]))istrin.clear();3 \2 W) e" p7 o ~, ^
for(;;){
' [- O; `4 x/ B if(istrin>>csym[2]){
' k- u& A; I% p+ t. c- k switch(csym[2]){1 M0 s1 w" D$ p, v6 A0 H
case '(':
' k5 G5 L* l3 u% n) D, E- S( G2 j if(!csym[1]){nLevel=0x100; nERR=1;}else
9 d7 Q9 c- _8 _+ H w) r" T( ]/ I0 z if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( I b3 v0 b+ c5 {' K* D
else{nLevel=0x100; nERR=1;}
( R# v$ C% V( ?( m break;+ D) G8 N/ v- G6 L$ s; l0 C9 R
case ')':7 ~& Y9 z- x1 ]1 w
{nLevel = 0x100;}break;
I ]% o; h, c, m$ b6 I! D+ @ case '+':case '-':case '*':case '/':
& g9 B( y' j/ @5 f8 } {csym[nLevel++] = csym[2];}break;
9 k9 }4 ?% T. b0 t- s( F! g$ h case ' ':case '\r':case '\n':case '\t':continue;
$ \5 [% p5 I$ n2 E8 O: B) x' j default:
5 ^; f" N4 E4 Z {nLevel=0x100; nERR=1;}
: U3 B+ o; `5 p' G }* i9 g% {* Z2 A( l# b# P" n6 V
if(nLevel==0x100)break;
! m7 Q5 m9 A: } if(nLevel&0x10 || istrin>>t[2]){
- [1 S5 n7 L; G6 ^& | nLevel &= 0xF;
4 m' C( c& u: `) L/ V! h( l* ~$ X if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, q7 ~+ e& V3 [+ R
if(csym[1]=='*'||csym[1]=='/'){2 f% [# j: ]9 E' g
GetExpValue(t+1, csym[1]);4 e% s( ?: y0 p6 u* H
}
- }2 Y; ]7 X6 i/ Y1 r, Y4 U else{
3 z6 B7 ]& |: c% }3 w K GetExpValue(t, csym[0]);2 F$ E: H9 o9 C+ O& I
t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ j0 F- A+ h& m8 L
}! E. g2 e' a, ^ W
nLevel = 1;
# {) a+ L% f+ \- K" j) Q }
; q" N9 C( c7 {) R! d8 N* ^ else istrin.clear();, e5 F$ C" j8 Q" i- B+ h, V7 u( r" ~
}
p2 v, p" }6 u9 s1 M( F else{nERR = -1; break;}. j) j. d5 _: y- x W. @& p2 s
}
4 n, _# H( F2 L8 H) q8 | if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% O' I2 |4 w) @: K$ p
else nReturn=GetExpValue(t, csym[0]);0 P' ^, B+ ]9 |+ @/ a6 Q
return nERR==-1?1:0;
& o) Z9 C# `+ Z2 ]8 j5 g}}
# C( R' V# a% i) N* b' `# E l4 f& K5 h* j' T8 ]+ T6 \1 J8 _4 D7 U
) b: ~- b2 O1 K& |) r. [
0 i" Q( i2 `9 S. R2 w- {函数模板使用示例:$ S7 {1 K& a" z) ?8 j# K; X
在以上那段代码的后面加上以下代码:
% \6 O$ b. @1 {. }$ m1 i( ?' Q" ]) b8 o e9 |$ S' q/ U
4 t Y& g. L$ J8 Q8 F8 A# ^! |8 j! e
2 [7 ?% H7 ?- v$ t3 g程序代码: 9 C% V1 F8 i( D, f
" h$ T9 X, h9 _/ ]/ L. a
#include<strstream>; ~; x: c7 B, ?) F) J
#include<iostream>
Y/ ^( T; {% V0 X0 h* r#include<string>. C$ p4 N) P* Q8 S5 E9 _7 Y
using namespace std;
' T% J' g8 R1 L. tint main(void)' a% O" f1 F1 y5 i/ G
{7 C' y8 U* O7 [
string s1;
$ o! l6 B2 d1 J+ v) x while(cin>>s1)
* K- x8 n4 N- ?9 s& P. G8 a9 Y" V" \ {7 H" ?' ~- G% Q! l
istrstream isin(s1.data());
]' V l9 o% A, N: T double d;' C, r/ T& ^0 `
if(fy_Exp::GetExpValue(isin, d))9 S2 N) _) Z; S3 p* T% B) k3 I
{# Y' w* _3 \. ]1 i2 @
cout<<d<<endl;) @& D% Z/ ~7 m' }2 A) b8 b
}
' @' L L* z& m x: u/ ? else' P( s0 Y% S* c0 Y- ~
{# X' y; L# U7 G4 X$ Y
cout<<"ERROR"<<endl;
2 Z7 c% t I: M/ Q# O; H* m }4 D( V! G7 }, m! F$ V5 [
}5 S I) y6 U/ |& o4 {
return 0;1 }9 {; n1 ?$ Z
}# |5 p3 y7 M. T; U: e# e, j
2 {5 k! E) E0 d# G+ l) B
n$ r. d2 u$ }, R! v然后编译执行就可以了(*^_^*)
# y9 n3 z) m9 `& j1 c" b其它:TC++上一定编译错误,不保证在VC6上也能通过编译1 H" O* r. L0 J+ }
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|