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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,) c& t; ~& g1 |! h" z; o
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& l1 |# o/ v/ R4 M$ ?+ a只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( l4 b5 z7 ~7 [, ?: r. Q) J$ U参数解释:! {% v3 s8 {* _1 v3 X, V. v6 a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# b+ Z2 K, n/ S) @* ^nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
6 P# V; B$ q. n. v返回值:
5 O& ]( W: n, X$ a% o# a( x返回非0表示计算成功,0表示计算失败有错误
, k- z- [: i' W h( ]! m2 C. x% Y0 {6 |7 \+ v/ N1 [# R
% h O8 ?6 M& M2 a7 {
' c( G* t* K) G. n9 ^& f& Y程序代码: 6 R) n1 j0 a: M4 X% K8 S6 |: l
/ O! L( i6 [+ R8 u3 unamespace fy_Exp{* x: F J2 H R6 ?5 X
namespace {template <class _T>. N; {: w4 z$ v
inline _T GetExpValue(_T t[], char& csym){
; X- ]- P1 ?7 o' q0 T% @4 V char c=csym; csym=0;; [' S. t6 m( A
switch(c){
. @' P1 z- X* b0 `4 k+ P0 ^ case '+':return t[0] += t[1];
; t6 N6 R: L8 Y, x case '-':return t[0] -= t[1];
9 S1 ]4 x% ~" W* R case '*':return t[0] *= t[1];9 D, T- n+ T" T4 t" c
default: return t[0] /= t[1];//case '/':
0 |3 d( |; r" O1 O1 J4 b. C }- A! [# |- d, C% G
}}, \5 Z2 q ^1 u
template <class _T, class _Tstream>( w" Z* P8 B; a4 x* h5 s
/* _Tstream: inputstream, _T: get return value
7 M6 i" E* X( j- D* a- l$ Y2 o* Return nonzero if get value successfully */% K, c: I, G/ V/ c5 ?, j
int GetExpValue(_Tstream& istrin, _T& nReturn){& r- j5 k3 C+ s( ]
_T t[3] = {0}; //雨中飞燕之作
. Y$ A' x5 k9 Y# h" R char csym[3] = "++";
, e! b' q/ v% X! _5 |$ R9 O* e int nLevel = 1, nERR = 0;: V+ m! }* V7 J+ Q! N! C% r
if(!(istrin>>t[1]))istrin.clear();
$ s8 Q2 c4 N) y* N* h! h/ X$ m for(;;){
! x* y, J4 i" }6 z6 t( ~, t if(istrin>>csym[2]){% c2 o9 z% n' W# N' ?& }. Z) W
switch(csym[2]){
a$ ]& X3 }! C+ b# a9 O case '(':) T2 L4 s0 \ Y$ ~. K3 l
if(!csym[1]){nLevel=0x100; nERR=1;}else
7 l! E7 q0 ?& t+ O# ^, K if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: W, Y- b8 f4 [& g! K6 q else{nLevel=0x100; nERR=1;}9 D: X1 S" K( s4 q7 |: w
break;
( Z% r# u" v8 L q% M+ U# ]- N9 f5 Z case ')':
$ ]( z& N7 `6 h* R, ] {nLevel = 0x100;}break;
' a5 X& {9 o p# }9 m case '+':case '-':case '*':case '/':3 k# f1 ?! d0 J9 ~ E& ?
{csym[nLevel++] = csym[2];}break;7 b4 d. \2 ?5 t& r! @/ X; a
case ' ':case '\r':case '\n':case '\t':continue;
: t& N/ O# h' q7 ^. K! D4 W; F default:/ a2 T% g" @2 ~% |' v
{nLevel=0x100; nERR=1;}
I* p" A8 o8 B9 K) X }8 I* M/ G; n' I0 D. [9 p
if(nLevel==0x100)break;
- N4 [6 {0 Y( Q( P if(nLevel&0x10 || istrin>>t[2]){
3 g4 o' f) q6 a5 d7 f: f nLevel &= 0xF;
% h& \) L6 u2 w6 g2 p: J8 ~ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}/ m S: U* F- B0 u- W* Z# {
if(csym[1]=='*'||csym[1]=='/'){
0 A) l+ _8 h0 G7 W7 i GetExpValue(t+1, csym[1]);
2 f9 ^+ a5 s; M1 ^% U }
* b z9 y* i5 E) E' s else{8 M( \$ h! Q& d; F" W
GetExpValue(t, csym[0]); T- f' } p' D: N$ ~5 G
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
; s+ a. q! `6 c: T }+ C; c. X: E) j* Z% A
nLevel = 1;9 x& R( |; l3 F( I8 u. `
}/ I, A* n1 F! z, f
else istrin.clear();2 Q: G" y6 P' d0 n) d
}7 _; t2 S8 p# z! R4 Z# ]2 q+ }2 i3 W5 m
else{nERR = -1; break;}; r, [$ q4 R1 c7 y) O* d
}9 M5 }5 Y, R) j# i6 |
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 Q5 k& y) A9 T4 Y& q U
else nReturn=GetExpValue(t, csym[0]);' S2 V# k# w$ X/ o& G+ D
return nERR==-1?1:0;# H, @) _6 V) e3 |$ L! u
}}
. Z) u; H n& a1 K" V6 h4 @, v+ d1 U+ b: L7 W z- _
0 K7 g2 _2 Q% _0 P) L2 C! S6 `4 S0 w# m# s$ l; w$ c8 C
函数模板使用示例:
* v% _7 \8 _" X; @: ?- p在以上那段代码的后面加上以下代码:
5 H/ Q, I# B/ [ o! { m2 }7 M' x
3 n$ I9 ?" \' \, i- C1 N
( U9 {- Q! t! X3 x- ~2 o# Z& `$ Z" y% [ d: l
程序代码:
- {$ \: f* v; ^ s9 k Z# q4 J7 [2 q
H) |( r* _: r: a/ T2 `! a#include<strstream>
2 l3 A" S/ i( ~5 l1 B#include<iostream>6 F$ G$ y- U$ T" q, a
#include<string>% v! Q+ y+ c# z ~( _
using namespace std;
5 B" \( a# G0 j4 Jint main(void)
' x6 d7 \* ~ \* R( A0 O/ i* f{, [! r5 ?- ]# e* v
string s1;
# c$ D9 s# Z; b9 o- r while(cin>>s1)3 L9 D. c& g" J, n. @
{& O# e0 {( ]3 `) q, ]
istrstream isin(s1.data());" f1 C5 k% ?' \+ j% L; S/ J
double d;
3 b" U7 Y( n" e1 l) F- d if(fy_Exp::GetExpValue(isin, d))
+ C" ~/ T* O" L {
2 r2 s2 ?0 V$ h# U5 f cout<<d<<endl;# j' a' ~+ O6 c' E' Y
}" ]6 S% S( A7 j; k* p. y: e: e
else
$ ~2 | c u: [+ C* Q9 L {2 ^' A* }# h7 }6 I$ Q2 v
cout<<"ERROR"<<endl;
# x8 K% R$ t! [; w) p }
0 E, g: J3 o4 z4 p. \8 H& W }
- U6 E2 Z" }1 ? return 0;
b: u7 ~! `+ W9 U' x3 e}- h% N& O. t7 r+ `) F
; e2 @9 W+ ~+ R* Q
: w- k4 D0 f/ G1 j
然后编译执行就可以了(*^_^*)
, {! a: F2 s2 A' t; M其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ J O- B, A( P 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|