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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,- R6 [! k" ]$ y$ I& n
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- w, [# t5 N* A5 ?$ K* }" k
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- K: y2 C5 e7 L& h参数解释: C# X, v: G z5 ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 o8 `6 s6 S8 H1 Y& c0 A' Y2 X
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- @3 I1 X& Z e- @5 {返回值:
8 I* R" w6 O4 ?. g返回非0表示计算成功,0表示计算失败有错误% T' \" W/ z& `! V* O
2 l$ s8 Z6 u- J& c- }* \
: q$ ?: j3 i4 i1 w% F1 q# j
& G- P4 v, l- |: o7 e6 C$ J
程序代码:
7 g/ P0 r# `) p* g- ]1 T- B9 ?! z* e$ b5 `5 g
namespace fy_Exp{
3 E: `" M7 j+ @1 M8 e6 S) n+ s+ Qnamespace {template <class _T>. i3 n' T8 @+ c2 t1 j/ H
inline _T GetExpValue(_T t[], char& csym){" \ d( h7 }2 a R% A' k
char c=csym; csym=0;( V e1 _( J1 J- G- d6 k
switch(c){
5 b. c/ J1 }( A& U! f: R' m; g$ _ case '+':return t[0] += t[1]; T! h$ x, @7 ]% v
case '-':return t[0] -= t[1];
2 n7 B8 {! v0 ~2 l, x8 I case '*':return t[0] *= t[1];. J0 D; r) f+ w8 f0 l; D
default: return t[0] /= t[1];//case '/':. U& P" y# y f3 ^$ S P. a( K J
}
6 @* ~ U3 S$ j. D& D}}1 m' f/ L4 X9 f) T4 d: e* v5 b
template <class _T, class _Tstream> N/ F2 _/ u; g! Y* z; \ K$ t* ~
/* _Tstream: inputstream, _T: get return value
( W; R9 Y1 Q- L; R5 e8 n* Return nonzero if get value successfully */
; B6 r! S% D: h7 Dint GetExpValue(_Tstream& istrin, _T& nReturn){9 f7 ~3 S7 C) L) n% _2 M: S
_T t[3] = {0}; //雨中飞燕之作: T! K6 j) C2 T9 n
char csym[3] = "++";
; S$ P% Z/ a' ]* p- i9 L8 n1 I# o( ` int nLevel = 1, nERR = 0;) [4 k* ]3 c% y" w! X4 [6 |5 B
if(!(istrin>>t[1]))istrin.clear();
! d# M9 b# A. R- B/ a for(;;){
5 U( z9 c2 f5 P1 ~! l1 D& v if(istrin>>csym[2]){
" C" X2 t4 F1 A4 o4 k' _6 I switch(csym[2]){
! ~- t- R) H$ I8 l' q$ r# @8 O, w case '(':
[$ Y2 s/ _9 {" T if(!csym[1]){nLevel=0x100; nERR=1;}else
4 |4 v1 y V3 r7 h$ z if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 F" j" u! Y. O; v
else{nLevel=0x100; nERR=1;}. D w2 k+ z; c- S7 T9 h2 _- l1 _; \9 B
break;
; |2 R6 D9 b; m5 W% G, D case ')':
" D Z& @5 |. H! r: C$ O {nLevel = 0x100;}break;3 F5 u0 P0 C' H3 I! [' \' G
case '+':case '-':case '*':case '/':
Y1 ~1 v* b7 [0 j+ t {csym[nLevel++] = csym[2];}break;
" S/ x% l1 W* b- G! r& K case ' ':case '\r':case '\n':case '\t':continue;, B* c/ C! d* ]" s! Z0 ?
default:9 _0 o( p( e9 N5 ~3 ]& X1 N
{nLevel=0x100; nERR=1;}
2 y4 j7 z) e: y f# C% F7 O u, e }+ |) B. p* b+ g
if(nLevel==0x100)break;6 y: x {9 K# [" C9 g$ A+ D
if(nLevel&0x10 || istrin>>t[2]){
* O3 B$ \ c+ C6 N$ }; W" J9 b nLevel &= 0xF;
9 n+ l ]" P2 E- h% K; w if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 a2 ~$ ^3 }- Y B) n$ x8 N, ^; T) r
if(csym[1]=='*'||csym[1]=='/'){% [! n( k% z% r f$ L8 V" b" V# M
GetExpValue(t+1, csym[1]);- w- ]# D4 K8 S; z) g& y
}& Y3 m8 m% ]% }' q" X& g. B; K
else{
$ J3 C$ z" A2 `! U4 v0 r' v GetExpValue(t, csym[0]);+ b/ S1 h2 r" a/ W
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ B9 q8 W, t8 P6 B6 B) I }
" m; r6 C' o8 D8 B* B nLevel = 1;
8 ^: m7 O; G4 } b& x }* T, F! S4 ?% u; G6 l7 z& u" `: Q
else istrin.clear();5 f8 o) J. N( R+ i# h9 U
}
( t) z+ k, {; o5 X- B# J( H else{nERR = -1; break;}
/ O I3 }: |% M5 H5 R }/ i, h f" L) m* O; B q* f
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 E$ ^ w) e+ x/ J% F# t$ Z else nReturn=GetExpValue(t, csym[0]);/ ~! S% u/ q; _* Y. Z% ~3 P2 U
return nERR==-1?1:0;4 x8 M4 D, ^4 U1 Q" N4 K2 L
}}
% e+ {" _' a, t0 {! L2 Y5 Z* V; X2 Z/ u; \+ P
8 ?; s" I1 B! o. N3 `
) U+ V! W5 f0 d. v( L& m2 {" {4 q- t% Q9 [函数模板使用示例:3 y8 s$ o* k! t" z$ e0 |4 D
在以上那段代码的后面加上以下代码:/ l; L- R8 J6 Y4 F p1 ]% V
) D6 k) t/ C8 z; l" X2 q
7 K6 F( D" B/ `) Z; Q5 x8 o1 W1 l
! L, L' O5 z) s; I# h% [程序代码: 7 r0 p( v) h! h
2 y/ A. f. H; U! v. s$ s+ l
#include<strstream>* @& v( [- o: h- @; h( h R2 e6 N6 d
#include<iostream>
0 S1 p6 \% R7 W$ ]0 ^* J#include<string>+ n: `9 f1 a8 C" k4 p
using namespace std;: S% q5 z7 J; F2 _
int main(void)
# u1 d* h5 t; j$ @5 u, q5 o( _1 P{
6 Q- V# q8 v# _( }, @! f string s1;
; y# K" i' Z& l% o while(cin>>s1)
- _9 Y% m. o6 j) a) l% q- j. Q {
; ?( ]4 L) S, |& N% w/ ] istrstream isin(s1.data());
) f6 X* s7 m2 K- G) d& o double d;7 C1 v+ L5 @2 T8 A
if(fy_Exp::GetExpValue(isin, d))
" a( |; }6 P6 t9 F0 `0 Q7 {+ t {: C0 U/ o6 ]9 F! u- y3 G" u
cout<<d<<endl;
" Z9 n3 W; g& T: J }
0 G6 }' ~ T, \ else3 z% ~, B8 b! P! `
{
?) C3 @6 T& ?" W6 t cout<<"ERROR"<<endl;
; o( v' L- s' H* J" N3 b2 j }% j- u" H5 F, ]3 G8 j8 X! S. z6 c
}% W) T# j) T' {
return 0;/ v, K+ z5 x! C F/ {% t
}
" n1 c! W* E/ y+ {: u: A& _$ ^1 ?# ^5 \1 Q& h+ A
( m/ S" x5 U" x6 h
然后编译执行就可以了(*^_^*)
) O1 `2 ]: E4 n1 k& [其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( J- Y. f5 }0 g& b 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|