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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,% x, e7 u2 ]+ J9 L- x3 ^8 b. F
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' Q, q+ X- m7 w/ g! C3 T
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ w0 o' C6 c0 h* F) q
参数解释:+ k8 ?+ `- w, W5 I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- _5 R+ ~; I% K) U8 k% `9 Z& NnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
7 A0 ]1 _7 Y5 W) d" [9 V {返回值:# a- O! N$ d# F8 a+ d
返回非0表示计算成功,0表示计算失败有错误- U, Z; c# C( ?2 _( A( o
+ Y, f' R7 S9 C, ~! e0 n( E! N
' U; B/ q7 G% \0 z
6 c7 V) k- s: `* j/ F2 |3 v
程序代码:
$ [: S3 e( b, L% F7 H, l. h% g! W' Z: J! d) E
namespace fy_Exp{
: W! c" v$ r4 f8 }- P$ V' [namespace {template <class _T>) M% x. r) U+ y6 S; q% w$ D" ~
inline _T GetExpValue(_T t[], char& csym){
! E) s( e+ @* A: Z% p4 ]# j( D char c=csym; csym=0;) s8 c/ R7 j+ F- c, B# ^0 D0 B6 P. n' ?: P& f
switch(c){ h5 {; p# M' e5 ~
case '+':return t[0] += t[1];' L8 s6 S/ }' l" C# ~7 M& x
case '-':return t[0] -= t[1];
+ I/ T8 Y" C5 d% u: ^5 e case '*':return t[0] *= t[1];
; N# L9 A1 Q2 o7 m2 y default: return t[0] /= t[1];//case '/':
1 Z; B3 o& u/ @, U0 ~ }+ c+ T( ~1 T( Q+ W3 n) M0 K
}}
( E P/ W" m: |/ X; @template <class _T, class _Tstream>
7 P: X$ I: j$ U, Q+ y/ p/* _Tstream: inputstream, _T: get return value6 \0 J% {, j( a" F3 A
* Return nonzero if get value successfully */
3 z! H$ P+ f0 |int GetExpValue(_Tstream& istrin, _T& nReturn){3 {- T' s/ i7 w- D/ X3 m) }
_T t[3] = {0}; //雨中飞燕之作
$ ~, X" f e/ c3 p+ Q9 ? char csym[3] = "++";, i; |7 D' Q) z3 @
int nLevel = 1, nERR = 0;
8 x, X/ p# b7 x2 T& x! A if(!(istrin>>t[1]))istrin.clear();
8 d: j" h: \9 [ for(;;){
9 m- h8 i7 [* k m# c' F# [0 A5 I9 d if(istrin>>csym[2]){; d$ I/ c5 }& O* ?
switch(csym[2]){
7 r. Q. D/ b5 e c case '(':
5 B9 C# q; p b if(!csym[1]){nLevel=0x100; nERR=1;}else* L2 p$ l& q P* @
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
# @9 S( s9 I+ j( U else{nLevel=0x100; nERR=1;}
: Y. h$ p6 N& v( O1 f- {( ]5 ?" G break;& i& `3 P' D/ H5 w/ ~6 _. }
case ')':( i! h+ u9 I# I6 r% @& ^% C
{nLevel = 0x100;}break;+ [! L9 s6 u3 R& G+ o
case '+':case '-':case '*':case '/':
3 J9 R# l4 z' ?+ R6 j/ ^4 F, [, J {csym[nLevel++] = csym[2];}break;' \: N/ J# @6 [( W' k* r# r# k; X) X, X
case ' ':case '\r':case '\n':case '\t':continue;
: `: f- o7 b" |# N, r+ C! a' }) r9 D default:
4 V1 h( G9 C& L {nLevel=0x100; nERR=1;}5 n; @" L9 R% e
}. U G7 C3 o! P
if(nLevel==0x100)break;
4 U M5 V8 a. G0 {6 U$ [) S if(nLevel&0x10 || istrin>>t[2]){
/ _) @: Y+ P/ g, c nLevel &= 0xF;' a( |! m1 K+ z6 z
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 H0 m9 x/ l4 ^9 h" x2 q; [1 O! q if(csym[1]=='*'||csym[1]=='/'){
/ y2 o# D1 a. Y; G, h- B7 T GetExpValue(t+1, csym[1]);5 C# D5 w" \( X" R0 x7 f0 b% t
}
* f" I0 B9 M& O0 [ else{# N/ O8 H" H. Y
GetExpValue(t, csym[0]);
; m+ x: a' [- _ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ u: \/ k! @- p* @ }; o- a6 B1 O6 g* b( d" i
nLevel = 1;
3 d% u- h. C1 J: d! j }6 |6 W1 v0 N5 Q0 M
else istrin.clear();
* ~6 o' c+ J& O$ `' |0 b) G }: V% k; P$ h; [
else{nERR = -1; break;}
% J9 a! x1 u: {3 I' d }+ r( p# o, r' z
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 [" W. l' M2 i2 S& c) J# d) B3 Q, } else nReturn=GetExpValue(t, csym[0]);
3 i' |- H- K4 j return nERR==-1?1:0;
( g6 J' a1 m9 ] X}}
! w" e1 s: l8 r+ J
; W9 R+ X1 h' Z7 H4 ?' A/ s8 V: b: {1 _
# n+ t6 y) G* ?2 z
函数模板使用示例:
7 l8 W6 N4 v% O# y% w8 ?4 Z, x在以上那段代码的后面加上以下代码:7 H$ D" k* y! R$ X# x1 L
6 E/ p' I: ?, R; Y r- X" s8 Y, } # ^; a% {) e, }
0 O7 T2 u0 s" g( t+ o2 \程序代码:
0 v! F0 e2 C. b; w0 v; y! S( E" R3 o" |
#include<strstream>
. v9 q' f- D5 l \3 P( }#include<iostream>
: J6 E7 Y' z( d, N" p1 k$ w5 C#include<string>7 F( t% t$ n5 ?1 b' S
using namespace std;
3 ?* k- W7 V- e$ O+ X. wint main(void)7 ?4 i$ w3 X; u1 S8 K! q
{6 \2 p1 N' L; E( y d
string s1;
% I0 r) a, n7 n" L4 A8 ` while(cin>>s1)
5 Z/ H# N5 c, Z- S: k {
4 ~' a7 t a ] istrstream isin(s1.data());+ b* X y9 ` l, Z8 {4 o
double d;$ S& z) B7 T% u. n, L1 D# H% g1 L, v
if(fy_Exp::GetExpValue(isin, d))
4 J4 Y. ^" U, H {
- |, I9 v" n8 Q! C cout<<d<<endl;
8 I- k8 Q6 T8 i1 c2 k$ k8 h }
" t1 \% M% p; ^ else, f7 ~, x/ c8 {: I) g
{ k1 r- i- n* y% w* ~2 H- G) H
cout<<"ERROR"<<endl;
/ Q- m2 r9 ]6 `, T$ x }9 `" y0 Y, Y9 x) M9 d. j
}: {+ R( T1 Z& b% ~+ |
return 0;' \& D" A# |9 M" n; A1 `8 \
}- U: {! j2 t4 }% _$ F
7 [6 z, r+ _( ^# p
% R- k, p# C l5 Q1 v0 E然后编译执行就可以了(*^_^*)
" x$ i0 { H( `. Y, F其它:TC++上一定编译错误,不保证在VC6上也能通过编译
$ ]. |, M# m5 w4 j1 l0 o) Y) }$ X 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|