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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,/ r2 I3 P+ }: x0 _( w1 w
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' K- t* T" P3 `" e只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn). E. Z q8 p O7 [( }7 N# C( e
参数解释:3 z& q$ F9 y5 o& P. [
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 E; m3 i4 ]& b6 {2 Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& B& t9 g6 I5 ]返回值:
& J! f, Y3 l( S6 j返回非0表示计算成功,0表示计算失败有错误
3 `" h& J+ O: O
* D: b8 u( L5 R 4 B* l- J3 L7 x# i
5 u1 K+ b4 n. w
程序代码:
; O' ]3 u6 \+ G1 f& z7 J
% K- D5 g) X2 {- U7 O0 T }namespace fy_Exp{: o9 k1 u$ Q. q0 d" Y5 v5 l0 ~$ G
namespace {template <class _T>
, S* G8 [, i- f# Vinline _T GetExpValue(_T t[], char& csym){
' t1 ?1 C1 G# ~) f4 W+ D6 ], ~' M char c=csym; csym=0;) D% j3 ?5 t: S$ b- a) v
switch(c){! f) Q( R, P9 c+ \
case '+':return t[0] += t[1];8 I1 _$ ^7 F6 j, g: c* r
case '-':return t[0] -= t[1];
# l6 t% m0 ]4 N7 f% F case '*':return t[0] *= t[1];5 q3 D4 g* `, f6 Q- p
default: return t[0] /= t[1];//case '/':
. u: @1 P) @) p% L7 D7 X }- e- t+ @4 z+ f/ e
}}
; z9 o" L% p- R. _. L# P2 R+ {/ t" F4 Etemplate <class _T, class _Tstream>
3 `9 L/ n6 Y" B* z* }" M& I9 N" M: O/* _Tstream: inputstream, _T: get return value
* G H: c5 B* ?* q* Return nonzero if get value successfully */
( B; t' h& J: s" S7 qint GetExpValue(_Tstream& istrin, _T& nReturn){5 ^" P& z; _" ^1 r: P, q
_T t[3] = {0}; //雨中飞燕之作
4 G: W/ E8 f* T3 I8 I char csym[3] = "++";
& i2 u7 O x8 l1 l) p int nLevel = 1, nERR = 0;
3 a6 t0 s$ j% k) S* Z; v if(!(istrin>>t[1]))istrin.clear();
" @! a$ z2 }* V4 B+ ~9 o3 W for(;;){
7 z7 W) P6 H; C if(istrin>>csym[2]){
0 g3 M# k( p! l1 b' E6 ]! Q: p switch(csym[2]){, \7 A" Z$ \2 c, p8 J. s) p
case '(':
7 H7 ~/ z3 G. L! \ if(!csym[1]){nLevel=0x100; nERR=1;}else& p! _8 c8 S K
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
1 f! t+ c" C3 i8 l8 X3 m9 e else{nLevel=0x100; nERR=1;}7 k: H' W: H* i* k+ y$ _
break;7 e2 t& E/ A8 w1 Q' A" S; @. t! C
case ')':
) C3 o7 x& @4 h/ A+ \- X {nLevel = 0x100;}break;" d5 Y4 s( l$ U( I$ b, y) p l
case '+':case '-':case '*':case '/':1 x: s( d3 q1 [6 @. Z
{csym[nLevel++] = csym[2];}break;$ ] y$ h" s& M+ v8 s' F
case ' ':case '\r':case '\n':case '\t':continue;
( E" O7 x+ ^& u& |, @; {8 W* w8 _ default:9 m0 _) {1 o' ]. t& A
{nLevel=0x100; nERR=1;}
9 S- T) q- b5 M+ \# k+ w0 k: c }0 C! r1 F( N s
if(nLevel==0x100)break;
9 B7 e, O6 y, y if(nLevel&0x10 || istrin>>t[2]){
" S7 }5 e' ?# N: b6 H nLevel &= 0xF;
# P0 M' ^; E6 f& V1 e2 l5 _ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}4 `* O; @8 f0 {. d Z2 [0 v3 `
if(csym[1]=='*'||csym[1]=='/'){$ e7 ?, G; J8 g5 |! i+ h
GetExpValue(t+1, csym[1]);9 c% m" C% q" T R1 J
}: W. L+ `6 ]9 q3 n! `' C! Z8 m
else{
1 R3 ~7 m( r8 `" \( x GetExpValue(t, csym[0]);
F0 A! g' v' y% H9 [; D# M t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! j- w" M4 s9 a8 ?: }- K }
5 ]+ S- L" [) L3 V nLevel = 1;
/ S- S& u) G' d4 ~ }
9 Y: r& [; W3 c! A9 b0 o else istrin.clear();
4 D& J8 |( m* l- i- D; J* Z' T; l }. G9 i9 n1 K9 R$ A6 I( p
else{nERR = -1; break;}
' e+ P% k' c( q8 K: L }
; {. ^3 w2 }% [( o1 P if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 x: v) L% w/ }' G3 q" d
else nReturn=GetExpValue(t, csym[0]);
* j6 W3 Q* n% [! r return nERR==-1?1:0;* z9 J5 w; d- z) P
}}* p0 X5 y1 ]2 s
* w, \: ]$ i6 D3 u; T* d+ e. t- w w! V
% f* r7 T+ {; H& ?
函数模板使用示例:
$ A( t# d# r/ q# ~7 ^; e在以上那段代码的后面加上以下代码:4 E; S: k9 V5 r( p$ h* J) B
: j' d- Y/ H& b1 O- O5 m8 B 8 C6 h2 A8 p( i* q1 }7 s
- C( J. `: c* E: C( }
程序代码: . b/ S/ x' K& u
3 _/ b$ k; w5 J8 e4 n9 A9 x#include<strstream>1 s' O6 ?3 h* o
#include<iostream>( J9 [7 m+ |5 K' `+ Z: m
#include<string>
# H& L2 @1 L( F' T1 I; c# Ausing namespace std;
, w. P0 `% w$ p# h$ Qint main(void)
( t8 X9 w( O" s4 k) M. {6 p8 o{6 ]: U3 U+ `, d: \7 _' k+ s
string s1;
& T8 B4 X! k# `+ X while(cin>>s1)
0 k9 C3 h' O8 w9 ]8 O% |0 M1 z {
6 D" H. @; I$ _* n3 H istrstream isin(s1.data());; v& a7 b9 ]5 }0 D
double d;% b7 k7 @0 u1 a' k$ D4 B& ?
if(fy_Exp::GetExpValue(isin, d))
$ S& Q0 M# i7 p/ x3 @) s {! }8 @& a6 w! u: z. l" |$ s
cout<<d<<endl;
9 {3 \ _/ U4 t/ |/ ^" x }+ L) K& M, r5 z) ^
else D( u* {6 R' ?6 w9 J
{
6 b2 l; q4 g1 `+ D! P' {9 b- v cout<<"ERROR"<<endl;
@% ]# r7 C; T1 x( R8 Y# N }2 T: ^, |& G5 M: ~
}
, `0 q- M! P$ Y8 n return 0;9 t% v$ B$ b. f
}
7 v( P# ?0 }3 j% ^2 E
. X! L6 p" L- ]' y" @; C9 u2 p5 w7 D" x6 H
然后编译执行就可以了(*^_^*)/ r+ F# j( {$ ~; ?, H1 W/ H' ]! A3 {3 h
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: F! K/ X5 j6 a 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|