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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
: ]; e9 d; x8 {) q+ Q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 d3 V5 y2 V- K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 l: |6 K, w( ^ s) A6 R
参数解释:2 S+ }5 O7 ^+ ]
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( n B* I; w, \# \$ T& `
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 R' J' r0 t% J% _返回值:
6 h5 D O) k/ S T/ u2 l5 M返回非0表示计算成功,0表示计算失败有错误, v, H& r5 m8 J' o# i3 n
( L' ^2 g' k4 ? P9 V; j
4 n# J3 f: U- Y: F1 F
2 C' v+ o5 b. A程序代码:
7 L( J- w! Z0 `2 T! k+ Y4 T8 ]" i" d, h) y
namespace fy_Exp{
( V$ l# l0 U4 {namespace {template <class _T>
3 H. P1 d1 I% O4 O' Ainline _T GetExpValue(_T t[], char& csym){
% E. D0 R1 o1 t3 l char c=csym; csym=0;
' x, ~2 Z' q. U% ?# i switch(c){7 E7 ^* e( q# D- Z
case '+':return t[0] += t[1];, i3 ~, G; W- E; f3 ~: ~
case '-':return t[0] -= t[1];
- H9 r; v3 x/ L2 D) H, J5 N" Q case '*':return t[0] *= t[1];
" Z8 T+ i2 j- y- k) c default: return t[0] /= t[1];//case '/':
4 f: O& J* C; _+ V C; N# @2 i2 s }' w" f- ^8 x- l
}}
0 d9 q H; D) N. t: Itemplate <class _T, class _Tstream>8 A5 ?2 `8 c/ h6 B
/* _Tstream: inputstream, _T: get return value
; b3 q/ X1 r" x+ P3 e* Return nonzero if get value successfully */
" T* o% h* K6 H U g1 @- o# x+ lint GetExpValue(_Tstream& istrin, _T& nReturn){
0 n1 H+ q) M8 U/ n _T t[3] = {0}; //雨中飞燕之作
' h* g v5 S) C) a( p char csym[3] = "++";
B, F$ T1 D" m5 j int nLevel = 1, nERR = 0;& l, ~- [' R& v
if(!(istrin>>t[1]))istrin.clear();- g" z+ o8 _ C5 Q0 C0 u3 ?4 m
for(;;){+ s" i) S( H/ s! n8 k2 E" T
if(istrin>>csym[2]){
l* J, Z. w7 o: I- E1 } switch(csym[2]){
% Z9 y8 I1 G1 `( e3 k5 T" u6 O2 _ case '(':$ s6 [/ C2 C- }7 F L
if(!csym[1]){nLevel=0x100; nERR=1;}else
& n: Q" N* p, ^* _* h$ l if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 {; \& s" ]8 X7 f
else{nLevel=0x100; nERR=1;}; c$ ]8 j+ ~1 x, i/ I
break;
: M* N7 _3 f! T+ `3 _) |& m- k$ g6 E case ')':
3 J' P7 ]! O' \! V7 r {nLevel = 0x100;}break;- J& v' `- ~8 Z- v
case '+':case '-':case '*':case '/':
2 s) l7 X" q; s5 W- v {csym[nLevel++] = csym[2];}break;
$ P' A+ ~" j8 M+ s case ' ':case '\r':case '\n':case '\t':continue;8 s3 K* b5 W# O% k8 V2 f$ F
default:9 Q" n. e8 Y+ z
{nLevel=0x100; nERR=1;}& x* E5 X+ F* ]
}
& `" |; X5 w" c* D9 V if(nLevel==0x100)break;
# x4 s2 ~4 c1 `; N, q0 ` if(nLevel&0x10 || istrin>>t[2]){
]- U( @; C5 d( l* X( A nLevel &= 0xF;3 l; t2 X: l, V, t7 ^) {: F
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
A. V6 f ~' O% e5 z$ q if(csym[1]=='*'||csym[1]=='/'){& l9 |2 b# \) ~5 h! L+ ~. y
GetExpValue(t+1, csym[1]);1 Z/ f) k% w5 c$ z
}
: I$ }( F3 d6 f q7 K5 { else{
& g6 E% H z5 s$ u7 r GetExpValue(t, csym[0]);, @! A+ p2 X+ w6 s) q- ]
t[1]=t[2];csym[0]=csym[1];csym[1]=0;' n& {! g/ g5 M# X7 P0 F! L
}
6 }! E- e" ~# k8 N nLevel = 1;) F. S8 P) f2 F9 m( S/ R# w2 `
}
_8 \& O: ^. ]; V else istrin.clear();) f9 g8 v. ^9 M/ g
}9 v _; e1 r4 c1 {" f9 x% x8 {- d6 R
else{nERR = -1; break;}# c8 I8 G3 z% e7 _
}
) `* b! U8 p) e9 V* v- v: n if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( Q& `/ L+ W6 ~0 M( D" q
else nReturn=GetExpValue(t, csym[0]);8 ?* }% C+ X/ G1 q1 k# L
return nERR==-1?1:0;
) c; Y+ {" s* j O}}9 o$ r* r& Z) T2 V/ K+ e- o9 L
% J/ S9 A7 q9 ^% V6 |
3 ]% K+ L6 p* |% z5 b( I7 ] H4 k: v; S8 i% H, k7 n
函数模板使用示例:
8 M$ e+ V. L6 v; ?! S在以上那段代码的后面加上以下代码:- G( f. o: {2 z, H: J0 m
' ~8 O1 S" _; T4 d7 s+ U
3 F# x: `) b6 V: }5 H
. `1 [6 e" X+ S/ D
程序代码:
* D; i7 ~( E* x7 Y$ f; V: s- ?( @0 c) q& S. C9 n( u' C# X
#include<strstream>
( v2 i& T7 G8 S$ X4 l* X p5 V#include<iostream>
: n+ g. \8 y8 e1 @/ \! a4 [! Y#include<string>
" V8 l2 r. `5 P$ a- a( ]9 f* busing namespace std;
1 F1 r& d) o8 }# q& \9 Sint main(void)
0 W( E# t% H4 d{
" K$ l5 M) E" j! d: g4 E/ G string s1;
: @' |. Q3 X1 ? while(cin>>s1)
: U! Z* z$ L# }! I {
$ d0 g* N0 W/ r3 d: }. h% I istrstream isin(s1.data());
& H5 n- t$ ^" u& m. M double d;
$ ^8 n& f- j; @! w4 s if(fy_Exp::GetExpValue(isin, d))
6 q* x( s8 ?8 ?% S: j/ u% P q2 n6 {! a {
* y+ t& N% W1 n% m- \' B' G cout<<d<<endl;/ Q n) A) D$ @. J+ O& u1 S
}9 y8 z& f# l. h3 z4 t
else1 n$ b7 \6 r. c5 a3 I
{# {) W# Q: i3 k1 g8 @$ r' s: Z: V
cout<<"ERROR"<<endl;; q: z1 H7 F9 G4 _8 b; P
}
* J4 T' p) [2 h8 p' r }
1 q" ?/ F# ?/ \8 J, B return 0;
7 J' C$ G. Q7 {- {$ Q( [}
8 ~% x p5 v$ X3 b) U+ Y4 g# @4 N3 S; C0 ^! a7 N' \/ K0 w3 _
% i9 [, n7 a8 }# w
然后编译执行就可以了(*^_^*)
4 T+ ^* e+ P* C6 c其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 A ?" _3 v4 H0 ` 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|