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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
( X; ^5 m+ y, r' ?* j- D; q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 J4 g$ M' n9 I0 J# b( p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 M' i9 x/ C, H" B$ C! d+ U; s
参数解释:. l4 t, a0 Q6 Q$ ~1 N- Z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ C) ~0 R8 H; V$ O* R# w
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 g, _+ Z" g/ \. M/ r
返回值:4 L" u# _6 y) ~: H# W' Q
返回非0表示计算成功,0表示计算失败有错误
7 \6 ~2 f& N5 c6 `; u$ T4 I( s, a# `; \" P1 M0 b8 Q
! H j; ~& @+ q! w. T
( U$ G9 f; F) M8 f8 q
程序代码:
% C. y4 h1 C, }: ^3 o v, i, q9 _; V7 g8 X4 B$ b6 z5 B+ ~
namespace fy_Exp{' U0 |9 H6 v* }( c2 S* R$ a
namespace {template <class _T>
8 v# ]8 b, b4 ^9 oinline _T GetExpValue(_T t[], char& csym){
; A0 Y$ m! N' e; r6 B1 [ char c=csym; csym=0;( { t4 ~3 u/ P1 z
switch(c){% @7 s- [ ^6 L+ ~9 a3 i" d
case '+':return t[0] += t[1];
: u9 y, K/ |! y. v: y5 K! @0 S! c case '-':return t[0] -= t[1];# Z+ k$ X2 e, |( _% Q0 `
case '*':return t[0] *= t[1];% p& p, a. T& c0 p' {; E3 G" g, ~" n2 H
default: return t[0] /= t[1];//case '/':
) S& e# V8 h! r- }: \. C }
8 r+ o- {$ u% ?+ R}}* |3 n# a4 w) C2 @/ b3 i% g" b9 o% e e
template <class _T, class _Tstream>
' j1 F# b, B$ L: H, t! J8 O/* _Tstream: inputstream, _T: get return value
/ A" b/ l9 N- A3 i5 S6 k8 s: _* Return nonzero if get value successfully */
) X D$ e: u0 L3 F2 ]# Jint GetExpValue(_Tstream& istrin, _T& nReturn){
7 x; ?4 L5 ]2 |+ w$ Y* {& o9 L _T t[3] = {0}; //雨中飞燕之作( s0 ~" b, W7 p8 ~" g
char csym[3] = "++";7 c7 W, L( [7 ~$ g
int nLevel = 1, nERR = 0;
+ p3 e2 R- r. B) j9 \' K6 I if(!(istrin>>t[1]))istrin.clear();- |& p7 f) B0 Q: Q
for(;;){
/ q% v* F: w% v7 Z if(istrin>>csym[2]){
/ i" k( I3 _8 M- n7 }* E! l switch(csym[2]){
- o3 H3 L* g9 N% b case '(':
8 I0 w( I6 W5 e2 [$ q3 y4 i if(!csym[1]){nLevel=0x100; nERR=1;}else
& q' r# [- q c7 ~6 i if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) L" k/ H1 L* b$ Q9 U5 Q else{nLevel=0x100; nERR=1;}
) X: t2 s' u5 P' l: O+ T break;4 C' K7 ]6 d9 w9 J ], x, G: W6 u
case ')':
' ?- f" i' J6 D: ?9 t( V {nLevel = 0x100;}break;
+ J. S, o5 S9 Q* ^ case '+':case '-':case '*':case '/':- ^: `1 ]4 K( V6 P
{csym[nLevel++] = csym[2];}break;! m A* a2 A5 ?- L k8 y
case ' ':case '\r':case '\n':case '\t':continue;# X' U( C+ P, z" @* E8 k' c+ R! {; e
default:+ Z( k' e9 a: i
{nLevel=0x100; nERR=1;}
3 f, r( W4 L! s& e4 u( g }
3 s& k0 s" G/ D# O( P9 _ if(nLevel==0x100)break;7 z) A8 I D) I& u" K
if(nLevel&0x10 || istrin>>t[2]){
1 ]% T6 ?; }( i+ Q4 X8 Q( @ nLevel &= 0xF;9 M5 {: \& V- B4 c+ O% o9 E- z& d
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 B5 [. N1 p( N# [3 f. k
if(csym[1]=='*'||csym[1]=='/'){
; l/ \1 e) G& a% _ GetExpValue(t+1, csym[1]);
; q' `( I0 Q7 Q }
; e+ l7 n% W0 O$ I else{
, b/ {6 H+ o6 H GetExpValue(t, csym[0]);
" E& K# Z1 W% V. A+ a t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 V. B7 E* t) x4 N6 `
}! `0 Q2 ~/ v0 V% P
nLevel = 1;
/ T* v! o. b; z( z2 v, D. X }
2 A. ?2 C4 ]3 e1 @# q2 } else istrin.clear();
4 P0 A* F0 ^# @; R }
. R% y7 B9 b1 Z4 _; P, d% @ else{nERR = -1; break;}
- M `8 \: y7 k! R" `6 V0 t/ g }
8 G" p. P$ K* B" h& q5 ` if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 \8 S, M5 e9 d. p) {+ h+ M
else nReturn=GetExpValue(t, csym[0]);
3 r. f, [$ d2 N" v; E( G return nERR==-1?1:0;
p9 \3 S O/ H, F}}
! d3 X$ F7 R7 ]$ \2 |8 c% l0 B& V( P! k# v% L# A9 ?
2 z" c" ?1 C' Q0 f/ D. [8 h# T
m, D" i6 t0 g4 b8 W
函数模板使用示例:! R, \1 h6 ^5 _+ p
在以上那段代码的后面加上以下代码:
: U2 J) O; a6 c
& m& w, t" I. l- @; c 1 a e: v9 H; l/ g1 J' s
+ | {$ f, v& I2 g l7 x+ B程序代码: 5 Z) u( A7 J( R" V7 T6 V
/ r' f! \- P: ~#include<strstream>$ ]+ Q) b, }! W' S
#include<iostream>
; g: O. U( Y+ F; @& h$ I3 \#include<string>
5 T* v6 N$ i& L3 f7 |" Lusing namespace std;
7 T* E5 f% r# m6 e+ {int main(void)$ Y9 R# g& D, Y1 e3 j5 k0 c
{2 O: F. `, I7 J2 j! \( ^
string s1;
! v* Q& y- c8 f: C: W while(cin>>s1)
( m: O0 n6 }- G, a {
* Y1 @2 ~5 t5 f istrstream isin(s1.data());
" S S& f2 k/ x/ s. l) F3 N3 y b$ v double d;" g; N/ O" ?2 X( b, F
if(fy_Exp::GetExpValue(isin, d))
9 ?/ `' H) P5 w2 a. K# G! G3 X3 s {/ L! d# D" A1 M' I) ~
cout<<d<<endl;
) s9 k' S% o) a. z+ W, z. t& ? }, N$ g9 ?. \/ |1 a9 K6 }5 I
else
7 E! s% v# D9 @6 A {4 u! m6 o ~4 q% n0 U
cout<<"ERROR"<<endl;' T6 s; D5 z. f# C7 Q$ y
}" t& q" x- v2 c3 s t
}0 B9 h& t: i. M- s
return 0;
5 C9 m, n& D& @9 F" z$ N}
. O8 D8 n$ R+ [- u3 f
* Y' U! M n& }# x7 a, `, { M4 R" _; j1 x
然后编译执行就可以了(*^_^*)
& | M& C+ r, @7 M2 k: N其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* @/ |7 p7 I. c3 M9 B% U 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|