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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
6 ]& A( i: H) [( r" i一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 ^- R& o0 J4 n9 H4 Q: T' P" k# }只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
K2 H8 `* G0 x6 ]0 ?/ H' _* L: S参数解释:0 |, l" v. t7 w! |* b' ?
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- {% E* U# q: [# RnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 {2 I# b% w; ?9 F返回值:
G2 H3 `- v9 [8 L. _返回非0表示计算成功,0表示计算失败有错误
4 @; N, L3 [( i1 h: C O& N6 s; U1 E* [4 }! B6 B
, b2 T0 A: `9 z* o* d, i
$ G5 A4 f3 |1 T4 H# D1 F
程序代码: 3 N( w2 P. E& I% A2 J" L
# @( U7 V& U7 b8 r
namespace fy_Exp{
" G5 d, I X, Mnamespace {template <class _T>
8 u% [2 I0 [, Y tinline _T GetExpValue(_T t[], char& csym){! C9 P5 \' g( A( Y$ `
char c=csym; csym=0;$ _* A/ y' K. @$ T
switch(c){) j# }: X! r1 w3 U0 I' c8 R
case '+':return t[0] += t[1];) v, n5 h1 |" W$ e% `4 {
case '-':return t[0] -= t[1];- ]7 }# F3 u7 p. _
case '*':return t[0] *= t[1];
4 s2 P+ I! M; ~7 G9 w default: return t[0] /= t[1];//case '/':4 B( ~/ i/ Y$ K- `" z$ o
}% c ]; s1 \) _: J" R) O/ k
}}. o& o) g: h/ C$ p
template <class _T, class _Tstream>& v4 u% r! Q6 e+ f0 h" @
/* _Tstream: inputstream, _T: get return value0 E3 u5 Z2 G/ ^
* Return nonzero if get value successfully */3 K' _- C- m1 L* g1 M- |5 m5 E/ ~* z
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 d9 N3 I, f3 b+ Y) ]! ~3 {3 j1 H _T t[3] = {0}; //雨中飞燕之作
; L1 y9 \" J, z# T1 d3 O char csym[3] = "++";
( @. u a1 }" i8 X; X4 b int nLevel = 1, nERR = 0;$ g- q1 r( |. l! D
if(!(istrin>>t[1]))istrin.clear();8 Y) o8 ~7 o9 j
for(;;){
' [$ n/ \& b$ Q+ z& M if(istrin>>csym[2]){; @) U( ?& G7 U
switch(csym[2]){- u9 G& e/ |/ v+ z/ d
case '(':
! M0 b/ q8 G) _: ?- u* H0 X: D# A if(!csym[1]){nLevel=0x100; nERR=1;}else
2 W1 D3 a* y j3 L0 N if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
% Y1 I |/ k* [- I- f else{nLevel=0x100; nERR=1;}! ^% Y5 Z& V6 z% ^3 j
break;
; n: \! Q3 m( K9 z" G1 E case ')':1 M2 s: C- {$ x' y6 M, t, N8 @
{nLevel = 0x100;}break;
/ m. |9 j) K% t% G case '+':case '-':case '*':case '/':8 I2 s9 \5 m: d+ _5 r
{csym[nLevel++] = csym[2];}break;
. e1 A+ Y) g9 W% S+ [$ R case ' ':case '\r':case '\n':case '\t':continue;4 g$ ` r% C) C8 r% Q
default:7 l" V0 g8 X/ `6 W) }& m, Z1 i, P; L
{nLevel=0x100; nERR=1;}4 S, j4 M2 n& e( f- I! C9 H% n8 A
}
0 R! p' p: [, y u$ @# q& c if(nLevel==0x100)break;2 S% ?2 J0 a/ P& m+ _
if(nLevel&0x10 || istrin>>t[2]){6 l( U5 z1 @. E
nLevel &= 0xF;
6 o) |% {0 J" z1 i) X) W if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: M$ k- J( p4 i; {3 v5 W if(csym[1]=='*'||csym[1]=='/'){; B& e, ?1 Z+ P: P) @8 o' s0 ^
GetExpValue(t+1, csym[1]);
+ N) @* E, Z D1 s) P- u* m/ U# e }! z5 l" g9 Q, o8 l! Y! B
else{% {4 x$ S$ [' V( k
GetExpValue(t, csym[0]);( e- c* r* c) J! g
t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ l$ U7 q8 B- Y$ g
}
: d% t F# e+ f0 t) V- ` nLevel = 1;& d b6 G- {" b6 m) L
}8 e+ d: M. {# j: X$ x" N* p* H4 m
else istrin.clear();* ?; Q2 A0 i( V; _# e% ^
}2 Z: e5 U& Q, _+ Z' l g$ d3 K
else{nERR = -1; break;}" J1 f( K' R2 f1 M( ]3 z
}/ B; l( O1 T5 d3 u1 G. f6 S
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% ]7 w+ T$ u* k8 u% ?. Z
else nReturn=GetExpValue(t, csym[0]);. A, V$ l' t" y' O
return nERR==-1?1:0;
. T" k* m A+ U}}
$ n5 a$ ?, B2 L P6 W% e0 e8 y
: y! A9 h4 b4 V, x& I
: _# _# Y1 y+ |& N
' e5 h1 O6 y8 X函数模板使用示例:" Z' e2 B3 ?& n
在以上那段代码的后面加上以下代码:7 H( [' t! C. ^6 ]( S, M
6 d E' W3 ]. z2 |/ L% _) B
) e# k, e" s1 ]! J
; w0 l3 q# x0 t& o, L程序代码:
5 R4 ^' X. X9 ?0 r/ c& `
2 }6 C0 f; k/ k: E; w: G" }#include<strstream>
- |0 ]# ?" g. J( r; l% Z3 O#include<iostream># k! x' s. o% K+ x% ^4 O7 x# l( x
#include<string>
* V! e' q6 P! p6 S$ kusing namespace std;1 F" p* }# K d; G$ R
int main(void)7 g9 T2 Y* A% |9 I/ v. U; I9 _
{& |! p$ H6 R; s( T
string s1;* R. U, [* q7 l; d
while(cin>>s1)
, A' S. q2 _3 L/ J% i" F {
. O g) u5 R2 p* M9 v* k! U istrstream isin(s1.data());- g9 _; `' e9 L `# l4 T6 t
double d; [' d3 N) z9 w, V1 n5 j
if(fy_Exp::GetExpValue(isin, d)), Q) z0 c& f0 e I, H O" _' p+ p
{
! Y0 L3 E) U6 I6 V% C4 M+ z cout<<d<<endl;* Q- Q. A- o1 m F) S: t: O' z
}
1 V" D1 W; g/ l4 `9 f) \ else' t0 C4 D6 C8 F5 Q
{1 \. Y% S, p) Z7 ~. @$ f
cout<<"ERROR"<<endl;
" g0 I' t. B# u# [ }
I' P1 k( E. E+ c J! } }
& X1 @# Q0 ]" E; [! u6 f+ X/ [ return 0;
9 a4 O; F% @" V! ]}
6 ]( ~# Y8 s- |) y- ^0 z
1 s4 p( _; [* t! R$ k" O e% X9 x B: y: K, Y
然后编译执行就可以了(*^_^*)
# I! T2 \' S* p4 |其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) G6 L" Q7 D4 W+ @ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|