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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 Q: m4 E0 \5 |" w一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; y4 H/ M. V W/ z7 M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- Z2 j: Q. v" _9 _) e( q参数解释:
, j& i# l+ {/ s' m: }; K" P7 ?istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流. u; {8 r U9 w( u. C; V
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 k$ g! H) P! T# M, m
返回值:' z! G! G! x& b: K G
返回非0表示计算成功,0表示计算失败有错误
$ j+ \6 b, K( b8 p* Y0 `' i% r5 l2 \. T9 G+ Y
0 W" o+ `* Z* M; \% _
/ s4 Q$ i3 d( _
程序代码: ( { |- \0 P1 B& z$ v& K4 Y
@2 W+ b- m9 ?! X+ d1 a/ B$ J) ?
namespace fy_Exp{
0 h9 ]* o" s# y* Jnamespace {template <class _T>
$ U* E+ `# W" w1 ^- d; a" a7 F) D8 Y6 Sinline _T GetExpValue(_T t[], char& csym){
$ L+ f7 h3 F' C" U char c=csym; csym=0;
# Q0 r3 w- T Q7 X3 `& ]: q/ A4 C switch(c){* x7 N, i$ z& E8 G8 K
case '+':return t[0] += t[1];; i- R1 u5 i6 P1 X6 K
case '-':return t[0] -= t[1];" n! Y6 }5 i2 C% q+ K* I
case '*':return t[0] *= t[1];
9 Y0 r9 c& \: M. a. ~$ M5 w default: return t[0] /= t[1];//case '/':7 v# p8 e' b' u" a
}
. a1 [4 _' }9 e0 |2 }}}! \; K+ U. B' L' M5 \
template <class _T, class _Tstream> z+ V, X2 A$ L
/* _Tstream: inputstream, _T: get return value
4 c; ~" W$ t. |& U- x% _1 t/ T* Return nonzero if get value successfully */
) Z; e0 G/ i4 |. Z. p bint GetExpValue(_Tstream& istrin, _T& nReturn){% V& z( P& k& U: `7 \3 F
_T t[3] = {0}; //雨中飞燕之作
* a4 b8 L; ?4 m: l1 |0 C char csym[3] = "++";
% U* V& C- s" o* R2 y) C int nLevel = 1, nERR = 0;% {. M2 Q* b/ |# G
if(!(istrin>>t[1]))istrin.clear();5 b# C) S' @3 E% n
for(;;){
3 N T G3 U2 \% n7 k! ]3 F$ J; K if(istrin>>csym[2]){+ {/ u# Q0 ~1 E( b* E$ r8 h
switch(csym[2]){
! w( `/ ] ~ h G case '(':; \% ^3 M2 F K2 M
if(!csym[1]){nLevel=0x100; nERR=1;}else* u% c- }2 r+ f6 u# D; @" W
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ |0 V" x, K# I else{nLevel=0x100; nERR=1;}4 _8 f$ [/ f9 t* w: U: w* T
break;
& E, D( y P# ]7 D% ~ case ')':
* }7 z+ ^: }0 T {nLevel = 0x100;}break;
" r& t/ h P& N3 X6 A case '+':case '-':case '*':case '/':
5 k& S6 i) M+ U/ ^ {csym[nLevel++] = csym[2];}break;% z! \/ k& F, ?8 f2 ]7 Y
case ' ':case '\r':case '\n':case '\t':continue;! ^2 w- q7 Q/ ]6 s6 c2 K7 E5 L3 y
default:
' i/ o1 F9 L7 S8 |' S3 k {nLevel=0x100; nERR=1;}: B3 t# v! m2 d% A* P" s+ [
}
: M) P' p2 H( B" }# O8 \4 L if(nLevel==0x100)break;6 Z- r2 X) B; A& B7 y: B+ P
if(nLevel&0x10 || istrin>>t[2]){ H/ p3 ?' v* f
nLevel &= 0xF;$ a( \3 i: w* V5 f$ g: D
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 j4 A* E" p; W7 R if(csym[1]=='*'||csym[1]=='/'){
, H* M1 W/ I% N1 N GetExpValue(t+1, csym[1]);
7 H4 D1 D6 O) Q3 }3 D/ T }
. n0 Y4 a' A8 t1 u else{- b: D; {( G# t3 P+ b& B. k
GetExpValue(t, csym[0]);6 } ]6 h4 M4 j6 d5 b
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 k) }' z7 v5 z( p8 N$ d } A }1 d- m7 Z; g. w$ r4 y: |, ~+ I
nLevel = 1;) L; D% a% G8 w$ c0 w
}
: u3 l; t! L; u4 {8 a else istrin.clear();
4 q5 `- y+ k( }/ o q }4 G1 O8 |; V& s) `
else{nERR = -1; break;}
$ Z) t" B* J7 A& [2 M9 x) l x5 W }8 O* L8 ]$ f! L" B
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 F" T/ J8 K8 Y. I2 G5 p else nReturn=GetExpValue(t, csym[0]);0 I! \0 ?' o8 x6 f& ~9 u' r. u9 J
return nERR==-1?1:0;1 z1 ?4 `9 H; U- E
}}; K; [( n3 X- [. ^
2 Z E+ @( G$ ?3 i/ n7 e: e. G
5 m2 n c- @& W/ M: M3 @ f
: Q1 M1 r) v. v% k: m函数模板使用示例:" A2 y* _+ M! Y% h& C8 @
在以上那段代码的后面加上以下代码:7 c) g$ d# d% F6 v2 V8 [
}; x& {4 c" p8 x
! Q, l0 U& M k4 `
" e* U, |: Q4 j7 L- h
程序代码:
6 U" ?1 k9 ?5 D+ S1 ]
) x! G0 u: j& D, \% Z#include<strstream>/ F) }& ]+ v0 |% Y& l3 x3 B- \- w
#include<iostream> r6 S" c5 h# ?- A% `- ?
#include<string>* w; t( L5 w& f' V5 N2 x3 I5 ^ h+ Q
using namespace std;1 G% A7 V$ G9 l% a+ f4 m
int main(void)0 \$ z# I# ? v6 m, u! I
{
; I# G" \9 [) l. Z: e6 i) J& ?2 R! f string s1;
$ ^% ?" E0 \* l8 w4 Q while(cin>>s1)& l2 G" o8 y6 P% y, U2 v, Y$ G$ {
{9 [) m# y& E) g& f: B$ _1 S
istrstream isin(s1.data());
! {( d$ i# M0 n# z' F double d;
2 z! T3 j" e/ u if(fy_Exp::GetExpValue(isin, d))
5 P, ]7 x+ y+ l) ? m# ` {) j' _+ e9 G3 Y; L
cout<<d<<endl;; |( ]/ w5 L( ?
}/ [; R7 R( c5 U% y. ]* ^0 l& ^* K
else
) F9 v! [- K: W: S {+ _: `! S( j( y$ U+ K3 s; f
cout<<"ERROR"<<endl;
. X2 j, `; n+ r" r7 M }9 O% S6 G% g [5 S
}
" n: M* y! l' p! n return 0;
0 r5 s# F0 p" T; F}
, q5 b! U$ q m+ Q2 U5 k7 d7 ?% A# F C
% d4 K8 s( z. y4 |5 m7 p然后编译执行就可以了(*^_^*)
4 {9 G! O0 A; P+ x" Y) ~# Z4 u其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 G8 B! g) j2 k5 b0 Q" P
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|