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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
8 v0 H5 h9 n9 ?% f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& T2 S9 `! ?. d6 E' V
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" N E+ _; f# [" s6 J% D8 b( j参数解释: ~9 f4 W9 u1 h. p5 H1 _( C
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流9 T, K* e) |8 M, W4 I& _0 a
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
2 @+ k9 z, Q5 V, i返回值:2 {6 _1 K1 e2 e4 _0 P6 U
返回非0表示计算成功,0表示计算失败有错误' c3 D2 @. t. i0 J* B3 I# O" t+ K
) r) M" J- {8 f1 ]4 S
* y. E9 `4 [ ~2 p) h. X8 v: {: d- l- f9 g* K4 C9 \% J
程序代码: ' ~) ~+ x$ o* Z3 Q6 {- S$ F1 q* D6 W
. B7 v! Z9 E3 C, X- k+ Q, M: rnamespace fy_Exp{
0 H2 j$ c- z" |3 w2 F/ ] Mnamespace {template <class _T>
z& y( A; c1 d+ Ainline _T GetExpValue(_T t[], char& csym){
; w: C$ E4 B: H! `3 _' s char c=csym; csym=0;
4 L& a4 m8 d" Y' T8 R9 e7 _- X switch(c){! r$ n, u% p5 n, z2 }
case '+':return t[0] += t[1];
) D# z2 O) |9 @" P8 a case '-':return t[0] -= t[1];: L6 Z1 z# Z z2 B% `
case '*':return t[0] *= t[1];
$ |+ e5 W2 a- J4 y default: return t[0] /= t[1];//case '/': p7 C7 E; V# Q" X. ?' m! H
}
7 R: E6 H4 l- H i- `9 ?* a! [}}6 Y0 ?/ J# i1 j; U
template <class _T, class _Tstream>% B6 J% H9 q0 y) ~
/* _Tstream: inputstream, _T: get return value
9 }5 `2 o) Z9 w% T# y1 P* Return nonzero if get value successfully */
5 f6 U7 w8 y- m$ A3 A. Uint GetExpValue(_Tstream& istrin, _T& nReturn){1 |' n& b1 R) d6 [+ |
_T t[3] = {0}; //雨中飞燕之作! d- D! I/ n8 y# K0 Q
char csym[3] = "++";
. F' I& ~) A# C* E int nLevel = 1, nERR = 0;
6 Z+ F8 D9 {( o1 t: n if(!(istrin>>t[1]))istrin.clear();4 s2 X h* A9 T) x9 H: c
for(;;){
( X" @/ U6 G5 M8 C# j) E if(istrin>>csym[2]){
8 w7 M' Y2 l L4 ^ switch(csym[2]){
3 v% Z; U m* S" D case '(':: A: f% B6 E' V' w7 z5 B/ y
if(!csym[1]){nLevel=0x100; nERR=1;}else" u% p9 f5 g2 X! C% [
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 d$ G* ?% O$ f9 K# H1 c* ]$ w( b
else{nLevel=0x100; nERR=1;}2 N" s5 U2 g* R+ ~
break;0 l8 g* A. L, D! F
case ')':
& I; @3 r& X M- ]& u; u {nLevel = 0x100;}break;
. ~" b4 p" f9 ~ d9 @8 o8 x case '+':case '-':case '*':case '/':) y8 r' v. w# S, V
{csym[nLevel++] = csym[2];}break;
! H. n5 `% j8 K/ Y9 D, } case ' ':case '\r':case '\n':case '\t':continue;! C$ [# L7 N7 g/ K1 k k0 ], o
default:
4 j/ B5 v. n7 ]$ f' v {nLevel=0x100; nERR=1;}) N/ C$ V8 T) k( o! `4 W5 V5 Y4 c
}7 ^. t- O; f$ V2 R: h, `
if(nLevel==0x100)break; m+ }0 ~: f! U7 Z* y, Z
if(nLevel&0x10 || istrin>>t[2]){
& K* t0 B" J% p# E2 t: q6 N7 Z3 e nLevel &= 0xF;
1 U i( [) c0 \6 V5 @5 ^+ C if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. g8 C( U! k2 V) m" n if(csym[1]=='*'||csym[1]=='/'){+ l/ i" \ l8 D4 x. h7 P2 ~8 v+ T( H
GetExpValue(t+1, csym[1]);2 J& V( q- b$ I9 p
}' Y% ^" M" ^: s _2 \
else{
1 s& m/ b. C n0 g% ] GetExpValue(t, csym[0]);) J/ D6 {$ }+ @# E; z6 ~4 C# U$ D
t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 _0 c+ o6 V9 z( p
}- ^: M9 T: B3 {7 L
nLevel = 1;. L1 y6 P' S" ~; e3 }, r
}
3 p' D! r3 C8 g% d2 o# P else istrin.clear();
Q6 z9 d+ o0 {1 x: w }+ K) u$ K7 g; s' m' B1 m2 s6 m
else{nERR = -1; break;}6 \ a3 V5 l& F3 h! i
}% o5 t, `% r. j( a2 I# |
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 P9 w9 [- Q! q$ A \/ P3 _* g- w, S else nReturn=GetExpValue(t, csym[0]);6 Q! j" W) j% B
return nERR==-1?1:0;
- {* `0 t1 W6 [. ]7 V}}& u' V0 M5 w5 Z" A
w* I# B* m+ c3 |& H/ ]& c
" Z- C! l, h; j ~
4 W- w: t$ Z$ l$ s6 B函数模板使用示例:+ y1 u0 ~, ?# w0 T
在以上那段代码的后面加上以下代码:
3 ]& F# V/ H& `# H8 c6 C; ?
+ U! c" ^: z P4 } * N: s) k) X; {, t$ T) w
. y6 v1 ]$ V" L, s4 L
程序代码:
( n& h1 h/ {8 B: m5 J4 J. g# t) D P$ P' ~* P3 X: |: j
#include<strstream>
9 w' ~ W9 D: M3 q#include<iostream>
7 z1 Z* w/ M% A4 ?4 V# Z#include<string>- F- x7 t6 R& d
using namespace std;" I" m/ k: x. p
int main(void)8 P3 w. d, v4 E9 S, I' C8 M
{
+ t' s+ h9 X/ D3 B6 D' D string s1;* g3 k) N6 z+ s/ S+ C
while(cin>>s1)5 u# H0 f1 `) D& B3 N
{3 `/ s4 t/ |( H& [6 k
istrstream isin(s1.data());% B; T" T/ I4 ^ O* h( v& R; Y
double d;
1 o: R: R: @5 l' O, _( j: b if(fy_Exp::GetExpValue(isin, d))
& F/ b: V- `4 Y9 Z/ n' G% }7 N {
) v. l5 S% R& }5 e4 L" X cout<<d<<endl;# F& D& `/ h2 B+ e
}
% s9 W- m8 m& ^0 d! ]! |0 z3 N9 B else
9 H* a8 E+ r( F. V0 L4 m {
( S @, g, {- {3 @& J& q cout<<"ERROR"<<endl;" w N- P6 ~! r3 K0 j1 t$ z
}( G) v- r: K' h. P3 W0 P4 N3 i
}
4 h1 p/ C% u& P7 Y* P- i6 O9 f. _0 g return 0;
" x% g4 ?: I6 r) c}
# p# B3 N0 C- i
; p" _$ | u" i" F% d. m% b, o2 r7 h, P; d8 _; e: G6 u, G* I; `
然后编译执行就可以了(*^_^*)
, |3 {0 c4 c" R: w# H其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ X3 Y6 w3 ]! b X+ h2 |2 A! e 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|