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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 i$ t8 ] I. P6 V: e6 F一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) F$ g a2 M m* V9 b f. w
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 ^" Y5 P& T2 b* G2 D; F4 m
参数解释:
$ g7 \) @( Q9 G! ^; g2 xistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 }- u6 O3 d. }( T' ^* |
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ ?, Q9 X. W9 T5 b0 y* _
返回值:
* L& x, @$ G# R! x& e0 R返回非0表示计算成功,0表示计算失败有错误
; d7 q+ Y4 j9 }5 Z9 y1 T' M- O$ J `9 V& C9 _' I$ F4 V
" {# S5 Q8 J: D# N7 i
/ @) n) ^9 w& k# ]9 i; M1 S
程序代码:
# q) W! @0 U$ @* W" Q
" T8 j$ G$ k/ |# Anamespace fy_Exp{* Z: F% h$ ?0 S; E& B2 k
namespace {template <class _T>
( s4 B0 }" q+ a/ v9 a4 K6 q' ainline _T GetExpValue(_T t[], char& csym){
2 \6 q# h& ~8 |) N: O8 I# t6 J! N char c=csym; csym=0;. I/ y2 N( r1 S1 a" T* } t& p
switch(c){
. n' F/ K( v8 G case '+':return t[0] += t[1];& }2 f L/ ^% U; J
case '-':return t[0] -= t[1];
4 A7 m7 c0 ~0 ~0 T/ {7 J case '*':return t[0] *= t[1];
( @0 N$ u( e; m, o default: return t[0] /= t[1];//case '/':
' Z' _- X% M2 ~) T2 z }
# U" t. B9 c0 A6 b+ ]}}6 |; j0 ^- z/ d: G) |: w4 R
template <class _T, class _Tstream>
5 F4 p- Q5 { |( w; T' z; p4 X/* _Tstream: inputstream, _T: get return value5 m3 ?3 H( m; U1 H
* Return nonzero if get value successfully */# N* P+ w% c& G) J& N
int GetExpValue(_Tstream& istrin, _T& nReturn){2 B; V% e% l( Z( o4 r l+ d
_T t[3] = {0}; //雨中飞燕之作. e, b6 c0 Y) ]5 t
char csym[3] = "++";
8 {1 K! A: j) I% o int nLevel = 1, nERR = 0;. Q/ I% ^- q+ n" s
if(!(istrin>>t[1]))istrin.clear();' Z" e2 U D1 m; i; w
for(;;){ l5 R9 a- R+ [; l; ?+ O1 w
if(istrin>>csym[2]){
7 Y1 O. Y5 L5 W. l2 a# N) m switch(csym[2]){
1 d# @" X! \+ e8 A( E; h case '(':5 y" E; K; K7 T( z$ S7 o5 X
if(!csym[1]){nLevel=0x100; nERR=1;}else
M1 }, j/ j! r if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
6 l1 B' T' P/ H: K( k, H, i else{nLevel=0x100; nERR=1;}
6 M! A9 }* i' `6 r break;
) _8 C- s# ] U N: Z' n% B- ~9 f case ')':
2 n8 Q+ z1 j" v5 T! U {nLevel = 0x100;}break;6 O! V- \( T% q* l) L x- h j8 a C
case '+':case '-':case '*':case '/':5 _ \9 O) r1 w! C- ~1 }3 [/ ^
{csym[nLevel++] = csym[2];}break;" N4 |3 y- m5 t
case ' ':case '\r':case '\n':case '\t':continue;
/ V X& ]# y4 V4 _ default:
, c' v( y# ^/ v {nLevel=0x100; nERR=1;}
9 u6 i: E, f) W: ]+ P6 g/ }+ d }0 G I F) w1 ?- Z
if(nLevel==0x100)break;
s( w/ U+ R5 H n* o W. W) i if(nLevel&0x10 || istrin>>t[2]){* q6 z& @# f) w+ k+ G1 c$ s U7 T3 x; E
nLevel &= 0xF;9 x0 b- k" [+ k
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}2 x* N( t* W) P% p- D
if(csym[1]=='*'||csym[1]=='/'){) Y( Q4 z' X& K( Q2 Y( {' a4 I( m
GetExpValue(t+1, csym[1]);" C, l( ]7 B* g, @' M
}% J9 n6 f% E5 T4 l
else{9 ]6 P4 l; Z% U6 }) S+ v) V
GetExpValue(t, csym[0]);
4 V. g+ p+ M7 }, L% I* Z3 Q0 n0 O t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 |0 c# h: X1 }, M$ }8 D, W7 i }
3 {4 u4 b# D2 M9 s# g5 j nLevel = 1;
% L, v! U$ ? D; F }
6 k: \, U7 P+ U else istrin.clear();
1 x& g: j: l8 d& f* Z, F }
- s6 J" T: n4 j" a6 M, Z+ Z' O/ ~ else{nERR = -1; break;}! e- J" q& H- G+ s; ^, G7 N: c+ m
}
, Z6 I6 m- X, u- @3 K% i+ U if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; V# y9 F% n. N- G. L) a
else nReturn=GetExpValue(t, csym[0]);
" Z, F) A, b- H v return nERR==-1?1:0;% z; a" K ]' [: A& U! \: R+ f8 L- Z; X
}}
3 e/ i* L# E( r- r) e) q5 b K4 {
; p3 g$ F7 y7 T S
# c# f/ M& l$ `, D3 {; O: t! k2 u+ e2 r) `, m7 S- Y' V9 Q
函数模板使用示例:
' r8 P5 j; l. p( O) J在以上那段代码的后面加上以下代码:# P7 z$ B- j5 q% b
. T4 d+ @3 y+ _9 U+ s; g . M2 W+ v. a) y$ p& i$ ?7 P; {/ K
( C3 c; Z5 n9 d4 M程序代码:
/ V. d6 J3 ~& N* F v
* B! i/ k6 B0 }2 Y" `#include<strstream>
4 o4 n- T4 p% @$ @ y0 A( ?#include<iostream>
* u& t% R2 }6 Q! N4 Q, g#include<string>
6 ^) m; Q1 R& f0 ]; ^( B( c! ausing namespace std;0 |0 N* Z3 O: C+ D1 I' i S
int main(void)0 g1 J" V* J4 s/ |* ?" z
{
! @- X! W4 {0 ~+ l4 P0 r string s1;
( @9 h$ w) v" \2 d+ C: g( l while(cin>>s1)
! R! G* k% t i L {
5 h0 |* x' Y, d. u- H istrstream isin(s1.data());
+ X0 F% c) X* g double d;
% ]: I1 g1 K+ j9 x1 ^( |8 ^. X if(fy_Exp::GetExpValue(isin, d))9 \! a# U8 k' I
{3 R2 ~& s$ w; ~ k& W7 H' P
cout<<d<<endl;. B& ~8 Z$ [4 }. H
}7 Q: {$ O1 E6 |8 ^9 e" x9 J
else
% Y* e$ `' ?% G7 ] {9 q$ A/ D; X5 @2 b2 y6 U& j
cout<<"ERROR"<<endl;
8 X `9 F5 M* z: H) ]+ v }
% a2 N1 g+ S- _1 n+ p }
7 F$ b' m9 S- S; ` Y return 0;( w9 A0 |9 J+ o7 C: N: w
}& [. W1 W, f) `* f( M: l
7 W! Y, V0 G) N, Y5 w/ l! F$ |4 l9 c
然后编译执行就可以了(*^_^*)
# v$ W9 X+ w, v其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! g; _5 R" v& i 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|