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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 ?+ N/ q) N5 e: F8 x% J一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# n; k0 e7 L! a: g; Y& z% l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( v5 f! E) Z5 _/ L+ w6 X参数解释:5 ] l4 |# `9 ]+ q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' u; U5 I" `% A6 o% }
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定# x: ]8 [# r9 J5 e o
返回值:
9 k5 s* Q/ q& R8 C' I' X7 x返回非0表示计算成功,0表示计算失败有错误7 ^: ~' u: U* f6 R2 y0 x/ u3 r+ y
! C! ?1 g# Y9 H$ @8 X. y3 u . G; D& K- V( h6 B
$ I0 [6 O$ c: h) H9 I- X
程序代码:
- R6 K% o y/ q' e
& t" x* R6 h" Cnamespace fy_Exp{
1 O, W9 [" ` d% K" x4 Knamespace {template <class _T>. f& ^3 O$ M- U0 h3 |# S, ~
inline _T GetExpValue(_T t[], char& csym){
, Z% O, I! B- h" t# Y char c=csym; csym=0;7 `: ]! |5 @- d% P4 m2 c; ^
switch(c){
z$ ~- g+ _0 b4 P/ Q9 @5 p case '+':return t[0] += t[1];# {: Z. r* y2 J% s6 s. _
case '-':return t[0] -= t[1];; V0 J6 X6 P3 T, b+ c6 [
case '*':return t[0] *= t[1];* ~. S- g) V; h) e
default: return t[0] /= t[1];//case '/':6 i" n# m- t0 Y/ h
}
7 F6 L6 q/ z2 u2 C}}
, c# f9 |$ S8 }: o2 r4 Jtemplate <class _T, class _Tstream>
7 t0 |' Z8 Q9 W/* _Tstream: inputstream, _T: get return value
) \ S S1 a5 v; P& j# m+ m* Return nonzero if get value successfully */
9 O6 d, L2 B2 d" xint GetExpValue(_Tstream& istrin, _T& nReturn){1 H( Y& h9 e# H2 e- P. ~
_T t[3] = {0}; //雨中飞燕之作; d6 S. j' e4 D% e' k! \; i( q4 z
char csym[3] = "++";
+ h# b. h" \/ u+ `% V- ^) c int nLevel = 1, nERR = 0;& I u J" L5 `7 _
if(!(istrin>>t[1]))istrin.clear();: A# L s# O. N0 h+ {# Q$ n% W
for(;;){
H3 Q8 [8 F( a! T5 w7 g if(istrin>>csym[2]){
8 n. C; K* ? ]# i* l9 H switch(csym[2]){! k# o' ]- n1 U# |' C# C: d
case '(':
* I6 E+ u3 L ~& K9 V+ ^+ g if(!csym[1]){nLevel=0x100; nERR=1;}else
8 l n. ~, B0 ]3 Y0 ^/ Y if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 \- E: ?. ?* N0 B9 J% ~
else{nLevel=0x100; nERR=1;}
; k* G2 Z5 K9 k' _) P break;/ X8 L8 e1 T. f. k
case ')':. y4 I" |# P2 M+ ~7 Z. a0 y
{nLevel = 0x100;}break;
& o3 @) G# i# L* s" l9 ^9 |; u. I3 { case '+':case '-':case '*':case '/':7 S1 B8 c1 z7 i7 G$ b+ N
{csym[nLevel++] = csym[2];}break;
|, m" V+ X0 G- u case ' ':case '\r':case '\n':case '\t':continue;) a3 K% G& S L( r) t
default:
& Y8 [) {& B4 w$ q0 ?/ _ {nLevel=0x100; nERR=1;}
% N* s6 b3 _2 R7 @4 w1 i }! w+ T6 Y, }- O/ Z7 l& r
if(nLevel==0x100)break;
1 F# O6 O- P; E: X' M" P% }' \ if(nLevel&0x10 || istrin>>t[2]){
1 X2 v2 Z9 Q# [: o7 Q nLevel &= 0xF;0 D5 j2 n# b1 n6 f5 T$ w
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
7 {5 F3 Q- Q, L7 |3 S! { if(csym[1]=='*'||csym[1]=='/'){1 P: w; }/ O& E# @
GetExpValue(t+1, csym[1]);" F( Q6 s) T- V( b v3 g+ L
}
8 ^6 N" [4 x& q1 ^8 `; k, l3 K7 \ else{
- [1 x/ g& g3 H+ Z1 N% [+ h X GetExpValue(t, csym[0]);
5 N- E& Q: m$ A4 h* U t[1]=t[2];csym[0]=csym[1];csym[1]=0;
v/ R8 E9 y$ [2 R% V8 [' ?- f }
# @; h: E' f# r& [/ { nLevel = 1;" n5 d1 _8 O6 Z
}
6 q Z* m' _) h" u$ x( Y else istrin.clear();3 ?% F( m& O' {- H& m
}9 ~% |; j$ V9 W' u; q* z, a! f
else{nERR = -1; break;}1 _- e$ s7 t! ]4 f/ M
}
. |: I9 q, ^7 W% j/ O if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ U* \1 V) B8 g* |1 B. G
else nReturn=GetExpValue(t, csym[0]);
4 _5 ~. W% x% s8 U* f1 D return nERR==-1?1:0;, r3 b& I3 {) s+ M7 @& l
}}
8 R3 z# a g8 s: s2 g4 ?
+ V: N& I: p. u$ ~, A9 A
2 \9 _# {0 f W
6 Z4 |3 ^9 s! m- Y0 m函数模板使用示例:( G$ N2 ?0 S$ ?& V( T1 g& b% ?7 v
在以上那段代码的后面加上以下代码:! R% G o5 Z! {) d C% M6 h: a
, W$ M' X. f. N. I5 ~) e9 s # v4 a- B3 ]& A$ q0 g
- g/ C7 b4 _, n7 V3 z+ _
程序代码:
+ G6 H# e$ `( `# W9 |5 t- `5 g4 s6 f4 W, T1 Q( d
#include<strstream>. I! C& w5 T/ e0 S4 U4 |
#include<iostream>
- k# ?+ R: T- S% V5 F( X#include<string>
X: W4 i- u) Q( Q0 O$ dusing namespace std;
5 Q* H/ \# Q/ @8 T/ G' \/ d( O Eint main(void)- m) M h& m! X1 W
{ j9 Q$ n) b6 e: L
string s1;
& i C: ~5 p ]( p/ M0 I while(cin>>s1)
1 J8 ^' Q( B: L! D6 y- L+ ]; {7 l% T" w {
3 G$ P' `9 u: U3 x9 G" S% {; _. p istrstream isin(s1.data());7 Y7 R8 S6 d5 i: s# P; j
double d;
, R% J- H; ` R, a0 S6 b$ U if(fy_Exp::GetExpValue(isin, d))
) h& ?- D8 t- Y; p% q/ G/ N+ U {
3 k" u u+ a7 K cout<<d<<endl;
' A! J& `2 Q$ a; Y" }% Y( | }6 x4 n& w* K6 W& b9 p' B$ `
else
8 ~" I7 ]7 u/ [/ I6 j' ? u {$ H }2 z( r x) w7 D5 u
cout<<"ERROR"<<endl;% L- L9 X. _" V3 B6 I. L9 m, U. f
}2 z( M Q7 p* r9 e+ ]
}
' m: P; Q2 a# M. H$ f return 0;
- E6 H I. Z( E) S) t: w}% I7 t$ {4 F8 V1 T& g& b# X
/ u8 F4 _: b$ q3 U3 l: S6 c8 X# d E/ e& P( s6 @
然后编译执行就可以了(*^_^*)
/ F! ^7 I7 y/ s7 P: E; b其它:TC++上一定编译错误,不保证在VC6上也能通过编译& @3 c$ l2 ^2 s; Y" i3 {( j
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|