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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
' x* q" z) k# K: H1 C0 P一个很方便的函数模板,可以并且只可以计算含括号的四则表达式: D s- c" N7 W1 `" Z
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" B( `) \6 _3 [, `, o6 T" J参数解释:
5 m) z: J2 @2 Q% {4 K5 ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: w! p+ D0 i" p2 C4 n' VnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 K' {1 h+ H( q: O返回值:; D! ^- j7 i/ w. s% a
返回非0表示计算成功,0表示计算失败有错误' k; e& a$ f; C7 j' M2 x
7 @3 Q8 ?6 a8 d. v2 e1 n7 c
) n D- L% Q( b+ U; X
# }0 w, ?8 X; q! B6 c: m7 ^程序代码: - T. X1 s$ m2 Q
( x8 f+ e; H; q- e' P) m. F* q# c, O
namespace fy_Exp{$ Z P7 M0 v: N' a D8 H9 e
namespace {template <class _T>
) M1 y5 E$ _: n ~/ Jinline _T GetExpValue(_T t[], char& csym){
* z5 a; r2 Z) p- k6 @) w char c=csym; csym=0;& ^8 `; L0 B+ P( x4 f0 c: W+ G( H
switch(c){& M2 B/ d: w, J8 m1 g/ o" L
case '+':return t[0] += t[1];: E+ Y: D! b/ A% Q! E2 [/ N
case '-':return t[0] -= t[1];$ ]0 q1 i# ?+ E9 t( q8 G* V& g/ [
case '*':return t[0] *= t[1];0 v& [, M1 j2 k4 }0 N
default: return t[0] /= t[1];//case '/':
6 s$ t" ]! l0 C* r1 M2 p* q l, D }
' s3 E: X: g9 A- |" D}}- k; [ B. W$ r- V9 X
template <class _T, class _Tstream>
* j% ?) `; P% ?4 F- j( }3 u/* _Tstream: inputstream, _T: get return value8 o6 ?& C9 S3 E4 z) H
* Return nonzero if get value successfully */8 `' L4 i) N; d. t
int GetExpValue(_Tstream& istrin, _T& nReturn){3 f9 A. R0 t! O, P
_T t[3] = {0}; //雨中飞燕之作
! [ V* }2 x- d' ]# S# r B7 } char csym[3] = "++";
5 X/ k: p$ @. T2 o: h% [ int nLevel = 1, nERR = 0;/ u. m5 M2 N7 L! f" x4 |/ q4 D
if(!(istrin>>t[1]))istrin.clear();
2 B0 P" ?! P& D7 B1 X; k for(;;){( g' k0 f% m4 S7 ^7 A4 L6 G
if(istrin>>csym[2]){( X5 o4 A4 e& G) J' v' K3 [
switch(csym[2]){5 A+ W" B1 D& f& U
case '(':
5 V3 Q, O% ?. L& H if(!csym[1]){nLevel=0x100; nERR=1;}else
! h$ \7 i- H$ L T6 N if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 n5 D) E+ c6 L: a; l5 I; ^
else{nLevel=0x100; nERR=1;}
& o: H2 ^9 I! d; \ | break;7 \5 d9 R3 p7 A; b
case ')':: b7 ?' d; v+ a2 `/ ?* n! B0 \
{nLevel = 0x100;}break;5 G9 }1 Q, N {6 m$ q
case '+':case '-':case '*':case '/':
; K2 F: q6 b4 Y) l! u% X$ Z( Q, S {csym[nLevel++] = csym[2];}break;; \& ~ r/ a7 j0 C, S+ Q H }( W8 g
case ' ':case '\r':case '\n':case '\t':continue;
/ f1 S6 ~8 e. z default:
9 O9 B1 g# a3 I, }9 D8 Y2 u! x {nLevel=0x100; nERR=1;} L- R. P! t! s6 k C$ _& Z
}
% ?$ ]7 b4 V) R! o' F if(nLevel==0x100)break;; E- B6 Y' `& g) A3 {, R1 P- b
if(nLevel&0x10 || istrin>>t[2]){
" D$ {5 m- P- J, @) I) c7 u. f7 [ nLevel &= 0xF;' g# ?7 a( ^- l$ Z7 \3 U* m& \
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 W) m' w2 L. V4 L1 p R( d- R if(csym[1]=='*'||csym[1]=='/'){5 S2 p! w! `1 s3 s: C/ F4 t
GetExpValue(t+1, csym[1]);
4 M& N- i4 A0 g% _2 {; t% E }& q1 t* }/ M5 b
else{: M s. E8 y% u$ {; g1 ~
GetExpValue(t, csym[0]);+ t9 Q' _* f6 l+ k
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ p4 l, {( e! J" w5 |/ } }
/ ^' R9 o# n' k/ R4 U4 @ nLevel = 1;
4 _% V: P. T2 K$ V1 F* u0 y' b* j }
. x% t$ G& j1 U# r else istrin.clear();
6 B+ l5 V, x2 \! C }
" L. _2 |+ [3 ?! }6 {4 x5 w: x4 O else{nERR = -1; break;}
2 Y, v9 z. R6 y) l) {5 ^* M }3 a* k9 A% N/ ]; p+ S& Z
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 u0 S$ F9 p( B- Z else nReturn=GetExpValue(t, csym[0]);
! J, e y* |' L/ l return nERR==-1?1:0;1 [# d( j Q5 M0 q2 R$ \% X* |
}}
! N N+ O J; X+ g" i2 Z
y. d' c6 V7 I7 H- o: O8 n# i! D3 ]% W; `) H1 i! e( I- e) `
9 Q: c$ J" c; o" Z/ `5 D' n函数模板使用示例:
6 t1 v8 L/ Y! t$ l% m% E在以上那段代码的后面加上以下代码:
( w5 B& \: q! J- A) P( q) f+ K. S" J, _' z
# `) c. W! T1 W3 S
. j, o3 ^: S) N, h" W2 u0 C程序代码:
8 z. ]$ W0 F4 ]3 y0 I( o! B- ]9 b& p: l% y
#include<strstream>. W; I# M/ w% K- m
#include<iostream>3 \/ B1 v8 g s% h- t1 l4 k, t7 e
#include<string>& l, A3 L7 B* R; ]' j
using namespace std;5 z, j8 u' W8 a* Y3 i, { L+ t3 s; F
int main(void)
9 w0 U4 p+ v3 @* R. I{8 i9 C% P7 X+ |+ ~: w. M7 N: c
string s1;) l) v0 s; c' i) B3 Y; b6 e
while(cin>>s1)0 Y) B6 o/ q# L s4 v+ L# U# ?( U2 Q* i
{9 _/ e r+ E0 t8 o" W0 N) ^
istrstream isin(s1.data());
9 R% D5 l# t f) I' O' ?) C: @ double d;9 X0 _ Q% W) J$ [
if(fy_Exp::GetExpValue(isin, d))
; [0 v& G0 S, i+ o( U, I {
0 `1 F( { H* l, ]8 j( H {2 ^ cout<<d<<endl;
' Q6 Y* y& v) z& K$ X9 e, f3 ^ }8 I/ w8 C% x$ t, j8 q
else
) W" b3 x5 C4 E {( O: c0 y2 h# [* ]
cout<<"ERROR"<<endl;
4 i2 E& {$ C! \ \4 x }
) k2 b {: `$ i k }
: h) U$ j; v" H8 L% J return 0;% V l( ^9 N, S8 W- ~3 x
}
. \, h6 v; h. n! y8 `" k6 ] T. G d/ r8 t6 G2 |9 o
7 O! H4 {: h+ v3 \然后编译执行就可以了(*^_^*)
* _0 ^6 F2 D$ W6 ^+ A其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 q4 N! p# B2 b# [
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|