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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; E3 U9 d5 i5 z ^一个很方便的函数模板,可以并且只可以计算含括号的四则表达式: p0 k* e3 T; [0 t( Z' L8 f
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- k: T- W! X0 N
参数解释:: T0 o' y, D, }; {7 W" N
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# q5 o# k3 v3 q2 q! \3 w: s0 Q5 hnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 e( F2 A, }/ J) E# ^7 x返回值:, a& d$ q9 m8 o1 W8 R
返回非0表示计算成功,0表示计算失败有错误
; `" y( I* ~1 D a4 {! K
4 W* ~; | w# g/ W, t
$ t" W7 O4 C5 {7 Z1 J" ?0 p$ w6 ^: Q# W& I3 x& Y8 R# ~
程序代码: 7 I7 L: j. q; L6 `" q
5 p! T5 |" {1 F. g) V
namespace fy_Exp{+ f5 e4 G2 x/ t$ k: R
namespace {template <class _T>
! c: B0 }2 y- ?. T9 Y c/ J- v2 T! @inline _T GetExpValue(_T t[], char& csym){& @% H* ]( D: ^; [* G
char c=csym; csym=0;0 ^+ o% D1 v" N$ Y9 p% q( T
switch(c){
$ L, r' `( e* u/ F- e7 }( ? case '+':return t[0] += t[1];4 G+ a7 w8 f) d* Z
case '-':return t[0] -= t[1];
8 z1 o! V+ p# ^1 a) O/ x, Q( s# F case '*':return t[0] *= t[1];
6 \9 G( J3 t9 v default: return t[0] /= t[1];//case '/':
; P+ W6 T% M, K% e }
: a( r" f, g" f$ V4 a. I+ L7 B}} r1 G& }- m- j2 t' Z. V5 J3 L
template <class _T, class _Tstream>7 J1 E0 e. o( k
/* _Tstream: inputstream, _T: get return value
" x0 H" h, h4 k2 Y( X* Return nonzero if get value successfully */
, Q1 [, _$ c2 Z4 v1 C9 o ]9 Gint GetExpValue(_Tstream& istrin, _T& nReturn){2 J* _" I, a7 |1 G* O
_T t[3] = {0}; //雨中飞燕之作) b, I: r. `* }+ O5 R6 z- \
char csym[3] = "++";3 e2 ]* q4 m# a
int nLevel = 1, nERR = 0;% q+ ?7 B+ v- B; g9 }& C
if(!(istrin>>t[1]))istrin.clear();
! G1 F% N/ \& U4 o% H for(;;){& F3 B8 _; L/ n/ D4 V8 A
if(istrin>>csym[2]){( d. _1 p8 c/ ^$ [
switch(csym[2]){
2 Y% f0 ~& l* E. d+ ] case '(':0 v( i+ C2 f4 [9 }
if(!csym[1]){nLevel=0x100; nERR=1;}else
& j+ M: S# a( F6 } r; Z if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# E, s6 u+ V% f+ A
else{nLevel=0x100; nERR=1;}: R1 C3 @8 k0 {" b* Y
break;
% i- _6 b: D5 o8 U case ')':
1 N( G( Z# @ A2 s) F {nLevel = 0x100;}break;
" Z" Q/ S/ o; o! K; \( H case '+':case '-':case '*':case '/':" B2 ?( W; t" y
{csym[nLevel++] = csym[2];}break;" O* {& s/ l; l3 g+ ?: N4 a
case ' ':case '\r':case '\n':case '\t':continue;
2 P3 \8 ~0 \0 q5 n; [5 _) X; U default:* `" J$ p4 ?7 h) I7 B3 Y
{nLevel=0x100; nERR=1;}
0 A3 W/ \2 a' S: x7 M }! U- Q, t; V0 d2 f% k- J/ a
if(nLevel==0x100)break;
@6 Q! p/ n3 z) O1 ]. i1 m2 ~9 ] if(nLevel&0x10 || istrin>>t[2]){
# \: [ f1 \2 e1 R& K1 z% s nLevel &= 0xF;
7 [% Y M3 ~& O+ @4 @, Z+ f( f+ r if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
/ w4 |6 ?4 k3 u; p8 g! P( Z if(csym[1]=='*'||csym[1]=='/'){9 K# C) m' E6 U4 z6 F
GetExpValue(t+1, csym[1]);
; U' s' ]* m( \2 M8 }( Q+ t: g }6 }2 i# g( {" y. `5 \* Y" [& k
else{
6 ~# a2 X" M) b) A; R% w GetExpValue(t, csym[0]);4 x. S2 A: a' U! G. P1 j0 _
t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 |7 u( ^/ y( X, Z. {% C% p
}
% v6 U+ n* I. [# S$ L% K( F4 h) Q nLevel = 1;
9 N6 d( f4 N' F6 m }- b9 V: \. D- v9 ?5 ?
else istrin.clear();+ ~: C. p8 c9 J
}0 M0 X2 r- g7 |- P4 t+ k* D
else{nERR = -1; break;}
5 i; e& @0 c; g" Y }
! X, A8 T. {% `* C' j# E' [ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
# v& f# ]3 z6 h; O8 |: O, O else nReturn=GetExpValue(t, csym[0]);
( `* |7 T8 W& N" T8 m3 _) T! b return nERR==-1?1:0;$ H& S# \& [1 z2 R( |/ i6 [- o
}}; W6 H& T- x0 u) ?
} n8 [- k8 C. m4 g4 C( l( U$ ]% r9 b% ?* `1 o
2 |$ U; T' b5 E# m
函数模板使用示例:8 Z6 `( n" l# h k& a
在以上那段代码的后面加上以下代码:* s# `1 t3 A: \/ _5 q3 a' X4 S
/ D C/ ?, X6 y) |& @& [& m
2 @/ }8 L5 y! i# K2 g: ]
) U. }7 X' T) D) x程序代码:
3 a" \4 b u8 s4 w1 S+ ^0 P
7 Q( w, d* z: G$ z7 i, Y#include<strstream>
& j" S" V1 D! F% E% e8 r#include<iostream>
, H8 q% E8 d5 m5 X#include<string>
$ m& r G7 k' ]1 }0 O6 ?0 H9 p% ^1 gusing namespace std;& `, i' z. V: Q+ f1 E, |% S( `
int main(void)* f g X. ^5 z% J2 I
{
& v- U/ o' d8 e. c4 K& R: W7 d string s1;
7 g5 {, `/ v+ n, C while(cin>>s1)5 d* n! t2 V) J }6 p! v! J
{8 {3 t3 d% `$ I" d
istrstream isin(s1.data()); k2 M2 d; I/ c, v# y2 W
double d;
; {- A! `0 e9 M C+ q if(fy_Exp::GetExpValue(isin, d))
. {. W" w0 j9 [. V$ R1 h {8 s ?( G! t+ q
cout<<d<<endl;
7 S e+ p0 l6 _8 {1 @( p1 ~ }- T/ o% C# f# P# b( H. J( X
else
& S. L6 F; J$ @ {8 g9 m/ Y% O2 c5 ~. w# m/ h3 z% |
cout<<"ERROR"<<endl;. N/ H6 h* Y9 L
}
6 k2 U1 G9 T% u; V. x% R; ~1 q }# h; }% P7 R1 m: e9 ^. u4 i: S; z
return 0;
$ l! d7 ]! B3 b# [1 c}+ w9 Y" {+ |; W
, s& `" s- @2 v8 j$ y& z( |
Z, p' \5 |! j9 n7 S% T然后编译执行就可以了(*^_^*)% P' `) i1 j/ O: V* L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: @- j* I2 J: c8 B4 ]& [5 Z2 d 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|