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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
8 H- X# O" i" _* N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式: V2 I+ c& \/ Y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 R! H3 ?" w* ]& L参数解释:' \( m0 H% q2 p2 {& Q- s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 G( V7 q/ b! [. d* U, ~7 i
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 {" n0 g3 e H9 D0 r1 O9 a
返回值:5 c: {# J& X* g5 H$ {
返回非0表示计算成功,0表示计算失败有错误
, ~+ w9 U/ A7 ] U2 H
9 m- u8 T5 r7 V7 r/ o6 D, y: |
6 M4 N' D9 [, c3 x l) U2 r( P1 `/ Y2 \9 H" c& D ]" z: R
程序代码:
h# `" s4 D1 K2 O) ?5 p) `3 N) z" }" A) k% Z+ u) _8 K
namespace fy_Exp{/ V+ d0 b. I$ q
namespace {template <class _T>
9 F2 g+ u9 R& n }inline _T GetExpValue(_T t[], char& csym){
5 z' R5 b, u: Y/ G char c=csym; csym=0;6 H+ ~+ r! m: w* s' f& h
switch(c){
0 x* }' m, s' ?. F# I" Y2 z case '+':return t[0] += t[1];
# e9 w/ l" }% Q/ D& q9 c case '-':return t[0] -= t[1];
. j1 e; X8 c6 a K case '*':return t[0] *= t[1];2 A# K; L1 ~5 D: W8 ]
default: return t[0] /= t[1];//case '/':
& F' _0 ]6 h) h8 g, ~6 h }! _7 v) `$ t7 A( G( G$ e1 [ _
}}
/ b9 L* W( e* C9 Ptemplate <class _T, class _Tstream>0 T+ R% Z# t6 I, w" g" A. {, ?
/* _Tstream: inputstream, _T: get return value! X3 m; f' X/ V
* Return nonzero if get value successfully */5 T6 l: f, S% B. r
int GetExpValue(_Tstream& istrin, _T& nReturn){0 K8 {& k2 w* w) u
_T t[3] = {0}; //雨中飞燕之作 l# ?9 ^& L8 S6 M( Z
char csym[3] = "++";
8 L3 W* n! X0 n9 H" V# w1 N int nLevel = 1, nERR = 0;/ p' c. z. W. I# {% I* ~" c
if(!(istrin>>t[1]))istrin.clear();" E- i! b; m0 I6 M' P# V) P
for(;;){
9 M, u& K% f2 e if(istrin>>csym[2]){7 m1 F) C, }# N
switch(csym[2]){
' }( i: ^! s" z6 Z( ?* b( T case '(':. t+ G. O' c: Z
if(!csym[1]){nLevel=0x100; nERR=1;}else
0 b* P/ R' }" { w: m- ] if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. ?! M3 l9 y/ I) z8 T, R else{nLevel=0x100; nERR=1;}
# B" J( p& r4 Q' N) F" K+ T/ L3 o break;. M$ [6 M+ \9 `& H' t A! q
case ')':
; t1 ^6 ~$ f- F6 s6 e& x8 D3 D {nLevel = 0x100;}break;
0 s$ j% t8 C8 c, c. D8 @ case '+':case '-':case '*':case '/':
/ ], [; @) |% U {csym[nLevel++] = csym[2];}break;
) o4 L3 `5 L9 a l' u3 @% @% _ case ' ':case '\r':case '\n':case '\t':continue;
' p. \4 T' @' b5 D* L ^ default:
) o9 R4 y2 [6 C5 V+ ^9 g {nLevel=0x100; nERR=1;}6 J! v+ O: p6 E/ H
}
5 M+ d1 Q0 t6 ?3 H if(nLevel==0x100)break;) @; T3 z' f. I
if(nLevel&0x10 || istrin>>t[2]){5 |0 i) e1 I- V2 o' s
nLevel &= 0xF;
2 u) L4 T1 V. @ F if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, C& }5 M" f' a: y
if(csym[1]=='*'||csym[1]=='/'){0 U& q. q" ~& b6 @/ H2 o0 C
GetExpValue(t+1, csym[1]);( G5 t, W% L5 C6 k: _! ~
}! E. W5 E7 I, @# d& Q; ^# L4 h
else{
; L- v* U+ X( _ GetExpValue(t, csym[0]);
2 N: l6 F v2 r2 H/ k t[1]=t[2];csym[0]=csym[1];csym[1]=0;* Q& A: E0 B5 F2 b( p
}
+ B& [. X8 c' {8 p9 E nLevel = 1;& o" u! d+ U3 ^0 g9 Y2 b* `' X+ u+ p
}2 j. a" H0 q7 V; o
else istrin.clear();
+ m- d" S9 i8 P& n7 e: v }$ E3 B4 u1 J9 i* }
else{nERR = -1; break;}
( ?. r# l/ n* V' u: j C# Y2 Y }8 P* {& {! m( B" g* k4 r% B4 R9 c
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]); C' F, ]" I* H
else nReturn=GetExpValue(t, csym[0]);
& g ]- A: @8 i: H# G6 p9 X return nERR==-1?1:0; ^4 y% u& Y. R, N; a# @: y
}}& v& o0 _3 S X3 z' M: X+ b* ^
5 h2 u1 C7 q! |/ v. T( x- z
K/ R; h) S3 _0 T& @% v5 A! _3 h9 d; ]8 S
函数模板使用示例:
+ W6 [0 D! T; y7 p# m* X在以上那段代码的后面加上以下代码:
" ~' c* l" f% D* B- [1 M3 W( t- d7 W0 N% `& h6 S
0 U n: B1 }) P3 a- b# G
( E& L: K# [) F% a* b% b" j; P程序代码:
' J+ n" [3 ~* g6 n- s9 {4 K5 E* Y4 J6 D; A- t( F
#include<strstream>& o9 O4 J3 }5 c) C; V* z) e
#include<iostream>
3 Y1 Q' p$ f+ Y* _& t#include<string>, Z4 e9 H1 T% Z7 M4 g( J
using namespace std;
% z! j9 Y4 B/ o- Vint main(void)- T6 [1 w& k/ v) i5 W" Q- y, G3 i* i& Q
{
0 p$ Z4 w" a4 h! p& W string s1;0 }5 L% d: d: _% t7 {4 x L- m
while(cin>>s1), m5 z/ W6 R- ^ W& t
{
6 \* g8 d8 p( } istrstream isin(s1.data());
5 b( f- z1 @( ~% u double d;
, r5 \3 V# M6 f' \7 M- r( V if(fy_Exp::GetExpValue(isin, d))
5 ^5 v, H9 |( k8 V/ O) e3 a {5 }+ }6 p# i8 Q, d
cout<<d<<endl;/ G3 }& R& k' `0 r
}
6 T8 b- G! E* x3 }8 n4 w* K else
- S2 @( {: r. i, X8 _7 @$ i {
+ `2 m) U" D' k# }' W cout<<"ERROR"<<endl;
, p" t" u6 @1 v, M" C \! t4 Z }% _. U; V( i) n* l8 P- f5 h. ^
}
& G/ u4 Z& A3 s7 ?- ^3 S$ B/ V! Z return 0;
4 D( S/ f) N' E}
, m6 k' {& M" c, w. `
" Z2 |$ v6 ^; e4 n( ~
2 B5 X! F7 `1 X$ B6 A+ I3 n& S然后编译执行就可以了(*^_^*)4 P3 R9 Y! B' b x
其它:TC++上一定编译错误,不保证在VC6上也能通过编译 `& r; ?# D# @2 v7 z4 K+ Y% ~
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|