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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的," a: e: ~" u5 R+ [
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ g* x' o2 ^2 v! x2 l6 Y1 \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. T6 W# p" {! n3 ?% u* s9 b参数解释: ]( l2 G# F! i2 p
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; X- U3 e; Y: O1 {) ?# r4 F2 ~nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: ]* k" @7 A( { |+ z9 X$ _返回值:8 `3 s5 l" P u( y5 W; k( S
返回非0表示计算成功,0表示计算失败有错误 a0 d0 R$ n" y4 | l. U% W
; h' L0 ^# u1 T0 n$ _
, [* o+ g% n6 G* u' p9 B$ P3 ^( u
程序代码: ! @$ E# L; q5 b! I5 @
% V+ W) `* e: Z. n# k
namespace fy_Exp{
$ P. ^0 Q- } ^) v1 Rnamespace {template <class _T>
$ p M8 C( j" hinline _T GetExpValue(_T t[], char& csym){
) m8 ^& ]' _& q char c=csym; csym=0;
5 x/ m- H- y8 q# R switch(c){
( @9 Y2 t6 |$ V# i& f2 [8 C case '+':return t[0] += t[1];
o1 B& x, ^8 I- |! n case '-':return t[0] -= t[1];
; t2 W# W2 Y. s case '*':return t[0] *= t[1];, n' W% ^0 I$ m5 g- F5 m. N
default: return t[0] /= t[1];//case '/':
! h' Z) f0 X+ b0 w5 y# [ }0 x- x) r5 N+ f$ j/ s! {( ^
}}
5 A8 _- ]+ P7 K* T+ e; \* gtemplate <class _T, class _Tstream>
7 m4 @1 v" S; P# g# X, R4 m$ y/* _Tstream: inputstream, _T: get return value) G" Y8 ]" F& J1 ]6 |
* Return nonzero if get value successfully */- r, @. D1 w* S
int GetExpValue(_Tstream& istrin, _T& nReturn){! `+ V& P; y& ]; y+ m
_T t[3] = {0}; //雨中飞燕之作6 y/ D; l5 M2 S! O; z: w8 d
char csym[3] = "++";6 r8 W' V+ _) @2 s% a& g& U
int nLevel = 1, nERR = 0;
: p% h, b- D3 u' z- C if(!(istrin>>t[1]))istrin.clear();8 \' z, @8 \0 H2 c
for(;;){& j% h) i) W& y9 u* p' }
if(istrin>>csym[2]){0 Q+ }. s6 G5 t: Z
switch(csym[2]){) W' E2 A# ~+ j% Y; H
case '(':
! g3 c( M8 m# c; n5 X9 c* U( q5 v if(!csym[1]){nLevel=0x100; nERR=1;}else4 e% {* p" L2 t/ e
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ v+ z& d5 G* V2 ^- q else{nLevel=0x100; nERR=1;}
, [ z, s2 ?- w1 F7 B break;
+ K6 a) @0 A0 V7 T& f case ')':6 N* x1 g( J l# s3 Z( |4 Z/ R4 _/ \
{nLevel = 0x100;}break;+ p/ _: k; F! ]$ V* g" q
case '+':case '-':case '*':case '/':
( g" j4 o$ J% H {csym[nLevel++] = csym[2];}break;
7 w( H, {# z0 @* p* {: O" e& e case ' ':case '\r':case '\n':case '\t':continue;0 \% Z. ^' q. v6 g
default:* q5 J, C* _! F, j5 Z; U
{nLevel=0x100; nERR=1;}
( X& I$ J9 Y1 w+ i" n+ e! x+ S }: w7 n7 E8 o0 [2 x$ v2 t: v) T2 Y* x
if(nLevel==0x100)break;' V9 R+ K, B, m" Q2 ^( }
if(nLevel&0x10 || istrin>>t[2]){6 ~ M6 m$ T! H" u4 U
nLevel &= 0xF;' e7 {( N. K" v$ C& y$ O' A2 P
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# j+ i8 v& d9 @6 g' Q if(csym[1]=='*'||csym[1]=='/'){
$ X. t! I! p* Q$ W% H GetExpValue(t+1, csym[1]);
/ v4 ~! c: i5 P" x: B0 g0 L! b* c }
7 k% n7 s- t/ \6 ~- C7 s, x5 E& J& n else{
* [$ @. y, U5 a% t# _! s GetExpValue(t, csym[0]);
1 ]/ C; D$ @# q: n+ V/ w" [# ~. A9 W4 u t[1]=t[2];csym[0]=csym[1];csym[1]=0;! t" G9 y* `( c4 r. ?$ k1 U; N
}
( x: ~% w; q3 T2 { I t9 V2 | nLevel = 1;
. v/ H. A# t- b, z5 H }! ]( M$ J0 @. e% R) j. N6 h
else istrin.clear();
# y7 x1 `: W' P, M9 C }
' |1 |; {, d& D+ ^$ \& ^6 H% t) Q) M else{nERR = -1; break;}
9 b% W" Y* H! M" c# i; ~% p }
; B4 D, R8 w& Y! R if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" ~$ {, {7 r1 v2 i else nReturn=GetExpValue(t, csym[0]);+ J" u$ j3 p" Q, }8 [: E
return nERR==-1?1:0;
% W1 D' \1 ?. ^}}
) o% y7 L& X# m" Z
X1 W0 c1 E* j: n+ t/ m( x+ h
; w! G/ @) g" i5 I1 M
, v5 a- B" R4 {% b9 }4 X函数模板使用示例:4 F8 b% g) v9 i
在以上那段代码的后面加上以下代码:
# Y) h! w4 B4 @* _# @
! z9 {2 X6 p) m- ^* w
9 z# o7 {8 B& J! e
: |, K( ^5 Q" U: ?- W程序代码:
+ w5 h& ]; _& i0 a& J+ H3 @' X' M. b4 P% Q
#include<strstream>$ a# J: S$ ?- ^1 t) J1 U; ?/ C
#include<iostream>2 B+ l) y+ F+ _# t; J4 _
#include<string>" Q. P) D, T# `& r
using namespace std;8 }3 N2 t& M! u* P1 x
int main(void)% K8 U& J2 K& E, d
{" }& Z' Z. n; R- Y; R! w, {8 v
string s1;
$ Z" L! d. Q; ^- ^ while(cin>>s1)
# Q4 r9 Y+ T4 Q {
# J& d4 s1 R1 v% [ istrstream isin(s1.data());& j" i( c, T7 N4 ~
double d;
( O$ _/ e7 w9 t. G# e if(fy_Exp::GetExpValue(isin, d))' q" l/ e* B* X
{
! ?6 y$ H, S+ A cout<<d<<endl;
5 X' u9 _: P% K) ~( K# w }: @* F1 h* M, g) E2 O* t
else
4 X. L- F3 r; c. O2 x: m {2 w# g# f/ E: U3 T: o: x
cout<<"ERROR"<<endl;
" U, o- j/ J3 {* N1 | }
# M9 l. e0 m' c7 O' Y0 }6 p; d6 U. A, y }
- Y5 L2 v; P; U- Q, Z0 r return 0;+ C# ` d; [9 o* r3 J5 O
}
6 V. F% ^4 H- D8 Z4 N4 t
: W' e( [7 [( T6 W; Q$ u+ A. M3 r6 @, B0 u+ O
然后编译执行就可以了(*^_^*)( o! u5 B- ~9 ~0 R6 d7 Q" F5 X$ X( B& W" G
其它:TC++上一定编译错误,不保证在VC6上也能通过编译) g9 u4 {9 ?" g
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|