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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
3 a4 R7 U$ n. H' f0 t1 O2 q% R5 }一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; }$ S* k) m8 T, p: u1 n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' ]# I1 N+ F, X# {4 C6 _参数解释:- B( K( H/ H: R4 F$ N, ]
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流& q! y( ?+ W5 ]! d& q) |. O6 D
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; o0 m, Z7 @+ q: s; E
返回值:# I& i: L1 J' `7 B# k6 ?
返回非0表示计算成功,0表示计算失败有错误2 b7 p. c4 m! ~2 }0 K* ^! N* @
! }9 \$ m+ j- z# v1 p2 J * m6 F5 x( V% R9 |0 N5 D
4 G* r7 e$ u: Z K7 a程序代码: ' g3 C1 N d# B' [0 ]3 G2 h
+ b! p3 L4 b1 ]1 @# Jnamespace fy_Exp{
6 F/ B& m8 s% O: knamespace {template <class _T>7 z0 \, i5 G9 F! r
inline _T GetExpValue(_T t[], char& csym){ T+ v" v6 D+ N3 L5 E& G. F% T
char c=csym; csym=0;# a( B; U! L8 O& R4 ~! O) w3 ?
switch(c){- U' B9 A, K5 l/ e! _5 _1 a6 g
case '+':return t[0] += t[1];. x3 y: G& \: x
case '-':return t[0] -= t[1];
9 V6 [! X' U) ?; u case '*':return t[0] *= t[1];7 w- d; j7 N. J$ G* @
default: return t[0] /= t[1];//case '/':
! X# Z2 T! e; i }
1 p; ]: C# E: Y: [. r}}
- D3 p Q, ?, F6 L' l a! Stemplate <class _T, class _Tstream>- n4 u3 F5 K) R
/* _Tstream: inputstream, _T: get return value% g, |& b' X7 }1 }
* Return nonzero if get value successfully */
- L+ E" E; V+ A9 K$ M; nint GetExpValue(_Tstream& istrin, _T& nReturn){
$ a8 C5 p& `& s1 r; U/ v _T t[3] = {0}; //雨中飞燕之作$ m! B+ o5 C* s1 d
char csym[3] = "++";9 J3 R. M8 J' P% J" U
int nLevel = 1, nERR = 0;) ?% U. i% a; z/ {
if(!(istrin>>t[1]))istrin.clear();0 J( e, y" q+ N$ l. C( Z' T
for(;;){2 t+ z6 h. Z8 N
if(istrin>>csym[2]){
9 p$ z- C0 B" F/ V( X switch(csym[2]){- j, V9 h3 Y" P' t* l9 U
case '(':3 P8 \) B- o/ J6 P
if(!csym[1]){nLevel=0x100; nERR=1;}else
2 x z0 J7 ?9 @3 j$ W6 ]) } if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
$ B( w) \- x. E else{nLevel=0x100; nERR=1;}& ?! ~& a, {! {+ j
break;! a( }& r1 R* B9 A) n, \4 w
case ')':
! x8 W6 y- I y8 R1 h {nLevel = 0x100;}break;
6 W+ ?1 w# _2 c ? case '+':case '-':case '*':case '/':$ n* N, {- A# R7 L% c
{csym[nLevel++] = csym[2];}break;4 |/ {. @0 e3 Z5 t- M7 F, U
case ' ':case '\r':case '\n':case '\t':continue;
1 F p1 [6 Z7 h. p default:. q. N) x) D+ }' @( N
{nLevel=0x100; nERR=1;}/ d% b3 U) n: ]: y" F g% \
}- x6 {6 }# I) N" a9 G" d
if(nLevel==0x100)break;
$ g6 _* [8 `7 m6 @ s% N5 U" A if(nLevel&0x10 || istrin>>t[2]){0 p- E5 ?2 i9 c" Q
nLevel &= 0xF;: ~( g7 T; f! l2 P' _
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- A' V- ^$ e2 h- k" X
if(csym[1]=='*'||csym[1]=='/'){
* U2 w% w: ^+ ^$ l( H' w GetExpValue(t+1, csym[1]);
) o3 i' F: F! r) Q6 T b }- W7 k/ K3 g2 d4 N
else{
2 x( t: F& A A GetExpValue(t, csym[0]);/ X3 [% p$ n" t% R$ G, q
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ W# h# [4 z2 Z0 K$ t }
2 Q0 G: W0 f1 E/ t/ l# X nLevel = 1;/ `8 l7 r& A' k" A) L
}. B5 M4 U5 X1 D
else istrin.clear();
: V( f, ?. Q' F* J d/ ]: j }# y$ a2 U" ]1 w' v7 n; e# x7 z
else{nERR = -1; break;}
6 @: z: N: a* `4 M; ?! J9 a }
0 K1 j% }: k( o, J if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
- `3 r/ L) H6 N else nReturn=GetExpValue(t, csym[0]);3 c& _$ p6 [& S% t
return nERR==-1?1:0;
% J9 r2 q+ J J0 v- W; O}}
8 E; A3 ~( n" w3 j+ [
/ j0 b. F9 A5 S2 n0 g1 u* G+ @+ Z8 h' }8 U* ^ Q' K
4 T7 Z" A1 K Q& n函数模板使用示例:
8 A9 P# {/ ~% D$ |# n5 ?在以上那段代码的后面加上以下代码:
. L- @# ?3 k$ c9 Y" _7 Z/ {4 o- ~8 q' N
' W z/ U/ }4 R1 h- k7 Y3 o( |
1 g3 o; Q. \; t2 i3 Q
程序代码:
, a5 c1 [9 Z, K' c. \- i$ s: J6 M8 v; s& x4 ~
#include<strstream>
5 n. @6 @ P9 K( q; Y#include<iostream>
" [& J, E/ D ]$ `7 u% H#include<string>/ V# ^# D1 `* L# Y% X/ K& ?
using namespace std;+ U) c9 l2 }1 E2 } M$ p
int main(void)
5 P/ k) k/ B* T+ D/ z' L{
9 {+ I+ H0 C1 L0 j3 G string s1;
- r9 L+ M. F: _3 k while(cin>>s1)
% E" [' h3 Q; k% y5 J {* y- X/ L$ b, V! t! R+ w
istrstream isin(s1.data());# J6 Q$ n0 V* `) \5 p9 t g
double d;. O. P8 e1 c; @; R$ k5 m8 _- E
if(fy_Exp::GetExpValue(isin, d))
% Z' @- D) v5 s: D* G# a. l [6 ? {0 Z6 U1 U' H5 E; I$ ~* I
cout<<d<<endl;
) y0 a- V" ?5 m, @6 v/ B }9 G2 G, k9 O# W) a" C
else9 T% Q' T+ t$ J9 ^
{2 R" e) c k6 N
cout<<"ERROR"<<endl;
9 I0 l0 f' m! e: a }
/ X4 X5 D- w' }, T7 U }$ Y0 ? ?. E9 z: U
return 0;* r+ m7 J6 P6 l7 {' f! O
}2 C& @+ J$ j' k; t c! {. h. F* M
6 w* ]# E# u& ?) A( P$ d) c, s1 O7 a$ [( O2 f
然后编译执行就可以了(*^_^*)
3 n Z% N) V1 A( m+ x6 V8 h: u其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ o A% k# n9 D# C9 i
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|