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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
8 y; w( M+ {3 u- D% V# O一个很方便的函数模板,可以并且只可以计算含括号的四则表达式* x3 Q: Q* o; A$ q; V4 n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); v3 E+ _9 D5 F, K5 R. ~
参数解释:
! @: E) z& D1 [+ fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" D' B8 h5 N U$ k4 J, xnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定# Q D' ~' _/ X- t" }. V0 ^; M
返回值:7 R7 }: ?, x1 y6 h3 D
返回非0表示计算成功,0表示计算失败有错误
) S5 R8 W: R* l% ^3 j* M
1 O9 N) G' [% A 4 K0 Q; _. o* `" _
/ ^' p9 O" m; m$ v' B
程序代码: - K0 v5 t; f" A" D
- i3 H+ ~/ z! w" L9 `' U9 enamespace fy_Exp{: F1 O& e9 q' r. m" Y
namespace {template <class _T>
+ G0 p9 [. X* D }# einline _T GetExpValue(_T t[], char& csym){9 P" d- o( p; _& _* A
char c=csym; csym=0;: Q2 R$ C V$ ^; q
switch(c){+ P/ J4 L/ x/ t+ t
case '+':return t[0] += t[1];
+ C$ j3 x9 h4 V. U# j" i# H case '-':return t[0] -= t[1];1 U2 I; x; P: ^, `8 Z5 x
case '*':return t[0] *= t[1];
; P$ x2 ~7 x' O! d' s2 b default: return t[0] /= t[1];//case '/':6 Y- ^: `5 N+ @. f$ p( h! l
}
, K% u9 P* i% h- M! K' K}}
- e; T. s: [. o s$ q' Mtemplate <class _T, class _Tstream>
* s& Z4 z$ p& y$ e# _+ R5 B- l/* _Tstream: inputstream, _T: get return value
- j p& j9 G h5 [! {* Return nonzero if get value successfully */
1 R' k8 n0 q! B* `9 L4 r0 wint GetExpValue(_Tstream& istrin, _T& nReturn){
5 a/ c4 v) B z6 o, d" z; q | _T t[3] = {0}; //雨中飞燕之作
) W# R- R: w) t8 p" O char csym[3] = "++";
) j& L' K# @( A6 C$ f int nLevel = 1, nERR = 0;
7 t1 V6 y1 [! j4 A if(!(istrin>>t[1]))istrin.clear();
3 T+ q, y( `% @4 g A, } for(;;){
! R0 O4 {( b" l. i if(istrin>>csym[2]){
! j( e4 f. i5 ]' k' b switch(csym[2]){
# f9 b. a; Z# d% ?- e; G; u4 N) e h case '(':% [6 S" R* s1 y' p* M2 m% D+ t* }
if(!csym[1]){nLevel=0x100; nERR=1;}else
* A8 ^& U# M/ J/ R3 D7 R if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- T5 T" p1 o+ e9 i
else{nLevel=0x100; nERR=1;}8 [8 `& A m, @' N& U0 k
break; N+ k, q" p8 [3 t& O3 z& K" n" p
case ')':
" G8 c: p* q/ A0 B# W" u {nLevel = 0x100;}break;
% ]$ q# c8 g) m4 ~3 W) O0 P case '+':case '-':case '*':case '/':+ K$ e. @$ U) O% j
{csym[nLevel++] = csym[2];}break;8 f$ x0 y# i" c: q& {/ |6 k( Y7 ^
case ' ':case '\r':case '\n':case '\t':continue;
8 o/ `- z/ o* c8 Z: V default:
. f( M8 q: K0 p! v0 X" H4 ~ {nLevel=0x100; nERR=1;}
( r/ x, s& h+ ]. R: H }# B7 a( z: f2 C2 s: Q% z' l
if(nLevel==0x100)break; |' u5 C8 u3 t3 A0 ~) _9 J6 h9 e
if(nLevel&0x10 || istrin>>t[2]){/ \! Q$ m" {9 {8 C+ F# Y3 B+ U) L
nLevel &= 0xF;3 b- ]( g4 l1 b9 i8 y
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: }( n5 w# Y1 S8 ?) C if(csym[1]=='*'||csym[1]=='/'){6 ^- F; M" `. v" D8 {0 [
GetExpValue(t+1, csym[1]);
0 Q/ B. i& s; x- A }
) E1 |5 |7 x* n x3 ? else{
4 s; ~% ]! G+ Y# `5 L6 [" c GetExpValue(t, csym[0]);
( f. c3 |* s$ R' n t[1]=t[2];csym[0]=csym[1];csym[1]=0;
( a& d4 z9 a* R1 A5 b }
7 ]: W# R5 Z6 b" L( q3 Z7 I nLevel = 1;* }; B" U2 w$ I
}* F( Q+ ?! x& X4 I7 o+ M& H
else istrin.clear();& Z/ X6 R; ~+ U/ ?
}9 g+ x! `" C- n
else{nERR = -1; break;}
) I. @) X& v; |% k) j4 T }
: A( y2 T. t; n7 q! I- q' K if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; ?' }0 x5 Y) _1 j
else nReturn=GetExpValue(t, csym[0]);) h @. |4 {( n
return nERR==-1?1:0;+ ]* d* g, t. w: _; S5 i; ~
}}: p+ y$ F% W3 _7 |1 _
3 ?1 t, W1 ^: k
! q& O" a f* g( N. P8 R4 l7 M6 V: P" }' ~9 |
函数模板使用示例:1 b' k* B& K* j) ]
在以上那段代码的后面加上以下代码:
! c" E1 ?6 p1 `/ w7 E6 e! C
6 [: \! L1 W# A8 ]! s* O( d
7 Q5 Z3 L5 ^3 N% E" w6 @: G
" U" S% I5 \ b7 o. p2 S程序代码:
' ^' V, m- v$ q1 L/ L1 ^* J0 j: `0 B& a
8 g+ h" Z$ G: |1 G( h#include<strstream>
+ X8 v3 U$ S+ a6 [( \$ d#include<iostream> k1 K/ ^4 z! P1 O3 A# _" F
#include<string>8 G. p8 L; K2 w2 k" q7 g! L$ D) Q
using namespace std;
- r$ p+ I+ _% l* h8 e1 a% Q3 Tint main(void)
) `6 W( c4 }$ c+ R: z7 d& |{
& m% V5 s7 F( v0 p J, z string s1;0 q4 i* Q6 R0 `6 d6 O2 V
while(cin>>s1)2 f% V' a' }, z! J1 m* V# o1 ]
{* e4 V& F+ V9 x
istrstream isin(s1.data());
: k% _. d' o( }3 v- q; f; F( @ double d;
, n+ }! |( @! L5 k if(fy_Exp::GetExpValue(isin, d))5 f( \9 W) V8 K- n7 L" m+ g
{; H n0 Y$ U3 [) B
cout<<d<<endl;
& n; O( F1 z8 m }
8 b8 F% W1 |( h' n) x7 I/ U u else/ s2 M: }3 U$ l6 J" V
{0 W$ Z# x/ k6 P2 K
cout<<"ERROR"<<endl;
6 }/ \& Y0 p9 w: P* x3 P, i }
+ ?4 [0 N. H# k: ?$ l# D }
3 n, B9 k4 ]& s2 b* v% G return 0;
0 L7 J- w2 S1 L, }& G$ ]}! v2 D6 Z! f2 I7 K" `6 M
* b+ ^4 S3 R9 ]9 E/ P$ ~5 m, r& j a. W, _4 j+ I2 b% P& `, N1 t
然后编译执行就可以了(*^_^*)
$ G! f5 N1 K$ V9 n/ ^4 s其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ Y& h7 z1 k% d; |4 S$ l8 i
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|