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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
- ~4 m7 T9 q' P4 P5 k# R一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ O3 O3 @' s. G3 M, j8 b
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 P6 K5 z( |3 j% U- W1 G
参数解释:5 E6 w' {8 l# O/ b1 G3 i, _7 `
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. F* j( T" [; ?/ O, WnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ q& F+ o$ }+ |; q$ ^
返回值:
& @+ G& R# {! F! ~4 D& D返回非0表示计算成功,0表示计算失败有错误
: ~) @+ L3 b! F, p3 m8 f& S; p
7 s3 I/ l8 \6 F' C) D6 }1 @ 1 ^1 ^# s r3 m0 t* t
/ r0 n( i1 o M/ \3 _( P) S
程序代码:
% S+ {& V* P$ n! \$ }* X# z
- v5 J5 }* R( X2 o. Z& \1 {namespace fy_Exp{
, l& V5 ^0 C% }2 ynamespace {template <class _T>
! m9 ?0 i( s1 S$ Dinline _T GetExpValue(_T t[], char& csym){
) M/ m, ~/ M o0 Z$ E( w7 f5 d char c=csym; csym=0;
9 M$ g! Y! i7 b, b6 q/ }2 U( R switch(c){
7 X1 O% B" B5 i1 z* y- k1 ~ case '+':return t[0] += t[1];" Q; O) U7 P2 A, R
case '-':return t[0] -= t[1];
/ v! q6 ]( Y" a( F. \: Y case '*':return t[0] *= t[1];
! [) c, Q8 K. L" X' M; s4 _4 [ default: return t[0] /= t[1];//case '/':1 K- c! i, j( ^8 e* j( G! b9 r
}
D, F$ B$ S1 h' U" h7 |- g H- b}}% {; ?8 C( U8 Q% ~& P4 t8 l' ?
template <class _T, class _Tstream>
& A; j- U7 i) G% I/* _Tstream: inputstream, _T: get return value
* p& Q6 {2 Q% y$ k8 G/ g5 e. r* Return nonzero if get value successfully */' h0 W! i! Y! T
int GetExpValue(_Tstream& istrin, _T& nReturn){1 h" B7 z, }# v1 k. }. O
_T t[3] = {0}; //雨中飞燕之作
; o% c# D# L* y/ u char csym[3] = "++";
/ V- L0 {( k! m, z, ^' _+ l int nLevel = 1, nERR = 0;
- F4 o( v1 i6 K0 S7 m) t. w if(!(istrin>>t[1]))istrin.clear();
; A1 D0 n( t. a* W9 Y for(;;){
9 F" Z( t) v7 H; F if(istrin>>csym[2]){
2 L' M8 Y% P. Z0 C2 j switch(csym[2]){" Q2 y S6 g; i! l6 ]: x! O5 P
case '(':
& t7 H! ^8 j8 [ if(!csym[1]){nLevel=0x100; nERR=1;}else
" C+ a. ]# l1 S$ @; E if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
6 P' z0 h# q! e X( i+ d else{nLevel=0x100; nERR=1;}
- c. c( v6 N9 ?6 ?2 M. K0 T) T break;
3 }+ W% r! n( ~* N8 p case ')':
, w7 N+ R% A6 |# ^) ~ {nLevel = 0x100;}break;$ E8 E1 [' g0 T1 x
case '+':case '-':case '*':case '/':
& P7 w; }3 I9 c+ d+ u! w {csym[nLevel++] = csym[2];}break;' q T6 u' E4 A
case ' ':case '\r':case '\n':case '\t':continue;7 v- h* }( {6 E* K
default:- K9 w. R/ ?4 }* b+ O, N% P6 _
{nLevel=0x100; nERR=1;}
& }" I: @4 \6 s. E( h- V }
' d+ a# e9 J5 A6 f* s if(nLevel==0x100)break;
; ?; y7 V, n2 T, m% | if(nLevel&0x10 || istrin>>t[2]){3 f; D+ N& k' u, d
nLevel &= 0xF;
: S( f( Z/ n+ o4 E* j$ \* H: [ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
) `7 [6 L2 `# E4 p9 R if(csym[1]=='*'||csym[1]=='/'){, O: V. o# |- Q) o8 |" ]
GetExpValue(t+1, csym[1]);1 X) ^" Y5 f7 N, k! l
}
& b2 P$ g$ x) N1 O else{* c( ]( u7 C5 q; P1 C: ~
GetExpValue(t, csym[0]);' ]* k) A0 x' P; `; ?% C) k
t[1]=t[2];csym[0]=csym[1];csym[1]=0;7 s; H( z! b$ X9 }( k9 R
}
+ ?# r5 \, ]3 s* }/ Y& m3 N nLevel = 1;
7 g! g6 y) R1 M& S2 x" r }, k9 }0 q2 s; L; W$ [0 C n* f# Z
else istrin.clear();
+ I$ z1 m& m& d+ j7 g$ @. R }4 e* v' C$ U; v* @: f- X
else{nERR = -1; break;}
! _0 h4 @: g: @& ?. E' w }
5 I7 x4 ~* C! r9 g if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' W* R e. f- N# U/ Y: H/ O else nReturn=GetExpValue(t, csym[0]);
3 A& M$ h$ k b3 O6 H( A7 A/ s2 a n: y return nERR==-1?1:0;" o- |0 f, T3 K
}}' T- [" Q3 \. ]4 S
3 y$ A' R8 [9 a7 A1 Q, N
* }9 x8 T4 y! U* K# Z* O& s
* j/ z7 L. O- p! [& \! K函数模板使用示例:% V w9 t3 l7 L& u4 T3 A
在以上那段代码的后面加上以下代码:
* A% l$ O+ e/ L' ~4 u* A% R
0 T3 l9 e$ s0 R+ b5 T; e
4 w2 |5 B4 q) [: i
5 N: ?. r, `& i# j* r程序代码: . C( S3 t7 `( [1 W
1 M' @9 K) ?" _0 q6 a, v#include<strstream>1 \0 H1 K6 p% e, K2 l" P/ ]; K2 _
#include<iostream># d1 v4 u* s4 s( v" d6 |3 m( T1 L
#include<string>6 p" h" Y/ S8 H9 S0 Q% `
using namespace std;- y! H: ~) c. A& q
int main(void)
7 s1 O" x' C. ?5 { c{/ w- z t7 `7 g0 Q4 v
string s1;! Y% t* @3 v+ P3 \
while(cin>>s1), A: X6 s5 S0 r, c
{
: |" Z/ ^3 G& L8 X M0 e istrstream isin(s1.data());
' A/ Z9 N4 s W5 { double d;. ~: ^" J& i8 e9 n" ?. m
if(fy_Exp::GetExpValue(isin, d))
8 F. c4 I- w* W( @( h$ ]' E {
4 N4 b# s3 i2 i cout<<d<<endl;
, [+ \' M. | s2 H; d$ U }* G; t9 x5 }7 ~/ O8 @0 K/ i0 L
else6 j( b9 S" N1 _# D5 d9 J
{
" J8 D/ w5 u1 B& i& Y cout<<"ERROR"<<endl;
/ Q) T! c5 z+ J) Z( `6 b" q }
% A N1 P* M: L; D$ I4 W }
) d4 a& v6 c# u2 }" r$ I8 P. V return 0;
; {& k8 z+ Y6 {% E}
; [3 b0 w J" a6 R/ Q- x( `- s% S+ l6 [' `8 x. @
9 K8 G% c* b# l& U9 y
然后编译执行就可以了(*^_^*)
' D S2 b# H* P/ x O0 T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" a' d, o( @, H2 Z( k% D 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|