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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
2 }% s9 i/ o: e1 Y3 X ^% I一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! Z' T3 @3 b$ d. N* T/ L只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: ]. O7 d( m' ?" E+ q参数解释:8 N* f/ F6 }0 \5 f6 o6 Z8 I& H
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! O% n* v+ r2 z1 F6 a! _% V* z; ]
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ I- w0 l1 }: M0 p返回值:! M. c7 R4 r' x5 R2 ?5 ?
返回非0表示计算成功,0表示计算失败有错误
6 T3 L' u; h* [. y% u& D m/ P0 b; f8 y" e8 y% l) D
$ x! q1 ]: {* n' w
5 {0 F" y& G0 ]1 H( Z2 w
程序代码: 9 E$ B3 O) O( J' J% P9 X
; A6 b: m: U5 o& L% W
namespace fy_Exp{
% j' U+ t0 i+ e h+ |7 { n* ]namespace {template <class _T>
! ]2 T+ l9 S9 ]7 d% einline _T GetExpValue(_T t[], char& csym){
% \: a ?% U o8 H char c=csym; csym=0;6 |' C) {7 v! p. b, r P# Q8 k
switch(c){3 z4 F* p2 B9 s# W
case '+':return t[0] += t[1];+ x% _# Z. v7 m
case '-':return t[0] -= t[1];
$ z* a; j5 C q/ h" X$ A4 q case '*':return t[0] *= t[1];3 P! V5 D/ H5 c6 d- T) D% b
default: return t[0] /= t[1];//case '/':* v' |& J+ K0 w& K; i
}
2 x1 |( W3 G2 K: r}}
; z: c5 ]* Z( N3 y- h! ftemplate <class _T, class _Tstream>$ S. V( ^2 K$ B4 Q
/* _Tstream: inputstream, _T: get return value
5 [/ j: p W+ M: t, J j* Return nonzero if get value successfully */6 z" N# S' p9 \6 Z" `$ j
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 d9 N& o! T1 W' |1 g. O9 ? _T t[3] = {0}; //雨中飞燕之作6 K. d9 R) n5 `) S3 n+ n
char csym[3] = "++";, J4 t6 W9 S* S" W! R+ Y
int nLevel = 1, nERR = 0;
$ }) y0 F9 P/ J- W: @ if(!(istrin>>t[1]))istrin.clear();
, j1 o- I; a, M% g- E/ t" R for(;;){
6 H" Y* ]$ ]8 K6 P if(istrin>>csym[2]){
. [2 m) d. o7 H$ h' p4 E switch(csym[2]){
* N0 `* h) b: d3 h. ~ case '(':
* \/ I) z7 t; T: Y ~/ ~ if(!csym[1]){nLevel=0x100; nERR=1;}else
6 C: A, X: z) [$ F5 f j' m$ ^ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;/ V, @1 S2 H+ H
else{nLevel=0x100; nERR=1;}+ V3 H5 I& M3 U, ?% f
break;
, M! F& s: V) `" N case ')':% M& }9 ^0 t6 A: B. g: p$ v/ ^
{nLevel = 0x100;}break;
( D, h# W% Q; o case '+':case '-':case '*':case '/':
- g! W4 r% ^$ J+ b0 f( q5 y/ y {csym[nLevel++] = csym[2];}break;
3 D3 |4 s7 g3 Z8 z: E1 g case ' ':case '\r':case '\n':case '\t':continue;
2 w" R0 L) R+ v. K9 [ default:9 G. V: p, j6 @* A, [$ ~+ p
{nLevel=0x100; nERR=1;}
+ H1 O3 z5 f; r* s4 D$ H7 ]/ h+ R1 ] }0 y- z2 v: l4 j! I' ~
if(nLevel==0x100)break;
( z( M2 h1 A X4 _6 ^7 x2 F* M3 d# W if(nLevel&0x10 || istrin>>t[2]){* ]" W( c- c5 m( t$ `& l8 a% Z3 m7 R
nLevel &= 0xF; w E2 e) {. K& p: G" u& V6 L
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- ^7 v4 ^+ [: {
if(csym[1]=='*'||csym[1]=='/'){
; j2 `- {7 u7 D, b9 o GetExpValue(t+1, csym[1]);+ g/ q& D+ n9 D( N6 {) s
}% f u! Y) F, B5 G
else{
9 R: }) \2 B+ u8 z9 q8 a GetExpValue(t, csym[0]);
: G/ E# b5 F9 E3 T7 L t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" e/ t# d/ r( q. {1 k- x- m }
( \7 H" z/ S/ v6 {: T; F nLevel = 1;
- B, u; c. m+ j4 l; R5 c- ` } V( |7 X' a& E) F* n
else istrin.clear();. ?' H m8 O. s% r
}7 }" `! V, ~& B5 L$ Q' z1 m5 b' i
else{nERR = -1; break;}& \, R. Q& S# v4 J7 y% n- i V
}
) H# h/ n$ p' k* t if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. N5 ]& f& Q3 F8 |0 b( W; h* T else nReturn=GetExpValue(t, csym[0]);
% X1 ^. r& A6 V9 Z return nERR==-1?1:0;% ~" l( ~0 j' D, R: H; s& [& m4 b
}} U9 I2 W! w4 o8 I: g' W) J4 F
9 a" q" P p3 b; h0 k& [& Q( i+ h" G% ^% R1 e6 E" q2 R
9 W. n# N- u) d {( u+ h函数模板使用示例:
3 e5 z" G# c' j0 l在以上那段代码的后面加上以下代码:
4 F# s8 B3 @5 y) M, l; U
2 ~; _& r2 Q/ }% C+ o1 ?" V/ c: a " j3 _4 }0 j3 m& h! E
1 f1 I( ^$ n+ _& r6 ?
程序代码:
! J- }) v% Y- D6 H- g( g( B" d
/ N) t$ g& n( i* s#include<strstream># w! i" C( W3 q* f7 t
#include<iostream>3 t( Y, W; L( {" L& D2 f" S" r/ z
#include<string>" y' {/ ?- L7 L
using namespace std;& s. @' a" x# l3 f+ j
int main(void)
4 m3 u! o9 }- ~{
5 l! |5 o0 f/ [# O! n/ v string s1;# u+ A- a6 [% V9 D# P! Q
while(cin>>s1)' J# i; j$ t' h# p$ l
{
( U! @2 _+ e6 K) Y8 \ istrstream isin(s1.data());
7 b: s4 `& J+ j3 s. Q2 ~ double d;
+ m$ R) n7 Z8 M' b- { if(fy_Exp::GetExpValue(isin, d))
# g% j y8 g/ `" L0 f$ M {
4 M; V- S5 y, t: W) p6 O' Y; s- X cout<<d<<endl;7 z0 O; J) |2 Q8 T w8 B' }
}! X. ?: A2 ^+ |% K/ Q
else5 V) B6 R4 E. b
{2 U$ I: S5 [! u1 x( |9 T2 P
cout<<"ERROR"<<endl;
# B& R4 c7 G9 V" a6 p, ?, A% | }: v3 K) T7 z% {/ M3 Q Y
}* ?+ d9 s0 p; i5 H
return 0;
& H0 B' C5 | _1 K}
- D. `/ d, p& Z0 k& o1 d$ h' {- I2 Y( u3 r8 K; K( c# K
& n, z ?) }, o. ?+ v# Y
然后编译执行就可以了(*^_^*)
* |) Y- n* x% y( @6 k2 `/ k9 S其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 B# Z6 W) f+ l* N1 @ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|