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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,5 o, I, W5 F# n9 J/ ^1 y% {
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式5 l! @9 E9 Q$ Y/ M* A
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 j3 _+ M0 z8 `参数解释:
+ O3 {/ T& d0 ?5 F! g8 s; ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流9 _5 k# X' C" Q2 u& c9 u
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 v( c4 J- N, |8 E4 ` o: |
返回值:4 C J$ @( l/ B$ ~" c8 w& c
返回非0表示计算成功,0表示计算失败有错误; b# w% Y2 w6 O! t# r6 v9 e, Z
; p' Y0 K4 U5 [, g D/ l4 t9 V
3 z0 [* ~, C5 _ s
$ A5 {8 X p. J$ p; t程序代码:
# }% Z7 X3 F" Z/ u+ B7 h6 s( G+ S3 u' {+ H& T9 N4 n, L8 K) A/ H% Q
namespace fy_Exp{: k9 m7 ^0 `! Z' _
namespace {template <class _T>9 V( ] [; Z+ Q7 T; A {
inline _T GetExpValue(_T t[], char& csym){
4 u; _( j( @, ~0 k+ z! p8 ? char c=csym; csym=0;6 n9 U/ L8 {2 T3 c: V8 w# k |
switch(c){
" S0 T; `( i1 t4 F8 f case '+':return t[0] += t[1];, o- I# `3 D1 ?
case '-':return t[0] -= t[1];
/ ~+ v$ x6 i) d/ s case '*':return t[0] *= t[1];3 S4 ~- u4 Z5 Z9 _9 x% n4 T8 D
default: return t[0] /= t[1];//case '/':, b5 F' ^: B% o2 M" d8 b
}
3 f# |1 ~ ?* X. I}}
; F$ f4 D$ o' g9 V0 N/ V% }template <class _T, class _Tstream>
# c9 Y! P& j2 F1 ~5 \2 ~/* _Tstream: inputstream, _T: get return value
" S6 I# Z9 Y' c# k, \8 i% I8 B* Return nonzero if get value successfully */
7 B7 u- t+ E3 }* nint GetExpValue(_Tstream& istrin, _T& nReturn){
7 b2 H; l' d- C2 A% Y _T t[3] = {0}; //雨中飞燕之作% W) I2 E! G' A$ Q
char csym[3] = "++";
3 P* Y6 ]; s* x* `: C int nLevel = 1, nERR = 0;9 D8 c' ~# _% Y6 [# u; c% n4 {
if(!(istrin>>t[1]))istrin.clear();
! C" J1 p3 _9 f; Z/ `8 C3 _ for(;;){" F; b0 J& s1 w8 b% \2 |) w
if(istrin>>csym[2]){
* G5 T. o, G! _3 {2 S7 F! G; p switch(csym[2]){
& P6 c& U: ]) @- B. A( x case '(':
) y% p% l/ g8 W1 l- Q; Y if(!csym[1]){nLevel=0x100; nERR=1;}else: C, d3 J M+ X; d1 z. u
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; M) t! M( _: U" W4 v& v) z
else{nLevel=0x100; nERR=1;}+ W+ y3 y1 y2 `% J1 L, X3 R4 z
break;8 h. h9 i3 Z: S! q& E/ O
case ')':+ @. h; M. z- j! f
{nLevel = 0x100;}break;+ T0 `5 g" F% i" O/ _
case '+':case '-':case '*':case '/':! m8 }/ M+ u$ \1 j& Q
{csym[nLevel++] = csym[2];}break;. m7 l4 k. o- R/ y" M
case ' ':case '\r':case '\n':case '\t':continue;# b% P, a) a; A5 n3 Q I
default:
$ f" k% G, E9 z* y" ? {nLevel=0x100; nERR=1;}* d% T! d0 @& ]$ D3 j6 [
}0 O' e3 |5 t$ r+ i2 H% n- C+ p
if(nLevel==0x100)break;' G3 I9 m" _( ]: y
if(nLevel&0x10 || istrin>>t[2]){ F* B& Y6 Q# z; j
nLevel &= 0xF;( N' p& ?( ?( j+ V% b: t0 g% w
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 d3 Q+ K$ s8 m/ K8 S, h0 ?% Y
if(csym[1]=='*'||csym[1]=='/'){
- a1 s2 A! }2 ? i/ V GetExpValue(t+1, csym[1]);
0 P+ Y: X1 Y* t0 ? }0 w4 d7 Y" U# G& | B
else{
( W6 T! w' j# J8 ^+ o GetExpValue(t, csym[0]);
, ^3 u6 o2 K2 E' Z( \ t[1]=t[2];csym[0]=csym[1];csym[1]=0;% Z" ` r3 c& \1 q
}7 ^" L, \6 s: [: V9 P
nLevel = 1;
V6 j( p( j2 n" }7 m" U& D }
6 V# b, u, l$ N0 D$ X% y; `! S7 O else istrin.clear();
! e/ V' @, Y. H } s" Y4 v5 s4 v3 ~7 N, p: w3 J
else{nERR = -1; break;}
: @0 X M( `% Y. Z+ m }
6 {& i) {( k- i0 @ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 F+ i3 l' C4 V& y2 L else nReturn=GetExpValue(t, csym[0]);3 C7 B1 a! I2 `2 k- l
return nERR==-1?1:0;7 h7 @( D! p6 H& s6 ?6 c; ?
}}
& q- p3 k' u( ^
0 p- T0 X( ]" z; b& Q$ [. x8 _' o- j* Q( b, P) l- ?
5 X$ M7 @9 M9 ]1 `: ^1 f, A7 x/ i& ?3 T函数模板使用示例:
" t6 e5 Y, d. w: \: y- y在以上那段代码的后面加上以下代码:+ R% ~7 a. S4 D, Z
H, W8 x6 s# u! o& ~7 z4 ~
6 I) j% Q; b9 w4 Q2 }3 T+ B! } q: S- o( F
程序代码:
0 O! \( a- Y3 D! d9 f [# L- R
' d/ L' s: F# D$ H; k#include<strstream>
8 o4 b/ _+ w1 w& s7 ?#include<iostream>
% Z/ I/ Y/ f3 x3 X- w#include<string>- A, f- o! H! O% y4 ~
using namespace std;
9 O) o1 m: B+ g% ~int main(void)9 h: k; L [. d! b3 e7 l) W
{% [+ ~$ Y! r" ^) @
string s1;
0 r9 i$ a" M% E/ a# y while(cin>>s1)
" H5 v$ Y! M0 g4 o, \% v {
8 Q4 U+ Q* O! { istrstream isin(s1.data());
# F5 z. ^7 p- ^; `, S% w double d;& t1 o4 Y# Q. D4 ?
if(fy_Exp::GetExpValue(isin, d))
; I3 z" M3 Y! r# c0 u {
# p. d0 v% ` G6 f# v2 F cout<<d<<endl;* U/ d G- e) Q$ d
}
: ?: F/ J1 d" q% V" p7 w else Q! X. `4 {2 W1 L! ~6 z
{
$ f5 h) x1 K6 Y# C cout<<"ERROR"<<endl;4 b$ f1 L- a* ^ W
}
$ ^: H; L6 u( `7 X5 q; n3 i }1 g1 d) g, `9 F8 T% Y \* t
return 0;
! L1 H0 ]/ u' m, b3 M} S: Q; ]" J( b8 S* p- u* T
E/ G7 Y+ \% d. ?: r+ i, v3 D' T$ j4 ^2 @0 y' J" i+ N# ~
然后编译执行就可以了(*^_^*)
/ m% s9 K) S. n2 D. n其它:TC++上一定编译错误,不保证在VC6上也能通过编译
$ F1 U' x& f6 M: }: | v W 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|