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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,7 i' C" j& z) T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& Y4 ~+ Z0 `& N* C5 O& K1 E' q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 @) e1 T n) k: z% ]' w9 G参数解释:
. h; F& y2 r4 _ k. iistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! g9 J* b- V+ k% ]& qnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ `3 u6 d# Y5 F' H+ X返回值:3 M$ m. c, D' b* c- A- Y
返回非0表示计算成功,0表示计算失败有错误; ~" n3 d C! U
" d4 e3 V7 s# m! H9 w: [ * T3 H' _% \. i) F, p
9 } I C6 O7 U" v/ ?
程序代码: ' A1 q* G- ]& X# @$ m
) B2 Q6 s% R( Wnamespace fy_Exp{# V v( ~; \6 \+ r/ u% u
namespace {template <class _T>
" Y" A# H, H$ z6 M5 `' e5 linline _T GetExpValue(_T t[], char& csym){+ D O: h* h6 `; N" W- A5 ~
char c=csym; csym=0;
! D6 ^! X, O) o) \) r' q1 Q6 x8 ` switch(c){
+ n* A$ n/ v: N z6 m case '+':return t[0] += t[1];
. h# c1 A: i' `7 w8 z case '-':return t[0] -= t[1];2 U p# _6 W: l) j/ m8 e3 ?: }
case '*':return t[0] *= t[1];2 N% f6 Y7 K: Q% N0 G3 K. G- E1 t
default: return t[0] /= t[1];//case '/':
) ]; i( R/ u/ s; j) u }$ K1 @5 c% J5 J$ f
}}
( `0 l2 V% ~# Y4 G4 I* {template <class _T, class _Tstream>7 n g+ n" o: L' @
/* _Tstream: inputstream, _T: get return value
- B' ]3 S( _% O% k0 M* Return nonzero if get value successfully */$ f* B! a' t& s$ B$ I& M5 I
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 ^0 S- D' C1 s# T/ K/ g7 O, q _T t[3] = {0}; //雨中飞燕之作
; R/ _: W- B' g0 t* ~: D char csym[3] = "++";
# s1 `2 e% h5 { int nLevel = 1, nERR = 0;4 }3 V- s4 ]( y; M0 O j
if(!(istrin>>t[1]))istrin.clear();: h/ \ e1 Y% ~6 f6 {7 Y
for(;;){3 Z# {2 Z( V$ D& ?/ G' x! i& m
if(istrin>>csym[2]){' X6 U& K; _/ |! R/ Z
switch(csym[2]){
4 k$ r+ u; K9 y- J8 H+ i o+ ^ case '(':
, g6 P! N6 J7 M9 Q& [ if(!csym[1]){nLevel=0x100; nERR=1;}else
6 d$ D4 V. {! Z# i/ S6 y if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 Y/ l% X2 P2 g7 e" H* \
else{nLevel=0x100; nERR=1;}
; {9 K" z! d/ Q8 |- h break;
9 a, E* U/ o7 M! ~/ d! }6 W case ')':
& _' @; u( O0 i {nLevel = 0x100;}break;
0 M4 [8 c: C$ x1 z b8 t n, K" P case '+':case '-':case '*':case '/':- j# J0 `( v5 N$ h7 A, Z
{csym[nLevel++] = csym[2];}break;0 G* T/ w3 }# x
case ' ':case '\r':case '\n':case '\t':continue;
. ]5 O" p: A* k" O* A3 i7 x default:2 B8 J; C6 R6 {' h
{nLevel=0x100; nERR=1;}
6 L7 k- X' J. N1 h! j! u) \+ K1 O }
! L# ^1 l( D9 H& B if(nLevel==0x100)break;2 ^; j! {/ Q& N/ A6 P4 Z# z
if(nLevel&0x10 || istrin>>t[2]){) q& y- y3 n# {' `: E$ d6 L
nLevel &= 0xF;4 [4 g3 z7 @( o* V/ k) g
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" z" n$ u! ^" T if(csym[1]=='*'||csym[1]=='/'){
, v0 t) T7 z; G$ H) U$ n4 s GetExpValue(t+1, csym[1]);8 ?7 G0 F6 @. A) B( v* B& c
}
0 o; G7 p) |! D else{
/ L+ T; g' T# L, L. I GetExpValue(t, csym[0]);
0 R+ n) d) U' ] t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 [ T1 P' p5 K' c) |2 D }, F S1 {; h% n/ O9 @
nLevel = 1;' B Q& k3 N2 n/ Y% }1 g
}
0 |# f- s$ ?8 Y E' ~ else istrin.clear();' F7 {. h6 X3 b# o i, @/ {6 @
}( D7 T' W4 m+ d7 S1 R
else{nERR = -1; break;}
! h% C" }3 I" s }
6 q4 [3 @/ u! Y4 X3 }. p; `1 a! u if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);, a. b7 g% e q
else nReturn=GetExpValue(t, csym[0]);5 q5 A% Q( o& }$ c& @
return nERR==-1?1:0;. w: @* T; ?3 b- B3 d! J$ f
}}
( x6 O$ U3 y n' N, c; z5 e
- m* y- ^( j1 ?! }/ [9 p }8 {, H! v- Y; T
/ c* @; V! v, M0 o函数模板使用示例:
0 K, K& u2 ^3 E/ g在以上那段代码的后面加上以下代码:. p9 f' w& ` A1 d, a7 w
5 g+ r/ o9 M( i7 y' ~1 n
4 u7 ^* m1 E- ]. p6 E5 O8 S
) N* W. i a6 F" v+ U9 a程序代码:
4 g: ?$ s# f: y3 w! ~
- s' P( h3 g- n0 q#include<strstream>" K+ v, R2 f% `# Z
#include<iostream>
! m X% i- ] y#include<string> K5 J7 x; g" b* r
using namespace std;
& v- U+ L# \. i0 A; l- C0 mint main(void)/ v8 F9 r4 n2 q
{: X7 g/ P; n o
string s1;, F* y/ ^5 A' y# r) _9 y5 f: C/ V* W# B
while(cin>>s1)5 T2 D( }1 B9 Y( h" o% S
{
" N8 z8 T. t- h% j/ C; q1 T' e istrstream isin(s1.data());
7 H/ k# [2 y2 g" S0 F# p: q: C' O double d;
3 y% y& a( d5 A O5 F if(fy_Exp::GetExpValue(isin, d))' `3 G0 k6 i% I4 y7 c! U
{ k; {; p5 F- F$ p+ W+ f
cout<<d<<endl;
& J0 s8 e! a, y8 z" q }* t2 z2 D; o# j+ V0 Z: L2 Z' x/ D
else
* j1 A7 w! E9 q {
6 d2 M& S) s0 o; B: o. y( u cout<<"ERROR"<<endl;5 S& h+ X" t# x4 F5 D$ N4 G9 I3 [5 R
}: I. s% q( i1 }. N
}
5 p4 M! q4 v; q2 @ return 0;* X' Y- K O$ v
}
7 w, U9 ]) A6 G6 x9 a$ i; q) k9 n" \2 @* t3 B7 m# A
1 |+ |; n$ X. u( J4 K然后编译执行就可以了(*^_^*) N0 B4 R3 V) ^5 b
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: w0 |& @( J4 L l% U( t$ h- H# ?) @% } 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|