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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
' I6 z; o7 ? I, ^: s7 O一个很方便的函数模板,可以并且只可以计算含括号的四则表达式% _; P9 y, R9 K+ g' }
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! l2 }, W1 ~8 N( c7 z3 V' |' e* l
参数解释:
9 F# s" J3 c q7 ~ \, yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 i& }1 {+ E7 @2 AnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 ?0 v. K' J) s; |( I7 n
返回值:
/ ^! ?# _! S' f. p返回非0表示计算成功,0表示计算失败有错误' j; F1 A* v3 f. ]! s; T; O
5 i4 I# Z7 g5 p) L8 E, W ' z3 E0 f' X3 S8 `& w- M
+ \. b$ K. ~" l/ j程序代码: ( ]8 E7 H8 | }5 D! H, E6 V
. e6 G s. |0 x- e1 @8 b! cnamespace fy_Exp{. y! B/ F+ I& l R. w
namespace {template <class _T>
: l3 |# g, c: w) N* M) S S% pinline _T GetExpValue(_T t[], char& csym){
7 e6 O, v$ `- B char c=csym; csym=0;
* M9 q; C( }1 u X; U switch(c){
! o0 b6 e( ^, K$ o" O. D9 S1 A9 H case '+':return t[0] += t[1];0 p _5 a0 A+ d: p+ g7 E: O6 X
case '-':return t[0] -= t[1];
* b+ {$ B- U) t case '*':return t[0] *= t[1]; o: l& F2 K; u Y1 _* `- R
default: return t[0] /= t[1];//case '/':
, I, y+ P& P a# i }. T" {' w% c2 ~% A4 [) P1 s4 M
}}
! ]. a3 H4 ^: K6 otemplate <class _T, class _Tstream>
4 P) q% E+ \+ A5 b/ v* g/ b/* _Tstream: inputstream, _T: get return value
, y1 x7 {, u8 {! F. x* Return nonzero if get value successfully */
5 Q: V, T8 T$ v0 A6 f3 z: Uint GetExpValue(_Tstream& istrin, _T& nReturn){; w; e. J4 f2 j' U3 d+ ~2 K" M
_T t[3] = {0}; //雨中飞燕之作) F+ f" b! s) N( g
char csym[3] = "++";
. R/ e: H B( l3 e* s. m* C int nLevel = 1, nERR = 0;
3 M0 S O- g# l9 Y3 H4 t if(!(istrin>>t[1]))istrin.clear();( s$ m. j0 ^3 }
for(;;){
8 X5 x% m( `; y7 i if(istrin>>csym[2]){( m8 O! _' q! \5 r3 A
switch(csym[2]){- P n+ b; J' N3 `* I0 b( c
case '(':
! o2 K: [+ I% Z. i) N; N if(!csym[1]){nLevel=0x100; nERR=1;}else9 V6 E0 U8 L) J; k- ?1 |) n
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" y6 l" e' y) n; Q" r% `
else{nLevel=0x100; nERR=1;}
6 p+ l+ t' b7 v$ r/ |& r+ h! ^ break;! {. F% x# R' o) {. ^9 |0 O
case ')':4 r& e: w. a( p) @: f B
{nLevel = 0x100;}break;
9 J0 f- g* F8 l- U5 U. |& a0 L case '+':case '-':case '*':case '/':
! a7 _. B0 u* i( c% x {csym[nLevel++] = csym[2];}break;
3 J4 c! l' I3 }8 @/ l8 c9 f case ' ':case '\r':case '\n':case '\t':continue;( M& a$ T6 M6 o$ @7 l( _
default:
0 Z" m4 I" u5 n, X1 r4 W6 l {nLevel=0x100; nERR=1;}
- ?" D& z6 n3 q' g }) H4 l8 `6 D" N2 q5 w8 y6 S
if(nLevel==0x100)break;
4 z4 S% n( e0 U9 j* g0 U! U% F if(nLevel&0x10 || istrin>>t[2]){: o2 C/ V( R! S' j5 e" {
nLevel &= 0xF;; n" E5 p. M+ n, ~# S5 Q% P
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;} }& m! A' U( W5 k4 ~
if(csym[1]=='*'||csym[1]=='/'){3 D' T( z( m" M
GetExpValue(t+1, csym[1]); W; Y1 h' T9 g) e8 o# q2 \
}
3 ^5 Y8 c& _% r. a; h) m else{' d$ e0 A2 `; g
GetExpValue(t, csym[0]);
% d, |$ Y$ C+ f% x, _ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
( v% h, {% S6 o" M1 o4 G }
! {# }6 ?6 h6 d1 H nLevel = 1;
+ `" E: I& m9 A- C }
2 h' @) G$ h9 G/ K- @& t8 @ else istrin.clear();
1 W4 P& I1 a+ I) N ?; p& M* u }$ p" H/ s/ s3 u) o1 Y7 n' y
else{nERR = -1; break;}
; | o9 T0 m& q! i! k) Z }
; S5 N. D- g' r, @& x9 C' N9 ] if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 z7 r' M2 [1 k v* n
else nReturn=GetExpValue(t, csym[0]);
/ {3 f9 I' K6 n return nERR==-1?1:0;) l) c1 `& \1 \
}}9 }" T( t! @/ ^
f1 S) i) z6 T8 F9 z% {8 y9 }+ l' H3 ^
- e, O- H- b+ {+ z: X5 V7 i
函数模板使用示例:
3 D1 c! w# J- S/ u) L在以上那段代码的后面加上以下代码:
3 `# P8 [8 b" A0 K# ]1 ]& M8 o0 u5 }( o) r9 d$ n0 j7 D7 z
0 B( b" @- k) d, E8 x2 {! n
4 S7 [" L5 U# }7 w2 ?程序代码: * S6 d% ~3 z7 u$ R, u% t- F
5 n% W5 f+ Y% F/ S8 W, D, ?* N; _#include<strstream>
/ X. ]. l1 @- B2 M2 g0 K+ s- s; G#include<iostream>9 e7 a: }. ^) W7 ^
#include<string>2 h3 s- n1 F, g, A4 Y' a
using namespace std;0 Z- ]0 C1 \$ t) x( y9 s6 {! r
int main(void)5 J6 n. A' I4 h- b9 e0 }% D
{
" }) F3 k4 e: I8 g" _) Q string s1;: ?# f% P) O. y5 j
while(cin>>s1). `( @3 P4 G2 o- j) \8 d' K2 W; o
{
8 D6 d! p" O: \ G istrstream isin(s1.data());
" t3 _9 ?% p3 G1 Z- H double d;
& [7 Q7 Y6 G3 g3 e4 m5 D, ^ if(fy_Exp::GetExpValue(isin, d))% U0 z3 r# e0 T1 c; [
{% j% G: C! n& v6 @
cout<<d<<endl;
% k: V6 C H/ v5 A5 `/ l2 E: B }
& }6 J& \( Z/ h) \0 z# ^% D else
; Z, y3 r0 K5 U) Y! f5 b {
6 s: R9 C7 f9 f) H! Z% ? cout<<"ERROR"<<endl;! w+ i+ X( F$ t4 g6 {: M
}
! D) x+ V, ~/ u# ` }) {, ]" n1 Q7 _! N, ~' i3 m# F
return 0;" E, a# ?+ {) `& q1 d* C" Z% u
}
" l" u( ?, k* [: `* @* R
$ G+ @5 M" a( K. i3 U1 X7 h, y O; b/ Z. B: T L* Q9 L1 Q/ @7 a
然后编译执行就可以了(*^_^*)1 p- s* l4 a- s7 r6 s
其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 R% w( Z5 Q% k& I
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|