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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
9 f5 E |2 {. p2 d" `3 j一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% y% L* s& b" n: c) D只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 U+ d$ u1 r/ m
参数解释:
7 b, l3 K# C1 Fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% h6 q- V" A9 b F& j: i+ z0 } v+ Y. A
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 n$ M/ k4 T9 {& ]# T7 |8 S* c3 W
返回值:- i ~. `5 } t% J$ c8 W
返回非0表示计算成功,0表示计算失败有错误; |! o I' E' T% P# v# r
- G5 x; k/ S) H4 @) c2 R
' ]8 |- F7 A, J$ B! u! `
+ t; s- y& L+ a- [/ u. W% v- Q程序代码:
( \+ J: r7 z9 n) e! v: e6 [) i4 G, j: a
namespace fy_Exp{
. W. d- F+ |6 }5 Pnamespace {template <class _T>
0 V$ q& Q/ W5 L% b: {+ U4 C+ ~inline _T GetExpValue(_T t[], char& csym){
: E. e1 M2 F9 {! s: ~$ `1 D8 I char c=csym; csym=0;
/ y& _; {, R9 B% e% z; j/ }" k switch(c){
3 Z, A3 {" g& [" k# `0 m. q case '+':return t[0] += t[1];2 Y4 a# B- z, J+ f: n: _' }
case '-':return t[0] -= t[1];
8 H: V* G* ?1 V! [( X6 Y9 n case '*':return t[0] *= t[1];1 B+ p3 I6 I# C8 j2 m% s
default: return t[0] /= t[1];//case '/':
6 T; s2 a" D8 h( Q* R& q5 O6 p9 R }, J7 x3 k% n6 X- \0 [! c: o
}}/ l V! F. d0 f
template <class _T, class _Tstream>8 q3 d7 Z/ p/ P% C, l, |& K
/* _Tstream: inputstream, _T: get return value
9 x+ P5 ~9 ?% S* Return nonzero if get value successfully */
- K8 a* z- c; b# q: Cint GetExpValue(_Tstream& istrin, _T& nReturn){
2 o9 w" J* {& \+ X/ y _T t[3] = {0}; //雨中飞燕之作
8 P1 ^- u1 p0 A# y/ ]3 }' F char csym[3] = "++";$ w7 s$ \/ K2 M( _' S/ W
int nLevel = 1, nERR = 0;
+ k: r8 u8 f/ P; x& \7 [, Q% | if(!(istrin>>t[1]))istrin.clear();; {' w! ?, I5 s) E6 s' t4 y8 a
for(;;){3 o% x6 I0 r. z+ b) V! z
if(istrin>>csym[2]){
# Q+ y2 [; P1 P- u; Q/ k switch(csym[2]){
) K& F2 h# \" p, |0 b! P' G case '(':2 M5 m+ H) p: [! V/ D7 K# u
if(!csym[1]){nLevel=0x100; nERR=1;}else; s# R6 l: N- J7 ~$ S6 C/ E
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% V3 }: f% I: @ V+ f6 W3 f
else{nLevel=0x100; nERR=1;}0 P$ a `' F0 _5 N
break;
6 E# |4 ]4 y2 X5 U: V( S% |' B' j case ')':
9 K" ^6 M# t- Q: F! T {nLevel = 0x100;}break;
0 |8 ?- \: L; V3 ^ m8 D. x( j case '+':case '-':case '*':case '/':
0 S. U2 v2 B% [ {csym[nLevel++] = csym[2];}break;
* m% Z. H/ h1 V' f case ' ':case '\r':case '\n':case '\t':continue;/ p, J* Z$ w( T9 c( H% U ?
default:
3 \! P+ i% w4 i; d {nLevel=0x100; nERR=1;}3 z" F' y8 j4 E# \$ ?! H. \' `
}* N% [9 L) N4 ^* M, p
if(nLevel==0x100)break;+ d4 X G: o5 \3 v* L5 y
if(nLevel&0x10 || istrin>>t[2]){
3 L: U _9 K# Q3 b- [% ]7 b: S# Z! x nLevel &= 0xF;# \, p7 F6 x. r9 h
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. X: ]3 p. Q; F$ a/ ?, [
if(csym[1]=='*'||csym[1]=='/'){
9 G1 V9 {4 N J( j; x. j GetExpValue(t+1, csym[1]);* W: t4 H: e0 X, E* A) _! i( ^, @
}
7 U% I# ^( T1 m; y5 _7 I else{
9 z, z( y2 J# s' K( I- x0 x GetExpValue(t, csym[0]);4 l* r( f u* E
t[1]=t[2];csym[0]=csym[1];csym[1]=0;* q+ s: w+ D( |- O
}5 b9 O5 B/ ?+ k5 w6 P: \
nLevel = 1;8 K" @1 }7 y/ W% Q
}' @ {3 G4 v( ?& L
else istrin.clear();
; S' {: G+ U% H- v' R' l3 g" \! L/ j }
3 T7 r- y; u) n, v( x% Z else{nERR = -1; break;}& Z+ }6 [- J: j9 @
}
6 z/ P0 s. L3 x* X if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
3 q, Q `2 O) l0 E2 f( A% { else nReturn=GetExpValue(t, csym[0]);
+ F* Q" c- T& k- }) e( p' L1 c return nERR==-1?1:0;# |% Z* M8 ?7 |& u S0 I
}}
1 d3 \# h9 U: P) ] m! d3 G$ x
8 r/ x1 _& A: ?% s" k4 _+ F0 l% q4 Z+ | g
! _8 k# p/ z* n+ N
函数模板使用示例:$ A) R, B+ A( k( t' D8 o. _
在以上那段代码的后面加上以下代码:. g, y) @# @! o# m; }, v
: X- M2 E, h4 r" S5 Z/ C
2 T, w( x D7 c
' G1 J0 E0 O5 B+ ~3 j4 Y9 | W程序代码: 6 c$ u% d5 f& d1 H G
8 m4 x( ]" [! z- i+ Y7 Q4 w/ L# C#include<strstream>) j6 e [/ }% x9 L* s4 Y
#include<iostream>* r0 B) E' P" D; p% c. }( {* P
#include<string>
1 ]$ q1 s4 f4 t' yusing namespace std;( _# s' W1 R5 }
int main(void)
+ s( x! x: @; A, H |+ f{
3 x0 @: z" H: J: O6 K: q string s1;1 {" Y' ?2 v; V' E4 F: Z m
while(cin>>s1)
" S p8 ?# ^8 [6 V9 p {
9 Q: X4 R* R& d) i istrstream isin(s1.data());2 J# |, N' h5 @3 J; N
double d;
; Y7 q/ `) U, N! B8 ]/ s if(fy_Exp::GetExpValue(isin, d))
' y# o6 ~/ Y! Y4 X- o1 d- ~ {
) e2 ]' c. w* p& E4 e$ U& P cout<<d<<endl;& S" [. V0 K* P2 J
}
% A1 c- f6 ~' E6 ?5 T/ _ else# ]2 u: F- l0 x+ i
{
; J- V' T6 } a8 {3 Z cout<<"ERROR"<<endl;, M2 B7 T# [5 a! W* i3 n# G
}
% |! U x7 `: i4 m0 ]0 U }, T: p- m/ \, h8 C9 ]6 g
return 0;
- h1 y" S9 }: ]}) W B8 ~+ Q2 o1 m9 x/ j& F
) m1 Q& i8 S" o7 q6 O% k2 o
% |# L Z' W# ?: D4 H5 G然后编译执行就可以了(*^_^*)
9 j, W+ p5 } |1 h0 a. A其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& _: L! U$ T' T9 |0 e! ], b 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|