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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
( t- r, A* \- S9 r# S) Y一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
$ W6 x, S' y3 B5 F& [# M1 _只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)0 s3 e% w( Z9 X0 Q: q) z v2 \, H
参数解释:( }5 y8 V/ c9 X0 H6 d$ a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流1 W9 p6 V2 X! x F- O% V
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定& U0 i* w9 z! C5 n
返回值:* q8 N, r$ F9 B; a$ P
返回非0表示计算成功,0表示计算失败有错误
8 k9 z3 g6 f; G8 z- }- i( E! M9 P
. p- n! x# g, e% i* D: b& d/ O L) Q6 ]6 H* k; Q5 w# ^' j
程序代码:
; s+ v! z+ u5 ~1 e2 I( w6 B1 ]* w: m0 B: j
namespace fy_Exp{
& k7 o9 U3 j# d( i" e2 Vnamespace {template <class _T>2 Q4 L2 x H! A0 }+ J7 y) n, O
inline _T GetExpValue(_T t[], char& csym){
5 v. ]5 j3 R, Z char c=csym; csym=0;8 [$ e. @8 q2 o: `
switch(c){
) }, p9 V( p( R case '+':return t[0] += t[1];' c, c4 z$ R4 ^( R% ~: \, A
case '-':return t[0] -= t[1];$ T3 N/ Q' B G
case '*':return t[0] *= t[1];1 E# }* W+ t2 Q- I) v) t. ~
default: return t[0] /= t[1];//case '/':
, w4 O0 m+ M- ~& X/ c6 A+ t }
; Y2 Q( b5 {, V d* o$ N' x}}1 i! H; D4 I" r9 B. |4 M( w
template <class _T, class _Tstream>5 V: y7 r7 g6 x3 e
/* _Tstream: inputstream, _T: get return value. X, r& f0 J. s2 T
* Return nonzero if get value successfully */
8 {2 n7 u; }) Q( t. x8 b# z4 x5 Gint GetExpValue(_Tstream& istrin, _T& nReturn){
. u" y- D/ f, N0 Q- V7 v _T t[3] = {0}; //雨中飞燕之作4 r4 t3 z/ W* |: C k
char csym[3] = "++";
' \1 F) K- h6 h | int nLevel = 1, nERR = 0;& j: C+ d+ L* ]$ k
if(!(istrin>>t[1]))istrin.clear();
; c5 o0 {/ Y0 \4 R0 u for(;;){( I, l/ @4 H& g
if(istrin>>csym[2]){" l5 G/ w2 ^1 |2 G) g
switch(csym[2]){
) \; ^( {8 z/ Q p! r1 T% N- C9 I7 h case '(':) h; [, X1 Z2 c- G% C
if(!csym[1]){nLevel=0x100; nERR=1;}else: }: K/ J3 M, k" `+ W
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 ~/ t. @; W: Y( f1 i else{nLevel=0x100; nERR=1;}3 A/ S5 W i7 f! h
break;& s) z4 n, ]' }: p. u2 r/ }
case ')':/ p6 ^7 M: V* C q3 N9 \: t+ L5 Z
{nLevel = 0x100;}break;
* {! |! k8 D3 S case '+':case '-':case '*':case '/':
# C8 ]: u4 ]# T& ?3 m {csym[nLevel++] = csym[2];}break;
5 L9 m9 r9 _+ w J1 E# S: J0 u# E case ' ':case '\r':case '\n':case '\t':continue;# E1 h' T# ?* q2 q+ C( U N: m) _0 ~& C
default:0 {6 ]4 u5 Q( X6 I5 [
{nLevel=0x100; nERR=1;}$ N# _5 O( y6 _3 R. h
}, `' P5 B, w# I9 X3 @* X% } Y
if(nLevel==0x100)break;
) w6 X: @+ O: R& h. x0 R/ n4 } if(nLevel&0x10 || istrin>>t[2]){
9 b, M9 o; i; }9 ?$ L6 I nLevel &= 0xF;
/ Y- Q) [* K! T2 r1 P2 a1 ? W if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. H( V" O% a; G
if(csym[1]=='*'||csym[1]=='/'){8 c2 T, X, y+ f2 O" ~5 {( Y
GetExpValue(t+1, csym[1]);) e" |! G2 M1 e) ~# F! X
}5 y3 u2 h4 c2 y5 |" D) C, X" X/ p
else{7 u. i/ `" d' {: G( q' g$ T/ Q
GetExpValue(t, csym[0]);1 A9 t* a4 o# r) J! g$ F& ^3 O2 B/ a
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' c6 Z# v1 m5 R$ n- k }
9 r, `7 q5 l" t Z nLevel = 1;; x# u2 c6 j3 l! q! l4 m
}5 K5 t4 R8 Y4 H; ]# Q3 D0 y6 _
else istrin.clear();: E' H$ X- `0 A Z! o, _
}) u; O* |* ~8 t7 L, Q
else{nERR = -1; break;}
! r* e, V/ u9 \3 `5 _8 Y }2 X* Y# w9 g/ g* X
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 H' t" U" J* f5 P9 i" C- i8 H else nReturn=GetExpValue(t, csym[0]);
% S# M# N9 U P& Q( P4 A return nERR==-1?1:0;) _9 d/ {4 u5 F2 W! y* s
}}9 [; b) {) I+ D
0 |( f. I# C% a# ]
+ |1 a1 r+ Z& U1 a6 f& B
' y: n: [" I4 m2 k% G" l函数模板使用示例:
& m1 Y5 x" f; o& w u+ a在以上那段代码的后面加上以下代码:
7 s4 ~5 ^0 S1 R1 X: [& d" I* G9 I. o) N2 p1 D( J8 Y, w- ^5 K( R
N! ^0 V0 H9 f& F; I
+ |& N9 S) R, @* t% G. _" X程序代码: 9 t5 o0 ?7 a p- }( [- O+ H3 L
5 J' x0 x9 G* {. a#include<strstream>
5 u/ ~! i- [8 y# S( j7 V#include<iostream>
7 e( F( ]& M% M, _5 J% E$ I3 ~#include<string>
: Z! c* l5 ^- l; X; rusing namespace std;
, F- _* `# T; G9 B+ xint main(void), x* W. J4 m$ w& u3 K$ M
{! {: ~4 a6 a; Q. ?5 {4 v
string s1; R% V, P8 J8 n6 Q) I
while(cin>>s1)$ u1 u! ^& o/ R! k6 U
{
( L/ X u) f) c( W8 K6 I5 ^( C+ R istrstream isin(s1.data());
/ C; L3 L( H( ]# l double d;
- {9 w) w* s7 i6 I if(fy_Exp::GetExpValue(isin, d))
( Y3 | S7 {4 k u9 O {
8 W- V( g+ }5 b* U* @ cout<<d<<endl;
% {) R, c/ w) p }! a( a+ l% H0 b! L- X
else0 b4 T6 d2 n* c, {1 E& a# B% J% M
{
3 i( ?* Z) i- Y- V: T6 w' h' A cout<<"ERROR"<<endl;7 Y: V0 o! i! X& Z6 x7 h
}
. \- _8 @8 l- A4 M: Y7 P+ u' v }& K. F3 h [. A- I D
return 0;
( Y& ?) x" t4 k$ I, a" g. n}$ Q5 L. \7 T( T) x( z
/ ]7 }* f2 O4 T- M
( i/ O& L% R* m. y) s5 H
然后编译执行就可以了(*^_^*). g# D! b) j, l2 K. z, N1 ?" j
其它:TC++上一定编译错误,不保证在VC6上也能通过编译: M; Y/ k3 s0 E% r
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|