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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
) I9 g% o" R3 `' Q& O$ E一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" U' h) V* {: O n只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ s; `) z( J X8 O参数解释:+ m% K& X4 f% k/ A% J G( \* }
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流9 M4 u: [" k' D# H+ y
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 E" M8 t6 k7 h
返回值:3 A; M6 h/ Y6 F- G/ }/ i- P
返回非0表示计算成功,0表示计算失败有错误; ~% T' k! P6 \" h3 U8 p
, N. b1 E* {# o, V
4 s( U7 W' b X3 s( A! I
+ Y( N$ A9 D% l8 n1 ~6 u7 P- |程序代码:
' h$ _ m7 Z& i5 X
9 O0 [7 g6 O' M0 `! ?4 dnamespace fy_Exp{
; V' S& g% z0 W# w. _( Wnamespace {template <class _T>
! r) X$ R9 A$ Z1 g0 k! Uinline _T GetExpValue(_T t[], char& csym){
; G4 k1 k9 l8 ^3 C2 T" R char c=csym; csym=0;- l7 q3 A! b* Z
switch(c){: P# D; A X6 y0 a' h- |
case '+':return t[0] += t[1]; O% i" p% g X7 ] k
case '-':return t[0] -= t[1];# F0 W" R! W2 Q R
case '*':return t[0] *= t[1];
4 N6 H; ]# K4 c& p default: return t[0] /= t[1];//case '/':
/ }/ P% t8 d2 t9 q' ?/ P' k* a7 i$ H }
; b+ `+ X8 O9 S' |" G& O}}
; X! w$ O/ r3 o% Y4 t6 I9 Y+ Mtemplate <class _T, class _Tstream>5 N7 Y# W* R) m7 M( V
/* _Tstream: inputstream, _T: get return value
8 ^8 M+ J* V2 h* Return nonzero if get value successfully */
+ e1 b5 B. F& cint GetExpValue(_Tstream& istrin, _T& nReturn){
& p5 K( N2 P' ~1 s4 l* n _T t[3] = {0}; //雨中飞燕之作5 l5 z- n) J7 _7 ^- W' w2 Z2 j2 B
char csym[3] = "++";* v! V1 @0 D) m# g2 A* v# R
int nLevel = 1, nERR = 0;
: u P6 e! M) h6 |3 v if(!(istrin>>t[1]))istrin.clear();
% p; F& E n9 A2 f7 i1 R$ C for(;;){
: C( o/ a. ~- L8 N0 ] if(istrin>>csym[2]){( Y1 e0 Z4 ^& t8 O5 {& ?4 U
switch(csym[2]){# S5 M9 K) r# u( P1 ^0 R
case '(':
g7 v. Z4 p& N$ w, ] if(!csym[1]){nLevel=0x100; nERR=1;}else
% K0 C$ ]( }' X7 N) a& m1 r if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 U# y1 `( x" P" A$ M
else{nLevel=0x100; nERR=1;}2 I+ h1 R3 l( z1 H
break;
& t& F. l, u/ ~% _8 W case ')':5 R( ~4 F8 m8 {. |
{nLevel = 0x100;}break;
( x; f7 F3 _% k h case '+':case '-':case '*':case '/':
# Z# v0 f8 b& ~ {csym[nLevel++] = csym[2];}break;$ k2 y( C( j, y& V3 X0 l
case ' ':case '\r':case '\n':case '\t':continue;
6 B, a3 }5 P+ m* J default:
% y6 @+ @) D' A* x' \. ^ {nLevel=0x100; nERR=1;}
6 v8 c5 X4 o" y& X+ W }8 h/ X: e4 |# [9 y
if(nLevel==0x100)break; v6 T5 f+ j2 A, C4 v
if(nLevel&0x10 || istrin>>t[2]){3 l& B* G1 D5 Q; l1 r1 v' d
nLevel &= 0xF;
* i4 A+ k+ E' }1 R6 {) e9 Q; K if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, i" y. g; v) |# x) M, K
if(csym[1]=='*'||csym[1]=='/'){
' @5 g' a" m; u% e; z1 S4 J1 ^: Q GetExpValue(t+1, csym[1]);
$ F7 S' \2 P2 f: {" S8 t }
1 o4 B& a# F( f else{2 ]: m( r7 ?6 o. b
GetExpValue(t, csym[0]);1 R+ n: a! @1 I6 r
t[1]=t[2];csym[0]=csym[1];csym[1]=0;; k2 L! A2 c0 U
}. {8 S5 x! a* t* _
nLevel = 1;$ r7 Z" P1 _" N% ^
}4 z/ Y: A( M9 \8 q- ^, l* ~7 T
else istrin.clear();
& S I+ P z1 c+ @1 J9 d$ Q }
" L) R. b- [/ R; }+ Y7 Y$ _0 k& s else{nERR = -1; break;}; q. s' x8 E3 _+ Q4 A: s
}
! z2 Y. `% o2 a% g1 l if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
[$ P7 z& M1 | } else nReturn=GetExpValue(t, csym[0]);4 l2 d: r R8 P
return nERR==-1?1:0;+ U! `" r$ \3 g+ L
}}
0 {* A: T! g: h$ y) M5 x5 b) Y. I/ L: K0 o
3 U+ ~* \0 j; ^+ r, J* s
9 q1 i5 Y* C2 s3 c) d函数模板使用示例:
: L5 T/ L, F$ n/ D% x% ]& B在以上那段代码的后面加上以下代码:
# k% Q( i9 }6 A# k3 o& T# p# m# v' J) _! I' r
4 A5 k! f( a1 v$ @! w0 ]& r
8 O6 T3 B2 \* N+ j. Z程序代码: & g' W7 y9 \7 P
2 D3 N: g$ ~. _* Y, }; l
#include<strstream>1 F T8 N9 m0 D6 P/ o6 K
#include<iostream>' u( o5 [$ \1 d/ w1 P
#include<string>, V/ j3 B" R) u
using namespace std;
/ Q5 D$ h+ t+ r! p0 hint main(void)
, l* w1 N( n- ?& Y{
j/ k6 F8 F6 y2 l, F9 m/ L( f8 @2 | string s1;/ D3 P; ~; ?' Z# P8 {/ y
while(cin>>s1)# C2 i. m7 M2 F$ N$ Z) K
{
c, k6 x( h; M) s; F' q1 u istrstream isin(s1.data());2 ~- L+ X# J) z
double d;' ]' f/ B7 s" G3 a, c) P7 g! G
if(fy_Exp::GetExpValue(isin, d))
. Z" q4 E6 o3 j; e {
' P4 c K1 B7 u' V# j$ ? cout<<d<<endl;0 O0 n. t% o. R
}. z! k! `0 `8 u1 Q5 }
else
: [, j; t, d, w# T {
$ {7 j" u+ _0 H1 b cout<<"ERROR"<<endl;& V. J5 ~8 y$ O8 F: S
}
5 ^+ ?& a+ ?2 z% ?# ?, p4 s }
! E! K, ]2 g. X* c+ P4 S return 0;
( u" A W6 T* C) F}
1 y+ ]- n- K" P+ o- a# r
1 ]" m8 e9 Y) V" O, ], J. U
; C/ q( U9 i h" o- h然后编译执行就可以了(*^_^*)+ X6 A$ y1 |7 u
其它:TC++上一定编译错误,不保证在VC6上也能通过编译& b) ~4 `& `( F( g4 _8 |* |, E
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|