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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
0 K' Z# ^% [0 T1 R& \/ V- Y# l一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 H) i7 i# |1 A: r) t' l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% v$ j- d; N; P8 e# y
参数解释:
! N% q* Z0 o6 x* _1 wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 k# ]: c7 b z% w% c2 a
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; y7 v8 P( _' o8 {) Q
返回值:
/ |4 v( G$ M3 M% e; d1 G返回非0表示计算成功,0表示计算失败有错误2 D9 T$ y$ B o' p
) F- m0 o( d% x: ^% ^
4 M' h% x# Q3 C( w
* X3 A; D! o* V& N* r0 e8 u程序代码: / \4 q- e" C; [) g3 f g/ m
' U( `- z }$ c8 t: b/ z; r Pnamespace fy_Exp{
# @3 O) D& c. W9 x, _2 V: a$ tnamespace {template <class _T>1 o4 ? d. @5 K0 C: |
inline _T GetExpValue(_T t[], char& csym){
( d) i7 W+ ^ z y+ g+ T char c=csym; csym=0;4 x6 b7 O' V6 `7 z7 {
switch(c){% B* A+ i+ ~* n5 @9 S+ D
case '+':return t[0] += t[1];5 y3 M$ T) \% B
case '-':return t[0] -= t[1];1 ]2 P- ?, h1 j" k) U
case '*':return t[0] *= t[1];
. k7 e2 q$ s) P! X. Z8 d; X! R default: return t[0] /= t[1];//case '/':
/ W& n4 t( c/ \$ i( b8 j- R/ S }
/ r# J% r5 @; V \) C" F}}
; T3 {! F, g0 L! h& s1 D7 w wtemplate <class _T, class _Tstream> k, N) a1 b: Q; g% G* ^: P
/* _Tstream: inputstream, _T: get return value
- R) `2 w" b U* Return nonzero if get value successfully */+ s; \( H1 H# z+ S
int GetExpValue(_Tstream& istrin, _T& nReturn){
/ F- V+ I" q/ T1 [. c6 r _T t[3] = {0}; //雨中飞燕之作
) P6 |9 k0 Q/ ?6 h9 Z. c5 p$ ] char csym[3] = "++";
* F! N. H. d& ^' I, P$ H/ t int nLevel = 1, nERR = 0;9 ]6 I- ~' y5 l( @3 Y" V
if(!(istrin>>t[1]))istrin.clear();
- d0 O9 M5 q' u) X9 E' C) m8 n for(;;){1 T8 C# ]* M- p5 O
if(istrin>>csym[2]){
n8 y7 X9 o4 g; t# F, U switch(csym[2]){
- K( B% e) w. {+ ` Q' T case '(':9 h. r* B) J) [
if(!csym[1]){nLevel=0x100; nERR=1;}else
* S$ M) ^' W( Q6 t if(!GetExpValue(istrin, t[2]))nLevel|=0x10;& U+ g" V. l& f8 Z! b/ b8 Q
else{nLevel=0x100; nERR=1;}' @: L5 x' e) z$ N
break;
5 c8 j5 y5 ]8 g) f0 { case ')':
5 ?& L4 k$ _5 O; o) C {nLevel = 0x100;}break;. z, t" {4 ~: p( K8 V/ r
case '+':case '-':case '*':case '/':! d, ~2 W& j$ k
{csym[nLevel++] = csym[2];}break;
$ D4 e: H4 R2 p) ~ w case ' ':case '\r':case '\n':case '\t':continue;; j) R3 Y& X" a1 y
default:
7 a) K, d$ K. T' I- r! @( ~ {nLevel=0x100; nERR=1;}
1 `, o4 V# B; i# X }
- o7 B$ F' J v; _- I if(nLevel==0x100)break;
0 ~0 G) `# K. y( d; r! n if(nLevel&0x10 || istrin>>t[2]){
; f- I5 h2 L# ] nLevel &= 0xF;- n1 x+ d; E* z" r
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; [# h: m9 D# V) q
if(csym[1]=='*'||csym[1]=='/'){& Y- L' T% h8 c9 b# h
GetExpValue(t+1, csym[1]);0 I2 `! c& M; F( T1 Q! k
}
5 k" v2 W7 {+ ] else{4 b4 P, _+ B0 S1 G4 d, G
GetExpValue(t, csym[0]);& G- I) m- m/ H+ w s" E
t[1]=t[2];csym[0]=csym[1];csym[1]=0;7 g! A Y ~3 x5 T4 ^/ l
}8 G1 Q: k6 C4 r" h
nLevel = 1;
9 K0 z, o( s4 O& L3 b }
/ N$ K4 a/ R$ D: H4 }, y: F! y else istrin.clear();
6 [2 {' O: z# F$ e o }
! z" W( C: H/ m( s else{nERR = -1; break;}
8 J. I7 E" J" o$ O6 n. g }5 q4 m1 f6 D: s, A4 @4 n3 O6 Z
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& a" i! H$ X" U' [3 K. U* I w
else nReturn=GetExpValue(t, csym[0]);
& p" i$ y. [3 O; ?& b5 |7 a return nERR==-1?1:0;
+ f4 @% j' Y( X- A; {}}
% D" @- N& ^4 \# `4 E$ v# p3 N$ j! K" t! p Y7 {
$ b" Z* P. }; s4 b0 l* X$ x
- G: u3 L* f# ? U函数模板使用示例:3 m. P4 T- P, G2 V- z1 Q k
在以上那段代码的后面加上以下代码:
+ p9 L% \* k1 j: r* q6 W' f5 p0 ]% m' _& s! N2 X9 I* N
# N. t* m6 k! V7 f3 f
( ]& @4 u- o, e9 ~2 j | v6 m程序代码: 0 @1 U$ `/ b+ u- o: x" Z) p
8 ?% g% Q6 f* g' v/ a#include<strstream>5 I. c7 ?/ r: L4 y4 x/ {, }
#include<iostream>
: \# e8 c) e: J3 a/ b( |. w#include<string>
& o5 p, y3 Q$ ^5 }/ Husing namespace std;
' H: r D" ^: Y+ S' k, C7 kint main(void)- Z; F6 U. \+ \3 Y# |) l
{
' J8 Z, ?0 D6 m* q H3 l3 x string s1;; N) ]- |) {' R% A
while(cin>>s1)
! N1 ~( Y: `! B {
9 w* h% S1 U# i6 `9 U. w: W istrstream isin(s1.data());1 V9 V5 r# ]% }" Z( _/ |/ ^* a, \
double d;8 Y9 _' v9 O: l
if(fy_Exp::GetExpValue(isin, d))2 z0 V, b k& S
{
0 ^) W# [- j+ m ? cout<<d<<endl;; h" s( x: \( U7 S: Z* X0 T. T
}6 C. f6 f1 z1 F4 \! c% b
else
- }. f% y: t( Y% e: @, |5 N {6 ^3 K+ ~& H3 i' \
cout<<"ERROR"<<endl;0 |0 B7 f5 N" r0 S/ t: V
}
6 l8 c8 M7 }$ b }& t- d. G" v t9 P: `9 ^
return 0;/ `& q! J% A5 m+ q
}
* a% l# Y# L/ q. I/ n5 ^
! Z: D5 t& z, X C4 W" \/ a( p S/ Y
然后编译执行就可以了(*^_^*)* X. m8 j0 [: T4 i; j4 a* j
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: ^$ x1 ?3 ?0 G Q 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|