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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
9 ?5 \# v# Z+ l- X9 T) I! W3 q5 e一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 l* p2 h) S" P5 M9 k只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' J4 @, R; W. M9 D' x' M参数解释:0 z Z a$ `$ u8 |( v( z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 p( N/ S' ~6 X5 E/ ?
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ [, _- P( N) A返回值:
, t6 `0 V) a# ?& ]' a返回非0表示计算成功,0表示计算失败有错误
7 B. s. X1 B6 S* \! }2 [ U: `! O
3 S4 p$ o, w2 L, s6 O6 p) ~6 @- F
( |) W" P2 [/ |, n6 N2 _" a$ y8 h$ z# L3 e1 w( V
程序代码:
( o5 z3 c3 a2 P4 E- c( I k% V# q2 E$ \# q- P% x4 W, T- G7 {
namespace fy_Exp{! [. d! k# W+ S8 K+ w6 S9 N7 A5 i
namespace {template <class _T>
( b& O) M# T6 ^9 n$ O$ Dinline _T GetExpValue(_T t[], char& csym){
& l, @+ d! x) u# S! H* o char c=csym; csym=0;
# H' V/ q" W8 V* g1 i switch(c){/ v! S, H: t: @$ u3 b
case '+':return t[0] += t[1];
0 `) [% ^$ ?% F; }- { case '-':return t[0] -= t[1];0 Z4 T5 q& B( j* d, x1 L7 R
case '*':return t[0] *= t[1];1 x! C3 F6 t, I' T
default: return t[0] /= t[1];//case '/':
7 I1 N6 L; Q9 T }
: ~1 C; m& h0 k3 @ z+ S; o) V4 \4 K}}
5 d: n2 i- p U9 [' d0 T" btemplate <class _T, class _Tstream>
6 G D) P9 I7 C" W/* _Tstream: inputstream, _T: get return value
# \8 L5 P) w) e( M$ s* k" Z* Return nonzero if get value successfully */7 p( t: k } n _0 a
int GetExpValue(_Tstream& istrin, _T& nReturn){0 m8 A* g7 ^4 g& b: H# N, M' g7 H# f
_T t[3] = {0}; //雨中飞燕之作
3 h0 C. B4 \% N0 Y6 c; K# { char csym[3] = "++";
& c5 Y* z/ z6 L% l) r! A7 t int nLevel = 1, nERR = 0;3 B) U; Y- n! l5 Y* t
if(!(istrin>>t[1]))istrin.clear();
5 o: p. T7 V: n; N+ O i for(;;){' g) {% |0 f' ?- j- D" d7 V
if(istrin>>csym[2]){3 x% D; q1 Z }7 U4 C [7 a y
switch(csym[2]){
4 ?" O# r/ S6 d( F. \% h case '(':
4 w3 D, I; y) v0 d if(!csym[1]){nLevel=0x100; nERR=1;}else
4 k7 x9 D& e. X, F ~, z6 Z# A n% A& P if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
$ S$ c6 \/ d* ^% G/ [ else{nLevel=0x100; nERR=1;}
0 |* c. t! @0 ?0 i X break;
2 g- k( U. v7 _( ?/ G. r case ')':
; A9 Z- S, f5 ]- k {nLevel = 0x100;}break;
0 Z; h1 _1 D4 T/ w/ B' K case '+':case '-':case '*':case '/':' u2 w8 U8 h* f" Y- c
{csym[nLevel++] = csym[2];}break;
5 O8 w6 W+ c. z' n M( v2 D5 v case ' ':case '\r':case '\n':case '\t':continue;
8 n5 w9 _- S% h5 Y( U$ B default:
9 |8 ]6 d5 h, H6 n) n# k8 X {nLevel=0x100; nERR=1;}
. U Y7 h6 m2 Z& ]$ K }" |& Z9 } @: f/ a- x6 X) K5 L" @
if(nLevel==0x100)break;7 i2 w8 [# |# C6 k- V# f
if(nLevel&0x10 || istrin>>t[2]){3 e: u& Y$ i4 J: W$ n: k( I
nLevel &= 0xF;+ g. M5 y: d! N: a- k3 g
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: E y( ]% l' v7 \) I: C if(csym[1]=='*'||csym[1]=='/'){- R c- s8 ]3 W$ s$ J/ C
GetExpValue(t+1, csym[1]);
# [. n" V m6 `) T! |/ X h }& z+ X$ i+ Z0 `. N5 b1 w m
else{' |3 o; v$ r$ J: i+ u W' K% K
GetExpValue(t, csym[0]);
1 X2 U& a5 v4 `8 t, m) |0 x0 t t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ v9 I" }* {! E4 Q' _+ r6 F, j2 V
}: {2 q8 T0 q& h
nLevel = 1;( A. L' z6 ?6 \1 ?* R0 e3 }
}3 Z7 a: V7 S( }; v9 {7 k
else istrin.clear();
4 C j3 E5 t3 p, o \7 M' J }
; b: I, i4 k5 G else{nERR = -1; break;}
6 t3 U! a2 w% ?- l- h/ l: N }/ Z0 l! O. \& [
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ m: G' u) Z" y1 y' O1 p4 ^
else nReturn=GetExpValue(t, csym[0]); p! |, |, E7 Y/ W) r6 I n% {* p0 ]
return nERR==-1?1:0;
& j) W- ]+ ^6 h# f}}
' O4 J% ^# h: s3 R2 {# ?# U& R6 e; r3 y1 |
z0 o1 t* t" M7 L* \* h: @5 F: S1 {; X% [: g1 F
5 O1 l" r: r9 s$ c7 @函数模板使用示例:
( r' b3 H& ]2 W7 ], P" @; ]在以上那段代码的后面加上以下代码:, k2 Y3 c; T X- r& h
0 m [( L8 U- H% P- K3 ^ @; W Q & }& s; Z9 ~) r5 u+ s2 d! Y2 `
6 K- X0 D# i: X/ G( X1 z- }程序代码:
' `, @- F1 k- f" \' w; x0 f2 A1 l; l: n
#include<strstream>1 y, ]7 r3 H& j9 l
#include<iostream>( _7 Q! o3 @( R1 O) C A
#include<string>
: I3 A, ~/ `, L! z/ \( dusing namespace std;& T* U; ~2 T( A
int main(void)
: B- M3 z( L e2 S{
$ ?# W4 s7 n7 A) ]$ ?' G& e! [3 r string s1;4 @5 F/ f: w/ |$ I5 N' l
while(cin>>s1)
9 ?5 n Q- G9 @8 M; k {* ^( o& Y m! w- Y$ t- ], h8 Z7 z
istrstream isin(s1.data());+ l2 S% D( b. Z# [0 o
double d;
' c1 |# C9 Y) @9 i# @ if(fy_Exp::GetExpValue(isin, d))4 ]; H7 A4 `% u
{
2 z3 ^ ?8 B( h( ?% A cout<<d<<endl;
" ~) M6 J' t- M }5 Y s2 S' _6 U2 c+ s
else$ u% @( A+ r: A
{: t8 n0 k% ?3 ~; {6 b& P
cout<<"ERROR"<<endl;
- |3 W! s) ?: y$ B. ~8 X }$ V/ [' i9 B8 t, E
}
. ^# [1 c- \* J, [7 l% Y U return 0;
! f. j( m' A, E5 U5 I9 i0 V}. \( u8 h3 N" x3 c
; E# O2 K; ?) N9 ~: q( ]' T
" |3 y# i3 q* M/ l4 u) \然后编译执行就可以了(*^_^*)
4 g% v+ q" Y2 ?! Z6 t其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 H' d( o# Q+ b6 Z 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|