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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,8 H) W3 g( b6 `* h" g4 s3 {# V2 Y* R
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- _3 U$ S. O& n P
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' r+ D. {: Y' g1 a- t参数解释:$ ^$ I9 a; p$ I4 i8 v! U4 h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( Q5 I# I. `+ J9 M7 {. v1 W, K
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
2 k! D% V: P# t% }$ E6 \1 b: \: G返回值:
% y1 y; Q5 ?) {返回非0表示计算成功,0表示计算失败有错误7 x5 V) f( A: d/ D0 N
- d0 J C9 G5 Z" l, i
/ Q2 L7 C. v% q5 ]7 t
) m8 o Y! q* H$ P
程序代码:
( H6 o% U: s3 y+ F( b4 y0 {1 n* n5 }2 @0 `, G0 z- e- J
namespace fy_Exp{+ S1 p$ ?" u, x9 q1 ^# k7 S5 W
namespace {template <class _T># }! ~) A. Q- V8 u" H/ v: u
inline _T GetExpValue(_T t[], char& csym){6 \& R0 p5 R. G( I' A- U+ i8 U
char c=csym; csym=0;- y& P- D+ l3 h
switch(c){
7 k; I* t( F5 Q! [, n5 P1 G1 I case '+':return t[0] += t[1];
5 Z, i! ~ ~0 v, v4 A1 R3 Z case '-':return t[0] -= t[1];
+ O+ \4 L( A9 y4 D case '*':return t[0] *= t[1];
5 Q: b% H" {( h# s9 Q default: return t[0] /= t[1];//case '/':
) g/ F1 s/ X. n7 G0 D. m3 G7 T }2 J- B( X h0 p) H: ^
}}
; l7 b8 e* n5 _) f0 Ntemplate <class _T, class _Tstream>
- {! z$ N* q5 x/* _Tstream: inputstream, _T: get return value
/ k( L4 R- O4 m! [6 e T* Return nonzero if get value successfully */+ i% N8 O( P% k; u; C
int GetExpValue(_Tstream& istrin, _T& nReturn){
: T, H& b! V3 k* u9 w- k/ M _T t[3] = {0}; //雨中飞燕之作) I/ v, ?* ^% @1 ~: ~4 J
char csym[3] = "++";, b: a, L4 Q1 {
int nLevel = 1, nERR = 0;
7 @% t* H" e$ L/ ^+ ?0 Y if(!(istrin>>t[1]))istrin.clear(); o+ @& d$ ^: |6 y( P
for(;;){
: Y/ ]8 a; Z: `* J if(istrin>>csym[2]){$ T1 d |6 y& K! A
switch(csym[2]){0 W8 P8 e! n( |& @. s& I3 k
case '(':
# n2 T: p3 z* }+ n" Y H if(!csym[1]){nLevel=0x100; nERR=1;}else" u; _; J% c8 l6 j- A
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 R3 N0 r/ Z+ I5 G/ x5 ] P( Q else{nLevel=0x100; nERR=1;}0 |# M* G1 Y6 t6 K
break;
/ t5 z- Q% p% A/ b' Y case ')':" T$ \, T P$ v4 n
{nLevel = 0x100;}break;
/ L. L1 z7 C) U case '+':case '-':case '*':case '/':1 J+ O; f: l. m
{csym[nLevel++] = csym[2];}break;
9 t* \- m9 Z; u3 p case ' ':case '\r':case '\n':case '\t':continue;
# n* R; O4 ?) c. C default:
+ s* C" G7 o2 G: ~ z- k _ {nLevel=0x100; nERR=1;}
$ d) |; o2 H3 q$ M }
' {+ ~' W4 q3 q# Y if(nLevel==0x100)break;
; s# k3 t0 @: k! Q, d$ y9 y& |3 Y if(nLevel&0x10 || istrin>>t[2]){
# y8 |. V8 J! L+ {" q+ ~ nLevel &= 0xF;/ o4 C0 Q% Q7 {8 |3 G( ~0 ?
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' f3 f+ ?" w: @. |4 i0 r/ e4 ` if(csym[1]=='*'||csym[1]=='/'){
% [! r+ X7 R" _) |2 Q GetExpValue(t+1, csym[1]);
1 z( q( `: u1 j% M: p) A }
: ~6 U0 z( K2 k& N9 U else{
2 R' g1 |0 `3 X, k GetExpValue(t, csym[0]);3 f& R% @3 [" _3 W+ u7 l
t[1]=t[2];csym[0]=csym[1];csym[1]=0;- R2 [2 `7 _3 _5 D% L9 P
}
2 S7 M; g. o" J7 ]$ B4 ~: T nLevel = 1;
4 Y" R6 e6 l$ s5 n- V( Z7 [1 A- R }
( }, X" ?8 x3 }; j9 N4 V else istrin.clear();
- t% S" }7 R+ z4 C1 M9 _, z' v7 D } |/ }6 Q$ `' f0 f d% @. \3 x
else{nERR = -1; break;}
7 h* |* F9 K' e" r6 e2 u }
0 H$ r6 B/ W/ g9 L" d if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; ]+ K8 I3 Y8 U: r/ l1 x else nReturn=GetExpValue(t, csym[0]);+ g L1 n; E- S9 G9 }# w
return nERR==-1?1:0;
V1 H; {: ~* }, w6 b}}& r. T2 s$ H0 b2 W$ l' q% W# R
" Y# ?) h2 A0 P1 N5 T0 Y$ h- q3 N: D) \; A9 ?. y7 Q
% v: i+ n/ }7 P! @ P函数模板使用示例:/ G3 }/ e; y' |$ C: j# B3 u
在以上那段代码的后面加上以下代码:. z: T" F' T& M( H& U4 C" L( j
8 Q( \9 K( v! m2 h
$ h% a: j. L/ O( b [ p3 c) p
# ]5 D c! \+ k9 W6 r
程序代码:
* s% ^8 E* J9 |* t- u% O2 x+ ]/ P
#include<strstream>7 H, O" \5 ?$ s: n/ j
#include<iostream># w5 Y( _, H1 @
#include<string>& R2 `8 i' e+ w! l5 R/ w( w; \
using namespace std;
7 B' `8 T" N) l* g0 ?int main(void)
2 ?8 ]. S7 a4 {# K. g' N; m. w{
# j$ q, A2 l$ I string s1;; e+ N: s9 a' `5 w. w
while(cin>>s1)$ a! O0 ~ C% d% P- R5 G
{7 S: ^& D+ k6 C d1 ^
istrstream isin(s1.data());4 W1 ]. v* | c
double d;
+ [' a% l- D2 f4 w2 ^. T- E if(fy_Exp::GetExpValue(isin, d))
8 L* Y, ~, d$ O. c+ L0 p {
+ h6 i T$ a5 c cout<<d<<endl;% N- }- b: V; ^4 ]5 D- b: j" b
}$ `0 N" L/ V p% f4 h) ~
else
3 {" C5 z* M; J' b {
' n# A% j: k) u2 J* ]1 x+ I! l, e cout<<"ERROR"<<endl;
$ I- x3 ]. ?6 t }
3 @8 X; l4 l# g, n0 h# ` }
: j1 v( n1 t9 u5 z) ^4 W- J; Q/ ? return 0;
* K, U! h' V" @! F0 ^- V' N+ [}: R5 I3 c6 e9 j
5 f5 B; c0 z8 Z
6 ]0 l1 e @9 d% B- P) F3 b0 {然后编译执行就可以了(*^_^*)/ f N# i# h5 W0 @ Q6 J' f6 U
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
7 P9 I' G0 x0 r( Z: h6 s0 Y 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|