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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,8 q5 Q5 W6 _5 r( [' D# o" }9 B
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 U6 V T: C8 w' F; }) M! d只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn) F% r/ H" G, Y% f% u
参数解释:+ l9 ^7 o3 ]! Q3 c* a+ }, R. n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& _8 D+ V+ A* anReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" s) Q$ c7 q' l
返回值:
1 u: ~$ Q2 }( ^+ ~返回非0表示计算成功,0表示计算失败有错误
9 P: M3 ]- H. s0 |8 j% \8 E
: t" ]; d: p" ?) U) E- |. Q: s6 h7 { 4 l! |) f3 n c; ]( r6 T! r( F
4 \* X; [# B1 }* K( f. e# @ c( @& f程序代码: , s$ b* |% h2 R2 E& W7 n/ ]% y
8 H% B3 T# r: u+ U* K* b4 I: z8 y' Enamespace fy_Exp{& y: L' v9 e3 y' u7 X
namespace {template <class _T>. b y) L; y, p- o5 ?
inline _T GetExpValue(_T t[], char& csym){
" f0 z+ u: B, m- _. N% D: p char c=csym; csym=0;
& |& G8 b$ W9 ]! \8 d! N switch(c){2 S: c1 L* o. t1 j/ Q4 w
case '+':return t[0] += t[1];
: @! h* L* _9 O1 M7 C case '-':return t[0] -= t[1];
) L7 Q' ^! w: ?3 f- U& b' ~/ } case '*':return t[0] *= t[1];
7 @8 L) H$ J& u9 s default: return t[0] /= t[1];//case '/':! C! Z4 d% }9 v9 P ^2 r. B0 Z
}
: N& U) O* j% ?* u! y, P}}
# l* f+ s6 b0 q6 }) s. ^template <class _T, class _Tstream>3 K+ ?6 \, A4 G& W) Y( K
/* _Tstream: inputstream, _T: get return value1 C0 H3 B! _& B k5 ]
* Return nonzero if get value successfully */
+ J2 c+ a2 N' @int GetExpValue(_Tstream& istrin, _T& nReturn){1 f0 i& E4 s7 @7 R0 H7 w9 h
_T t[3] = {0}; //雨中飞燕之作' \% ^6 O2 d/ Q* P; ?+ R0 r
char csym[3] = "++";
7 V4 Z7 p6 q4 j1 V# {4 v int nLevel = 1, nERR = 0;
/ T' y% R2 [9 Y+ y/ V3 L if(!(istrin>>t[1]))istrin.clear();/ V* b0 W! J. z% C2 H5 o) P$ p
for(;;){9 z5 i$ K% Q1 M8 R3 Z3 X5 X
if(istrin>>csym[2]){
, m8 ~. x5 d5 ` switch(csym[2]){. C# }8 j3 d/ V
case '(':
# ?6 B" b$ ?8 ]0 ^ if(!csym[1]){nLevel=0x100; nERR=1;}else: o# H+ j- e2 i+ t
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
# a/ T( D: y4 D3 ]$ M. S$ O9 D6 x else{nLevel=0x100; nERR=1;}* w( G. [/ Q* u7 n! t( K( }# L# }% Z
break;
" z: Z F) Y' X% o case ')':1 [/ j0 E( U U0 P5 I( @* q
{nLevel = 0x100;}break;& `# ~* \+ F: X. Q/ X$ i5 n
case '+':case '-':case '*':case '/':
3 { q& u J. }3 ?. ? {csym[nLevel++] = csym[2];}break;6 W O9 |: Y: c) K6 O" [
case ' ':case '\r':case '\n':case '\t':continue;9 s1 r: w+ _) k# n3 t* ?
default:
8 m( F0 A4 d5 \7 y" {6 a' n0 C# t {nLevel=0x100; nERR=1;}: e5 d6 ~$ D' C% N3 d/ R
}
$ I% d2 B1 ?& m' ?; i9 R if(nLevel==0x100)break;3 P% Q) G0 X. o1 _/ E R
if(nLevel&0x10 || istrin>>t[2]){ W$ B& R" N: y6 f
nLevel &= 0xF; e& e C- y, x- W4 b
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
$ t D0 J4 s Y" z; P+ t% Q5 t+ g if(csym[1]=='*'||csym[1]=='/'){
" O+ k7 d) y" t, S1 e GetExpValue(t+1, csym[1]);
) [4 b: j+ _3 n& W' j }; k% ^. `! A! ~% _0 ^' {
else{
8 A* ~2 u/ N% M: n. s) t GetExpValue(t, csym[0]);
' M$ I0 x5 s* @ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 Z$ ~. S7 n* B8 ~* n1 x }
) U% ?& w3 d1 T2 ~ x$ P3 m4 b nLevel = 1;
. I$ y8 n$ W& Q/ I1 p }" h9 m* ?% I4 @
else istrin.clear();& }- J4 k8 z) @: @) t: K
}( x3 L# [+ Q* X* z
else{nERR = -1; break;}
j6 Y% C- k: I2 X: o" e9 l: }% Q }
$ Z& e e: U; ]( L9 ^; A, o if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
[* C" I6 C5 N2 h7 j else nReturn=GetExpValue(t, csym[0]);; j# c9 }$ ^+ f7 Z0 E
return nERR==-1?1:0;
/ q$ ]5 v4 L! d# C+ X4 k# \}}, s+ G( C. U) [/ o7 R. F& A+ g. v
- z( `4 U, w( E8 F) c( v
& L% i o c6 ]# p$ ~1 s4 H
0 t) ^6 z% @- c+ a3 m: s8 K0 j函数模板使用示例:
1 y8 ~1 G. d/ z. o) J3 s8 C4 Z$ y2 A在以上那段代码的后面加上以下代码:: q8 ?; w. o# e+ L
I% p1 w* D; \ # y, \) t- k$ \. Q- c* s$ X' D6 c7 o
. o. c4 M; l8 \9 e, q% p( F程序代码: 9 v" Y# F% \- w+ @! C5 }
! l# i3 |$ J ~# Y% b) [
#include<strstream>
+ e# f) W! L7 i! S#include<iostream>
: K k+ H* a' |+ h* V#include<string>
. r' @$ N, q l; dusing namespace std;, O1 a1 E& O+ i2 P u% S+ u
int main(void)
^8 `5 n" w4 z8 Z% m7 K# M* D{
9 P4 R: R2 ]# M! _7 ^ string s1;
) x' u9 ?5 C D8 ] while(cin>>s1)
8 _9 _# i% z" S7 n$ J1 q5 i! `# Z/ V1 G {
4 a, C3 m4 O' G, o4 K5 s4 T' e# i istrstream isin(s1.data());
0 ?/ \6 ^- y! g g double d;, H. w+ e7 o! ^$ U# _
if(fy_Exp::GetExpValue(isin, d))
8 v$ ~8 e, E$ ]2 f. ]3 A) x% | {
8 e B( {# O- }9 T cout<<d<<endl; c4 t" n: J4 S& n# E
}
0 J" Z. I6 H5 \2 f* N else4 C( {" P# ?0 C9 Q _& o
{" F! p5 H# ]! {
cout<<"ERROR"<<endl;0 [& ]" G( c$ q3 ^( \2 h! Z2 e
}$ G5 T) N- W& u, ?9 K
}
! Z/ S" N5 t' d5 ?2 R5 G return 0;
) ?# s- `4 v. F}2 n/ Z0 v% ^; L% ?' `, }4 ?
9 v' ^/ J! B# w' t6 V2 U* o# P" X8 U
0 `4 M" |9 S+ H$ r4 l1 y然后编译执行就可以了(*^_^*)
9 R1 Y: T+ |6 D( Q) ]其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 g5 k5 p3 z+ _2 {6 x
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|