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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
! F5 j4 V) g K, p一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 |+ c& W. [+ Y6 I& q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" o" h2 a4 |# h2 A参数解释:; Z0 W0 V* D3 p) f4 v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流- M7 ?9 Q1 e% J- V* o! R
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
/ Z, n: d; S1 G: x( U& P% F返回值:: ]$ N( q, L6 Q6 P5 m0 G3 p
返回非0表示计算成功,0表示计算失败有错误
7 `/ v! o$ b( d: ~& \8 U3 a. X( V" i* ?. D& f7 l) @1 q
; U- {& J7 [ M* \" s/ r% ~
7 L1 I2 |' U; ^% K# M7 g) V0 [7 h程序代码: ( G7 l4 c, n8 W( q) E) |
3 {) H9 D" ^1 l. r4 }namespace fy_Exp{& S& s+ z+ Z4 |3 ~% F4 }
namespace {template <class _T>
2 ^/ [% \6 E2 Z% K: @# h# Vinline _T GetExpValue(_T t[], char& csym){
A3 C! @5 \6 ^2 t& b char c=csym; csym=0;
* P( G$ o4 C8 P5 S. J switch(c){& w$ {, e/ T, E# s, K: X5 j
case '+':return t[0] += t[1];! Y! v/ \9 e* h$ b, P3 o
case '-':return t[0] -= t[1];
9 z4 l& D/ }) B7 S+ Z case '*':return t[0] *= t[1];
# m+ @4 ^ u+ L/ a% ~2 K default: return t[0] /= t[1];//case '/':$ l7 @5 n% Y0 y8 C
}
7 N' W/ G" z; |5 u+ |/ u}}
2 O {; t- U# e- Y# r. R- Xtemplate <class _T, class _Tstream>& F& C4 h) L0 W- p
/* _Tstream: inputstream, _T: get return value, N- W$ ?4 e* I1 B% _8 @
* Return nonzero if get value successfully */3 M) V7 W3 w" e+ n9 g0 ? N2 Q
int GetExpValue(_Tstream& istrin, _T& nReturn){
% C8 Y0 u! U* [0 \; [ _T t[3] = {0}; //雨中飞燕之作# t7 g5 W5 {, \
char csym[3] = "++";& P5 ~8 D d& W( f A1 m
int nLevel = 1, nERR = 0;
5 O' i0 z4 }6 B5 }; z if(!(istrin>>t[1]))istrin.clear();
8 H6 u2 N4 H. N2 x for(;;){: |- D: @) o- Y. c3 c7 H, H" G
if(istrin>>csym[2]){% V4 s6 R# T. k, |' c% D4 Q
switch(csym[2]){1 \0 ^/ W) [+ N0 w a
case '(':) ?+ t1 ~+ O. B, F( a5 R, K$ r
if(!csym[1]){nLevel=0x100; nERR=1;}else
( P% E; O+ B4 u4 D if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ ?8 H5 \* C; g* P& w else{nLevel=0x100; nERR=1;}
! ~3 c Q4 A- g3 R* U3 z break;3 ^% ?% H/ ~4 z+ _6 d9 [! h5 a ?, `
case ')':7 Q8 r$ F0 j. [
{nLevel = 0x100;}break; B: D2 |4 U: C0 i# z
case '+':case '-':case '*':case '/':
q, ~( p- D+ }. D- W: p; ` {csym[nLevel++] = csym[2];}break;
8 y- Y9 o) J5 r2 @) a8 d case ' ':case '\r':case '\n':case '\t':continue;3 c- }1 e$ r2 A; Y! M
default:; N' F# `! I+ @) F$ M# v
{nLevel=0x100; nERR=1;}2 U4 @6 M: }0 M9 H
}) F5 i! s. H7 c3 z% a: h
if(nLevel==0x100)break;
' J: F8 |9 [6 \8 v0 f: @ if(nLevel&0x10 || istrin>>t[2]){
6 C- F# l+ t* J: z$ r nLevel &= 0xF;
% U+ a1 R9 |' K8 _( X) F if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 K& y( t% n2 y( \# a
if(csym[1]=='*'||csym[1]=='/'){
6 {* V- C1 N& I2 U8 q) V9 h GetExpValue(t+1, csym[1]);
+ q% L) p+ H2 z3 @$ B' q* @ }- B' X0 @3 T* T* O; t( k* z
else{! w0 h% m, ?0 O
GetExpValue(t, csym[0]);; B, c% [, ?% T, c
t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 g) Q9 T/ G* e/ Z
}
0 H1 e! V7 W; I' n0 G2 K( K nLevel = 1;9 A: z# F1 H3 T% H* i
}" A& r& C& Z* m( @6 ?+ k3 j
else istrin.clear();
) I* T5 t8 b8 o( G. B0 l5 W }
7 j. w& E. E5 Q N else{nERR = -1; break;}. s& h3 I1 o$ g& k% k/ K1 l
}* p+ F& J1 D9 z6 `8 U) r4 d! m/ a' v
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 v. F2 C3 d- m _
else nReturn=GetExpValue(t, csym[0]);
4 j8 U% G- }6 U5 N5 b0 n7 O. |: { return nERR==-1?1:0;
( s R% c. \- ]7 d1 K+ x* x}}
& d: c6 j a7 p* u$ }7 q2 c- {% @* O) H8 N# e5 a
6 n z* Z9 H) u
6 U' X% [- } K, a: v函数模板使用示例:
4 u7 T3 d2 P3 U" D4 H在以上那段代码的后面加上以下代码:' ]0 ^8 \9 C) D
+ |1 y- f+ m2 m1 x' p 9 X" o$ t6 r" F
& ?& a% D! k2 B. T+ C( I
程序代码:
: S7 w6 ]# i% _. P1 g g# {+ e; o9 H/ N, E' i; w
#include<strstream>: U5 x" f( h3 K4 z' V- d% |
#include<iostream>
. L4 A; E7 Q+ u#include<string>2 k# W! |" ^6 V; s. ~" D1 r
using namespace std;5 ]# Y' b1 f2 V! p* p
int main(void)
1 k+ _9 Q: e* d% H{. I$ y5 m1 a6 X4 E0 h% f/ A
string s1;
: g# G* @- o) I while(cin>>s1)
6 d0 E2 p9 K/ `% |( u {
: k0 f& x/ _0 D8 Q' ~ p- s istrstream isin(s1.data());
& x- b0 |' j' J0 h double d;) t5 {, |) t H) r7 a- t. p0 j
if(fy_Exp::GetExpValue(isin, d))" ]% Y. t- b# |' Q. i
{
0 Y# E$ ~! V- p/ U- ? cout<<d<<endl;' i9 I* W3 H# ^, S" J8 m8 J4 V
} g6 A8 m x: k" \$ L! U
else$ l+ ~/ ^; C9 A7 P2 c
{
! G, T% [0 T' n" i7 I% r cout<<"ERROR"<<endl;1 u1 @$ a" r& ^- F0 L0 k3 ^
}
/ ?! q) m4 t: u" M7 q" } }6 T3 s0 s: J6 J1 t0 ]5 V1 \1 _$ y
return 0;
! l% H- T$ y, R& j9 z3 N2 }" [" a1 N}/ T) Y0 }+ Y \# f
% p, n5 s5 R" _
: M3 ]' j5 e8 w& t9 j* Z- ?然后编译执行就可以了(*^_^*)
6 l) w8 |( x1 \! ^8 l0 T8 o3 j其它:TC++上一定编译错误,不保证在VC6上也能通过编译& `0 e) f4 U& {8 N0 C+ S
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|