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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,+ s+ I' o: r& c
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ o9 v$ Z# m4 M: B, W! B( q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
8 K1 S3 U& J! N: n9 m3 E* Q参数解释: d# N) U8 t2 g4 {
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 x& E" z3 E& S* |/ onReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! m+ y) m5 v3 g+ M返回值:) T& o! F6 ~+ }
返回非0表示计算成功,0表示计算失败有错误
' G# N: c* H3 T- ^+ }0 I; V
; j- H, u$ \* z0 \9 f+ @. @
0 z1 ~) |2 B; w
& O- f8 X3 [5 _) w% _- f# Y程序代码: ' [4 n( w' H3 ?4 Y8 V
" u, \9 x) P) m2 ?# F) Q0 z( _. {4 d
namespace fy_Exp{
9 D5 [8 E: j! g- I' i v) Tnamespace {template <class _T>2 j) W$ a" h+ i3 j# Q% {
inline _T GetExpValue(_T t[], char& csym){
6 s4 f) E3 n+ J+ V5 q& | char c=csym; csym=0;
3 D. q0 n4 k' c3 H( g* A switch(c){8 ?. B9 O8 I" z' d: D
case '+':return t[0] += t[1];
" o4 l# h& U! A& T case '-':return t[0] -= t[1];- n8 {# j. [8 |6 T% e
case '*':return t[0] *= t[1];
% S g" z) m' D( k# N9 s+ } default: return t[0] /= t[1];//case '/': e( q( n6 J p* ?' [
}
9 X k, G- J0 B7 H8 N, i}}5 |% R3 y2 u& Z' _$ @' R& |3 m
template <class _T, class _Tstream>
6 S" O1 p+ v- X' l/* _Tstream: inputstream, _T: get return value
% u8 v# F# q" a) u* ?2 [: z6 h* Return nonzero if get value successfully */6 K; l7 E" o4 i3 t
int GetExpValue(_Tstream& istrin, _T& nReturn){
j3 X! P$ Y* J6 g' }. Y- u3 I8 p _T t[3] = {0}; //雨中飞燕之作
0 U N5 N B0 w$ o char csym[3] = "++";
$ [1 n2 J3 [+ s4 y! c$ M. k |. b int nLevel = 1, nERR = 0;
% t/ {- d7 a. B# L6 c$ [$ P9 U+ e% j if(!(istrin>>t[1]))istrin.clear();
& A5 I. R* P6 Y: \: q/ j for(;;){; D: ^2 N- g6 _
if(istrin>>csym[2]){
- S" T( m+ L2 v( ~& j v( Z switch(csym[2]){* S6 B0 W3 _# l# \7 }
case '(':
] Y" _4 g2 f6 q" Q# Y if(!csym[1]){nLevel=0x100; nERR=1;}else
6 O! A$ ^! j8 |0 {! l if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) j3 ^ u% O1 y9 L7 b else{nLevel=0x100; nERR=1;}9 N( d) f5 r7 ~$ s" G
break;
" k9 y+ r( m4 O. H3 J/ x case ')':) G: z* M8 X1 I
{nLevel = 0x100;}break; e6 O: h$ b" w
case '+':case '-':case '*':case '/':
- B% ~6 ]; j% T- \ {csym[nLevel++] = csym[2];}break;
; x) J: w1 I y/ q) q case ' ':case '\r':case '\n':case '\t':continue;
# Q* I% n2 d: p# j4 X default:
# h" o. r5 k( @2 M, x {nLevel=0x100; nERR=1;}* e% U5 k l& V) f8 q0 u) r
}
, X" ^( Q( Z$ W- R7 F if(nLevel==0x100)break;+ a+ b M7 _2 q3 {
if(nLevel&0x10 || istrin>>t[2]){6 A1 C" T" H4 r( J+ G) }% r% U
nLevel &= 0xF;
) O! G" {$ d5 E6 n7 [ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: M5 `- T( z+ r- K3 ?8 \4 j
if(csym[1]=='*'||csym[1]=='/'){
5 }4 Z, W0 `6 F8 z4 V+ U GetExpValue(t+1, csym[1]);
. v: y) B+ v* Z6 J, T4 I }- N" P, E' P6 K/ i7 g
else{9 O! r2 m4 v4 m4 a& e e
GetExpValue(t, csym[0]);
" X, M( I/ k' W t[1]=t[2];csym[0]=csym[1];csym[1]=0;
% J4 q5 ^ b9 [7 k J; f, _: G }
) D, H( f) V6 V6 x6 I3 A: o nLevel = 1;
1 Z: U9 C% t1 p5 B% ?; T }
4 P" `0 Q7 x/ y" a6 x else istrin.clear();
. A! Y. Y0 n2 { }8 U$ C2 h9 j' u' D' X
else{nERR = -1; break;}$ G! _& n3 ^5 P& l1 ^ h
}
0 k- F; E4 }7 z if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
) ~3 ` Z+ S, `* l( x/ @ else nReturn=GetExpValue(t, csym[0]);8 q- V6 }5 w. E- e
return nERR==-1?1:0;
! D# m A/ k2 q! ]$ o. K" D) ^}}6 D1 F$ P0 ^: `0 ]% b7 B
1 \/ v6 h$ q8 D3 _( {
8 `* K; c6 L% ] Q; f$ y: w
# b* V% w) P) A) y( I% o* W函数模板使用示例:
6 y2 b* T7 u/ r- g2 K在以上那段代码的后面加上以下代码:+ a. ~3 p1 c T: h/ _0 O
, v3 d, L8 V+ x- v. @
( t% z U3 m$ P" @0 `1 L$ _' c! h: t3 S
程序代码: 1 S! q$ d* _" T$ I7 }8 l
6 b$ G) f$ K! B0 `& b2 y
#include<strstream>
* w2 j$ ^5 Q6 Z: C' f$ _$ S" S$ A V#include<iostream>
# P: F* _5 W/ x1 K* ] I! A2 n' F#include<string>5 Z; _2 L" x- v Z
using namespace std;
, [* ?" D: l5 ^9 [. i4 `- gint main(void)/ N0 O- ~/ O9 H; [" P$ }
{4 \) R- { a* o: r, J. c7 f) k
string s1;, l4 o- B8 m: h
while(cin>>s1)) ]" h: R0 _0 D y. x
{+ I0 I% b4 Z8 F( S/ V
istrstream isin(s1.data());- }7 Y( e J! k0 h) O
double d;5 Z$ q6 T7 ^& ~! f
if(fy_Exp::GetExpValue(isin, d))
0 H& z7 S2 E7 K# l& H0 A {
6 C1 E1 I8 R( n/ ~% }( d: @ cout<<d<<endl;6 [/ O; z5 X: B% c4 h' ]
}
9 g. k& I: ^ \8 b else
, W6 ]: }" ]4 O3 [. C {7 l( M! y+ \$ r, N4 w% \
cout<<"ERROR"<<endl;
7 G1 N4 k0 d& G! e4 c& l }
8 L$ N. r9 R# C( S2 e% v# |* V }
) I Q1 U; `2 e! K( a return 0;
2 [% e& I2 u- `3 G' I}/ m7 F, m1 g5 `3 i( j4 R
! p& I7 [: T$ ?3 ]' @
" d4 q; C/ `' B: {1 L; Q9 d然后编译执行就可以了(*^_^*)8 T+ _2 }5 k- K3 Z8 C" j+ ~
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# l- T# K0 y ?2 ~7 `. Q$ W 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|