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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,$ T1 e+ K$ g8 M) R/ k" O) ]% z
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式* u0 I* L9 R7 a% c5 M& q+ Y1 M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ m- I* J$ E3 v/ | [参数解释:5 I f9 c0 i! u7 A/ i' ]
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
z+ N1 D2 n7 N# UnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" k3 c! }8 D: {8 z1 H# ]. m返回值:
/ a7 X% N& v3 q, y! p返回非0表示计算成功,0表示计算失败有错误
$ U0 d% }) q6 L& I% [' j5 i
& {" `; v5 E1 w& x+ W7 J 6 N" Q3 ~/ [( R/ P7 Q8 J6 Z! \* n
' i" |9 H! h: r( y程序代码:
! z( q& _ i# J3 T
% J8 k8 o( i8 m9 v2 ynamespace fy_Exp{+ w. o M, T. {; e) `
namespace {template <class _T>8 e; S1 L) \# J2 I2 D
inline _T GetExpValue(_T t[], char& csym){- Z4 v) w3 ~9 L" r" b8 V& Z$ a c
char c=csym; csym=0;7 v" S) s- \& ^) o2 y! B
switch(c){( S( y* G1 f6 a# D
case '+':return t[0] += t[1];" t/ x( M/ I- w$ w6 f8 r, n% o
case '-':return t[0] -= t[1];
$ K: t# ?* R' r* N. P5 K, I case '*':return t[0] *= t[1];
7 @. R) M8 ~: s; {, K default: return t[0] /= t[1];//case '/':
9 |/ r2 Y# i' D; J! f, Y9 t }; y4 G: p0 |& G+ U5 Q: u
}}! O/ x8 `4 R5 X4 F( j0 [: W, s
template <class _T, class _Tstream>$ z0 p0 E1 W4 h0 ^, O
/* _Tstream: inputstream, _T: get return value
& R1 K# p, w4 ~4 g8 y7 {, O; w* Return nonzero if get value successfully */! F8 C+ h1 G1 }$ a. A
int GetExpValue(_Tstream& istrin, _T& nReturn){. \5 x5 P* x6 g" i! t; Q
_T t[3] = {0}; //雨中飞燕之作) a, B. l, V4 g" W6 A
char csym[3] = "++";
" L8 A! g/ l% `% ?% `# ]( m int nLevel = 1, nERR = 0;8 L0 a0 M. V1 y
if(!(istrin>>t[1]))istrin.clear();8 G" p7 {& y- ^
for(;;){
& @+ N) g) l+ M2 C if(istrin>>csym[2]){
7 C' ?& y g0 Y switch(csym[2]){* R5 t! S" p: _
case '(':
- |1 }7 K- o! ~5 \) ^( y if(!csym[1]){nLevel=0x100; nERR=1;}else
, o4 o, L" D4 T% d* V: h7 G if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
" o. }0 x: i, m) W2 M- t* R% @ else{nLevel=0x100; nERR=1;}
9 N- P* P; b0 P1 s4 L1 H break;
+ D/ K7 T0 T6 k1 p case ')':( @5 V5 d! ^" T1 s
{nLevel = 0x100;}break;
5 x' l* e- [; I case '+':case '-':case '*':case '/':
: B! N N* h8 \; U) }3 x1 o, g3 [7 }4 ? {csym[nLevel++] = csym[2];}break;
4 |. |+ D J9 V/ O$ S4 X case ' ':case '\r':case '\n':case '\t':continue;$ ~' c1 ~6 H3 q. w) w, r* H
default:
: g0 i2 S9 F8 ?1 w2 E! K8 W' j {nLevel=0x100; nERR=1;}+ Q* M! ~, T0 @0 s
}3 M) v* o8 ^. V1 Y) e
if(nLevel==0x100)break;, s2 r6 c: R6 [7 N/ P- |
if(nLevel&0x10 || istrin>>t[2]){
9 w& u1 f0 U' l) }/ O nLevel &= 0xF;
: i* I8 w. y( B" E- p if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 v; c# [, G( x: a2 @& C5 f" E if(csym[1]=='*'||csym[1]=='/'){; u7 E3 X3 H! L2 C: I/ U. m
GetExpValue(t+1, csym[1]); q7 t$ x% w0 z1 P1 K2 @% h' b- s
}' r( ^9 ]9 ~$ w' `; P! y Z
else{
3 o. e* g, b6 }5 l GetExpValue(t, csym[0]);
9 w8 G" L: r, k t[1]=t[2];csym[0]=csym[1];csym[1]=0; q, Q# J# Q8 U! A# B; X
}
1 ?5 K1 O4 \/ q! b) ?% P nLevel = 1;
! W9 Z$ B+ m9 d5 n }; m; t" N7 |7 Q+ l
else istrin.clear();
. q/ N f6 _2 `0 }5 i) V }
& [7 S6 K) C ~# b else{nERR = -1; break;}
) q6 W/ N5 F/ G8 P }4 C! F! c7 a: Y' y
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 l% q# ?2 }/ W1 e9 P/ p else nReturn=GetExpValue(t, csym[0]);2 F# T: ~, |" s/ E1 p8 _
return nERR==-1?1:0;
# k& I. J% I* e3 ~6 s}}* y3 B3 t) {! I$ t# o
! E; N3 P. x6 n: D, {) Q0 X. W8 J2 R* Z1 C7 q0 `) Y8 F
( H* X$ M( i. o: h
函数模板使用示例:0 [% K/ w* K% b
在以上那段代码的后面加上以下代码:
+ w' j- s9 D$ q# a1 C. K2 P, @
" g% C. x& C( i4 L2 r" [+ Q; S $ J" t* c. v- J* J% x' @
7 e% g$ H3 S' D0 g
程序代码: # S# f: v. m9 O1 Z+ e( y
4 w* A1 ~/ j+ m#include<strstream>% k% V4 j# {% U
#include<iostream>
5 z' k4 \8 c' w5 u' K% ~, T#include<string>
& s& I# Q% l9 t4 N8 Gusing namespace std;6 b/ m" \* `$ N3 b/ }8 ]' l
int main(void)' ?, O6 \/ s2 Y5 P4 J% q
{
- u+ ]8 g7 d0 d } string s1;2 j. m# X- j9 E8 h9 H Y
while(cin>>s1). j y1 s- e$ S& `. s# W
{% b; n9 O! q7 \0 N( X$ W9 [7 Q
istrstream isin(s1.data());
. q* m' X, p2 R8 m8 M: R6 i! H double d;2 R1 V' [8 @* F( _3 F; c. @$ A& i
if(fy_Exp::GetExpValue(isin, d)). f. m$ t3 w1 C4 A7 C/ s% f
{
9 g6 l+ \+ p- k1 }# s% q cout<<d<<endl;
! O8 c, L5 E' s7 _ }+ s q! e: D! b1 s1 [4 [5 D) ]
else
) {+ Z {+ |, t5 t- f n {+ a( s: |! N9 t" |* Z: G5 p* ]% v g
cout<<"ERROR"<<endl;
& _1 j# W+ r9 P% Q \ }, R8 z& O2 U+ g8 m- u
}% N" b9 t" T1 O
return 0;
I. V1 B& i3 Z, L' C' p}2 q- z/ P% v* d
1 a6 u; y8 s- v; V T
8 l T# C- s. s; g! H然后编译执行就可以了(*^_^*)( |. f9 \$ R- P* L" {' n3 ~
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% t1 t O2 s4 {& \ p' w 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|