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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
9 b. Z! M( \& L一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" W0 [9 B* @4 T0 ~( k& t; }6 S只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" x. |& l0 {% n! C参数解释:
) O: a! Z `0 L( X6 o& Fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) C0 { P. E. j/ a) n" l* Q' f
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# Q. d1 \( e% w- Q4 C返回值:. Y2 i5 }; c$ Y$ p8 J3 z; U
返回非0表示计算成功,0表示计算失败有错误
* A1 e9 p6 v8 D1 ]' s/ q; ^" a7 {1 {" ^0 W+ Q; U" P- H) M
9 v8 l" v1 P1 ]9 p
: T0 S; M1 ~# C, P程序代码:
" Y; T4 b- C0 { n" g4 O, h; T7 E/ F$ b. Z+ C: o9 l
namespace fy_Exp{- U: [* j0 ~" i( X
namespace {template <class _T>
) G* w- f) L% H" T5 R1 v) @inline _T GetExpValue(_T t[], char& csym){
0 Q1 U: O+ _$ c$ x2 Y9 e! J char c=csym; csym=0;
- D, P! N. v" Z9 K* C, Y switch(c){2 v4 k' [1 D- J) h: \, L% Y4 L
case '+':return t[0] += t[1];5 B" I6 Y. H/ R- s2 ~! j9 I1 T' G
case '-':return t[0] -= t[1];
! V; N! Z' {- v0 ^. N' T' J1 V case '*':return t[0] *= t[1];
* O T5 {1 \: q: Z default: return t[0] /= t[1];//case '/':' g" I; I' P+ Y; A+ T# I3 h! d* [
}
, X; t& G( k) b- p) H5 l, ^5 v}}" i' g) b5 }( C
template <class _T, class _Tstream>/ |: e6 l: W0 N1 a$ h: |
/* _Tstream: inputstream, _T: get return value
0 x( G7 k$ D) d2 e! m5 A* Return nonzero if get value successfully */
5 x( @) T/ I/ R- w' Mint GetExpValue(_Tstream& istrin, _T& nReturn){/ P$ |# j! V( l+ c
_T t[3] = {0}; //雨中飞燕之作
, i! h$ x6 o" F+ ]" ^ char csym[3] = "++";$ G+ l* A6 R1 X" x
int nLevel = 1, nERR = 0;
+ h- |- C! M' ^6 J7 x# A if(!(istrin>>t[1]))istrin.clear();
- D' x! }8 ]( F n5 j. |4 W! R for(;;){
* H8 j* Q; t5 ^- U8 N5 I2 G if(istrin>>csym[2]){
) @3 K3 U B$ k9 c switch(csym[2]){& |9 b N( M ^
case '(':8 V, F" b& y# U) M! m8 |
if(!csym[1]){nLevel=0x100; nERR=1;}else9 ?: d. ~! @# V6 u# {5 h5 m9 }
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" P# O- e Z$ ]& O& @/ X+ z
else{nLevel=0x100; nERR=1;}( {4 s2 A+ s/ C( K/ E, B* ]! t
break;
9 P2 R& v2 D/ w! |( Y4 H, ] case ')':
- t* X ~7 N1 u) j% h {nLevel = 0x100;}break;- ^9 n5 x9 i8 E$ h+ N
case '+':case '-':case '*':case '/':
! X0 r+ x& X8 C {csym[nLevel++] = csym[2];}break;
/ M& F5 j6 L; c( i" A: d5 z case ' ':case '\r':case '\n':case '\t':continue;0 D1 p9 ~: W, j( m, Z+ J, L
default:1 ^. }9 b/ ]: B: ^: a
{nLevel=0x100; nERR=1;}
9 f; c8 i5 O1 E* K }) m1 t$ E% X- Z1 q4 L' p
if(nLevel==0x100)break;1 D+ s8 ^. O/ Q3 o ~9 i4 E! @
if(nLevel&0x10 || istrin>>t[2]){
2 W1 M0 _! N X nLevel &= 0xF;' N8 _ \5 Y z* t- u4 b9 O
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 P! ]7 |& y" l4 m1 l7 Z if(csym[1]=='*'||csym[1]=='/'){0 @0 G3 Z: v6 f$ X" D4 b7 ^
GetExpValue(t+1, csym[1]);
+ m& T* g4 M2 k, h+ j- C! K' _7 d }
; F1 d7 m. W. J# N m9 G, c else{
# [2 y! ^0 ^5 a( ]2 P GetExpValue(t, csym[0]);
- m' |3 t! V" F/ ^3 \* k, A# S% t t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 [8 c# m' O/ w6 {
}
& ?. q1 V( x" I& Q% {, y" V" q: V nLevel = 1;
+ D+ ]8 {2 U$ Y8 p+ h }
" }' Y3 x, J2 U/ z2 }$ B else istrin.clear();
5 x! g5 S+ D7 ]' H) | }
2 n( @9 I/ K- p+ n- ~. m# W else{nERR = -1; break;}1 _, E7 [+ V. S/ Y9 P* f1 G
}
% R6 H) I7 o- d5 ^% n! n# x if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& j! ?$ D F$ f
else nReturn=GetExpValue(t, csym[0]);( _' B7 x* w8 S2 r" R7 I4 |2 Z. F2 p
return nERR==-1?1:0;2 H* i$ X' H r0 c* z# T: j! R
}}
M6 n1 b1 g6 H" a+ N
% W/ h: k# I, j) D( X' o: K( X8 r }- W, s2 H: a2 r, z$ p
; ]/ |! `7 l; b4 n6 v: ^
函数模板使用示例:7 W0 ^ {+ P6 Y$ D8 M, J
在以上那段代码的后面加上以下代码:1 {. E8 B% a" s5 r( v( ~2 e- a
) y, N+ ^1 y: q. c* J7 t+ v3 h
' Y( o: s$ |' q, A& F3 K5 b U& r! M0 o3 ]9 t, z
程序代码:
0 c3 I+ u5 a; P4 F1 a/ c0 Z& ?: n& {+ S2 x0 h" e- j; z
#include<strstream>
7 X4 s6 Q2 y+ }1 n" j7 V* [1 I#include<iostream>
* Z7 [) ?; Y i' U8 D% x) t#include<string>
& S& s# B6 _; R D) e! ?8 L1 lusing namespace std;+ {; j5 \( e( K% Y, g! o# E' h) E
int main(void)
; [2 @/ K- i* ]6 W, G" m% J3 h6 V{, B2 p3 {/ s/ M$ |& s9 j, z
string s1;
) ^; G3 @; K" ^! y( m8 C7 b+ a7 D while(cin>>s1)
: V0 r5 l& c b, u e {" G4 M/ @4 x" _; k7 d' [9 a
istrstream isin(s1.data()); y3 a/ {8 Z: y1 U
double d;
% z0 O! v- a% X3 X$ ` if(fy_Exp::GetExpValue(isin, d))
, I% B" Q4 B, n- S7 Z {
- K2 J, i3 c) j cout<<d<<endl;
2 W, n. b- n9 I) @, v" \0 Z, X5 R% l }- V; V5 ]! L r
else$ `2 Z8 E5 c i1 @% ?9 ^/ }
{. l0 c. E: |$ f& I/ c0 a9 D
cout<<"ERROR"<<endl;
7 C7 V W5 {; O+ C, W1 Q! ^/ Y& H0 h: F }
% b; k5 C4 h" U0 \: @( U( g1 t }
) \5 y. w" M0 e! S return 0;- B4 z0 |0 j, K
}
) P: q. b2 n8 t2 ]# D
8 d1 `# i8 i/ l# }
Q1 a# z9 ]6 _5 T' X3 E然后编译执行就可以了(*^_^*). g5 N; I' [% b4 C. l1 I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
6 S* _ S" e d* E, B7 j4 n# p1 ] 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|