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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,, C$ ]6 d/ S* S J; A7 H% o
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; Y( l( p( z; |+ l& W! \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- O2 F1 G# ?6 x5 \1 P' l
参数解释:
& G. [0 ?, w0 b, T" Bistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( M: ^# Z% d; I
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
J) }! Y; k- I5 ]- |1 h返回值:6 Y _" a2 u, A; I! D' L
返回非0表示计算成功,0表示计算失败有错误0 Y; z2 k s R/ N+ ?1 k N5 \
, E# i/ F- u& b
: U& m7 F' k$ y1 w
* h E* e6 Q2 R5 t8 `+ X4 K
程序代码:
) O6 P1 ~- @9 M+ X" }4 F8 ~) a* L- b5 L' H! g; a2 a% z
namespace fy_Exp{* Y, ?* }1 C- T4 f+ [( H
namespace {template <class _T>
/ b7 ^3 R1 X2 R$ N/ A finline _T GetExpValue(_T t[], char& csym){& P4 I6 n' |$ i5 l- F2 `
char c=csym; csym=0;- e& ?/ h8 ~3 Q% F/ q
switch(c){
& z( T% Q) D3 ]. j S: H- c6 B9 l case '+':return t[0] += t[1];. M* K1 {8 I5 e
case '-':return t[0] -= t[1];. J' z/ W8 `4 f, {, S
case '*':return t[0] *= t[1];
( M" C9 m" V8 M+ k6 s, S default: return t[0] /= t[1];//case '/':; O/ X; k& r- J2 a
}* X& l: U1 ~9 z0 p! |/ _
}}8 P% L9 N7 J! Z$ [* e; n
template <class _T, class _Tstream>+ G2 P9 H, g/ a% h
/* _Tstream: inputstream, _T: get return value
( Z/ W, R/ b0 Y: h u* Return nonzero if get value successfully */
& `! @4 I T* P) fint GetExpValue(_Tstream& istrin, _T& nReturn){
2 ]5 c0 t4 S3 L5 n _T t[3] = {0}; //雨中飞燕之作
! r' l, \4 ]% ?9 D9 R! @7 { char csym[3] = "++";
' Q# L# t$ f% F) }& C! D/ I int nLevel = 1, nERR = 0;. I6 X. e2 B: H! o" ], } k
if(!(istrin>>t[1]))istrin.clear(); W3 W7 s/ m+ ?6 h* [+ a% g
for(;;){
" U+ }# l, E. A% b0 n: Y1 E if(istrin>>csym[2]){. ~ S! N- h- n$ `% @
switch(csym[2]){
p# ?/ v1 H' M" X; G* Q( Y8 e case '(':
9 D, a" A# O/ M! v! b if(!csym[1]){nLevel=0x100; nERR=1;}else
3 }; I5 y/ C7 V- y$ e. A2 G if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, v) s+ T' q3 ?: E* Q8 `1 X9 h( ?% R else{nLevel=0x100; nERR=1;}
& ^- T, m& F" P4 P break;
' [! Q1 t. x m: h$ K case ')':2 g" J7 m1 h& Q4 V- \. |; h
{nLevel = 0x100;}break;6 @4 r( j8 i$ B7 T# @
case '+':case '-':case '*':case '/':8 B' ~* N l. `0 |
{csym[nLevel++] = csym[2];}break;6 e9 x8 g2 P/ Y& w) g
case ' ':case '\r':case '\n':case '\t':continue;# F7 p8 A8 U9 [7 d' |
default:7 ?6 T% F6 M! I
{nLevel=0x100; nERR=1;}" R, q1 V: A& H$ C u% n6 Z+ j6 R
}
' z5 Y9 M" Q& ~( W8 [ if(nLevel==0x100)break;9 x/ L3 q. u9 |/ t; k' }' e
if(nLevel&0x10 || istrin>>t[2]){. R. @- u. s1 {, [0 A6 u
nLevel &= 0xF;5 m) K( l: @# T8 b; U; e& c
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}+ I- Q, }2 Z) Z* ?7 Z
if(csym[1]=='*'||csym[1]=='/'){
" n' T( Z. _7 j/ S$ T5 o0 K GetExpValue(t+1, csym[1]);' k0 i6 U% [! v
}5 T, T5 r" [+ H
else{
$ D+ c- ]' a- S) d8 f { GetExpValue(t, csym[0]); d2 `8 Z" h/ P0 d l+ N
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 Z( Q; w0 y2 b+ t& X }. m; \7 d% K. p, n" q0 B
nLevel = 1;) {) h& E' Y% w, e4 o8 }
}
: u# r0 | M$ F, P i$ S else istrin.clear();
8 \8 F' Q( e. { }
6 i9 o% c( K! O- [& P else{nERR = -1; break;}. p" f# z# R, {
}* Z, x$ `+ A: h, _0 f
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
) c1 |! s/ k$ E9 l1 u; P% I) ` else nReturn=GetExpValue(t, csym[0]);
; C2 j) ? Z) Y" ? return nERR==-1?1:0;
- V% m, v$ d2 }+ _}}0 t$ h ]. X' q
( e& f8 ?" y. q$ g
1 X% c5 j5 t- ?; K7 g5 T0 {" `& _4 h5 c3 n' E9 b
函数模板使用示例:
8 N1 P: f6 Y% c8 L0 H在以上那段代码的后面加上以下代码:
' r& N2 l) w' [* T# m G9 A) V7 [
) g8 r k2 b' s- d8 q9 R( O
6 I7 ?* J, a2 i* \程序代码:
5 j6 G6 \4 x- X; Q' x8 S5 R8 O3 Z u' Z: i; E8 q. d: T" u$ T9 Y9 `% c
#include<strstream> B0 [ F- e* [
#include<iostream>
: W0 c0 h5 j: v#include<string>
1 j3 m& y) m( g$ T9 Q9 {4 e7 Kusing namespace std;$ [# w* ~! }0 w1 A
int main(void)
2 m$ N6 B; Q+ N8 g( o' ?{7 [7 ^9 L- U) ]* n$ ~
string s1;! i: z& x- f+ y- s
while(cin>>s1)6 \# V V# |5 P+ X! `8 R
{
) |- o2 Q; O; a$ R* m istrstream isin(s1.data());
3 z# e3 T& l# N3 n% J( d double d;
- K( \- s0 C: w if(fy_Exp::GetExpValue(isin, d))
3 V( _7 e3 w% l2 z4 K/ Q" q y2 n {- k4 z) {1 M, ~* }
cout<<d<<endl;
; R2 c y( i0 J: |, i }
* o$ |- A3 v& K0 Q+ A0 G else
# Q' p! d: n8 ^$ u2 t7 ]) ^3 V5 u {, I- ?+ n7 |$ U# X5 p
cout<<"ERROR"<<endl;
' _5 [9 i3 q8 y* A1 T }) ]* N9 ^5 u' s5 e9 f! k- i, B
}
2 L+ |( k; }# s+ s; _) g return 0;
: J' W+ E8 e* J' e9 F3 x}) |/ W5 u" }( N& B# B/ @
* }5 P5 I: z( Y, q/ X1 W+ c7 c
然后编译执行就可以了(*^_^*)
; }3 z! I z' L2 w其它:TC++上一定编译错误,不保证在VC6上也能通过编译
9 I8 K( g" P! ~ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|