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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,; K! i* ?% A8 Z9 K _
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
7 K; [9 e; [! n" ^# M只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): z N1 r+ t" x
参数解释:! t+ K/ s" g# o* d0 O! B( U9 V1 r) F
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* c9 s5 V: V: N; E8 ^( q9 bnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: v1 |% K7 m3 P; w7 w
返回值:# v% ~0 ? B4 a7 q
返回非0表示计算成功,0表示计算失败有错误. h3 V, _3 ~2 Y) w0 J0 W
l) z% r7 ~3 C
" \- u) |: m6 J# j
n0 _; W+ x$ B* c
程序代码: 4 C& l8 a3 L; f
5 u1 }, z% {5 h) n
namespace fy_Exp{
8 }( c4 q+ M( P0 l5 m; j4 knamespace {template <class _T>7 L P P. C$ g, }9 j
inline _T GetExpValue(_T t[], char& csym){
5 i! P: O) V* T* I& H, T char c=csym; csym=0; w( G l' _7 h% a+ R# J
switch(c){. u$ p, S; ]) c
case '+':return t[0] += t[1];7 Z$ w$ _ r9 ?! M2 Q4 L' v7 y3 ]
case '-':return t[0] -= t[1];& L7 _6 c- [* r+ F' z9 M) W* _; n, C. P
case '*':return t[0] *= t[1];6 t/ u" ] J2 j% A$ _3 f, t9 S9 \6 y
default: return t[0] /= t[1];//case '/':
5 @" m0 P( D% F& A1 P6 B$ n: Z+ _ }& J% c$ g+ d# h: H9 P
}}& _/ Z6 s3 H. ]' U8 y
template <class _T, class _Tstream>
* A! ^' C' e) Y1 `4 d$ h/* _Tstream: inputstream, _T: get return value
& U) D4 }) W5 N# x5 o- E! k) d* Return nonzero if get value successfully */
! _! q: J* v; I3 j% L4 @0 s' uint GetExpValue(_Tstream& istrin, _T& nReturn){
- H+ ? F+ t$ z2 `6 Q" K+ k _T t[3] = {0}; //雨中飞燕之作
" o5 e' K3 E& u; @* I' d6 ] char csym[3] = "++";
! d8 M2 x. g6 N1 _ int nLevel = 1, nERR = 0;
+ `8 p; X; R3 Q3 f& h. I9 S if(!(istrin>>t[1]))istrin.clear();
# S" O* }" q3 i) a& L1 j& i. A for(;;){2 q6 ~* `, d( V$ A
if(istrin>>csym[2]){# W* P$ J4 k% A' F5 A
switch(csym[2]){! j- ]- f5 ~, ~- P
case '(':
9 m8 S" l! ~' Q+ n7 o- l6 B% W if(!csym[1]){nLevel=0x100; nERR=1;}else
5 b h$ J0 H& [$ r; U& E7 {4 U6 ?* J if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
# V1 F l8 W6 v, z% A else{nLevel=0x100; nERR=1;}2 H0 ]& `# M# k8 W+ ^/ }
break;
2 f* b" t) I1 s1 a0 [) ^0 W- [, Y4 s case ')':: c- t7 s" q4 J; M! X. s) A: g8 N
{nLevel = 0x100;}break;
5 f5 |! {' L9 H. M case '+':case '-':case '*':case '/':
7 P. M$ k+ }4 k* l4 p+ ?0 v0 W {csym[nLevel++] = csym[2];}break;; m1 z+ B" k; l6 |
case ' ':case '\r':case '\n':case '\t':continue;
9 {- x% K% D9 F4 M5 T* m% W/ t) T default:/ h- D" ^0 z. m
{nLevel=0x100; nERR=1;}
2 G/ c5 X$ r% |! x# O }/ ?/ Z! I, Z6 d8 N
if(nLevel==0x100)break;
$ }. z8 L4 t2 ~* |/ Q* O if(nLevel&0x10 || istrin>>t[2]){6 c: s& z. K9 I% I: K
nLevel &= 0xF;
6 Y% i' E0 d# T1 _* l# L if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}' i1 ~2 w5 ~! a! Z
if(csym[1]=='*'||csym[1]=='/'){
: _ T( D" v( ?, B- M, ^* ^7 a$ B9 p2 j GetExpValue(t+1, csym[1]);& L5 g7 M9 d6 }/ V1 h, h
}$ _/ b, j7 i9 z' v0 u# O, R0 O
else{
' o- Q4 ~1 n2 j8 ]$ Q GetExpValue(t, csym[0]);. z8 ~1 \) J0 r+ `0 e4 Y" @% S* j
t[1]=t[2];csym[0]=csym[1];csym[1]=0;5 A0 U* N: w: l% M- t9 ?
}8 j; t, `, I' Y) C
nLevel = 1;! w6 r7 _% e% M$ g; I" P
}
# i* J# ~* n+ G9 f- `& f else istrin.clear();
4 T5 m# l; g( n: r$ C4 P }! C4 n; Q: \+ K0 m3 W9 @
else{nERR = -1; break;}
* B/ ?2 `; u7 Q& I( h }
/ F+ e2 k) r5 z5 q* v+ q, k if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; q: u) J0 }# Y else nReturn=GetExpValue(t, csym[0]);$ E' c5 B- t6 A0 i, `
return nERR==-1?1:0;
; t9 t d5 ]1 A5 Z; p9 U4 K8 t( `}}
* L# i6 h' @2 v# I* `2 b. D, ?# D6 t: z" R2 n! U* O
5 k+ j- \; O! n, M7 `, _- x5 Y4 x: H+ E( q, w, ^
函数模板使用示例:
. H% e: x( W% I7 V在以上那段代码的后面加上以下代码:6 W) Z/ t2 T. m9 r* T+ J, S! P l
# f1 E# q, t3 ~9 O5 d5 ` . k/ d" V Y+ }2 [" j0 ?- }2 J
- L( ~+ m9 p- y+ b- i程序代码: " G# I# w" Y4 f2 {/ z8 X& v
% E; R- s1 P7 ^
#include<strstream>4 A9 h1 U3 j; o3 {- y% R
#include<iostream>* @, J: U# B+ A( g* \
#include<string>
3 n: x8 S9 z& V, f" _/ H% Eusing namespace std;8 m: V, d* f+ U* t3 W
int main(void)) a3 S9 k* g* m8 G6 i- R
{3 e4 Z9 X: h( {) V: I
string s1;" y8 t0 P5 S+ b
while(cin>>s1)6 R5 U# v. [) ]3 b$ X, _' @
{
0 e( g) G$ D8 {* U K istrstream isin(s1.data());, n/ q' k4 L4 y! p7 T8 C `' b
double d;/ F U% }6 M0 T/ Q, Z
if(fy_Exp::GetExpValue(isin, d))5 ^) y! {% @! e$ T* A" R9 k
{. t( D6 H# U9 B" f! q/ ~6 a
cout<<d<<endl;
/ p& o/ S- Z7 Z0 r9 Z o# [ }7 {) [* w# m& c
else+ [$ z$ ]; `+ v: u
{
" J6 Z2 ^. K" ^& k# e4 V+ H( k, A cout<<"ERROR"<<endl;
3 }1 A# d" [. O }$ r* _) P: s! ~) a5 t9 U
}) C; j7 Y8 V: Y) n# y7 Y* L: U
return 0;& d' s# V" X) J3 j
}% e* q% y! N7 t# k( p
, @* g; A# x4 Y7 `, O1 C' ]+ e! u5 t
然后编译执行就可以了(*^_^*)$ y4 Z; h' e+ ^: D E
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 V* F7 p8 G. X* w 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|