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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
- R! K; J V+ a+ C一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 \9 ?! n" `) o2 z! q6 {. ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ \+ U% l3 h i参数解释:
, l \+ u9 S- E. S& \+ Uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% R! Z" p p. @) B$ W3 L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- c1 M3 U8 y, M, ^9 `返回值:
. B, r, n/ q, p返回非0表示计算成功,0表示计算失败有错误
" w1 H0 A* v7 A( n, F# I- a9 P) F- _. m/ r" g
( e# d; N7 [7 E, R. ~$ ?4 o" r: a' P8 C
程序代码:
4 k1 A/ T" U; P3 i0 Q* d$ _$ B' u+ o# t/ `
namespace fy_Exp{
( P/ t, i3 m+ V; f5 |/ T& Xnamespace {template <class _T># [$ }7 L$ r+ l6 y0 H' C
inline _T GetExpValue(_T t[], char& csym){- n: F* e" {2 \& ]( u1 f' \, i7 N, F' t
char c=csym; csym=0;3 {2 x8 Y) u7 G
switch(c){
2 ^! C; F, S9 @$ X. w- X) R3 c! k+ l* _ case '+':return t[0] += t[1];& @3 g* I$ _: Y% f6 V( L; Q5 t" b" M
case '-':return t[0] -= t[1];( {& ]" f+ d( o1 E9 F4 F. h' B% ?
case '*':return t[0] *= t[1];! ~ i( ~) @6 [( C7 s2 r% h ?
default: return t[0] /= t[1];//case '/':0 P) q/ G# f. b0 {( o" I
} p1 _4 ~7 ^7 ?" N6 H
}}1 k0 }3 V! l; f1 t( R7 O N. k
template <class _T, class _Tstream>
/ B$ e# h9 h; g" J* l/* _Tstream: inputstream, _T: get return value
, \6 F7 _/ o4 r9 @* Return nonzero if get value successfully */
0 O; p( F, e3 @/ _1 Kint GetExpValue(_Tstream& istrin, _T& nReturn){( j- Q* R9 e$ L" K: I1 l
_T t[3] = {0}; //雨中飞燕之作
# A) ]( @- b( G char csym[3] = "++";4 J0 u: c3 E$ h- L% ^5 F
int nLevel = 1, nERR = 0;
% S( j- w o$ G" _) T if(!(istrin>>t[1]))istrin.clear();
( D$ H) C' A0 w2 v* N4 y: A- h for(;;){+ C4 _/ u) V" M' v3 f3 Q5 Q
if(istrin>>csym[2]){ X+ _3 d7 V# m& v y7 T
switch(csym[2]){% S7 b/ N/ k7 B) U' C$ I) B" d
case '(':+ l! G' `+ k5 G+ z/ W/ r
if(!csym[1]){nLevel=0x100; nERR=1;}else
5 Q2 a* d3 R- W% I if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 _: x# b4 [- d* l8 R% g else{nLevel=0x100; nERR=1;}
( ?$ E& y. w2 Y! x1 n& e/ n- Y. o break;8 F+ j; e) z% r0 f0 S3 m# ?
case ')':
2 I# s4 Z# l0 }2 l) R; C; J8 L+ R {nLevel = 0x100;}break;* D$ T3 W' L! L$ F* ~
case '+':case '-':case '*':case '/':
z* @' Y& Z5 Z6 c {csym[nLevel++] = csym[2];}break;, O& r- z" Z; `. W5 q8 B
case ' ':case '\r':case '\n':case '\t':continue;
" U0 b3 w# I6 p3 P. c$ ?4 [: x default:7 G5 B& @9 t- A' w+ y% j/ I# D
{nLevel=0x100; nERR=1;}( o7 ~2 N( o# ~7 ]7 N* ]" d
}7 ~' H- y1 z# S/ ~
if(nLevel==0x100)break;
+ X$ y e$ Y9 X) Y; e0 m* q* { if(nLevel&0x10 || istrin>>t[2]){) W: F. n7 ?1 q1 g# e4 y
nLevel &= 0xF;6 g' K6 ?) ?9 o, e
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) @' z! F, w; S4 I
if(csym[1]=='*'||csym[1]=='/'){% m. O& T! j E2 I3 e% H
GetExpValue(t+1, csym[1]);
, Y2 B C, i( e1 ~/ Y }
: I( k; T1 H; E else{$ b2 K4 V( l* g3 R* P$ ^
GetExpValue(t, csym[0]); o; @& g/ ?7 y9 w& S8 u1 [+ G z ^
t[1]=t[2];csym[0]=csym[1];csym[1]=0;! N1 S! R. K: R1 Q! ~: F
}
& o5 d. j( @( a nLevel = 1;
U+ ?0 \( n, Y% q" w, l }
) n9 ?& a& K' }% G else istrin.clear();& I: `. a5 r7 F2 x/ D( t4 T" m
}
# X. w$ B3 L7 l3 t# i8 V else{nERR = -1; break;}8 ~' d7 @# ^: f# U. A( b! R
}1 D6 d1 f1 m7 Z% s+ Y
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 x! q" s- U( o5 ] else nReturn=GetExpValue(t, csym[0]);
) z! c" ]. \) y5 j; F return nERR==-1?1:0;
8 |% @6 ?- r. {6 Y, \4 ^, w* B3 D7 r}}& \4 D# s% l7 a. `, H5 Y
/ }! y( c6 O8 k6 i* T& A. L
; v% p9 \& B+ @ l* |- b8 G0 E$ L$ Y% \( M4 a3 m
函数模板使用示例:
# \" ?- e. N3 _- m: J在以上那段代码的后面加上以下代码:
, J! c. J/ N3 b' }9 E- p8 T+ M
4 m% G' i6 q5 ~: e# ~
; s8 r' ?- K4 }$ N: a" e0 V) ^6 J3 T8 u! J
程序代码: 9 }) E1 r* W, f0 o
1 t- ~3 _, d9 C6 Q, Z5 f
#include<strstream>
' \4 X! T- Z3 \9 F#include<iostream>, Z; `- r2 e0 G2 [
#include<string>
- f7 q' X+ c* K$ L: \+ L1 e- nusing namespace std;- s& H7 @+ O+ w' U% J# n
int main(void)
3 H& T( @% n# i7 A7 B# j+ j1 e{9 |0 m/ k7 Q4 _+ x; S o3 H8 m
string s1;
/ x" k. r6 ] P8 A4 A* e while(cin>>s1)3 H, E% ?# ^; S/ _8 f
{
- A$ c1 x& `% Q' Z4 v! z- O istrstream isin(s1.data());
9 S o( }( r2 s4 R double d;% E7 O7 d2 a# x# `
if(fy_Exp::GetExpValue(isin, d))2 `& g$ l1 S4 O3 K9 U
{
, |) A4 Q E8 x1 D cout<<d<<endl;7 E6 E8 V4 i0 Y& x/ _
}9 b7 T9 U0 Y! L$ n" }: L* a- @2 r5 N
else7 |' [. x0 T6 W
{
# }" {5 L1 _3 {2 }( d3 Q cout<<"ERROR"<<endl;+ V$ T! s- G: D$ r% F) b7 ]( b& _
}
8 ~3 h5 _& @* F7 s }
! @+ Y- ^; g$ _& P$ K# X) ~ e9 Z return 0;1 \% a/ g; P! {5 ~+ h4 ^6 n
}: z% Y* q6 O) x8 ?
o' {; w5 W1 C, Q. g/ ?/ y. l# J$ o
然后编译执行就可以了(*^_^*)
* l# |! A8 E: T% Q% \0 h其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 y% ] T, {; ^0 L
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|