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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
, H+ V3 q/ w% f) S" r0 q) f2 b一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
* M! Y1 l1 C4 u/ G- [& d+ D只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)& m+ t. }2 O1 m" {: s) u
参数解释:' p8 h4 ]) D; ~# s) S
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 c7 t' x! x7 a9 z# ~3 pnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 `& R( A. z2 M( R! r" O返回值:, j' x3 k! e# T8 W
返回非0表示计算成功,0表示计算失败有错误4 g& ]# f* m1 e5 M( t+ W4 r+ [& G
6 K) I. s, n- J1 N
0 P# m: a$ \- f' e) _2 X
, t# i5 v5 J- b# P0 u* G) B- {程序代码: , w; s- g) r: o& p1 c4 r U4 \6 K
9 w- h: U0 m% w+ @9 H8 ]/ ]& ]2 V" t, Hnamespace fy_Exp{
1 O& L0 `- y$ j x' a5 bnamespace {template <class _T>& _7 k: d7 m: z! ^5 y3 P" M
inline _T GetExpValue(_T t[], char& csym){5 ~9 U2 ?! O' Q$ D# U1 K- P
char c=csym; csym=0;
! [% h' Y" R9 u' m" R0 q switch(c){! |! v" f* s6 m
case '+':return t[0] += t[1];
. M3 M6 v& F/ l5 {3 d, _ case '-':return t[0] -= t[1];
5 G9 B* N3 |4 o {! c case '*':return t[0] *= t[1];
% o7 M$ N: L7 r" I% L8 U' u2 H2 A$ _ default: return t[0] /= t[1];//case '/':
2 B4 D1 @' g3 { }9 f. c) ?( p5 I9 h
}}- v% C4 L- M0 o; m4 W S
template <class _T, class _Tstream>3 p0 w5 H5 [+ p o v
/* _Tstream: inputstream, _T: get return value+ l6 e7 l: k1 x" ]: h
* Return nonzero if get value successfully */" s/ l0 w( F8 I' G/ U
int GetExpValue(_Tstream& istrin, _T& nReturn){8 P; h9 W* m' t# O3 g3 f
_T t[3] = {0}; //雨中飞燕之作/ Y; V" A6 y* W& ~% k
char csym[3] = "++";2 I- \4 U" v; u
int nLevel = 1, nERR = 0;
8 [/ v1 y! w" z+ z if(!(istrin>>t[1]))istrin.clear();& ?5 r5 R2 W* w8 K7 o8 o7 V& ~
for(;;){
( N0 E1 @- V9 u: o0 V- O3 J6 b, p if(istrin>>csym[2]){
& I" j2 e! i& v7 Z6 k switch(csym[2]){
7 {$ a1 e. N; ~4 \2 R case '(':
2 ?* P: f, Q: n! V& h if(!csym[1]){nLevel=0x100; nERR=1;}else1 R0 X9 d, u4 ^- }
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, k: E: L- ]/ `/ V3 c: D0 @. _' | else{nLevel=0x100; nERR=1;}# q. c9 m- |8 m
break;
9 V2 Q+ m- R D8 H case ')':3 B* v4 T; |) g
{nLevel = 0x100;}break;
, g) X. }; |/ J* c* w case '+':case '-':case '*':case '/':" o9 S/ G9 I$ @6 W% z. z* B
{csym[nLevel++] = csym[2];}break;
3 R9 K2 X) \' S# o) ?5 [ case ' ':case '\r':case '\n':case '\t':continue;
7 x$ S# R' S$ `; }! S; g; { default:) x# n/ F( |$ t9 a' U; F$ H/ N
{nLevel=0x100; nERR=1;}; ~- ~" n! M7 n: t
}
" ~/ x2 v6 [: P6 u _ if(nLevel==0x100)break;
0 b7 p& @1 l9 h$ ?+ w$ J v if(nLevel&0x10 || istrin>>t[2]){% ?! [4 l1 V; I% A E; m
nLevel &= 0xF;
/ [/ Q/ S/ j3 I* ]% {; B7 k if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& m# y0 w# X2 p) A
if(csym[1]=='*'||csym[1]=='/'){4 K% J- I; p: P$ C4 ]
GetExpValue(t+1, csym[1]);' o2 m* K% X: c
}5 X% {2 B* h+ {: B! b% x
else{$ q+ j; }2 {8 ?2 t; w
GetExpValue(t, csym[0]);
2 k' K' X# V2 Y0 ]4 x t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 a# l% n8 S" ~7 h: d3 J8 b }# J" p6 n$ E8 s$ A
nLevel = 1;
! i. T5 L% `: J( @- j9 f( v) z& I }+ U" [6 T0 g- j& c( K) i0 S
else istrin.clear();0 m& h9 p2 N5 ]+ `0 c" p
}3 d( U7 s( S+ z: u4 C2 C2 c9 G
else{nERR = -1; break;}, H; r6 P: }2 ?! d( C) z, f$ f7 z
}( Q9 n- B4 t+ {9 m9 N% M
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" B7 r1 }" v9 q5 I7 U: Z1 ]& U( h8 v else nReturn=GetExpValue(t, csym[0]);
# X- C# r5 ^! v, R* N4 {7 {) P$ _ return nERR==-1?1:0;
% y/ L4 q7 U5 l2 Q* W9 O9 x}}& P" [- {6 J+ ~8 _5 e; U9 O
" S7 V+ T* [8 u' b- U
2 F `7 q+ l4 W# m) C* z
$ p! A- v5 E, f9 E( E7 t4 A2 y
函数模板使用示例:
* E" i' P3 N( ^. S s在以上那段代码的后面加上以下代码:
+ C8 a4 ^/ n8 g3 \, M, A/ g" H4 M3 c# f$ e; a
! U, _5 |3 ~8 [9 }1 W9 p
' z F! a7 g, v& O7 Y3 i: o
程序代码:
. Q7 y7 b. p2 k% S6 C+ ^. o) k! v6 @9 c ], S
#include<strstream>
, o8 x) b* W' k; e, B% @#include<iostream>
& r& C4 f( p# M0 b6 ]% ^#include<string>
& W" q8 B; |6 kusing namespace std;
3 `7 Q% Q9 T# v8 h0 n, Iint main(void)' z1 S$ E% J* A
{
9 j" [( c- W5 r/ q4 t5 A' r string s1;
) g }, \/ z( a4 w/ ^ e while(cin>>s1)
0 B* i. q) Z2 [4 F {
1 `2 X- L! L% J$ N0 B istrstream isin(s1.data());8 }- i0 b& P$ ^ n
double d;
! z8 |$ T2 z5 r7 Q if(fy_Exp::GetExpValue(isin, d)): H" R) [! S+ B* J; i! E
{
+ e k( n M9 D+ D+ B. q( f cout<<d<<endl;
8 ?: {) M; U" j" o6 ^ }' V b" r* k) F& O4 A
else7 x Z- O3 {$ Z; T
{
3 c9 S! x! t4 U+ F9 d8 t; [0 J" s+ } cout<<"ERROR"<<endl;2 a0 s/ e) ^5 z* n. X8 ~! X& b
}
! r8 E/ R& e5 v1 s3 C; ]5 w2 b }
) b6 V; y# m z! L8 Y% w return 0;
+ F+ b5 Q8 e3 o4 y' L* u}/ R, y- d0 E u! F' m
4 F* W+ Y, k N9 A8 P& u- q1 [
2 q, x6 e9 G" p j7 N& N+ |
然后编译执行就可以了(*^_^*)
; v3 ~: B3 u0 ^# T其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 Z+ K. A) G; J* c5 M7 N
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|