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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,2 r; [+ ~! Q0 x9 r& o/ x
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
$ X% e7 `: u. i3 [8 o! ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! m+ k# E* {' g: j9 D2 {& E% m参数解释:
; x# S. z% V4 [. G* ]/ s' z. Oistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% R7 R$ v2 Z4 d# s
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定9 O# T! s. k _5 j* k( P1 Y9 E' N
返回值:6 J% K. y- P7 Z7 p/ k+ R" m9 ^9 O
返回非0表示计算成功,0表示计算失败有错误% n( b. u$ g- D
# n7 Z0 i8 y! s+ E& t1 u: I ' D6 z/ T0 l/ X1 S+ q( m/ d
- z0 m* U' L+ C1 k8 R8 {0 W程序代码:
1 S K7 C/ T" z: ]" x' o8 y7 j$ ^7 H5 d: a
namespace fy_Exp{
3 M& V/ |' u: h0 e- _namespace {template <class _T>
/ `; A! e; S z! Y- h: o* J+ Z2 Rinline _T GetExpValue(_T t[], char& csym){
{+ `, s. B7 b F g+ F char c=csym; csym=0;
2 Y$ w3 ^9 E% {1 a: x% r switch(c){
# f) q4 ]$ k; p case '+':return t[0] += t[1];9 N- m! l! X0 }. G
case '-':return t[0] -= t[1];5 B" d" L. r: \% b5 \% o( k
case '*':return t[0] *= t[1];
k: R6 i9 s$ |/ J! E4 `4 ~ default: return t[0] /= t[1];//case '/': K( w1 l( _7 d$ ^
}$ |6 O ^ |4 G* y
}}) l3 f/ Y- g8 Q1 ?. Y, A
template <class _T, class _Tstream>
2 m$ A5 g, k8 V9 Y! T& e/* _Tstream: inputstream, _T: get return value1 a. [+ y; {7 E- ?1 ]
* Return nonzero if get value successfully */. H* T& p J _/ ^5 A" M4 v5 `
int GetExpValue(_Tstream& istrin, _T& nReturn){
6 X: M; G9 u- t& { _T t[3] = {0}; //雨中飞燕之作+ J. m5 P6 a8 N8 d" O% Z: M
char csym[3] = "++";
0 ` i0 Q% f% L0 y7 A% N int nLevel = 1, nERR = 0;- t% p1 Y; y) o0 l
if(!(istrin>>t[1]))istrin.clear();$ d3 h. ~& U( C0 f: y
for(;;){
9 X/ s" j$ I4 L if(istrin>>csym[2]){
* L$ i6 Y. h9 R0 u5 E switch(csym[2]){
3 ~7 @* g7 g* E- I) [) O( O& B case '(':
- l8 B+ }! _. {/ k6 d2 k! S# x if(!csym[1]){nLevel=0x100; nERR=1;}else$ f1 n& x! D: f$ Y7 J* q
if(!GetExpValue(istrin, t[2]))nLevel|=0x10; i F B! d: h* ^
else{nLevel=0x100; nERR=1;}
1 {) J/ q: V. h* O# j break;
' v( ^! S$ X: {/ F% S2 H1 ]" _ case ')':
$ u0 Y5 @' f& } M8 Q: {8 F8 O9 b {nLevel = 0x100;}break;
4 V1 n. B% D/ A3 w case '+':case '-':case '*':case '/':
2 ~- L+ M2 C9 |; x {csym[nLevel++] = csym[2];}break;: ~& \$ h' w2 H
case ' ':case '\r':case '\n':case '\t':continue;' h& ]5 j( S r5 B$ l
default:
! C/ ^. l# J; s# p$ }4 k) P2 z {nLevel=0x100; nERR=1;}/ _. {2 l$ p3 \* m! i
}5 {8 M1 L7 N2 Q8 e4 ]* S. B
if(nLevel==0x100)break;* l" a3 c' d% `. u* V% I
if(nLevel&0x10 || istrin>>t[2]){- A/ A3 w9 ]* c8 F: V: D" f) W2 P
nLevel &= 0xF;! Q* k- ^1 ~7 k
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ H J/ W0 @# {+ i! G0 F/ i0 O, h
if(csym[1]=='*'||csym[1]=='/'){
8 `. r" `) s9 V GetExpValue(t+1, csym[1]);
# L. H8 X9 B, U/ N! @5 i: m/ A }
" H; o& P6 w1 `! A! y else{3 U, n% C; w+ x" g& ]4 }& T* }; \
GetExpValue(t, csym[0]);" j; Z1 U6 s; W. ~
t[1]=t[2];csym[0]=csym[1];csym[1]=0;" ]1 {, I j0 p: e% F2 b
}
# [' K9 }7 x4 `1 `7 Q' ^& v1 v nLevel = 1;
- s0 T+ J' f" I }0 v* O }7 n+ J9 \' T5 S& |& d+ T) U9 \
else istrin.clear();
6 Q" K, M; u; F9 b }
2 F6 a# a7 x' _ else{nERR = -1; break;}
' W C W( F2 Y }
6 u8 C4 M8 a' j& ]3 Y3 Z X if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]); V7 T$ o3 |' T; h. L. L
else nReturn=GetExpValue(t, csym[0]);
+ k. C5 q- E& \9 e) j p, t( S return nERR==-1?1:0;
3 l, R8 |% X0 O}}
6 N- M) D3 G' E3 h8 e
, i5 |& Z6 B5 @5 g& j8 d
3 K+ F. g+ n! M3 J1 Q c5 k. d2 G: p" y( k" `2 }. x
函数模板使用示例:
* z- D* P! e- Q# h2 F在以上那段代码的后面加上以下代码:
" Z) t8 L/ |- x5 m. @3 R. O3 v
" t; `: f' @- m- c; \* C# x
% ^( }" `% e5 P- q/ s
: @" H: E7 L- U1 Y Z3 c7 C程序代码: " A) T. m: o* M8 W- r3 f3 f3 R
. E3 K4 c8 x) G
#include<strstream>
) H' y, e) }% v' t7 v( J#include<iostream>
& f: u# Q" k8 @# d* {#include<string>
% ^: j3 m+ C. J0 Xusing namespace std;
; m, q4 P: A3 t3 D/ Tint main(void)
% L0 x- Q7 u' j! p; `# U4 k" c* b! A{- D/ X- i) E0 W
string s1;
/ O! |/ y& M, h( A+ C$ ~7 a6 K while(cin>>s1)( s$ A0 x0 r- z' M: r
{3 O, z( i5 t2 ~- h2 L7 D: y# Q9 \
istrstream isin(s1.data());
6 a# j, _8 a! B7 h8 ^ double d;
4 _9 |" }- j" N! ^9 v( }' G+ m if(fy_Exp::GetExpValue(isin, d)); j- I9 q! X0 K1 h
{
$ n1 X0 J: q+ Y# n. e# J2 U' y9 P cout<<d<<endl;
8 ?6 C; R1 r5 J& b9 c4 v' ?4 h }. `) E/ S; F0 |! Q& A
else) x, m8 {0 Z# a& k Q
{
0 f$ u9 d2 ?' s+ d cout<<"ERROR"<<endl;$ L# N5 C) M' `4 D3 R, U* q
}$ d8 N$ a3 I, p& i7 b5 V
}
: E7 p) L& P" B& T) |& n: u return 0;' h2 y& E s7 C
}4 ?3 A# k2 ~% H2 q
8 P5 J! ^- T% b+ C2 U* a% l
2 }5 H+ v, o; F" @
然后编译执行就可以了(*^_^*)
3 \- }, {5 S9 l j3 |( W其它:TC++上一定编译错误,不保证在VC6上也能通过编译
' A$ E0 Q4 }/ w ^* I: Q$ E 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|