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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
, U5 O/ ^5 q$ T7 c一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 |/ S/ h7 `+ B# v { k只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! q$ Z e1 a0 b! e0 {' p- {参数解释:
0 V4 t: v+ f- o Oistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 |+ y% k$ u/ p. L; c* nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" p3 Y+ c0 ], y# V% B1 Z
返回值:
0 A5 t# z9 A2 n# c3 M. ~返回非0表示计算成功,0表示计算失败有错误
4 A- }) D' d G5 n0 Q+ q3 T& m3 n( ]
% K% [) E, h# y, V7 B4 \ # X0 d. W5 T" m; b4 U M" p6 ~
5 ^* n3 M7 a% O程序代码: % @: ^8 M( j+ t! D( H2 j4 g$ Y
4 I4 y4 d' O% _+ y% h
namespace fy_Exp{8 E( Y$ R( m/ d* e: D6 h# R1 Y; @0 l
namespace {template <class _T>! H0 Z, l/ _4 ~ j+ `# L& H t
inline _T GetExpValue(_T t[], char& csym){) q8 u+ S2 ?. ~( t
char c=csym; csym=0;& D* U6 a8 }; H/ ^2 N) }
switch(c){
- c' k; O9 d- F$ `1 S- Y6 p case '+':return t[0] += t[1];
& d" X- Q* }8 a- a9 U: \5 ~ case '-':return t[0] -= t[1];* K# Z% X5 m2 b& C4 W2 |
case '*':return t[0] *= t[1];
# [8 J/ ^! S: _7 i/ r2 `$ Q z default: return t[0] /= t[1];//case '/':# a$ u9 D/ x" r L* i
}% j! g( E: o9 ~* d" f5 d9 ^2 o
}}
. \0 l. j, C! v7 `# _! ]template <class _T, class _Tstream>
" {; u7 a8 E- q V, p/* _Tstream: inputstream, _T: get return value7 J) W! v& ], V& H' R2 a
* Return nonzero if get value successfully */4 G. o5 ~% I6 n, B, N9 R% q1 T: v
int GetExpValue(_Tstream& istrin, _T& nReturn){/ C+ j# [: Y# z! r9 l
_T t[3] = {0}; //雨中飞燕之作
. k# O% A; ]- u- b, f char csym[3] = "++";
& L( s7 Y& u+ k: w) |' }1 b+ v1 j int nLevel = 1, nERR = 0;
5 E- ~, v) Z/ D8 r7 e8 Z6 E9 P if(!(istrin>>t[1]))istrin.clear();' P# o1 K5 t# G8 ]
for(;;){0 g7 Y, {6 r3 J
if(istrin>>csym[2]){$ }+ v; P0 f, t0 b/ O4 f3 r/ Z
switch(csym[2]){/ S2 }/ Z* d7 U1 Y D$ I
case '(':7 \) H! b1 R0 m; E
if(!csym[1]){nLevel=0x100; nERR=1;}else/ U) d' B3 g& B4 @' b
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 L* d4 o4 r" |6 C( Z, i else{nLevel=0x100; nERR=1;}
I% E) h4 A, Z break;5 S) p+ _' J/ c' T# {( u, q5 c+ X& I
case ')':/ _# ?; H* o% W3 }6 F- y t
{nLevel = 0x100;}break;6 n0 n- _! _; q' e( M' W5 r5 }
case '+':case '-':case '*':case '/':# q* m( q1 M9 s/ h5 w' N* I
{csym[nLevel++] = csym[2];}break;$ i( a; ~6 j% z* q
case ' ':case '\r':case '\n':case '\t':continue;0 j$ n4 {) y3 X% [3 t) ~! L5 k' r+ w
default:, K8 d% x. q1 `0 s( u1 L1 L
{nLevel=0x100; nERR=1;}
: G7 n/ e9 _; Z3 M/ V4 Q }! _+ g, ^) Z* C7 Q# d" q5 S7 n. u! v
if(nLevel==0x100)break;
5 A% h- V' K0 J7 J, y if(nLevel&0x10 || istrin>>t[2]){
+ m& z/ H9 V9 X nLevel &= 0xF;
C+ k' `5 E. e if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 n) D0 P6 u7 i( F
if(csym[1]=='*'||csym[1]=='/'){/ q3 z$ d! n% J+ w+ i
GetExpValue(t+1, csym[1]);. Y8 }5 Y, f( P6 X5 ~7 H* E
}% u. k K' A) y' v1 H
else{" W+ ~7 c5 r' g O7 s
GetExpValue(t, csym[0]);- u7 w/ s! @1 ]! r6 f
t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 o& ~ H: V ?! H4 |/ j
}
" M C1 U' N9 X! l7 ` nLevel = 1;
! Y; f# S& f$ q1 z }
+ q* K6 t$ N p+ @ else istrin.clear();9 t( G1 k4 Q n, F, g% t7 _9 \
} Y% n- s7 v" X, @& Q5 p
else{nERR = -1; break;}
0 P5 \" Q3 E1 D2 f8 j }
$ o4 ?& V: V, x" _& g if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 p6 i/ q. g3 S8 O6 `
else nReturn=GetExpValue(t, csym[0]);6 b1 g, M# Q( s
return nERR==-1?1:0;% ^) K& M7 J' x
}}8 Y4 Q8 |1 W1 z9 ]* y. x2 i0 m3 } ^
4 N& [0 N0 w3 E) S4 t
! } P5 E! S) W
: @. m$ l& ~( s) ^函数模板使用示例:
1 P3 E& j, P2 o% z; V- g在以上那段代码的后面加上以下代码:' x/ x# j7 G8 J/ p# P
& f) p/ U3 t, I/ s: {" E ) Q% k" A6 G/ F: [: F2 G
( P+ H# }5 G" h$ ]9 s/ R4 Z" T程序代码: 4 }4 t# u/ r6 T
1 ?0 L% ^# g; z, I6 z#include<strstream>: I& I, a( H, S' l
#include<iostream>4 ~# U3 O, h( S, D: J
#include<string>; ~8 I0 ]' P6 H3 R
using namespace std;
7 B* C& J9 Z* j5 z0 d; A& Uint main(void)
) G5 O# v7 e2 c{
1 o' [' F& t) j" s string s1;
; @4 y( J9 R! V/ L* V" ]- ~ while(cin>>s1)
* V% O i* m* {% S {# O) J6 ? g+ _4 W" x2 A. X
istrstream isin(s1.data());
2 Y& E/ O9 k5 i, M9 Y K double d;
# [; o: e0 E5 v& F( S. | if(fy_Exp::GetExpValue(isin, d))1 k! F6 ]9 a4 @* `+ u4 O
{
) v8 ]+ U( V( Q! Q8 ?7 r. V cout<<d<<endl;
, }! w6 d8 G% g6 n; J* I a( b }
1 N( `0 {4 Y; X" {* [8 v e8 ^: m else
2 Q- N3 _6 R0 Z9 N' a' v, Y {
9 U3 O; {/ u. h6 @ [+ r2 _ cout<<"ERROR"<<endl;* P" ~# N1 q7 z4 M9 _( ?) a
}) ]8 e n8 O& h1 J+ t
}. V* q: I6 a8 W& p+ Z
return 0;
z! J" d. a9 t4 ^% t}. @8 e: c0 D, s7 M7 V' u( n7 p
6 r- X t9 @3 r \
7 Z9 j! y, L! m7 @# S然后编译执行就可以了(*^_^*)- z4 u# O& I) G6 \% w: L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译" O0 R; h9 v$ j c# H
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|