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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,: e' A' \8 l) K+ m: g
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) G& Q0 S* M* Q$ y. F* H9 @只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% V. Y+ b1 C8 L& v( N( U1 A' X9 N参数解释:
/ B! p# m! J/ Vistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 ~/ e1 g8 B3 h/ w+ W% u
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 u. A( K& b7 p) z( E
返回值:
" I8 Y% A" g7 Q0 C5 `1 E, N返回非0表示计算成功,0表示计算失败有错误
$ {& i' b2 B# c$ b
3 p9 X" v/ K/ Y% k6 \) | 7 M0 \. F& O& @9 a& c
& s, B8 m# B( N- ]! O5 j* ^, U& W程序代码:
) m0 t% f1 ~& G, I" P
. F. T9 c+ O, _6 jnamespace fy_Exp{; a7 c7 w, O O* q
namespace {template <class _T>
( X3 V/ v) B( Tinline _T GetExpValue(_T t[], char& csym){
) N: Z: j y( {" B6 U3 k" ]& C char c=csym; csym=0;
) i5 l% P- J+ t' ^0 C9 w switch(c){* P. J" Q5 k! d8 [
case '+':return t[0] += t[1];6 h2 j9 [) E/ b
case '-':return t[0] -= t[1];) A- ?6 Y! ?0 p+ k1 v
case '*':return t[0] *= t[1]; w5 m& ^- u+ a& G) I% [0 L
default: return t[0] /= t[1];//case '/':
% ]& L" M3 L2 C j o* v$ D }: E/ E( J/ r7 b& `0 s# E
}}
" M* L) x0 _$ p& z& utemplate <class _T, class _Tstream>
# [- y4 ?( l; C) `/* _Tstream: inputstream, _T: get return value
0 ^5 `% i2 T# }* Return nonzero if get value successfully */
4 C5 s) m; H$ @! w7 w ]int GetExpValue(_Tstream& istrin, _T& nReturn){
' l6 V+ k' y% ?: \8 B6 ?, } _T t[3] = {0}; //雨中飞燕之作
- B+ }4 g; ~# T6 T3 l' k. x char csym[3] = "++";% ]2 G* I, F' e* |: u; p
int nLevel = 1, nERR = 0;
: Y% K( X% N7 j if(!(istrin>>t[1]))istrin.clear();6 H9 q2 J* {6 _+ J1 \8 ?
for(;;){+ b: e! s8 X0 D+ S* k
if(istrin>>csym[2]){
7 w: ~, z1 u4 T. p$ H switch(csym[2]){
4 u! G. m; R7 @( q! p7 E/ r case '(':
2 A+ o `; r! Z0 o* c5 R if(!csym[1]){nLevel=0x100; nERR=1;}else
2 z4 ~2 h+ d7 i5 U. W5 r if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( D# E! i9 w" {$ J v
else{nLevel=0x100; nERR=1;}& w" K4 n3 @- v
break;" E& e5 D" T; l# y3 I# X
case ')':9 N8 Q* ^$ g/ r: F s
{nLevel = 0x100;}break;' c6 O( n7 H* Y8 n7 p
case '+':case '-':case '*':case '/':
! N4 N7 V& `1 N' x: v$ e: P/ n {csym[nLevel++] = csym[2];}break;9 m- V: |; J- @- |3 J2 b% @
case ' ':case '\r':case '\n':case '\t':continue;! D, r6 Y! Z. X& l% b0 Q5 }
default:
) {7 Y$ m5 J0 Z* v/ t. j& B {nLevel=0x100; nERR=1;}
6 S( z) K6 N3 r5 Y }
2 ~* x. Y \$ U if(nLevel==0x100)break;
m1 H' H% G- p* R9 o if(nLevel&0x10 || istrin>>t[2]){9 P' t ~) m9 V
nLevel &= 0xF;; B7 G3 k& X' A7 ^( }* s
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" s6 e9 b z) X1 l if(csym[1]=='*'||csym[1]=='/'){! W- V5 H$ `0 `! s' m/ ]5 R# I
GetExpValue(t+1, csym[1]);
! W/ S/ P* _) K5 h) v }7 J" N, Y& |% \" ~ ^) M
else{! @. N+ [. n: I* ?5 i
GetExpValue(t, csym[0]);
3 a/ p7 x* t! W. w8 y6 k2 x t[1]=t[2];csym[0]=csym[1];csym[1]=0;* I- n: {4 G/ [8 N3 n, N6 ?
}; p5 M/ `. V! U; v
nLevel = 1;3 U0 |1 \$ ~' |# r' j# Z
}" |1 X. a! w& j* B4 |, \
else istrin.clear();
& p* C5 z3 [, t4 D' d( ] }8 N% P7 t8 K: I9 Y2 T0 K: p1 N
else{nERR = -1; break;}
r0 N+ l* P& B; \1 ? }7 p3 J& A3 a' }, Y
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 J: c& l! |5 e ~3 e/ q* _7 B- O else nReturn=GetExpValue(t, csym[0]);$ S& }9 b0 ^5 ~9 [& b W
return nERR==-1?1:0;7 [, t5 S$ ?8 W; R* R* c* S4 V% c2 F
}}
7 L7 q7 T& D% @5 U8 ^9 g+ L4 l' {+ n
, k% Q5 G% O4 X) V Y3 [, D6 j6 d+ ]
函数模板使用示例: ~' W* h/ m+ Y
在以上那段代码的后面加上以下代码:4 Q, v# n6 ^! S" i* A9 M7 z
/ v4 U& ]5 g0 a% P 0 X( _7 B. ?0 K9 x* A, Z
8 C" Q. t- g" t% m# }+ f s
程序代码: ; b. N' W; ~4 G! R4 A$ D
5 ^* w! N* n. k* Z' M#include<strstream>- \' K0 F( a' W8 L4 I2 d- ]+ e
#include<iostream>
+ z& L3 F) k3 {#include<string>
( p5 t% s- Q8 m- v G( kusing namespace std;
. B$ I( \, O, I9 s1 c. Iint main(void)4 ]' a$ d9 E8 p/ c, E
{
. W( w6 w' b( o" E% c, J string s1;0 z; q4 J3 n) q7 A" H" m+ d
while(cin>>s1)
- d3 P3 i0 u( o- q6 }* ?+ | {- K. x) H5 T9 d
istrstream isin(s1.data());7 Q }4 t0 V* ?' |6 ?
double d;
* a S) b! N0 d5 Z$ z if(fy_Exp::GetExpValue(isin, d))
* f7 v, X/ d9 b0 W9 r6 s7 d& L' N {% v! ^7 a: H% ]% i9 i$ f9 p& X
cout<<d<<endl;
# o" K$ Y/ F/ U' w6 @ }0 V+ X; c' ?/ a9 e
else
9 u. U# c( q" W; j; N {
$ h* w0 z% L; M; Q! c1 g cout<<"ERROR"<<endl;
v) O) l, d% `% ^ }+ P. g2 ^" M9 q+ I) S, a* D
}% g$ z8 I# |' ^2 t' Q
return 0;
. }- ^# r% n8 e9 E! u+ I# s( m K}. F1 P% b# v( @
4 _3 b9 F( q5 H
3 v$ O& H# M5 L9 ~然后编译执行就可以了(*^_^*)" ~& c- {+ @2 S1 J/ |1 O I7 o
其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 e* q% A! K* F; }8 p' P$ Y
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|