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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
, r. x; q" E& J7 u一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) O1 e% r. [; Q& W$ U t; i' [8 p' H
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( V! v+ N- D6 _& ^( G
参数解释:
$ v+ ]2 E( X$ j a" Sistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 e3 ~) [0 R/ f( ZnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: j1 x* e& \6 K1 [
返回值:
2 O; f; ~/ v$ B4 [返回非0表示计算成功,0表示计算失败有错误
* [# D" Q5 d. c3 v: t: y
, e; _. h1 Q& ]1 ^ 5 |5 l" a* f( c0 Q9 {& x, l2 z; c3 @
" F- z6 s% W4 w8 Q程序代码:
7 H" b8 a; e7 ]% |: V p3 z- H) @
' l1 w) n' k: S# V3 _& `namespace fy_Exp{) }8 G5 b' E5 C) T0 ^$ z
namespace {template <class _T>7 @7 Z4 E4 ]' i& g- q! [
inline _T GetExpValue(_T t[], char& csym){7 R5 N7 \" y2 L
char c=csym; csym=0;
1 S+ @* p# m( F3 j3 N switch(c){0 J$ L% _: ?( n, c1 ]% ]4 X8 E: f. U
case '+':return t[0] += t[1];2 K1 d3 ~) b t; ]
case '-':return t[0] -= t[1];
4 j$ e* `: x/ F |: |+ u+ x9 k case '*':return t[0] *= t[1];: F; B7 {3 k* L' u6 e! C
default: return t[0] /= t[1];//case '/':
" F+ ? v# s6 q+ q& O4 r/ _ }
4 [/ w. W& c2 A! ~! i}}/ \& X! [1 B9 [' X3 K7 Q6 d
template <class _T, class _Tstream>' `; R/ E+ E; C, D; @& [, c3 C
/* _Tstream: inputstream, _T: get return value
7 @1 I! g1 x2 O: T8 X& F! y" [/ f* Return nonzero if get value successfully */
& S: D' M( g" E& fint GetExpValue(_Tstream& istrin, _T& nReturn){7 N, U; T% a7 c+ _+ m
_T t[3] = {0}; //雨中飞燕之作
1 E+ r' f6 O1 r S char csym[3] = "++";
k" H$ ?, I' d7 \! p: ^% g: J$ E int nLevel = 1, nERR = 0;+ q" x& [3 Y) `
if(!(istrin>>t[1]))istrin.clear();
/ X( r# f- h3 h; P% @( B& N) I; _ for(;;){$ v, ]% C. a2 `4 Q( K, c3 b; f
if(istrin>>csym[2]){! V. T7 x5 F% `: y* v* L& m/ ^0 H
switch(csym[2]){
/ {, { P) k Q# R2 a case '(':
2 x( a! o5 I. ~% m if(!csym[1]){nLevel=0x100; nERR=1;}else" g/ }. X! ^% J: B# D: |
if(!GetExpValue(istrin, t[2]))nLevel|=0x10; U" _+ ]# ?7 Y q6 Q' Y; U
else{nLevel=0x100; nERR=1;}
5 }0 s8 N2 n6 D break;
1 b) ^0 R3 r P6 P/ _ case ')':0 r' ~: i7 N- j- n, Q1 o
{nLevel = 0x100;}break;
8 z% d+ @' u: K8 m+ z; h( o, Z case '+':case '-':case '*':case '/':4 ~& d0 x: k/ w) n+ {
{csym[nLevel++] = csym[2];}break;3 m$ h' I3 r6 D3 o) Y* ^
case ' ':case '\r':case '\n':case '\t':continue;
_! j O: T! O; w default:
4 z7 B: Q1 o- c, ^5 A9 m {nLevel=0x100; nERR=1;}
, ~! K1 U3 y& P; {6 b }
d/ K$ k0 L+ z+ B3 z if(nLevel==0x100)break;7 Z& J2 s9 G6 r3 I- _
if(nLevel&0x10 || istrin>>t[2]){5 h6 U8 Q/ c1 C
nLevel &= 0xF;
+ Z9 M1 `- r8 f8 k. ^8 X- U if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" B; B$ O2 R' P7 y- [. l if(csym[1]=='*'||csym[1]=='/'){
; }: v" v% \% {% | GetExpValue(t+1, csym[1]);
3 T9 j, i7 D2 }9 x9 p4 B, \ }' v3 m0 o& I1 d$ H, f: c
else{1 ~# e- ?5 k y" ]1 |
GetExpValue(t, csym[0]);
- v! H+ I( E" \; O! ^3 D0 ]( J t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& u1 r. G, p5 D/ V4 ^7 I' h }& t( I# X( j' O- y; D' Z- m
nLevel = 1;
3 W1 c, }2 _4 {# x u, Z1 b3 U5 Y }
6 B2 P' R' P& K) C6 h# I else istrin.clear();1 d2 O/ o! o& h ]4 r7 H& y
}9 G' M, s! y! c! }
else{nERR = -1; break;}: [. S/ R4 R+ K( Q2 x
}
0 O p7 E% {9 o$ J if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 l% J' j- y* f3 a+ h
else nReturn=GetExpValue(t, csym[0]);
/ m! @8 E. i Q- X return nERR==-1?1:0;
9 m; b& S, I% {1 c, ?8 w}}
( ^8 A/ ?; B# |/ g, _) a5 M
* z7 ` t5 t6 g- C8 M
[9 m% `+ v+ Q7 \5 W+ R, ~# j& F( e9 h b) ^0 M
函数模板使用示例:
: c5 @% ^' v& a2 Y/ Z在以上那段代码的后面加上以下代码:
- M3 q( G; U9 o3 d
# I# Q6 c6 ]; d! T" C2 D
0 I6 |! f2 t) F; X& v$ a' ?9 [/ q% v7 A. P
程序代码: / V5 P8 i \. R( Y. ~# \4 g( ]5 [
: }/ h8 o: v9 v, U
#include<strstream>
) V: E( \$ U; F$ }9 b#include<iostream>& |, ~4 X2 [6 K: ~
#include<string># q: a" A5 J8 l
using namespace std;
1 e+ ^0 ] J& d$ W% mint main(void)- x$ y: w& c+ e1 Q
{
; \1 P; L. J F5 @; ^ string s1;1 ^7 `5 P8 n. r; d9 o, C
while(cin>>s1), N$ c9 h3 w% U* N
{" b2 V3 l* G. y i' z2 _4 s p
istrstream isin(s1.data());
, D- w |5 e3 I) H3 G3 R double d;
" W; P8 }& w. Z7 { if(fy_Exp::GetExpValue(isin, d))
0 F4 f$ D4 K( N5 _9 k {$ I& ~1 Q' f3 W3 ^' d) w
cout<<d<<endl;( w( N4 t; P. u' F3 O( k- n
}" R- G" H6 o4 ]8 c$ P
else+ ~4 O9 s3 I1 [8 K) ^) J! [% A8 p4 b; h
{
( w ]! J7 |2 g cout<<"ERROR"<<endl;' _; x) n. r4 `" d& _+ B1 n
}+ S$ p! V \4 n
}0 [# q! Y, W1 Q
return 0;" Y8 R* H! t$ o0 M
}
" E$ S, h G7 H
; z) O) l& U4 }; A; ^/ C1 P! a; a8 s+ m6 _% ?+ b! ^
然后编译执行就可以了(*^_^*)
) B$ B B+ H. L+ p; g$ x其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 Z* T( I( t1 H8 E; q; s0 C+ [ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|