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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,' ]8 \' t' K _& {3 M3 E
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" ^. `8 U9 q9 p! `5 k4 }- `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! Z) R$ l; O& U. C0 | n0 m
参数解释:
S$ |6 V7 P t5 Y4 C, ^/ @3 t8 v, Listrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ w( a0 A- l+ @9 H9 RnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ B2 O; j i& o3 E# j返回值:0 l! G0 ` A; p! v# }) s- v
返回非0表示计算成功,0表示计算失败有错误
. F! j6 S" i, v; u% ^9 m8 n
4 t) \, I5 O) `0 d8 f
! j! `$ ~8 f# J W
6 k e8 u: W& d) X! t) w' w# t2 q2 I% u程序代码: 6 t+ B- X+ T) o% u3 u: ?7 ?7 @6 c
) q" N- E. {, `: l7 w& J5 B2 H
namespace fy_Exp{
1 h* q9 h6 m6 x' }% _2 I' w% ]6 bnamespace {template <class _T>
' m4 n1 ~$ Z& P" j# Linline _T GetExpValue(_T t[], char& csym){
9 B# @0 N0 @9 @% o5 F char c=csym; csym=0;
/ v' I4 Y7 k6 t0 K: | switch(c){
' R( Y) Q* Y9 s$ z case '+':return t[0] += t[1];# s8 U( z' B* I0 ?3 X
case '-':return t[0] -= t[1];" S! K) V( t% L) b, B
case '*':return t[0] *= t[1];9 a3 j# |0 k: v
default: return t[0] /= t[1];//case '/':
7 {9 _7 N# ?/ J) K7 x, | }
) a! H2 M$ [2 M6 J- c}}* Y4 m; l0 y1 s& {( e
template <class _T, class _Tstream>
$ h0 B/ I y- C. F9 M$ o: w/* _Tstream: inputstream, _T: get return value* h, a5 n3 c- B) B# @ r
* Return nonzero if get value successfully */
) E- Y: d$ Y: Mint GetExpValue(_Tstream& istrin, _T& nReturn){1 K: Y+ ?0 b/ x* }! Y
_T t[3] = {0}; //雨中飞燕之作: h* z% s* ?9 D
char csym[3] = "++";- h% W! S* Y ~0 D) H9 u3 G
int nLevel = 1, nERR = 0;
- Q9 V u6 e8 {$ e7 i4 h' F if(!(istrin>>t[1]))istrin.clear();( v% ^& T5 z# U7 w* {$ `' x7 j- ?
for(;;){2 s; [) J, E; U. Y1 A
if(istrin>>csym[2]){: Q# T5 ]2 B6 l1 G$ }
switch(csym[2]){
. l2 M0 B3 S; A case '(':
$ o1 E) c" E; [6 f9 y2 ` if(!csym[1]){nLevel=0x100; nERR=1;}else
; t$ R4 r8 n( l) e' o8 G( [. d9 H if(!GetExpValue(istrin, t[2]))nLevel|=0x10;* J, N. g: d: C& \9 M+ r" d+ r+ Y
else{nLevel=0x100; nERR=1;}
* q, w0 r J& v1 O8 J: R break;# h" s! x/ T% H9 W
case ')':
: N$ ^: V9 j. Y0 @ F# d( H {nLevel = 0x100;}break;
" r; j4 O6 K9 f' ~ case '+':case '-':case '*':case '/':' g! p9 k T. ]8 R N) K3 Y
{csym[nLevel++] = csym[2];}break;
! R c- }" h# K- E4 w m case ' ':case '\r':case '\n':case '\t':continue;
- v) O; n% F7 N( i3 U default:
( `0 `$ i4 y/ P5 \- N {nLevel=0x100; nERR=1;}7 u) O* N* o9 o$ S4 v
}& U% @4 t' Z( c. T
if(nLevel==0x100)break;& N _# K' q9 k* r! z
if(nLevel&0x10 || istrin>>t[2]){1 `% E) f' c( A/ i
nLevel &= 0xF;
. l6 e" b4 Q6 e if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! _ ~) i9 H, j3 n( M
if(csym[1]=='*'||csym[1]=='/'){
6 O* P4 M2 z# c; {! [0 b, w" d GetExpValue(t+1, csym[1]);" x: G1 N1 c' d; M% v( h
}
, b& Y6 h9 L. D6 m$ Y8 ]! f else{! \2 o1 t$ K. e! P1 v9 ^
GetExpValue(t, csym[0]);
# }7 C$ u5 `5 y+ T: f* u2 W* t8 p. { t[1]=t[2];csym[0]=csym[1];csym[1]=0;( W; I; |8 N! u, F0 o
}
+ P4 Y e' f8 L2 O nLevel = 1;+ ?- d! ~/ U/ X5 ]) k
}
' a4 _: `( \3 M- Z9 ^7 h" V' P0 C else istrin.clear();
* U& R( l. z1 C c4 j3 ` }8 M' }) T6 x$ r) r& }6 l
else{nERR = -1; break;} B6 d2 H2 T9 ^+ T+ ^2 H
}
$ V: k; I) F8 U/ C6 K! @! q- G0 M if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
! ?3 O. c! Z* y! U( F% ` else nReturn=GetExpValue(t, csym[0]);: a4 ~4 `% ~2 M' y* S
return nERR==-1?1:0;
1 O- S" f; T4 O$ U}}
9 \" M! g5 A1 ]% U; s7 K! `. ` @' X5 V; e' `+ O. u5 r- J
7 u, j1 }7 y6 j' G& } M4 `( h: @, R& Y, C. f0 {( p
函数模板使用示例:
) U/ W* ?+ E9 R0 d4 u+ Y在以上那段代码的后面加上以下代码:
) ]0 N% D% F! F1 O2 z- c" N$ k7 E& ^2 ~1 [. U+ r1 @ I
/ |/ C* Y$ M4 O1 Z" e6 P
6 s! l" T9 W6 N& u5 Z0 X4 e程序代码:
& A. y1 u' T4 J
1 j$ @ ~3 `5 T: d; M1 c5 a#include<strstream>
# P% a& `& F, m4 n! Y" i#include<iostream>
0 w/ F: }) p) S. l5 F8 O#include<string>) @0 k; J6 P0 D$ W5 }) j
using namespace std;4 y" M- C1 J" V0 H& k
int main(void)
# ^5 _/ I' w, K{
/ A2 o" E- A' r2 D+ E6 W% ? string s1;
! z2 [" ]: ^# \% S8 N while(cin>>s1)2 \8 @7 Y" q i# R, t" P
{ s ~2 G4 Z2 m
istrstream isin(s1.data());
~, @* [5 T( e* d# d+ r double d;3 n5 T- [* Q5 l' v1 I8 c& R ^; N
if(fy_Exp::GetExpValue(isin, d)), Z+ C. N/ m; i4 p" l
{" S" j4 q ?& F; X8 G6 ]" d0 H
cout<<d<<endl;
0 s9 z4 j8 `- T* d+ i6 U }
0 M% Q( P% k8 K$ S else$ a, n# y# `4 I! i1 Y
{) a& U6 ?! F" Q2 G1 w! C j5 w0 {: u& T
cout<<"ERROR"<<endl;
/ _1 U) T5 i3 c3 }/ T, g5 q/ Y }- s c* [, j+ ]; B6 e/ h9 k
}+ ^/ D7 v& z' Y3 r& q
return 0;
+ Q v" Y: d% a& G; Z8 H$ C}/ o8 W( S: D6 @( h) K3 l1 z
/ m+ X3 k; K6 h. a/ O
! P# {' U: i0 V2 {1 c
然后编译执行就可以了(*^_^*)
}) W: c8 h# C$ V p其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 Z& q1 E- e! ]6 q4 H# x' x 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|