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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,7 B! V- a0 h- U+ Q' ?
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! e/ w4 g9 z4 N/ _ x3 E% O2 B
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# ~; |7 t l+ `- `- I( G, j3 G1 M参数解释:% d2 g5 V! f% }% |' k- j
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流, h( U$ \$ a H5 f# C
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; {$ H9 T+ ]6 c/ s" j/ T* n& g! H( N
返回值:
* ?8 U, K! D) u返回非0表示计算成功,0表示计算失败有错误2 b3 Z2 ?: Q3 o6 s3 {
, t5 d4 W. @9 u1 M+ O 6 k; k/ s- m$ _9 l! h: s/ ]
$ x7 }: H: a$ ]! ?" K6 U9 C
程序代码:
' K! }# p3 x \' j) G8 X; S: u- d, U# J8 t/ u" d. q! I9 }
namespace fy_Exp{$ m a* n$ K) ^0 d/ g0 R
namespace {template <class _T>
) ]! V7 v! `* ]) e" Einline _T GetExpValue(_T t[], char& csym){/ d2 x9 Q# X2 A( Z: J
char c=csym; csym=0;9 A+ v+ a8 e7 E5 D
switch(c){% I9 D# m! c6 @$ b/ x% [( R& g& u
case '+':return t[0] += t[1];
. ?7 x: p* t' m/ K& d( C6 e case '-':return t[0] -= t[1];
# R4 Z4 E5 N, Q case '*':return t[0] *= t[1];
% V9 x3 |6 Y4 D1 K% J5 _$ ` default: return t[0] /= t[1];//case '/':% C; a% ]; u" l" o2 C# Q
}2 [/ Q, n" f; P Y' q
}}
$ S H; f4 d1 S, _; I3 ytemplate <class _T, class _Tstream>- Z& |& r @1 {# |) |
/* _Tstream: inputstream, _T: get return value
1 j7 U1 {6 I) l2 `' O) p/ ~/ R* Return nonzero if get value successfully */* t4 F. D0 P, e/ U1 t
int GetExpValue(_Tstream& istrin, _T& nReturn){
6 t' v6 ~+ D, o' d1 O _T t[3] = {0}; //雨中飞燕之作
! ^) N8 _2 a9 d& H+ {$ ^! ]* e5 ^ char csym[3] = "++";
5 G0 I8 l; J5 T int nLevel = 1, nERR = 0;
9 q( E: ~ d% |7 t- v* i if(!(istrin>>t[1]))istrin.clear();
% ?6 b) \6 ], [- @: {- d+ W for(;;){
; }1 x5 A# G" T6 B if(istrin>>csym[2]){" S6 R- O6 t' I
switch(csym[2]){ q* W! g: [2 k3 o) ~ L( [$ G/ U
case '(':7 D9 _, A0 W! \) [
if(!csym[1]){nLevel=0x100; nERR=1;}else
7 G; p5 A/ @& R- t s if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, ~# S+ K! M3 D
else{nLevel=0x100; nERR=1;}% l5 H T5 A9 l5 W5 ]: m% ^
break;. g4 `8 V" F0 N- ]
case ')':; K- w3 h$ @. [7 T
{nLevel = 0x100;}break;# T( y- W& H r3 @
case '+':case '-':case '*':case '/':
" O! M! P; _2 n4 C& D% a5 F1 d {csym[nLevel++] = csym[2];}break;- J1 }) V1 b( N) ^7 {
case ' ':case '\r':case '\n':case '\t':continue;
4 Y9 e, P* @9 V- A0 ~ default:& B4 |$ X7 Z4 }3 R, ~: M
{nLevel=0x100; nERR=1;}6 L; s4 y$ b% y K" u% T0 q! K
}& l9 ?) O6 j* f2 U
if(nLevel==0x100)break;3 v0 a" W/ a8 [# w& L* J
if(nLevel&0x10 || istrin>>t[2]){
/ j) [, x" j9 ~+ ]; C" q nLevel &= 0xF;8 Y3 [! ?/ [& ~, ~& [
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- e! i+ X1 y2 g
if(csym[1]=='*'||csym[1]=='/'){0 u% o/ E( ?' e [' u) }' i
GetExpValue(t+1, csym[1]);! b/ r$ O( a4 }. W6 z2 H& L* U5 Q- U
}
0 q7 j# O( }( w else{
: v% p; r$ g6 D9 ?+ A GetExpValue(t, csym[0]);
" p6 h- l; C0 o& O3 o: U t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# J+ E5 \4 [- q* ^ }
, |8 }1 x4 `, I O }) J nLevel = 1;
: R% b& D/ J+ N }
: B& }! F5 t$ I9 ^# C& |& K( [5 q8 n* B' [ else istrin.clear();/ q- Y, D/ a9 Y$ D4 j+ \5 P: m$ [
}
- M, n) ?; O1 A( _2 [ else{nERR = -1; break;}
4 a7 |+ J2 x& @" V' [* T }' J- c5 q7 p$ W* `3 J
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 u- i, V% l/ n( ?# u; H; S ?
else nReturn=GetExpValue(t, csym[0]);; `8 K: d' i3 l) h1 N
return nERR==-1?1:0;
3 `" C: f3 D: x+ ~' G}}& N7 U3 i% |% y( M0 w( d
7 }( r$ A/ o7 p, ^
p! w: w! d4 w9 u2 n3 t7 ?# t
" i. M: S- _: S函数模板使用示例:
9 q) s& U+ Z. J$ A在以上那段代码的后面加上以下代码:0 Q. Z9 R/ b! e X3 _9 a: I
$ }+ o( r, U3 {0 _2 q 8 N+ k4 C2 r |6 X
1 [6 a' l' d7 s% ~程序代码:
: q& E1 r4 U: Y# ?; t9 D& B% E+ T; \& R5 P0 H8 @0 [, g
#include<strstream>& h# ]; F) n9 w8 S* z
#include<iostream>3 F$ ]$ C. D) J N G
#include<string>: H& [5 U* n9 M2 v$ y- ]
using namespace std;
% l% ^% {( I6 \' Zint main(void)
1 p1 ^) ]( v' @6 p' E; y y3 p9 a{
% W( c; {# k& H2 F+ v; I string s1;0 r7 }2 A: x" H9 b
while(cin>>s1)1 u! `4 b) Q( A% g3 y/ v" [2 `8 n
{5 M+ u4 ]; s2 S
istrstream isin(s1.data());
* J i4 V, V0 a4 \. @! O double d;7 k8 Z7 @( L7 o$ [( U& D
if(fy_Exp::GetExpValue(isin, d))
3 f/ O. a$ F" F! a/ j- [6 O+ F, C {
, P( z' s( @4 A1 I/ X3 G6 j0 n/ y4 | cout<<d<<endl;
1 \8 j* X& @" J) G {( F2 e }' d! U( K$ n% \! @& S+ s& @
else
! G" u' _/ j, F, a& G {
" A: `, \2 S; X6 `( ` cout<<"ERROR"<<endl;3 u& G- z, u6 N* n( A" G6 B
}% r+ a$ a5 |# b. A1 ]. [6 s
}# b$ `( g/ I6 K5 }0 l
return 0;- h, I- b% @; q1 c" E; `; ]
}
0 c6 ~3 \6 P7 k$ \* K
/ @. F, H9 c* N- J0 x
+ |5 m/ [2 @' p% H+ _3 ]# N2 |然后编译执行就可以了(*^_^*)
3 |+ W2 w: x3 w1 K4 u7 @其它:TC++上一定编译错误,不保证在VC6上也能通过编译
$ ]$ h5 Z3 q7 ~, _9 z* f8 q/ p6 n 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|