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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,/ q) r8 {. T1 M O7 ]
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" d! ^' e1 E2 b1 o$ E- E
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* r; w/ H0 J: s0 D( @/ L; [
参数解释:
$ r" Q% x2 }/ L! V2 t$ A( G0 iistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" b2 a5 V" C- b% nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" M* t3 L: Y6 T V2 K
返回值:6 b3 g: K; [, \: D/ I# [1 p
返回非0表示计算成功,0表示计算失败有错误
& B- l& Y- z+ T5 s' o
$ ]/ Q5 t9 S- w* T
! E U' N& O8 f3 R4 w0 L8 D7 Z9 S$ t, F" F/ o
程序代码: 7 R; c' B4 o3 {3 f/ _0 i3 R% \
6 B) G' y$ e# Y
namespace fy_Exp{! X% K" L. Q) L8 Q8 Q' B1 Y
namespace {template <class _T>
8 R: {6 I% i" h. n. Hinline _T GetExpValue(_T t[], char& csym){, p. | r1 C8 m6 G1 `- A' F
char c=csym; csym=0;
, G0 q. t5 \! i8 S: v switch(c){
% D5 \9 I8 T# L% u& x I1 w case '+':return t[0] += t[1];# M8 i. @. V/ K O
case '-':return t[0] -= t[1];
! ~& b. Z5 E* R. B6 } case '*':return t[0] *= t[1];- k5 ?2 e8 H2 [8 S( A: {$ }% A
default: return t[0] /= t[1];//case '/':$ S: J. u7 H2 f% g/ _ k
}! g8 I' m8 Y, E0 T
}}
/ B6 e1 V' `; T7 ftemplate <class _T, class _Tstream>
: ~: Z- U# r9 ~4 t/* _Tstream: inputstream, _T: get return value
: X5 a. R b3 c# x$ m* Return nonzero if get value successfully */1 L; g% E8 b& m* d
int GetExpValue(_Tstream& istrin, _T& nReturn){* x3 J( [3 K4 p+ v6 W& p9 I
_T t[3] = {0}; //雨中飞燕之作
- E" w1 B$ k) i6 n* |; I, G char csym[3] = "++";' G/ n) C k q |& d0 z
int nLevel = 1, nERR = 0;
0 s! E# v8 r+ C: M3 Y* w# _! a if(!(istrin>>t[1]))istrin.clear();% O5 Q# H; \5 n. T. S
for(;;){. D( Q% b. q, j9 y# x! K
if(istrin>>csym[2]){: G& C2 d- @* ]2 |% w; | ^
switch(csym[2]){/ V, q* }1 b6 p& D* v
case '(':
9 @" T; S! `: {1 Y( _ if(!csym[1]){nLevel=0x100; nERR=1;}else# z' F( v2 Z$ ?/ [. J! ~
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 b3 i! N6 r+ l$ X else{nLevel=0x100; nERR=1;}
0 C: v% x2 u! d: p8 m break;
) x: h% s. z' u9 p case ')':$ {- G4 u% A, v+ h8 j8 D* r P
{nLevel = 0x100;}break;
1 Z1 }4 ]$ t4 l" t3 c8 F% U$ f: k case '+':case '-':case '*':case '/':& n+ u2 i# ?6 W
{csym[nLevel++] = csym[2];}break;) L% I5 w+ z. t4 `" `/ ^! @" J
case ' ':case '\r':case '\n':case '\t':continue;/ e9 S- n- K+ }; n# {
default:
' t5 k/ u2 d9 v5 Z3 E {nLevel=0x100; nERR=1;}& a; F+ d) ?& o4 k
}
: N' [% Z# m$ T5 D2 B/ [2 O* c if(nLevel==0x100)break;
# \# y- ]) i* N* C4 H; ] if(nLevel&0x10 || istrin>>t[2]){
: }3 L( J3 P7 |4 ]" n; j: L- p: M nLevel &= 0xF;. Q% ^- N% h, z
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# Q% e& J! ], I m/ l( f7 g7 ]7 \/ {' m { if(csym[1]=='*'||csym[1]=='/'){8 l$ a$ k0 A3 l$ s& |
GetExpValue(t+1, csym[1]);0 L$ ?7 o/ a$ W k. H, v* ?
}
5 n m5 u Q% f5 n' |. s$ M else{1 n( b ^9 x9 K9 {& i; Y
GetExpValue(t, csym[0]);
9 Y5 i1 R% f" V t[1]=t[2];csym[0]=csym[1];csym[1]=0;
0 R8 Z; q& w3 c ] }
, C6 ]/ f& X/ d, X& x nLevel = 1;0 N9 H+ v! t6 D) {0 R2 I
}& {+ M# S1 a/ D8 M9 f) I1 B
else istrin.clear();
4 z h% }# h( v. s/ c q+ j* p( X }8 L' G6 _7 ^' N k! g: c# c
else{nERR = -1; break;}- [, B2 d: b' t$ o
}$ C( E; v. d3 m- f0 D; V- J# s2 {3 Y7 b$ z
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- k$ v& o8 |0 V, m
else nReturn=GetExpValue(t, csym[0]);- S# Y9 F, J* f; s4 n1 w% Y
return nERR==-1?1:0;5 e" z4 d E7 d( S' ]6 v; i
}}
; P( e! g* L7 A
) M6 I8 @( K( ?; }' m2 E) S$ s# E$ a5 K7 d9 z
: ~) B Z: `: T" Q函数模板使用示例:4 ]5 | m; t% h' w( _3 q: u
在以上那段代码的后面加上以下代码:# p* i" T5 r! v
0 D: \; h$ }, [- m$ R # Q2 j* e" j8 a6 N
) ^2 Z [+ Q% d- V: B
程序代码: 2 r+ I+ C& S" q. Y) t( t. \. \
9 u w# K7 c3 ]& Z+ A ?
#include<strstream>
$ F1 [# X: ], E1 `#include<iostream>% Y6 G; Y% F& j3 z& r- I$ w
#include<string>2 h8 p0 H' J/ E, V
using namespace std;2 U v7 a' k3 [+ c% I x ]
int main(void), N1 O+ i; P7 S) b, Z
{
! V' h# a( Q6 l string s1;3 Z# }4 A: V; m
while(cin>>s1)
+ { e! Y, u. g' V; {7 {( ? {
1 i8 U5 @9 H5 I, m) x' ^8 {: {0 p istrstream isin(s1.data());" {/ M- t* q- ?+ g. N/ p8 n+ E
double d;
! X5 R% g! A0 G3 [. r if(fy_Exp::GetExpValue(isin, d))7 {, N! p# o* l/ p" S# b4 B
{: M/ v R5 B- }: S" F0 M: O8 l( g
cout<<d<<endl;
& n$ h8 ^3 w0 | }
/ v# b0 P* k+ K else
% S+ u% _# I7 d( e, ` {
1 N. c6 |3 @ d7 B cout<<"ERROR"<<endl;
7 g3 m8 F; x* l& t8 I }' i$ b; _- D; k
}
1 B( J$ H* Y0 ]8 i return 0;8 G! w j: k' V# G; F) \
}
* {( d! `; E0 n3 S: o2 `0 R! `) h- e0 W% c- \
8 G8 P/ N0 F3 _3 g4 T9 K# e: |3 }然后编译执行就可以了(*^_^*)
: t: D" M2 u* T2 h& N: W其它:TC++上一定编译错误,不保证在VC6上也能通过编译( y' _/ T1 t8 k- L: e8 F
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|