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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; r) f4 I9 J# q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% Z* }: Y: Y# @ I+ Q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 g/ c! {4 Y/ a& j: }; w
参数解释:/ O7 [# @ f! [. q$ K. l' K
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- ~! @! T( `. T( knReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 I# s' A! j) |& R# ]4 A! n$ f返回值:
, H% ?, t* b0 `7 i: g0 d返回非0表示计算成功,0表示计算失败有错误: q: a+ K# b/ c9 ~- ]# W) Y0 h
. v, k: D4 p- }* S7 c' D" N6 j
, I8 G. j' m$ q) \
6 F2 F4 A7 t; W& L$ u9 H3 D4 l% Y9 T程序代码:
5 j$ k8 g5 b& b7 l8 t/ c) N
; L, e- r9 u/ F$ r g2 O( C, nnamespace fy_Exp{2 I; v; y* c l' y+ _/ b
namespace {template <class _T>3 H- b: ?7 p |; c
inline _T GetExpValue(_T t[], char& csym){/ @; C5 L0 H7 y& l8 y
char c=csym; csym=0;
1 `+ {5 C: [4 v( s K switch(c){
' C) Q0 L; Y4 R' Y Y! @ case '+':return t[0] += t[1];
6 B- }5 X; i% |1 {3 J) m! H case '-':return t[0] -= t[1];0 a/ Q# E' I8 |# \0 e
case '*':return t[0] *= t[1];
( }& @/ N5 f: R' X default: return t[0] /= t[1];//case '/':
6 \6 {6 z& k3 M W' z" B }
7 s' F) l- s+ S: x/ i R}}
! Y! ?) `# r; N2 h1 I* Ytemplate <class _T, class _Tstream>+ F* U& o; m# t+ v, v5 h4 Z) q
/* _Tstream: inputstream, _T: get return value
- `) _" T/ o7 g* Return nonzero if get value successfully */
& F( |* c4 @! X" D3 \int GetExpValue(_Tstream& istrin, _T& nReturn){5 \- s) X, g% s. q1 }' F, Q# D- A- C
_T t[3] = {0}; //雨中飞燕之作7 u$ |. C7 u0 Z; ]& |, _7 b- Z
char csym[3] = "++";5 b- n3 [4 q0 j+ w: s, G
int nLevel = 1, nERR = 0;0 A* l6 `) f0 y, p% `- U r
if(!(istrin>>t[1]))istrin.clear();: V4 ]. _. V+ q2 G8 m V4 N2 g
for(;;){# w) H! D# E) V) q- a! r G
if(istrin>>csym[2]){% G3 {/ Y6 b- j( k) Q$ H
switch(csym[2]){
, F2 k! e' U U/ Y! k" |" C case '(':, q9 {2 a% [+ x }6 V
if(!csym[1]){nLevel=0x100; nERR=1;}else# O- |1 G! @3 p/ y
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 ?) m$ C7 R' M; O, q' Q! X0 r c
else{nLevel=0x100; nERR=1;}7 t5 _5 U& o" d" g- s, H7 g
break;
2 B4 e' e. N, ?) ?; f1 O0 E" q3 d case ')':
2 L- S6 u3 n9 W5 `% C& ~" @ {nLevel = 0x100;}break;
; q, a8 V9 ~# O4 k# z7 _. w case '+':case '-':case '*':case '/':% K# K2 `2 F- n' o, f
{csym[nLevel++] = csym[2];}break;! j; Z1 L) X" y/ O- w4 y( C# w0 j
case ' ':case '\r':case '\n':case '\t':continue;9 Z/ f- G. t: d/ Z( `
default:
* b- N) B0 c1 J( y {nLevel=0x100; nERR=1;}+ [. i* P8 |; h( S2 ~# s$ f. ]& J
}
; H/ K X0 b3 w if(nLevel==0x100)break;1 R( x! ^4 J: s5 u
if(nLevel&0x10 || istrin>>t[2]){
! h, V0 r" k: a, f% o9 p nLevel &= 0xF;
+ n+ ~ u; W/ e* ]: p* V if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}/ ]* S! |$ V/ `5 ]+ V7 L
if(csym[1]=='*'||csym[1]=='/'){( ?% O' g# n O8 d9 q
GetExpValue(t+1, csym[1]);
: e6 u, T3 t( C }* E- e# U( m; Q
else{
$ E/ l) H9 M' _( l1 d& h GetExpValue(t, csym[0]);
. d- i% l7 E3 p( D4 V t[1]=t[2];csym[0]=csym[1];csym[1]=0;
5 R' K3 o: Z: q9 y }
0 M/ N, Q/ g# V0 g) c nLevel = 1;2 S% ]: M4 A# @6 A( b0 ? R; Z) w
}. C" @5 t- M, \% U% p
else istrin.clear();
/ T$ v8 U) W. l. }6 u6 Q }
( z' X( T2 B$ ? else{nERR = -1; break;}
' I2 r. p0 Q" t1 x# e9 v' s }+ G6 L( ]* {/ s( z1 }+ h3 y
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: J9 G% O% D3 C
else nReturn=GetExpValue(t, csym[0]);: i1 | _8 Z( A9 n3 h; W( s, d
return nERR==-1?1:0;
: o6 B# N0 D( `' @2 R, G V# k9 `}}: \9 K% t; {# k ^$ @
4 D" ?9 s9 \" \) g1 w8 }3 w8 V
" R( D" Z# K( P8 B" S3 q1 c/ G
函数模板使用示例:1 Z# W. s& F' G$ |( c
在以上那段代码的后面加上以下代码:" d+ y- b% U, b+ w
& E. R1 l4 E1 O, c/ ]' T `% y7 x 4 h# g1 Z" n( j5 j0 w% ]& o
; w! Q/ [: I. R5 r2 R
程序代码: # y" E3 x( J( H9 i5 i. {9 C* Q
% b# h2 b& G- ?#include<strstream>; b& d0 G1 W% y! b
#include<iostream>( W! i9 p0 ?: R
#include<string>" i; V- r# ~( N8 D: O. w5 M$ i
using namespace std;! b; E& J6 k3 O: u
int main(void)' t4 u g% X, A- p2 V, k: e- B
{, b' p) S* Y' F- r/ ^
string s1;& M8 M: H: z8 a w( Y, A
while(cin>>s1)+ X$ V* w6 F( ~3 V" n4 i- c+ f
{
- d+ _. O" \! V( w# k/ Z4 i5 P istrstream isin(s1.data());
; Q9 E- C# Y. i- o- ]8 P double d;
4 T" Y7 @5 ^" Q if(fy_Exp::GetExpValue(isin, d))
3 w9 T9 c' M" t( N8 ~7 Q$ a {- b- k! v$ b; {( w, S
cout<<d<<endl;$ O; S8 A1 t/ H9 f# M
}
) d9 J' n+ z M) @1 C4 x. [ else
3 S/ _5 g W; M) M {
5 _ o; S; L3 ~% Z1 Z) k! x cout<<"ERROR"<<endl;& A) L9 g' Q7 v- v
}
- u$ A% S; S! L5 E* g4 U; [ }! C, R$ M: J% _ }) {
return 0;
) i: t- v$ c$ G. b}
+ Q/ Z( l: m# A, N% y; h$ d4 k# P3 s2 v& n4 [
! k# o( ^% P0 p. i7 G
然后编译执行就可以了(*^_^*)( s, }1 m# M6 O9 u" {3 N
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; ^, K; g( j9 S- [. ~* p& _/ p R% d 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|