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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,! O$ `7 e1 X0 c- ~; ]6 U
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& A* s! J3 H0 h8 h4 x7 q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ {& M9 r! a. k( U! C; o4 u- X& g
参数解释:
, L7 V$ z Y: z3 F$ Z7 p/ Gistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% v/ V( B- P- L0 K- KnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) n' @1 I8 v& ]/ y6 B. r返回值:. b0 G# k, H5 G# E0 r
返回非0表示计算成功,0表示计算失败有错误, A: o6 j0 C, n9 U0 ~
a9 ^! t/ {/ ]4 E s
( R7 C) e3 @8 H, i3 b% E9 ~- d+ s& I
$ l; s* p* g( x5 ]! V程序代码: . a0 s& k2 a( F. f* Y; q
/ x: o0 f3 E g6 q+ c$ Rnamespace fy_Exp{, [6 \/ P1 N2 o) G) X
namespace {template <class _T>
$ p k' x p- A5 ^inline _T GetExpValue(_T t[], char& csym){ x9 [9 s: O/ J+ w, b+ d
char c=csym; csym=0;
( p: P' N6 |. ~! b4 _, F7 r switch(c){
2 {# `" i- y( l: ^ case '+':return t[0] += t[1];/ T7 B6 f) a4 `- o) o8 d
case '-':return t[0] -= t[1];7 h: I# b. U. ~, s/ W
case '*':return t[0] *= t[1];# {6 f% M$ g6 D4 g+ z
default: return t[0] /= t[1];//case '/':% D4 f- \4 x0 h* p( h) T
}
8 ` H8 v6 Z6 ]}}
5 S1 c% @6 ^, R: I4 Ttemplate <class _T, class _Tstream>' P4 V. Y, X( i+ v
/* _Tstream: inputstream, _T: get return value
# n' _- k Z; u! Z6 {* Return nonzero if get value successfully */
. I c% d$ r( @0 }! K( Zint GetExpValue(_Tstream& istrin, _T& nReturn){2 U3 B- }* O; z& g
_T t[3] = {0}; //雨中飞燕之作
, a: H$ P" a6 s4 z# u char csym[3] = "++";* ^8 ?( w# o9 \2 H" {
int nLevel = 1, nERR = 0;
! r( w' N! h9 w if(!(istrin>>t[1]))istrin.clear();; [/ Y9 n6 J g( ]4 N
for(;;){
* o8 O1 O6 h8 K if(istrin>>csym[2]){7 ~+ w3 X$ ~* G" x5 b6 N
switch(csym[2]){
7 L9 q+ o) n( D5 }2 ]' d, \ case '(':
) Y' s4 d8 D9 |; }- }% y% Z; x if(!csym[1]){nLevel=0x100; nERR=1;}else) {/ J6 x& C1 i% w
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
x0 M4 @, f$ i; [8 G O [ else{nLevel=0x100; nERR=1;}
5 p6 w! U( h# r: T5 H" u& L8 P* S3 y break;
7 {, b( |3 m! x. h/ d case ')':
[! e: I4 A* |& ^5 i6 y1 A {nLevel = 0x100;}break;
/ l/ O( V3 d1 _* j. B- ?6 C case '+':case '-':case '*':case '/':9 Y# f' T0 S2 v1 O
{csym[nLevel++] = csym[2];}break;' D/ k o$ p0 i" {, c, H* `
case ' ':case '\r':case '\n':case '\t':continue;
! v. h V" e# Q! m1 w( o default:. d4 l8 ~, a; Y- q$ C; d4 L
{nLevel=0x100; nERR=1;}4 ? C+ h6 a7 ?; g5 [
}
% ^; D$ N3 N; z2 }2 o if(nLevel==0x100)break;
8 n5 S8 H& [& k* b: }5 d if(nLevel&0x10 || istrin>>t[2]){
; ~+ _* B, b% { nLevel &= 0xF;
, L4 d# o; {2 L if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, V6 Z; p. M$ z6 B: K& A6 } if(csym[1]=='*'||csym[1]=='/'){
# R0 h) T$ S( ]2 m9 @7 q u GetExpValue(t+1, csym[1]);
& y' T& E1 G- q }9 V" s6 [: ~8 i* e- y: i
else{
/ S+ Y1 u! M% `* P S: \* P/ W GetExpValue(t, csym[0]);
6 |0 `( m' X( k- g0 | t[1]=t[2];csym[0]=csym[1];csym[1]=0;
0 M$ Q6 H# q- C7 M0 F }
' ~- @$ V( r, N% _, Y+ M' h nLevel = 1;7 G, |/ }3 Q2 R1 x6 a0 o
}
" i, g7 L1 C5 B6 U o+ |$ p else istrin.clear();
. i. V/ k! L& }7 }( K }
. c, d4 x* N. J' k7 G0 k, r else{nERR = -1; break;}+ S% p- ~9 o7 V+ R
}
9 N5 @9 D& s- E4 _. _# u if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' `9 E1 N$ W9 D6 Q/ R else nReturn=GetExpValue(t, csym[0]);
- s y4 l( B1 D return nERR==-1?1:0;
9 \# r% C; y T9 ?. q, w1 o}}
w( f& @' [4 T0 R8 Z% m
. u5 b( ?3 `- Q0 x( G4 m# E* a* c/ a# b
9 m& `1 g. |! y8 i- {函数模板使用示例:2 G S0 E# X7 t8 ?; p5 |
在以上那段代码的后面加上以下代码:
) V/ u( b i) s& k# r9 k% z4 Q( m# F d6 h+ k6 p6 S
+ j* ^: w! A+ y& o5 }% k/ a% q; B6 ^
程序代码:
7 Q, _" O4 q3 r7 b3 {- x2 n+ E% u- g4 n* i4 u+ J
#include<strstream>
# T, x2 Q" Y: b3 u#include<iostream>
; @9 b3 s; S3 M$ ?( X* N+ `) N#include<string>
7 q- Y2 U4 Y3 Busing namespace std;
# j2 Y C/ H- @3 Tint main(void)
) |6 B& _* }& |5 r' E0 g{
% F1 u- } |6 L& U string s1;
5 ?2 I6 i9 N2 p9 L4 e6 O6 I while(cin>>s1)" ~1 c- Z- e- j+ T" q/ k
{$ X: ?! l2 c a+ l4 E$ g& K& ^ `
istrstream isin(s1.data());7 f5 i8 R& K' U* x( g
double d;
" i9 h3 q9 D$ e5 n7 m+ O if(fy_Exp::GetExpValue(isin, d))/ X( A4 ^: w6 p0 e6 u) @4 |
{
3 K; }% G: j! h& i cout<<d<<endl;
5 l. a2 | E7 d- j* I: G% v" ? }
- u" j. @0 r7 g0 ]8 B7 N else
$ c/ `! t! m* ^* ~9 e) w9 z' O% a' D {8 ^6 m! e d$ ^, b$ e! m
cout<<"ERROR"<<endl;
3 N" p- z; e5 ^2 g+ w( E }
( Q5 D1 @2 z; j* i$ B }
. J* @( i$ _# y. f return 0;" f# O' \" b# J7 D
}
2 h/ ?7 `9 p6 h6 Y+ L
) l9 o& ]; \' H1 y+ c# Y" U: h% o9 Y8 z5 D: \) s( p
然后编译执行就可以了(*^_^*)- D0 |4 \& p5 Z# h; N9 a$ Q+ L- y
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% w: d9 k" f# L& A( {8 D 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|