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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,2 I; N1 ?7 n- g7 |! {+ e
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 {0 ]) t3 z% X只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) z1 F9 x0 y; h' E参数解释:0 D+ S5 U/ ~3 v+ ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# L! K! f/ `" [# Y3 znReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 ^0 Q) `' J- E返回值:
: y+ x2 _; z0 s6 c返回非0表示计算成功,0表示计算失败有错误0 L4 V, [8 u3 F
2 S8 a4 x+ z9 B: {+ O. I' @! S
; u7 _7 B! H7 k8 H
. N% \) u# T+ g
程序代码: ! |& i9 y1 S# m, v. h( W2 x
! |: F6 o5 U6 S+ n( u, a' bnamespace fy_Exp{
* i( ?7 R- u3 i7 xnamespace {template <class _T>/ ]2 g* w( p; J2 d5 k
inline _T GetExpValue(_T t[], char& csym){
& z1 i9 t3 c3 J/ k! |9 @" M# a char c=csym; csym=0;
( @4 \' T1 I4 a2 P0 Q& u switch(c){
" f$ M o+ w6 g! n case '+':return t[0] += t[1];
4 C5 T4 t9 {2 C$ T8 X& Y( b$ g case '-':return t[0] -= t[1];) w8 a6 A T5 M3 k! `
case '*':return t[0] *= t[1];
2 w5 I; l+ _4 S5 _9 y default: return t[0] /= t[1];//case '/':4 H1 o7 L! t0 e/ u. a7 h4 `. [
}
( i1 K; }& b$ l/ g; X}}
, U+ f" x; B1 G$ Stemplate <class _T, class _Tstream>6 P* I( ]4 F: F& q: Y% O4 h1 K
/* _Tstream: inputstream, _T: get return value4 K/ b& B; V( _1 s7 |0 M4 o
* Return nonzero if get value successfully */
. N+ A, t* n) B0 `* Bint GetExpValue(_Tstream& istrin, _T& nReturn){
! z# B# L, ]1 Q7 P _T t[3] = {0}; //雨中飞燕之作/ P& w6 Z, U5 F3 g
char csym[3] = "++";$ U+ a- n6 x+ N8 Y' U5 C3 g
int nLevel = 1, nERR = 0;
9 m1 u& |& L$ [: g N if(!(istrin>>t[1]))istrin.clear();* c6 h ^* d/ i" \7 @, i
for(;;){5 ^4 X" w( F p* \4 m, L# C
if(istrin>>csym[2]){4 R7 }( x( x2 K. J3 U4 a' \) j
switch(csym[2]){
' f6 c# r5 e% ^% ~0 F1 n' G( S/ I case '(':! J0 \" E- U6 K2 p& @. M
if(!csym[1]){nLevel=0x100; nERR=1;}else# L4 |: B/ `3 ^
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% j7 L X5 E; ^$ P% t+ _0 E$ g
else{nLevel=0x100; nERR=1;}- [( P% Y" E0 J! J2 V4 b1 U: k! N5 A
break;- Q. ?8 y& c/ e: X
case ')':
. l; ?6 }& R' U {nLevel = 0x100;}break;
. G1 |# e; w7 w( h' j' f0 T* W# v0 u case '+':case '-':case '*':case '/':4 d! i; e4 }0 d0 S# @9 K
{csym[nLevel++] = csym[2];}break;
6 K u$ x# T' a- J case ' ':case '\r':case '\n':case '\t':continue;
# d G$ z& }) Y' @ default:
1 e* c6 m: q+ j/ N0 @/ T; I: S) b {nLevel=0x100; nERR=1;}
- S& h0 O5 @* O3 } O } m/ ?( } Q- o8 I3 p
if(nLevel==0x100)break;: @& J% e5 }& W0 P) f
if(nLevel&0x10 || istrin>>t[2]){; |5 ~1 M: n4 _5 S" ?( m3 g
nLevel &= 0xF;
! P, | @3 w9 z6 A7 U" ? if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}( A# S; l* b# m: o
if(csym[1]=='*'||csym[1]=='/'){+ U: i# l% K# Q
GetExpValue(t+1, csym[1]);6 J1 \3 \" O. f9 ~6 T6 G0 z. K, r
}0 B: _, V, e7 c7 l* t, p
else{# q7 P& i% d6 f7 F8 k4 b
GetExpValue(t, csym[0]);
- S- W' I) G! v& N8 f* D t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- f: t- _' L9 q+ X- c$ O9 t3 Y }
5 G; E1 j( D+ `6 {: @ nLevel = 1;
( k: {% }+ O: _$ f* D3 q, X }
) ~1 Z2 T/ g! c3 A6 ]# _% T) H else istrin.clear();% `7 r$ t( ?5 P7 }- `( H9 p
}9 y9 g( ]4 z2 `( n. y" N2 d8 Q3 s
else{nERR = -1; break;}- o+ \9 Y0 S: t* m1 E+ @+ j. t6 [% X
}
4 m) c6 d0 X, U* O7 r5 G if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; X% M+ y- z% b( r+ C/ F
else nReturn=GetExpValue(t, csym[0]);9 Y( A4 j S- [
return nERR==-1?1:0;
! c$ {; J0 D; H' ^}}
/ \9 h+ v# ~8 d) B7 `8 W# T7 A3 D0 R2 j6 M
; `2 n! D5 J# D$ g7 \6 d
7 `) e' w7 f1 j _. I" H# y$ m
函数模板使用示例:/ h2 G& d5 _; J8 C0 M8 j% Y$ C
在以上那段代码的后面加上以下代码:3 ~# }3 S5 e+ a1 |3 P
+ D4 L. o/ M& }! B ]
8 E9 K7 Q/ N7 I9 Q z+ B
" b; w7 F. x* {: Y程序代码:
) m# r7 v& q( x' k. E& { S6 `: b! n6 x" x- h! K' f& O
#include<strstream>, m7 S3 ^- S H& K& q) B2 V1 z+ j
#include<iostream>
1 j) {" M% N. q3 C0 f7 p; k#include<string>, a5 B+ n" T2 V" Y% P7 Z
using namespace std;; m! m0 ^; y' k( K
int main(void)
; S& _5 e1 N2 X1 f# b{
9 F- F3 p/ b$ N: @/ l2 ~9 m- [* h string s1;6 a9 n1 B4 b$ u* E7 ?5 ]1 s
while(cin>>s1)
, h) u8 S% c* J: j. A0 |" ~ {
5 r' {* T* @; u" m2 F7 F4 } istrstream isin(s1.data());. {8 Z5 @) |1 ^" k" G% A+ T! h0 |
double d;
' N. y, `" m% m7 M! u1 L" E% P if(fy_Exp::GetExpValue(isin, d))
0 Z( d$ ]; h/ d# _/ G$ M {
. L, v) N7 x* Y- f" h cout<<d<<endl;
3 ?4 A, z& e* { }2 M |6 f! K% J$ J) V: w
else
; o; v/ E! J7 w! G5 D {
* W ]+ L: a( {* o cout<<"ERROR"<<endl;. p/ @& f6 p7 _0 e3 j+ T i8 V
}
, J, @7 c) I# K. u+ k' H } P \4 N' U# Q+ Q- J- V
return 0;
3 t" q3 Z& c" B+ Y}
/ F0 c" z8 R0 X6 G" E" J! c1 Y( @8 n; r* {1 X- M$ e
4 @7 v( k1 u; w. Z$ Z& W; x
然后编译执行就可以了(*^_^*)$ y5 F: W. P1 R2 R& `8 A
其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 f/ x+ Y7 a; e- F
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|