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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
* n' _$ S3 Z4 j6 C8 g一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 H4 R# {$ c: H
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 G2 V8 j# S- @0 b: f; H. z
参数解释:! t) G3 l. o+ v3 B. ?& ~0 y% r
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" s" g' |9 P0 R. k5 u! [; \; `8 R; PnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* U! }1 v: Y+ T( Z1 Z返回值: N; }+ \5 U( i% m# G, M3 `
返回非0表示计算成功,0表示计算失败有错误; L/ Y. i6 B* n" Q
: R+ g2 |1 o7 J" {; x
2 g$ \! |3 @; `' Z% y9 h2 C$ Y& M* I& }* f3 y% ^
程序代码: 7 N o: K6 }) v/ J
6 C( R0 O, B/ m: H9 qnamespace fy_Exp{
0 `5 V" T, R+ @" ^$ Cnamespace {template <class _T>
* F" Q3 s9 u6 Z( sinline _T GetExpValue(_T t[], char& csym){
4 W! `3 t3 W( C( c" o char c=csym; csym=0;
$ b3 e; F7 ?1 T1 l( O& g switch(c){
# @. ~- c4 ?4 `! b! y7 x case '+':return t[0] += t[1];
& g Y+ _: Q& t7 p; t! E case '-':return t[0] -= t[1];
]+ c3 R* g5 ]- Q" j+ x% l- j. j case '*':return t[0] *= t[1];
1 S' C4 @5 ~ B/ J- z default: return t[0] /= t[1];//case '/':9 M6 J8 k9 z& s% `% J! K1 ~
}
) |, ~0 X( y8 i' ]}}1 Q! G1 o; }' ~9 P, L! x7 ?+ T
template <class _T, class _Tstream>
1 |* c6 i! h$ l. f$ }/* _Tstream: inputstream, _T: get return value4 X( P, _3 V7 P: w% h& ?
* Return nonzero if get value successfully */* N1 D5 \/ h2 s3 A; M) m
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 J: k; |% P& e! C, z2 e1 c _T t[3] = {0}; //雨中飞燕之作) }: G0 z/ M- e
char csym[3] = "++"; B0 j& Y+ t7 l- s( y
int nLevel = 1, nERR = 0;6 I5 h4 f- [1 C
if(!(istrin>>t[1]))istrin.clear();3 Y& y) q0 F6 a3 F. @# s8 L) f
for(;;){" |6 }! U' e4 y
if(istrin>>csym[2]){
8 a8 T" G. S- G switch(csym[2]){
( W) x% U! E g7 L5 @% ^& Z. ? case '(': V. q6 r0 e) b1 @2 Y
if(!csym[1]){nLevel=0x100; nERR=1;}else
8 N) r/ {, Q# y: U/ D$ L if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
6 h; A/ F X ?) H else{nLevel=0x100; nERR=1;}
$ a1 I0 z8 n2 ~* }, E3 C2 V break;
6 ?- ?2 F( _0 f3 k case ')':7 w7 Z m! T- [2 D9 p
{nLevel = 0x100;}break;) ~6 O& c, u3 M0 D* ]$ O/ Z
case '+':case '-':case '*':case '/':8 r" z# l* d0 P$ S8 n
{csym[nLevel++] = csym[2];}break;
( S) P0 p6 u& W6 L6 T% x$ i case ' ':case '\r':case '\n':case '\t':continue;0 h3 q" g5 [, H! D9 ]# W
default:* D! R/ s+ M: X: k( B+ D' C4 C
{nLevel=0x100; nERR=1;}: \" k6 ~/ R% s
}+ E/ ?+ b" p5 d. V; Y) L+ B* c G
if(nLevel==0x100)break;
* D4 ^7 c5 m7 G4 L9 y if(nLevel&0x10 || istrin>>t[2]){/ ], f/ x0 a) e# z$ {! V
nLevel &= 0xF;3 t7 b0 v+ c$ \: @* j# T; b. k* d, ]
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" r) H/ ^- y: P+ Z9 r if(csym[1]=='*'||csym[1]=='/'){
' ~" E- [! a% W% Z) K GetExpValue(t+1, csym[1]);. r" w) ^. s1 j' U7 V e
}4 M2 \+ i5 q3 C
else{
% p* g2 j) W6 S GetExpValue(t, csym[0]);) {; |$ Z' Z% W) k) Y
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
: s* _3 C y' [6 I6 a; w% m }
+ x. ^7 q6 R. S5 V& {) w! T2 ]7 `2 ` nLevel = 1;
' Y& |& C9 Y6 D }
9 A% f; x. F. \2 n- M* A else istrin.clear();
5 u7 }0 F6 Q/ m }
3 ?' c! B- ?, X' R: T# g+ I else{nERR = -1; break;}
4 ?* T: \+ d. N& Q5 t3 M }
7 \0 ~: [" O8 L! m2 @6 X0 @! F if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
* q8 h9 w! B$ \; j2 p8 \0 S6 O else nReturn=GetExpValue(t, csym[0]);1 \8 l7 `! `. m: W) t
return nERR==-1?1:0;& g0 O2 _( t5 `3 S6 m7 o
}}+ d9 p- X: E! t, I$ B k
6 i2 h& n, M! `8 s6 H: V. m0 `- G2 b2 m
0 J, v3 ]3 U) [" k2 G+ d% C% c) S( @, W
函数模板使用示例:4 F/ m9 z% x" B) Q
在以上那段代码的后面加上以下代码:: A1 f! { W1 q/ v) C. K) ]# r+ o
4 M: k, ~6 W% q2 @+ G6 i/ M' f) t, V& u
" A$ }5 P- ^& a5 e* K: S$ F1 z7 A4 T# U& F2 i4 X; j. r
程序代码: N: L. v9 e6 T; s: f) d" h3 t
& h, b/ [! v5 R Q2 K
#include<strstream>
8 S, F2 E/ N9 l- V6 }2 M9 q& `" S* B#include<iostream>8 u6 g4 L5 n/ ~# |9 l" I# L' U
#include<string>
" O* K; u5 f) |: S0 S6 o. S% pusing namespace std;: J* J" [3 V9 ^9 P, k, F
int main(void)
6 b( ~- m& U9 A{
: A: X; C0 \3 R% Z( L9 j string s1;: s* W5 d7 k+ {% }% c
while(cin>>s1)( `3 Z5 x$ N4 w# L, G' }
{
& R5 x6 s9 G! T0 I: n1 a* h istrstream isin(s1.data());
, x6 Y0 p* ]) a$ z+ _( `* i& Y4 `* P double d;
9 T; I6 f, \$ |! k, e+ m( b if(fy_Exp::GetExpValue(isin, d)). y& `, j! b9 q8 i
{
% ?$ m4 I% Y: D0 @ [ cout<<d<<endl;
5 C& o& c" |8 C" f1 s8 \/ U6 @! L }
, j, x. |% x. m9 ]6 a else
2 [' f0 X, z) r C {
, l+ W4 c' t4 _1 b( q cout<<"ERROR"<<endl;/ e. z3 S9 F0 _5 x
}/ @3 h/ d) w- j7 l- S$ H
}# p5 A% F3 j3 U# J
return 0;
8 N" ?' z2 j& T7 j8 H. t+ C}
* F8 n+ N9 U, T6 p! R$ r$ Z! m0 s/ c/ B7 q5 V( ?4 W
7 S. o* p- W5 l/ X/ \% y然后编译执行就可以了(*^_^*)
$ ]& x- ~# l8 Z0 f* x. j* p其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; j m N& h4 G+ z 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|