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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
4 @% v8 }% |7 A# p7 a f0 f/ R一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 l7 j& k6 b; F4 Z6 M8 b只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) }6 E$ B$ a0 b& }4 a: K% Y+ O参数解释:
* n9 d M+ L- H0 a Uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: D% F$ G9 s; h0 c. b- mnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" X9 i7 ^- g1 j) E' w返回值:) Y5 u+ A4 g8 t' l; W- q9 A, k
返回非0表示计算成功,0表示计算失败有错误( P9 N L8 Q: S
' e. \7 Y, `3 s/ \ J3 Y; y
9 e g1 Y8 I2 N( g2 A
( B0 w" B/ G1 z0 f" e9 P4 y程序代码:
- f+ F+ \2 i( Q1 {$ ~! E4 W/ S8 w8 C( a$ b, c
namespace fy_Exp{0 K2 T" E9 ?% ~
namespace {template <class _T>. c( r! `. U8 |7 {
inline _T GetExpValue(_T t[], char& csym){% {( c2 _$ y2 I% v" A, N
char c=csym; csym=0;; c; t. P. H8 a3 f) Z# F
switch(c){
# l# g" K3 O0 A5 `2 } case '+':return t[0] += t[1];
9 G8 p% N5 v J( b case '-':return t[0] -= t[1];
! \% l+ V( I% o6 N case '*':return t[0] *= t[1];9 |4 F( ?8 G8 D6 N- A
default: return t[0] /= t[1];//case '/':0 d* L# z% P8 y
}
. u9 Y8 ~* x1 K& P$ C9 l}}6 N7 [6 b! X/ ], d6 f
template <class _T, class _Tstream>
8 e1 i/ J0 g. q4 m, m3 a( G1 B/* _Tstream: inputstream, _T: get return value: f8 a. L2 c8 {" }0 `
* Return nonzero if get value successfully */
; l' |1 W+ A7 p* d$ I% Cint GetExpValue(_Tstream& istrin, _T& nReturn){
0 M _: |- Y# ~& B, N _T t[3] = {0}; //雨中飞燕之作6 U8 L8 D) b( c, Z: ~$ O
char csym[3] = "++";
+ N* g5 ]* ~8 j3 |8 c. T* g4 L j int nLevel = 1, nERR = 0;+ P' G* Z) f- T
if(!(istrin>>t[1]))istrin.clear();
+ g- n* l/ j/ i! x' k4 d for(;;){
# r I$ n$ f9 y" B1 u' u+ d7 e if(istrin>>csym[2]){
8 r$ ~' J) [1 n- D) H8 Y4 x switch(csym[2]){7 I, r8 K6 b0 C5 J% h
case '(':
8 Q$ n& _' D/ p if(!csym[1]){nLevel=0x100; nERR=1;}else
& D- d3 |, o \& r. f if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 }0 V2 W1 I8 V/ R5 J6 H
else{nLevel=0x100; nERR=1;}
2 E6 W) h7 |% u5 f& [ break;
+ T: A/ V& S. ^3 F. o case ')':9 I5 A6 z- @' ?1 g) O5 u
{nLevel = 0x100;}break;
- d4 A, J2 I! b! u2 g8 W case '+':case '-':case '*':case '/':& D! J% S; h* j$ c! u
{csym[nLevel++] = csym[2];}break;
. J( G9 f. Y/ O! F case ' ':case '\r':case '\n':case '\t':continue; ^4 I3 D% v6 _$ Z" Y
default:( r' M2 I1 C6 N4 v7 H
{nLevel=0x100; nERR=1;}
6 C- Q' s2 d0 z! I5 {# x9 a3 F }) }# E4 d: R( c$ D
if(nLevel==0x100)break;
1 U. ? d- x7 o* t6 H if(nLevel&0x10 || istrin>>t[2]){2 p5 r4 N) O0 O
nLevel &= 0xF;
z$ q8 I1 X7 g2 W if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 m5 j3 c" ^( e7 M" F& S if(csym[1]=='*'||csym[1]=='/'){4 A* |! x) v( Z# R. P
GetExpValue(t+1, csym[1]);6 g) k( g) Z% H" V' f `* C$ s7 W
}
; m: \0 N* c2 h. ?3 A8 ? g else{
- K( V" z2 k4 W. q. | GetExpValue(t, csym[0]);
" C1 G3 N% e+ C, e- k! g# { t[1]=t[2];csym[0]=csym[1];csym[1]=0;
6 X( }; n& I* e0 h9 o# @ }& N) Q7 ]. d2 X M" {6 a: \" T
nLevel = 1;
' t& a4 `0 O2 r# L( G- F }, Y3 `0 d- _9 x
else istrin.clear();
# T9 s) c# h6 r. f }! R/ u; U) ]- W. o4 S1 T
else{nERR = -1; break;}: M& L. g- p: y0 \" |+ H5 u9 J
}
1 }/ S# [/ a3 ]4 N" |; w( x( y+ F if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% i* y+ {; L3 u7 a
else nReturn=GetExpValue(t, csym[0]);
! |; a$ c2 N8 n# ?; ?: Y4 B return nERR==-1?1:0;
* ~5 {3 j2 q( O) ]9 `}}
4 N, G# q0 e% L) B0 d8 L- y, e+ j/ b' L( U
. v# F. D- m- C! u
6 N( n$ u9 ^& s
函数模板使用示例:" G" l+ W6 v5 F! q9 _4 c
在以上那段代码的后面加上以下代码:
) W( @' W; v/ ?+ {! F% ]: {1 C* M- Z2 s7 H7 a9 G5 k" O+ `
) s/ m e0 V7 f" v- w( z
% f- ]0 U0 z! G6 C" C& J4 {+ D程序代码: $ J- D% o- a& [2 q
( |5 k. Y7 \( t' J4 @2 L#include<strstream>
) X6 ] d: ?4 ] B- A: C5 M; f( h; t#include<iostream>$ G p4 ]4 ]$ a
#include<string>
+ Q# U: I, B0 x: g% K8 {using namespace std;1 G6 c' Y6 l$ a4 Z5 |1 S1 O
int main(void)
* T+ }9 ~6 Y$ r6 y{' v' M4 B% Y0 _* h$ I/ b
string s1;
4 [; G, ?2 \9 h3 a( Z while(cin>>s1)+ _3 G9 L) _/ V8 ^- H( e
{
7 i1 I* u, Z7 T$ Q+ _* r istrstream isin(s1.data());0 H7 v( \9 T0 e+ q+ C5 M* [
double d;6 R9 N u; o$ L/ A n$ x: R8 N
if(fy_Exp::GetExpValue(isin, d)); s4 i# B- T" C2 b+ m; v3 E
{
4 I9 `. F8 H6 T: ?" Q8 w+ N cout<<d<<endl;
( d7 K! s& _2 {& l0 ^ z1 g }
/ ^ a, F/ \: ~$ {! u: u! ?3 h" h else0 Z: G" a9 @0 \
{9 k/ c5 \4 L; ?4 B( G4 Z
cout<<"ERROR"<<endl;1 ?5 k9 T# j+ s4 u/ B, X0 [- x
}
) `& Y/ x- J6 b5 K/ V3 J }
4 `8 e- M1 [2 ~* Q return 0;
9 H! m7 N9 c2 K1 h6 m. }& e$ o) `# a}3 V3 o( f' Q% V6 _
! P. L/ Y& B* X2 p3 c# b: f ^ z# w7 S6 @' u
然后编译执行就可以了(*^_^*)
7 B7 | J. o3 Y1 N# b5 |其它:TC++上一定编译错误,不保证在VC6上也能通过编译' E& E9 z8 k- }1 @! P9 x
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|