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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
, Y4 R6 Y R/ W6 m* D$ {; z一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ T9 ?$ O- I0 C$ f& z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- J: c: V1 i$ Z f1 v参数解释:9 d+ C* p/ F% G: }+ p2 [0 Y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% U; Z9 N6 i( [$ S
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) h, L3 ^( j+ ^
返回值:
! C* V) b7 x+ D7 B' H: d" Q返回非0表示计算成功,0表示计算失败有错误: t! `2 I* |: T
, [4 ?( Z- h' v: w: i
6 r: {* H- ^" W' R/ R
( P4 G+ I$ _: k* Y- \; b程序代码:
. i" _2 F+ S0 ~1 I! j/ f) N
* z$ i- V3 F" Inamespace fy_Exp{
) W/ Q7 w L) Fnamespace {template <class _T>
r9 c( O; N: B, ]inline _T GetExpValue(_T t[], char& csym){
4 f# L0 o& A+ o char c=csym; csym=0;$ ?# a/ F0 ^. n5 x. v
switch(c){( [( F* L% K0 \/ B# O# `0 E8 ~
case '+':return t[0] += t[1];
. }# |( Y3 E5 a4 Z case '-':return t[0] -= t[1];
4 r$ H0 j. L2 i x case '*':return t[0] *= t[1];) c& F0 Z. l( t; y
default: return t[0] /= t[1];//case '/':
) f$ Y! m0 t( b# A9 x+ h }
b3 z( t# ]! N8 w4 f. N}}! P- b# Q1 e$ ]0 {" C* I0 C4 C! Q
template <class _T, class _Tstream>: B; V6 e2 Z/ d( b' j
/* _Tstream: inputstream, _T: get return value
; A# l3 \, y3 U& u) p* Return nonzero if get value successfully */
9 N, J. R# D0 T2 T; ?# j2 a5 f! X! {int GetExpValue(_Tstream& istrin, _T& nReturn){
) f0 l7 \( }4 A- u: p$ e6 m _T t[3] = {0}; //雨中飞燕之作. H/ P7 e$ T# g1 B
char csym[3] = "++";- e0 z- Z- ~+ P# [5 n: K
int nLevel = 1, nERR = 0;9 P( r* W& |' [
if(!(istrin>>t[1]))istrin.clear();
4 c; }) b; V( D( @. A% n1 Y for(;;){
/ q. c$ S- A3 d if(istrin>>csym[2]){
9 d8 C# ]- {/ K$ z$ n+ f% | switch(csym[2]){
; c8 [0 K1 c+ o$ i case '(':, y) i! K; [' p+ @: I
if(!csym[1]){nLevel=0x100; nERR=1;}else ]: N' b h5 J8 D( m! @9 p' S
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 U5 ~- T7 p2 u5 V: D else{nLevel=0x100; nERR=1;}
5 ?; n8 C5 {" i4 P' @$ m# v, g break;5 R3 V" v5 J' W
case ')':! w4 O ?8 d5 ~9 ]' n, S2 |" Z5 Y) ]
{nLevel = 0x100;}break;
' r8 J1 \. z1 K; x case '+':case '-':case '*':case '/':
& z- g7 v3 \( g3 m( B) ?- F {csym[nLevel++] = csym[2];}break;8 p% J! T( M' S( @5 B! o
case ' ':case '\r':case '\n':case '\t':continue;
! Q$ x0 a1 [' d6 ~& S( o7 X) J default:
9 A- r6 z0 y$ I5 ~! O {nLevel=0x100; nERR=1;}. ?/ D; ~/ Z( ~
}6 x/ k; H5 }' s" T+ l
if(nLevel==0x100)break; w% O6 s) O, y$ L# [8 f: y
if(nLevel&0x10 || istrin>>t[2]){
H) |* \, r5 ~" I$ b nLevel &= 0xF;
9 T/ I/ E, F, L2 ?+ }% s if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}' z- U! T C, ^2 G
if(csym[1]=='*'||csym[1]=='/'){1 A ]! m" w, N0 g* J
GetExpValue(t+1, csym[1]);
/ H3 f* b* w+ S1 ]7 b6 q! u }
+ i4 s# a) q2 |* }5 T' T" { else{& H/ u) A2 H ~6 R3 F/ k% B% J" U3 ]
GetExpValue(t, csym[0]);
5 S& d2 n5 z5 M3 v4 p; ]/ B t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 d6 x* ^& L# Z& r- f/ H1 [ }
; P" p/ W m" L) ?: T2 C) Y; I; N9 x5 r2 V nLevel = 1;6 F3 W( P p/ }, {& |' e8 y
}
+ s: y" ^7 w. u7 w else istrin.clear();+ z, j+ Q, d( H l: `/ L
}
# ]& h( S& @) g5 p# M' a else{nERR = -1; break;}) l3 S1 c4 S7 |( b6 D
}
& H/ r; l! E6 Q; U if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
! ]8 s* H9 |0 `% I2 U+ Y* v else nReturn=GetExpValue(t, csym[0]);
6 P# l3 K3 Q% j0 S return nERR==-1?1:0;1 Y b- J- s( y0 y
}}
, g9 U$ `3 t1 i! a: _0 f8 y. ]! m
3 v" o$ a' p D3 I$ q$ X" F/ e
R5 b& {$ [& o* ?# y
# z0 g2 R: m% l% l$ y% y0 {4 E函数模板使用示例:
1 ]3 O& ~& T8 U( z1 y- v" m在以上那段代码的后面加上以下代码:
: `" W9 x# D6 K* |. Z& i( u
7 A1 u% [1 v, w$ A2 ?$ l3 ] 7 p8 l/ T8 t3 ~0 l6 a$ R" t
' N& O, h8 ?/ G# ~) s, b$ F! Y程序代码:
6 X2 ?$ W% [4 P* u3 ~ b/ e9 v8 J* L# W: Q! {( j# T# {, d4 Z
#include<strstream>, ~1 U* i6 F* C' _
#include<iostream>
- @" Q( n/ R) e0 @8 \, c6 L2 k; D#include<string>5 p" w3 R- ^# ~: N8 X
using namespace std;9 [1 e- f/ ^3 l* F, d0 K# U w
int main(void)* v. U n* Y. x) C+ W
{1 V) o3 u8 F1 W3 s# k$ f: B* Q* Q
string s1;
3 @# A k. P3 R. I7 x0 j" j( c while(cin>>s1)
( p4 O2 }* c2 e, Z {1 ^2 ?: D0 e' K/ I' Q+ y2 P
istrstream isin(s1.data());
* K) I# G9 D# D3 V2 Y double d;
" p# i$ J* g0 z. ?2 w if(fy_Exp::GetExpValue(isin, d))( q X( A. w' J+ E
{: d- X3 B$ Z/ o4 O/ V) G
cout<<d<<endl;
4 v. T Z6 v; P4 U: H; C$ C }6 L5 L0 _. s8 C" H5 Y
else
+ \9 t% D7 e" d! M$ v2 Z% E) P {
: `! u( Q3 o* N% t: L# ^+ i- v cout<<"ERROR"<<endl;
1 [5 D# ]' f$ Z# H' A7 v1 U6 ~( {. K }
: C* F4 ^1 v: W- q; m* n }
" b( u1 I- F3 b9 Z" { return 0;% L; O9 S+ ^. o5 R: v# @* d
}
4 Y. A) P6 g; l8 B0 n* Z1 L; h* G' M1 r& O# S) P( P/ E
' a# p0 D0 X2 p1 @; w6 u
然后编译执行就可以了(*^_^*)
" r4 B1 Y. U3 S) u/ B- _* V其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" ^ t; m0 Z* E" r' e 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|