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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
' ?" }8 p4 B0 n6 o3 u- O6 E1 |5 g一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) Y( z+ m& b2 Y' m+ d# E/ B/ M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ {) c+ S, P# J$ A$ E! i参数解释:) `; b& U: s2 Y! G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 `/ ~- Y0 ^) m% K; Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 o3 \0 N( C$ v' }& H$ E
返回值:1 n- v, T. T8 _$ ^
返回非0表示计算成功,0表示计算失败有错误
0 @- ^- X* i( g! J9 ?+ ~$ i: D9 W, S4 J' k& F! I5 R
4 I; @; m8 ?' ^1 F4 R: m
. Q/ W- Y0 ]( r4 B2 A
程序代码:
) ^, e6 F' j$ _
$ s. x; b1 [- @, O# jnamespace fy_Exp{* T5 E) I/ y% ~3 @; v a
namespace {template <class _T>
, Y5 z2 ~# f/ ?9 e6 D2 Einline _T GetExpValue(_T t[], char& csym){+ }' g+ V. a; Z* m( }
char c=csym; csym=0;6 [& Q$ ~3 E$ u
switch(c){
4 s* `2 Z; z! x# |: s case '+':return t[0] += t[1];5 K% ^' R& @. T3 s
case '-':return t[0] -= t[1];
+ D) e4 Q8 N) y8 y+ i: d case '*':return t[0] *= t[1];
! Y0 P7 m+ |+ [5 E! O" Z2 G! p default: return t[0] /= t[1];//case '/':
& o4 q& C9 D" G }
6 T: A& p% h4 ^5 }. Q}}" v/ u/ s. A0 Z: K# q: G, _
template <class _T, class _Tstream>
, {$ S' J; K; [! K/* _Tstream: inputstream, _T: get return value
+ P4 {2 |$ A' g2 a* Return nonzero if get value successfully */5 E+ t t9 w: A5 `+ z) x
int GetExpValue(_Tstream& istrin, _T& nReturn){3 Y! T2 d H8 o. c/ I
_T t[3] = {0}; //雨中飞燕之作
/ J6 ~% j( h2 T2 O& E& ?( Y% c char csym[3] = "++";
. f$ [* S6 ~/ ^' [ int nLevel = 1, nERR = 0;
4 v& e K6 R0 Q if(!(istrin>>t[1]))istrin.clear();$ `9 d9 i3 w0 s$ c' T. S/ p# x0 h% @
for(;;){1 C+ m/ a/ C5 q! D0 n9 Z
if(istrin>>csym[2]){3 Y1 y6 ]% ~: N9 N
switch(csym[2]){* U& W. Q$ \/ |! p
case '(':
0 V0 D# ]+ V* m _4 W% B if(!csym[1]){nLevel=0x100; nERR=1;}else
6 l0 W9 s3 \2 w" P9 n' m3 r2 f if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 G- _' |/ k B) {6 A# j
else{nLevel=0x100; nERR=1;}
" _* d. D/ ]9 [) R0 }- \1 j break;+ c% U9 C7 h+ k/ Q5 P/ t
case ')':- k" ~. s; p# k, e t" ^! S
{nLevel = 0x100;}break;. K9 a: I3 |+ v6 t- v& f
case '+':case '-':case '*':case '/':
4 k1 p+ ?& j* N/ V7 _/ r {csym[nLevel++] = csym[2];}break;
& Y, N# L* q* ?9 M% R case ' ':case '\r':case '\n':case '\t':continue;0 A4 g. M/ f3 [7 i7 q7 u
default:
. v9 o0 t- l: h+ _) @9 m {nLevel=0x100; nERR=1;}
( c6 z) _$ v$ U, F& } }$ N) P. x, R$ [5 U* e4 ^+ |8 A: X
if(nLevel==0x100)break;
& q! d5 H# h" h* Z9 C if(nLevel&0x10 || istrin>>t[2]){
- a& @2 I+ s! f' ]5 a. b4 @ nLevel &= 0xF;
3 U# |5 u" Q m2 z. S' O5 J( a, ? if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. S% d& X9 k c1 r' g& u if(csym[1]=='*'||csym[1]=='/'){7 r' s4 T) e( g' ^& G- ~
GetExpValue(t+1, csym[1]);7 L; f* Z) O+ R3 \- D+ v& y. [
}% a- x5 ? I* Z0 ^( w8 y
else{
2 a: M& k- v' k- i* k GetExpValue(t, csym[0]);5 H/ M, |$ w2 a* u, v
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 Y5 [; J2 z, {7 O$ l) ? }
3 ]9 [! n3 L* C2 n- Q2 b9 { nLevel = 1;+ @; d7 D6 k6 @ r3 q3 i
}
9 x4 b6 _, D, m+ D- Q* r' E else istrin.clear();0 Q' B/ s. f, F4 H8 F9 i* o4 q7 d
}
( w) W4 G2 N( R8 j' h- I' F else{nERR = -1; break;}1 H6 N" v, N8 b {9 [
}9 H4 |% a! W$ L3 }9 B6 s3 h
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);# m5 p4 Q! j, W- p2 B! z" L
else nReturn=GetExpValue(t, csym[0]);
7 y# g1 _3 f7 q5 R* p2 l return nERR==-1?1:0;
7 O' a( }- y: e0 V* g}}
6 V' |9 m/ F+ d2 W5 k3 H* g; V% |! Y4 D" }/ u
3 ~, k% r& y' l8 D# B! J9 z0 A# A8 |! s
函数模板使用示例:
! Z) h; N$ ?4 I+ h- c在以上那段代码的后面加上以下代码:5 X9 w8 R8 L- L/ [4 p9 B8 ?( Y2 |
3 H$ b9 ?: P/ q$ _( h
: ^6 c4 p1 w: R1 Y3 |1 d- x( E" b. p5 D9 [3 O6 @
程序代码:
# O- v! S7 t# P
' o s" |, a0 S0 }* a+ o#include<strstream>
9 v) H$ ] b4 {#include<iostream>
. M3 _# W H; y+ j* u8 s#include<string>
! w8 w# v) v* u4 K; r+ P. i, pusing namespace std;
2 B+ m% x# ~3 q7 u- Dint main(void)
+ A2 p$ M, E9 M{1 Z! d$ F$ ?6 h- v
string s1;# w- i3 a2 K# `! ?' G ], X
while(cin>>s1)" z( C3 H! u5 Q. f
{
. ], ]- [; i0 T) f istrstream isin(s1.data());
6 F$ x! t' w( c( Y: S/ Y; Y( p double d;
# @: ^& z5 G! v- B if(fy_Exp::GetExpValue(isin, d)), I1 O5 t- ~4 |" Y7 D& K
{& ]/ c @2 `3 H2 T$ a" U Q0 [
cout<<d<<endl;
$ S$ ~6 ^* {. h5 [8 P }" x, }, u6 N: f1 w1 P \
else: Z, P' i! y! l; ^1 N+ K
{
, p, z+ ]: i1 Y% ?8 L cout<<"ERROR"<<endl;' f) E; H& P9 k0 u! a$ x
}# }% O$ O( M" ?* V
}9 N8 z: {3 q, T( m
return 0;
3 Z7 M, I/ f$ b1 c( J}
0 d& k, }7 g" e) u q/ i F/ v9 r9 `. H, m
3 ~% k3 s) h: ?( W4 ~然后编译执行就可以了(*^_^*)
8 f2 b' ]) J# i( O0 [3 O6 H其它:TC++上一定编译错误,不保证在VC6上也能通过编译& L8 [7 {7 x- m: F+ j
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|