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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,0 [) k7 i; `3 i! G+ W
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ l& }6 l- i) U只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), J/ R" h0 m% u- T. T# l, U
参数解释:
9 r- |6 t; g, listrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ N# w$ E1 ]+ Z* a' _
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) b' w' `- `* V0 ~
返回值:' R# E8 e# u' d6 b# z5 ^
返回非0表示计算成功,0表示计算失败有错误
6 D( Q# S. z( h2 o4 Z6 a) R1 ~; g' m- c; U
3 m* q8 G6 l; Q6 m
7 z: H2 R7 ^; M( G+ A! ~/ v# ]程序代码: + K" Z/ b( ]3 F e7 i
6 W: Q. ^/ Y) p- C; R9 P @
namespace fy_Exp{
4 ~+ K6 B. W( N' F6 W3 c) ynamespace {template <class _T>
' i, r. x& X0 f- Linline _T GetExpValue(_T t[], char& csym){: t4 E9 N! N- Z7 W
char c=csym; csym=0;
3 d e- T) w' J2 z; K, @. Q; e7 P5 | switch(c){
4 I) O, d5 ?4 Y) E case '+':return t[0] += t[1];* I9 X0 v1 d; b! w" @
case '-':return t[0] -= t[1];
$ k; G- j1 ]! a case '*':return t[0] *= t[1];. q7 Z/ H4 A+ R# J
default: return t[0] /= t[1];//case '/':
6 ]6 v) T6 i( l | }% K- H+ C- H6 H2 \
}}
. \/ l& z7 M0 i& `0 V. L$ qtemplate <class _T, class _Tstream>- e" c2 _: \+ K' V
/* _Tstream: inputstream, _T: get return value7 ]3 W+ ^: i6 F6 U0 |9 V
* Return nonzero if get value successfully */
4 L" H$ _- f& @int GetExpValue(_Tstream& istrin, _T& nReturn){5 I5 X# f; _4 J
_T t[3] = {0}; //雨中飞燕之作5 U' B8 k9 j: w: o8 s+ e
char csym[3] = "++";! U+ a; W+ ? n
int nLevel = 1, nERR = 0;
* ^, \0 s) v5 R! ^' z& t if(!(istrin>>t[1]))istrin.clear();' `3 B) f. [8 }6 p u; o& c `
for(;;){
' D' s7 W' v+ _ if(istrin>>csym[2]){* F7 j9 Z) ~5 R8 a4 m* {
switch(csym[2]){
# B7 G- r- d& ~% ~. n case '(':% _5 g8 @ g$ ^' k8 R4 N' l8 Y
if(!csym[1]){nLevel=0x100; nERR=1;}else# M- I" P1 N4 {- ~; `1 k: I0 i
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! {% E4 t3 S/ c3 n8 }; V U2 T2 i
else{nLevel=0x100; nERR=1;}* E/ u/ e) B: l: S0 s
break;
% [6 V8 a* C# A: S case ')':) }8 l- C" d2 U
{nLevel = 0x100;}break; R/ ]4 [$ G2 k% P5 Q! X
case '+':case '-':case '*':case '/':
" [* L* x! B4 F* r- D y; |1 X {csym[nLevel++] = csym[2];}break;7 k( y- [7 a+ c1 K1 N/ I
case ' ':case '\r':case '\n':case '\t':continue;: \+ L7 y1 B- ?8 Z' O
default:
; k8 q$ R/ i7 W4 t% r: J+ B8 y {nLevel=0x100; nERR=1;}0 o* B& ?2 t, Q; W* R2 r
}7 t& Y6 C: B6 E
if(nLevel==0x100)break;
# S2 Y5 U3 ^ J7 U if(nLevel&0x10 || istrin>>t[2]){7 b& @$ v7 p9 S! X5 g# Y8 C
nLevel &= 0xF;, y' u( @% W, S4 ]. e
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 o! a% f2 f. x) |9 P* a if(csym[1]=='*'||csym[1]=='/'){
6 k/ P7 J( I# H8 i& g4 z8 T GetExpValue(t+1, csym[1]);. U5 Y3 I* a ^, X9 I0 ~5 y7 f" ]8 Z0 W
}
5 @/ W0 N' _9 _) l else{2 m) S. A: G0 {2 a1 `! x& m1 s
GetExpValue(t, csym[0]);4 Z& N! H9 ~% Z: N) ^7 g& K/ s
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" @+ }' n/ C3 S# T2 z0 u( H }2 d" {. [ }4 c6 ~% A
nLevel = 1;4 h! Y3 z- c2 W" E& W
}
; D. d5 W/ r3 d" Z. M( k- K2 p/ x; r else istrin.clear();
- ^2 \7 @; j$ f" Z }4 Q! j$ {: m" \3 N9 A3 ~
else{nERR = -1; break;}
' F5 G5 b- o0 H7 a) W: \3 L8 z }
2 y) \8 R% f2 c* {0 r$ m if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 ?6 v. h9 Q8 g2 V, P* F else nReturn=GetExpValue(t, csym[0]);
2 I, ?' [* y& d8 T% h return nERR==-1?1:0;) c. X, M$ x6 n5 `: n
}}
k$ X/ I0 R' H" x, n9 k0 U
9 C% i0 c# q3 h# G" \
( K" D; W. j* L% Y) P" S/ n% C) \2 e9 ~
7 X9 i m1 `% y7 g函数模板使用示例:1 A' V4 s% g: H4 M8 L6 e
在以上那段代码的后面加上以下代码:+ ]) O; w7 X6 s$ Y
. W7 R( C) j" J2 V7 @
( u# Y! w7 n* L3 z. T* O w+ K" y
- O0 @, J5 ?) k- f) s程序代码: ; k" V1 D0 s. L- C0 w; A
* d) u9 _5 ^6 a K- v
#include<strstream>9 I+ t' V$ f0 y
#include<iostream>
1 ?& }4 X4 K3 `! X( l1 ]#include<string>8 P/ ~1 C) I9 Q) K
using namespace std;
+ B' N, P" ]3 P) {+ H& }) fint main(void). R# l7 n0 }5 E. Q- Y5 d" B% m
{7 k/ Z# P( c" X3 [( N) C! l, }
string s1;& J! } u: Q! z: s) |6 ?
while(cin>>s1)
' b5 |' O2 F, w3 G+ }3 z {
8 v x3 A# t- T2 u6 N istrstream isin(s1.data());* h/ ]% S4 c/ T! m3 E8 F
double d;4 I: X0 n( O4 I: `: X$ P" t
if(fy_Exp::GetExpValue(isin, d))
8 s F6 c; r! [ {
8 k5 C9 z1 E$ B- d2 a; J7 w$ H& Q cout<<d<<endl;
9 r4 E0 {/ S/ V2 ~8 f9 k }- Q+ y7 K+ l1 a+ b1 c
else
$ g/ D. _2 ^+ C9 I# @ {$ I% ?/ F! D' @& T, @
cout<<"ERROR"<<endl;0 b( Y3 _; @% M7 H, X. A5 J
}
- e+ X- D/ w' {9 a }8 K# k, e* A9 ]6 o9 `
return 0;4 A' F; K: b ~ H3 X
}( A- T( ?- ], G. A8 w
6 c2 G8 d. d/ Z; U; P. L9 Z0 N- ?, @* S1 M, l% E8 C
然后编译执行就可以了(*^_^*)3 g T0 U3 S* `$ i b: o
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
$ m% s9 \$ t$ @* I3 p 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|