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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
$ z2 E% c' _; R8 [# S$ ]一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 R8 P2 ^9 O1 ?6 e7 Q7 b" z7 t
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) J: d$ h0 K0 Y+ v. Q/ J参数解释:5 Z5 y, D/ W& d! ~- b7 y% Q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流- x6 I& `8 B. f) y) }! V; T' |9 F2 A
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 e& j' I2 Y R+ H* H1 V1 H返回值:3 }9 Y4 G; _9 f1 u/ m/ a
返回非0表示计算成功,0表示计算失败有错误
4 A3 S2 d4 K0 s, F# W a, A
: Q/ ^' A1 u1 `/ m0 }6 D - @0 k4 G3 f: n5 q
, v2 s. a1 o$ x: l程序代码:
- z" g7 e. W8 ~
4 P1 v3 n; t9 A5 F% J$ E$ v% nnamespace fy_Exp{
1 f, W& T" T2 ~9 }namespace {template <class _T>, m9 f; k: u7 `5 Q
inline _T GetExpValue(_T t[], char& csym){
( f7 a! X% {6 P0 c6 ~+ }% \ char c=csym; csym=0;
& g) a; l& H$ h8 N( Z switch(c){
' R& [0 L* A5 G5 S; y2 Y case '+':return t[0] += t[1];
" f% _+ a+ }% |5 T case '-':return t[0] -= t[1];! k$ S6 X% S0 y& l6 c
case '*':return t[0] *= t[1];
* f$ D" e2 d/ b9 {; H* Q5 r1 D! u; H0 r default: return t[0] /= t[1];//case '/':+ y. x. w; j# _4 O: G4 n
}7 M0 [+ B4 D9 m8 P/ I
}}6 U$ ]8 e: \) b" X: S# G+ L4 o
template <class _T, class _Tstream>
9 D; O( N9 z- q \9 N4 z; X: ~" x/* _Tstream: inputstream, _T: get return value7 F M1 \0 G9 }+ a5 \
* Return nonzero if get value successfully */# g; R j: @6 ^' W0 P- ~
int GetExpValue(_Tstream& istrin, _T& nReturn){
( E. e! ?0 Y- g; m _T t[3] = {0}; //雨中飞燕之作
0 H: f$ n3 d' u0 j1 b3 B \6 d char csym[3] = "++";% r) U, B$ O, b+ u& q" @
int nLevel = 1, nERR = 0;" R$ W) @* i+ e( ^
if(!(istrin>>t[1]))istrin.clear();' u2 N$ I/ Y8 E" ?% X8 y
for(;;){/ y% m% H& I/ l/ A
if(istrin>>csym[2]){
' ?3 X) ^7 U% z$ N0 O* N switch(csym[2]){
! q) v# v4 s( i/ l+ K$ g case '(':& h. |9 ]* m4 q& f
if(!csym[1]){nLevel=0x100; nERR=1;}else! z8 o0 w& J8 H; E4 t. D
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 U* D' g' Q: C
else{nLevel=0x100; nERR=1;}
) }2 p( m3 b" C4 _: @ break;
, Z+ U2 k/ J4 C2 ~9 @$ P case ')':- n5 W1 s+ H8 F3 ]2 q" e4 H
{nLevel = 0x100;}break;
0 {3 o) n6 q! e* b& {/ ~: U( V; N: x case '+':case '-':case '*':case '/':/ H( x2 Y, ^7 o; L* q; O2 l& C, a
{csym[nLevel++] = csym[2];}break;
+ M8 r5 h% Y9 y. o$ x# S case ' ':case '\r':case '\n':case '\t':continue;% Q5 ~6 C+ H0 `' y4 q+ z
default:
8 i8 |' m) U5 G+ E1 d% R {nLevel=0x100; nERR=1;}9 D& q( P/ S# e* U
}3 Z: O( ^% J6 s
if(nLevel==0x100)break;9 }! y4 \; e$ H
if(nLevel&0x10 || istrin>>t[2]){
) q0 z3 u$ U. \2 Z nLevel &= 0xF;
# D: J# { {' M) @( _7 w3 J# N if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 u3 s4 w' g2 r8 W/ W3 S2 R if(csym[1]=='*'||csym[1]=='/'){9 M* w9 Q# K5 |8 t6 k
GetExpValue(t+1, csym[1]);
3 d5 J: q; _7 p. }2 W' m }
9 e6 l* L& R8 `6 V/ a# t' x else{
; {0 @0 o! K# a! n! D GetExpValue(t, csym[0]);
" U& u9 ~# X9 ?4 \' m6 i t[1]=t[2];csym[0]=csym[1];csym[1]=0;2 c' T+ A; `3 [5 N3 z9 N! T9 Q
}- N# C, s0 y- I! V3 `2 ]3 a
nLevel = 1;
6 Z& I* v! b/ ?* O }$ e n. k& i* J% I, G* @
else istrin.clear();
) s3 ~+ m/ E$ d0 U. M5 v }7 N, Q5 N# D) H* m8 D
else{nERR = -1; break;}# w3 V4 i$ Z" b% i3 i) f& I
}) [$ ^- |. H7 O7 V8 `9 r
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% r# C! N! y i2 S+ M
else nReturn=GetExpValue(t, csym[0]);
P6 b M5 Z, x& Y' m; H return nERR==-1?1:0; L# z) g% B" Z
}}
2 Q I) E' M. h6 }2 m- E% N# ^3 s6 ?( d; [4 r& W3 S8 S0 a9 @/ M& p
( J! P0 m+ ^4 ?, s
; }& {' R! d6 ~
函数模板使用示例:
. m/ F+ f) }/ a在以上那段代码的后面加上以下代码:: C, k; e2 H; E& L7 z0 Q w& ~
# C4 k( R" C+ ?* p$ E* B8 y1 j, { * O Z" T8 V( o% r' n% P+ O o
3 F( R7 u. d( c, ]: x2 n+ ?+ d, i程序代码:
9 n8 e$ _3 Z* M+ \/ A% ?
3 V- w" }' o4 b! Z9 r6 `/ v4 b: {7 W#include<strstream>2 b! j, W3 F: @' u" k
#include<iostream>
) ?) X4 p! k3 @ ^0 M/ v w4 y, g#include<string>6 \( O5 i y7 o" Q3 o
using namespace std;
: S2 N* I! J+ j9 P0 lint main(void)" ]) J9 S: i7 N) X3 K/ V
{8 A3 w9 n. r( @' i- X! k6 L8 {
string s1;
( `9 _! L) c r while(cin>>s1). T* H% z: S$ f3 K
{" V5 }+ Z* F3 L" a) p0 n
istrstream isin(s1.data());% V/ K5 t7 I/ L' D
double d;
- t1 z! U* X- s( { if(fy_Exp::GetExpValue(isin, d))9 H0 N8 m% z1 z$ }0 f
{
5 W9 u2 c5 X1 N6 q0 f6 q cout<<d<<endl;* R8 r6 u# ?& h: T3 i3 E1 R/ y
} g: y9 g5 a; r* N3 ^# P
else1 Y! x# L- Q' y. o- x
{0 L. L. W& m" X" [8 L
cout<<"ERROR"<<endl;; S' K2 N0 H2 }( r
}
+ }5 i# n c1 Z; h8 v1 o4 X+ } }
; ^" ]" F( W3 N8 Z return 0;0 X }4 |& m; _! P
}
% K/ h" o0 ?2 k p2 A4 V
% l3 w. M0 o9 f% u" {
6 \: v& E1 \% r) r' ]" {# r m% u然后编译执行就可以了(*^_^*)
6 o3 r. X) ~; _8 W3 ?其它:TC++上一定编译错误,不保证在VC6上也能通过编译. ?( o) K! Z- ?/ P
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|