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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的, s3 k; `# j, K: D [
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' b; G+ d' L& e只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
; F; u: ^! ?) F3 M* _: X参数解释:
5 ], X, o; I) \5 Oistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
/ _; a5 w, A8 y. ~( r) ynReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 n' c! w9 |9 ]2 X
返回值:" ^+ Q+ M1 f- j5 R2 D% |! V; j
返回非0表示计算成功,0表示计算失败有错误
7 ^- Q3 p3 e+ L" e
1 c8 b4 C5 {* o: l- b& W5 h
6 k: U+ t" J( ^2 D8 M c+ l
7 \! v/ ^- `% ]( e7 d$ b) w程序代码:
' F& s5 \( J& e% {6 `9 U
6 X9 }7 b# J5 B O) Dnamespace fy_Exp{( u+ Z1 x8 l6 q" z9 x
namespace {template <class _T>8 m g+ i Z. C( j
inline _T GetExpValue(_T t[], char& csym){
- G7 E; P4 u. g3 f5 V% z. C char c=csym; csym=0;
8 Z' A! D* i/ c+ I: a, K switch(c){8 w/ ]( ?: E" P* a6 i4 [: g7 a5 ~
case '+':return t[0] += t[1];: g/ h% h; o0 J# C
case '-':return t[0] -= t[1];
; s* l& H' p& p# M; g case '*':return t[0] *= t[1];# ^( }* {0 s4 Z
default: return t[0] /= t[1];//case '/':
5 N! V6 P7 k* @% H } {0 v2 e7 e A2 D
}}4 o9 c$ ]# E) [5 i/ A( t
template <class _T, class _Tstream>! ?8 D. R5 P9 {# z4 L0 W
/* _Tstream: inputstream, _T: get return value: d* [+ X, \1 T8 i
* Return nonzero if get value successfully */2 l- R2 {1 ~, A4 U
int GetExpValue(_Tstream& istrin, _T& nReturn){. \$ k, o3 E8 Q! b3 S1 e
_T t[3] = {0}; //雨中飞燕之作
3 {& _ g& z& K* P! j2 p. j char csym[3] = "++";
* a/ c) H. ~1 h7 j3 z! U: _ int nLevel = 1, nERR = 0;
; p+ e' R( y+ |' l2 H, m! E! h if(!(istrin>>t[1]))istrin.clear();, r# I0 g3 i% o( s6 s2 d
for(;;){" G% Z/ r7 s2 n9 C* o. s
if(istrin>>csym[2]){: n! u& j# x. o! z- v' E
switch(csym[2]){* a% L, L5 r7 e5 m) I! j$ e+ \
case '(':" s7 G% D5 g7 \2 c+ n6 B2 v& Z
if(!csym[1]){nLevel=0x100; nERR=1;}else
O4 a- R2 P! F, l3 V r if(!GetExpValue(istrin, t[2]))nLevel|=0x10;4 V' t: s* X' C6 g2 b
else{nLevel=0x100; nERR=1;}8 S" B6 i, O2 Z' \0 Y
break;3 C4 y" Q% @! V# m1 }3 |9 {
case ')':
# q0 u5 s( J& U. ^) w {nLevel = 0x100;}break;
$ Y# t: c& M9 v% }* }7 S case '+':case '-':case '*':case '/':
( M, o7 P2 @/ p6 u4 ^5 f {csym[nLevel++] = csym[2];}break;9 H% u, I d J, Z# O
case ' ':case '\r':case '\n':case '\t':continue;
8 ^4 P& @# w& T: U' v default:1 h6 n7 S' N: w. F
{nLevel=0x100; nERR=1;}
9 z# F7 m8 f6 f/ A+ D }
a; S( z* y: |9 |4 G& v if(nLevel==0x100)break;
% l$ s8 |, Z7 A2 C if(nLevel&0x10 || istrin>>t[2]){ H$ o( e* a9 ~" e+ y6 I- v
nLevel &= 0xF;
* V- d" p% u/ @4 f j if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) m$ G0 Q* \/ z. M, C+ K9 s* b( K
if(csym[1]=='*'||csym[1]=='/'){
, g8 i, e: F5 _" u GetExpValue(t+1, csym[1]);# H* z; Z% U! Z
}- X' J# t* ]! s- S7 ]
else{
1 O+ l% {$ |0 G7 ?2 H# W# g. P$ w1 P GetExpValue(t, csym[0]);& [4 |: y& E K; ~
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
2 S3 c1 d4 M7 d5 w1 v }
' V5 h2 a2 q' a% K; Y nLevel = 1;1 H" b- I6 ?3 c. y ?6 K
}
% V0 M. u% Z* p) A4 q else istrin.clear();! i5 j5 V4 `+ n
}8 H+ K/ \* g! p
else{nERR = -1; break;}' t# k6 C/ q x
}
" O& a# `4 {* X( d) E" o if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 l/ j* b: ^# v% L
else nReturn=GetExpValue(t, csym[0]);9 m( j0 M# ^% ^8 o8 j4 P& O
return nERR==-1?1:0;
& [8 K, {8 G: d5 @}}7 [" b/ j |) J# ^4 G! ^) K
8 p1 N) ~0 v! \* \( G+ J* @
- H, D/ b' b4 W* z4 B$ h& c, S( u7 U# Y0 E
函数模板使用示例:5 O3 D" v/ U+ O* S0 M9 c( K. ?
在以上那段代码的后面加上以下代码:! @7 ?! y9 `/ e9 ^* P: Q9 L
( o: S5 c) y: V4 Z1 \$ N
1 v2 e( F$ C4 U1 N6 {
5 X- S# e5 k) E: D, `$ Q程序代码: ' |4 T: ?8 d9 ?
2 H" O. ~; d, a! N. w4 ]
#include<strstream>
1 k3 p4 ?0 ?) p% r+ K H4 c. b#include<iostream>9 i# @+ Z' l- @" R' U" A) ?
#include<string>
- M& q3 H: n4 h( V, `' S/ vusing namespace std;0 I; C$ }' O! B$ o' V! m
int main(void)8 P4 w& N' X8 U" P3 f# S5 h
{6 j+ y2 g' u) \+ ?% C3 J
string s1;
2 W/ e: i" f7 F7 R while(cin>>s1)
5 M" [2 u5 |$ r {( Y* m7 N7 B- A) a3 b' `- ~1 k9 j! J
istrstream isin(s1.data());
& O' }' g" q* ^ double d;
& C4 `; k8 f3 D if(fy_Exp::GetExpValue(isin, d)); C" z3 m; A! Q7 _( ~$ g( W
{
+ _; L- w6 f6 g: B1 U7 T" ] x cout<<d<<endl;/ f& j8 H8 a6 o
}7 n0 }1 S- v0 L: ?5 R7 P
else
& L. n: D3 E7 A) W {
! d! a, w: s; }- g s0 L* a$ o; e cout<<"ERROR"<<endl;
: p8 n0 O0 X2 z g# \8 n( B } l# T1 g8 @. Y1 D
}6 v+ w' ?2 L2 L/ \
return 0;4 ?/ |8 D3 p: V8 k) C6 ]* J3 L
}
2 E J/ l9 w1 i! w M m5 |% x! s |/ {
6 {2 ~# [- w, X5 X b* l( Z5 Y, [4 O- o/ ~/ p" \6 ]. `% i& z
然后编译执行就可以了(*^_^*)
- [( V/ H( U! j9 M其它:TC++上一定编译错误,不保证在VC6上也能通过编译' V# Y. k4 H* s9 T1 \! F/ u% O
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|