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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
" J9 H- s6 g* e6 ]% k3 h1 b) i! s一个很方便的函数模板,可以并且只可以计算含括号的四则表达式9 b! |# \, S3 v5 b
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 _! T( B& f. }2 k |: P' b- j
参数解释:5 K: n+ @) ~/ x& F5 H( F t9 U
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流& S( W5 M' R; l
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
. z, f& O4 S# q+ q# {, h7 @返回值:2 S6 C! T" K0 e. g8 |' H
返回非0表示计算成功,0表示计算失败有错误6 U' ]* o* k. p/ Q* K- G
0 H+ g5 f E% W, d, |& n
. h4 I# x9 u! f& \3 n$ i) g; G# G. G6 o' O# @0 [6 E
程序代码: ) k3 |3 c W$ c% M; V
3 A& W" A: |4 s M8 }' ?
namespace fy_Exp{
2 [' J$ N! a( p2 h: N/ @namespace {template <class _T>
- s+ u4 G1 U8 ]7 M' S" |) w, @+ B- Sinline _T GetExpValue(_T t[], char& csym){
) h5 Y/ u! T7 S0 H) U0 P char c=csym; csym=0;, }- u( f4 W; j( l* u5 p
switch(c){
. C6 D Q9 {6 v case '+':return t[0] += t[1];( h- }9 C5 m" V- Y8 }1 f
case '-':return t[0] -= t[1];
+ n! ^3 n, J3 t6 J" s& g case '*':return t[0] *= t[1];
+ V; t4 e k# i default: return t[0] /= t[1];//case '/':
/ W) x# x: G. Z- Q5 V }
3 e8 ^0 B R" p; H0 {2 {6 r) E: C}}
. T7 k* B- R3 k3 c% Ltemplate <class _T, class _Tstream>& U a6 @8 G5 i* @* B5 C h
/* _Tstream: inputstream, _T: get return value2 I7 x3 U6 u8 n# R9 ? g/ g7 [
* Return nonzero if get value successfully */
b0 u+ V4 B# [( Q6 Rint GetExpValue(_Tstream& istrin, _T& nReturn){
/ h" I4 D5 D ^% {; \! S" e _T t[3] = {0}; //雨中飞燕之作
( Q" ^1 f: v% u! H2 l, U+ V' z char csym[3] = "++";$ U9 \; Q3 f6 ~$ F1 I! k1 X1 G" x9 t
int nLevel = 1, nERR = 0;( U% n3 L5 c$ Y. R! X9 G
if(!(istrin>>t[1]))istrin.clear();
8 |5 C% y( ]8 t) e; o' w. w for(;;){
7 U9 {' T0 s' S2 r if(istrin>>csym[2]){
$ F9 t& E% l: f0 b" U/ v switch(csym[2]){2 O/ d+ \! w* h b0 Q% ?
case '(':
* |1 B9 s. r+ l5 L if(!csym[1]){nLevel=0x100; nERR=1;}else. P8 O- `8 {+ v% P7 D0 ]" w0 o
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ a2 u0 _# n# j" O5 P7 R8 ]# D0 a else{nLevel=0x100; nERR=1;}
# {+ x j- w3 O break;
' Q# o1 r& O7 D case ')':
4 \2 Z( @+ x' B; ?8 r8 v+ [ {nLevel = 0x100;}break;0 w2 B0 M) J* b) l* q
case '+':case '-':case '*':case '/':5 L" u6 B' l' C0 Q
{csym[nLevel++] = csym[2];}break;
( D1 D2 {8 W4 T case ' ':case '\r':case '\n':case '\t':continue;& J/ h, {$ q/ C: a8 H% h G5 f
default:; K& v; X( [/ R6 `5 h. Z2 n
{nLevel=0x100; nERR=1;}, i2 x; M* n9 T# J* n3 W0 |- }
}& H5 `/ [' q) Z2 X* U6 _5 s
if(nLevel==0x100)break;
# ^+ b3 _* p% y9 q( Y3 w if(nLevel&0x10 || istrin>>t[2]){$ q% [; p- t5 x: {8 x
nLevel &= 0xF;6 s7 y1 {! Y3 b+ _9 G
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 {9 F2 b$ b" g if(csym[1]=='*'||csym[1]=='/'){. l6 w K U# ^1 z- k
GetExpValue(t+1, csym[1]);
, ~1 T1 K/ G" ?3 [, a4 i }) ]. z# |+ W o" J" }
else{0 r& \) t7 D3 r/ c! `) e" d
GetExpValue(t, csym[0]);% N: B# z/ h# N. ]* S
t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 H- e" A6 Z- v5 n
}+ S6 p7 P. ?6 M2 i1 u1 K
nLevel = 1;
U n$ A8 \. P7 i; ` }
$ p3 T# B( w0 _! X. X else istrin.clear();
: q0 d7 M/ C1 p6 _- E; s, G7 Y }
0 H; z, G5 C \, i* Z+ G else{nERR = -1; break;}
- p3 f2 A4 Y0 A# ?% B# h }6 ?( W2 O1 E8 V- Q; o- Q) e2 s
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 P) N8 E/ c+ `/ w else nReturn=GetExpValue(t, csym[0]); k6 q9 @4 g# R7 X& B* v
return nERR==-1?1:0;
( Y) [+ D! o7 L2 A, ?}}
* L$ Y/ h$ ?; [; y5 R4 i; O1 j9 {% \* ^& H) e7 N$ [2 b# f
* P# Z) [# T! r) [
5 g# x% @/ k7 G) I$ k函数模板使用示例:" x q) `! T# {1 ^% P Y# }6 h
在以上那段代码的后面加上以下代码:
. \) W( U5 f7 B* H8 d& M8 h' Y% r5 ] H* j9 H: K$ {1 g$ }
' @: c8 F( g. H3 x) }- M
' O- k9 A3 I6 @: y3 |0 Z4 q
程序代码: r* u4 A, P# t! s/ q, y
6 M0 n& N2 F( D0 r; s4 P% G6 x; U2 J#include<strstream>
* @0 x3 C4 C7 T8 o ?$ ^#include<iostream>* `% S6 v" r. d( @) k$ k
#include<string>- P2 ^6 J/ X3 D: F5 m! C; s: K
using namespace std;6 l9 U r/ O% n ^( e+ m
int main(void)
$ G( m! w1 Y% @% ^" A& Q{
) A, n, B! H% A+ V string s1;
# R: v% P& }: i$ X while(cin>>s1)
8 q: Y2 B( C8 N' ?) J {7 ^9 s9 O& r% ^4 m
istrstream isin(s1.data());
! L/ G* {% W3 v! Q2 B0 l double d;6 N( f. I) M& M8 N& W/ g
if(fy_Exp::GetExpValue(isin, d))
( Z8 r. ~# o' O$ n( a! L) ? {
- i1 t3 y1 k u0 M) O6 u6 T, q cout<<d<<endl;
4 A( X* m* y3 @* F: N7 v }9 W1 K0 R) [ n n c
else
& P4 N7 q0 t( R {" e+ I8 g$ `1 q
cout<<"ERROR"<<endl;, ~: s g" D' |7 K8 z3 \
}
8 I; N# [- D" }& C }
& V" j, b; h0 Z( G- H! o return 0;
1 d3 A( I2 @. N- ~4 Z}
" X& a. r' F1 u9 P5 T
& y0 b8 o7 e0 z$ E, {( h
8 m7 C/ h6 k9 X, n然后编译执行就可以了(*^_^*), e X5 r! J! y* m: {. f
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) {, J/ s) o1 e/ O& [; H% J 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|