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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,3 G- Q+ o- K# i5 b
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 g) U8 ]7 @- ?1 D0 B' y! p只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)) G1 j& Q! U& S! ?8 {7 a
参数解释:+ v$ O8 ?# X* d# G* F9 S; t9 T/ U
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ k) t9 E6 y; W2 G- T; w
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 l- r' B/ O( U, w返回值:: ]7 p5 _: ~1 E
返回非0表示计算成功,0表示计算失败有错误) `2 e: l3 `( @$ s
) @% h& {" }, ]7 t/ R& N' [ h
! q' u" s& y! ~# e% l
. b Q4 U: J( M8 }/ Y* q程序代码: 6 J2 G9 J5 g& x# Y+ B# p: i. e/ F2 R
6 ^7 @# b8 r* e% w1 p) @5 Z2 \: vnamespace fy_Exp{
" I. P* Y( a2 J* D( m9 gnamespace {template <class _T>
3 k6 v' H- A8 k) Cinline _T GetExpValue(_T t[], char& csym){
* |" W0 q& g' f F3 f9 [+ _5 g2 i1 f char c=csym; csym=0;
& }$ a K1 a5 I- e* o& N switch(c){
- R% |; [* z6 g) W" R* |! \ K) x case '+':return t[0] += t[1];- G) k% M+ s; j5 W) M: M$ W9 T
case '-':return t[0] -= t[1];
- s+ K) l! g! \) _# T) M' L9 N. o: ` case '*':return t[0] *= t[1];
% ^3 o& G4 Z9 F1 g" d. a default: return t[0] /= t[1];//case '/':
! O7 s' W' n& k& u7 }, e }2 i& X Z3 Q0 F7 m/ ]
}}0 G; v# W$ L; H" ?2 }& a
template <class _T, class _Tstream>
5 M3 x" R; v/ [9 p, G) C/* _Tstream: inputstream, _T: get return value
( t2 T$ ?' @+ ]; `. s* Return nonzero if get value successfully */+ o7 W, B: i- Z6 a1 a, l1 S
int GetExpValue(_Tstream& istrin, _T& nReturn){ M7 P9 j' N% x) B2 T
_T t[3] = {0}; //雨中飞燕之作! h8 v; W( ^% G
char csym[3] = "++";
! ^2 Y) P& |4 `$ D* T' B int nLevel = 1, nERR = 0;
6 ]% {' L% Y9 h if(!(istrin>>t[1]))istrin.clear();
0 k, R9 S/ i8 N8 U9 t for(;;){3 u& g O& P( \! @
if(istrin>>csym[2]){# \% x% E$ V0 ^' \
switch(csym[2]){- X) l, h O7 Q) d1 q
case '(':
/ m5 P( \! f! W2 q! |9 [8 M if(!csym[1]){nLevel=0x100; nERR=1;}else
7 g9 k. _ f Y: D8 g# y, N+ n if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
% u' l( F* x) I5 Z else{nLevel=0x100; nERR=1;}
- b8 }* R* b. X* y& a break;
" m: b9 X, U* T& v) a; y case ')':. A" a) |/ ?, C q# w1 t- |( `
{nLevel = 0x100;}break;
3 X& G' i/ W( ^: T( z | case '+':case '-':case '*':case '/':% ^' T* {# h W3 b6 L" x. M+ b# G
{csym[nLevel++] = csym[2];}break;' }" v8 S' g* w4 X( M- b8 `& w/ O
case ' ':case '\r':case '\n':case '\t':continue;
2 J+ j5 k0 s, r8 r0 N( A default:
$ K2 n" ~: q! d. a; k {nLevel=0x100; nERR=1;}
# X. S4 T/ v) B$ e' I }/ @- t6 w) {' f% R# ~
if(nLevel==0x100)break;5 ]1 Y# v$ ~. c6 e
if(nLevel&0x10 || istrin>>t[2]){
$ v' X! e% F+ c6 V nLevel &= 0xF;2 ~3 |# U1 g' l: t! Z" X6 m% w0 F
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 U5 X3 m* K- U if(csym[1]=='*'||csym[1]=='/'){
/ R" J! A: l5 q% G1 w GetExpValue(t+1, csym[1]);
) c* Y- J8 E; O }
& J/ K) o7 N4 o. w2 C8 _ else{
% G4 |5 \ n+ V9 ], t7 w GetExpValue(t, csym[0]);6 E( [1 H( ~: |7 z
t[1]=t[2];csym[0]=csym[1];csym[1]=0;. f( Q5 ^ j; g
}
1 I3 c r$ s$ B( S: i, ~7 S% B: D! Q' v nLevel = 1;* \* s# Y% C1 c7 E0 x4 W& b. f: ]5 g
}
4 Y9 S' O( M, W' [$ e else istrin.clear(); u+ L) E" O d) k/ [
}; k. R* D# e0 `) x4 W4 C
else{nERR = -1; break;}
) U$ _% m* `5 T: C }7 f/ t( C. p5 f! f2 z: f$ u* r$ C
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 r% M1 a1 X2 R8 t& v" t5 ?2 D else nReturn=GetExpValue(t, csym[0]);4 Z: }- }& h7 l1 ?0 k2 T3 ?4 S$ {4 T
return nERR==-1?1:0;% o! @" l [3 V
}}4 t; `* |* ], F% l; E7 I. |
9 N2 K) }7 E% n2 X- a; v$ @' t7 x
) q# | o" g4 Y( K- H! _
# G6 `2 S7 f* Y) J6 K5 J, m
函数模板使用示例:$ f, [2 n& S* ]' R5 R. g
在以上那段代码的后面加上以下代码:
, z2 [- L" L v
8 e( h2 z% ~5 ^# M! u 0 [+ W) \& m, v
) V1 T* _9 O5 A6 N0 Q! B# B$ H% v
程序代码:
, ~- `1 g- ]1 O3 v4 E% s+ v/ g6 {. u, n
#include<strstream>9 v: b5 q1 I) n3 j
#include<iostream>( B5 y& f7 D8 R# M8 k4 c
#include<string>5 l8 e& Y: H' S& q5 ^2 W
using namespace std;( F9 y, ?: d4 z( \: g/ R
int main(void)/ T3 ^ m) v; s5 C
{
. _) |( q- T: K: G/ a" S7 \ string s1;
+ H W% c% B5 X$ q2 ^& \ while(cin>>s1)+ C) J" n- k7 z( M0 D1 E A/ e
{0 t& ~# J' Z$ L: b
istrstream isin(s1.data());
0 V$ a0 E P: i. B1 }, x& x3 J double d;
% R7 V. R% l- V/ r if(fy_Exp::GetExpValue(isin, d))
8 W- V& D3 y; W0 u {+ y# j; H6 C% z: d% U$ A
cout<<d<<endl;8 o5 B% U# S; ^
}
9 x; b: b& e/ z( w p else; h% h" ~$ h; N
{
% y0 w0 k a2 s6 T( h; i cout<<"ERROR"<<endl;
: `6 v& y. Y+ E7 P }9 \% }3 ]* N1 X ]% }
}" Z) S* K# n, N# E3 J
return 0;- U- x5 a6 Z3 S0 e7 m5 K
}
9 r$ I5 C" Z( j3 L e* v( c# N9 i! u$ O- [5 @* Y- O% ^! f- n/ z: Y
+ u. n9 i2 ?: O然后编译执行就可以了(*^_^*)
/ k" F! k- i( ?( \4 y其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# \& y* B4 X, ]$ U% |: T 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|