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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
! ~9 h) N9 H- y' I; m/ \* m2 g一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
~( G* g9 L5 Q/ v只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) [& D& W3 T7 Z! k参数解释:5 { T" y( i; l# D( ^# h# y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 m2 F/ T1 ~) n' \nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 q% }4 }+ l) r$ P2 K返回值:
8 J, H% \' l8 z, r+ O: p8 Q4 i返回非0表示计算成功,0表示计算失败有错误
6 D9 O* _9 y3 f5 B' P% I" @' }: R
# X# K& X* a3 i/ {3 ?( K + g1 |! D! q( m Y
- h! |& {/ f/ k/ j# s程序代码: 2 G0 P- A) g8 S" Q" a7 A0 p" m
; J; s& b7 r, {. B
namespace fy_Exp{
$ u9 Y) N z) L2 w; Pnamespace {template <class _T>
& q4 ?% I: q/ [- O: minline _T GetExpValue(_T t[], char& csym){
( Q$ V- C1 A3 J `' t char c=csym; csym=0;
; f; h# a( m+ i) ]+ @8 F1 N switch(c){
u# h1 q8 A' \$ i0 i case '+':return t[0] += t[1];+ @6 e& q$ Z+ \ O9 m9 t! _1 o& l. {
case '-':return t[0] -= t[1];
' f \; E3 b" k6 U; v case '*':return t[0] *= t[1];
. ^3 x# Y# h" \5 L; N/ f' r. F default: return t[0] /= t[1];//case '/':
. Z& A G* @' X0 s }& U# d% ]0 G' Z: _
}}
5 s; j, u$ C$ C6 atemplate <class _T, class _Tstream>/ w! f7 z( z1 Y) [) h8 H
/* _Tstream: inputstream, _T: get return value; I9 h8 ^3 J# U7 U% @2 L4 A
* Return nonzero if get value successfully */
. u3 b% ?0 T- z( V' t# dint GetExpValue(_Tstream& istrin, _T& nReturn){ a3 T+ f: F. R
_T t[3] = {0}; //雨中飞燕之作3 E7 w" `9 a0 N/ ~/ c
char csym[3] = "++";4 C% Y3 J) p2 y! j* Y8 m( B
int nLevel = 1, nERR = 0;# u! R. [* t$ \- ~$ H* j. M
if(!(istrin>>t[1]))istrin.clear();
% I; L' _) t" P& c/ ~ for(;;){
* ]1 r7 @. g$ D A0 f if(istrin>>csym[2]){8 l+ L" t2 P* d$ Z
switch(csym[2]){& l2 N+ v! S; B. ^3 _3 J
case '(':, q; N3 J- O, P% e" \& a% l4 [8 p% |) p
if(!csym[1]){nLevel=0x100; nERR=1;}else- h4 {2 m$ e$ W
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# {! V# z' I% W' M" ~
else{nLevel=0x100; nERR=1;}
" g O& ?9 r; d0 r break;& |# Y% @! v/ x6 C. u7 y! r
case ')':# R) m6 N( E# H* O+ w
{nLevel = 0x100;}break;* d4 T: A- o5 e
case '+':case '-':case '*':case '/':
8 V- O, @% W4 d4 K Z& T {csym[nLevel++] = csym[2];}break;4 m* z4 N! k' P" m( S/ Y1 a
case ' ':case '\r':case '\n':case '\t':continue;
" m: J" {, }/ ^' Z; a default:
% R& L5 O; G0 o% v( n0 t1 w3 C# k {nLevel=0x100; nERR=1;}0 c3 Y3 a( K5 E, ^: S/ o
}
! ~. G _7 W% C1 T if(nLevel==0x100)break;1 d+ Y9 v! M1 K
if(nLevel&0x10 || istrin>>t[2]){
" w p7 ]- w8 U0 L( ~ nLevel &= 0xF;
# u7 o g7 _2 ]' f& t8 M" ` if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& h M1 V1 ?8 b7 T0 d0 z1 G' b" n
if(csym[1]=='*'||csym[1]=='/'){
0 \$ W8 P/ }! z% w3 F/ x0 z GetExpValue(t+1, csym[1]);6 o6 m, _$ C4 k! _$ B- n: C
}/ v: |% Q( c+ Z: ^9 I
else{' s' F8 e: g" e. {" Y
GetExpValue(t, csym[0]);
$ A F0 u4 {. F) k0 r& |7 q t[1]=t[2];csym[0]=csym[1];csym[1]=0;( m$ o/ P% t- s( ^6 R; A
}9 ~2 n6 X2 m: i3 Y. }3 f8 @. l9 r
nLevel = 1;
1 b3 r6 ^% j' q4 G% ~+ n. f8 p }: q; E. m& F+ t0 w$ e
else istrin.clear();2 B' a4 k. G# I; i
}9 c3 C; `# A! b, b) M
else{nERR = -1; break;}0 R& S) Y! o M% r1 s
}2 {! U( R F; W6 z Z/ Q
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( T" g5 w# L/ B" E' Y: h4 n" f else nReturn=GetExpValue(t, csym[0]);
' E& S4 W' h! t6 J- J return nERR==-1?1:0;
! R2 ?) P5 q- i+ o, O( _}}) I+ Z- D. i& [3 ~* I. m
: p: c6 x6 s, S
$ l) ?8 w& w& E$ u5 @! P. A, \: |) o/ I% p8 |9 p* q
函数模板使用示例:
! A# D+ S3 \/ a2 ]3 V2 Z在以上那段代码的后面加上以下代码:# _1 j, _. e0 L, n. ?2 h+ j3 Q9 Q
2 O' |, q/ c! b" p! J! e6 t$ D
6 r& y m# N6 Y, |5 ^4 {+ p
) H8 Y9 K ^2 W7 P' I程序代码:
; k* y3 c9 l! X: W
6 u) ?5 O0 [6 @#include<strstream>/ v+ O% L; n+ l( `
#include<iostream>; V3 G4 u: j" [; N
#include<string>
) c0 Z" G, s( d& z- susing namespace std;0 z( F! u2 p) v# R6 W
int main(void)
# ^4 [0 D0 f: ]! p! Z) S{
1 m, [4 j$ q; _# z string s1;: H% F5 p; r1 S3 Z# n
while(cin>>s1)
) z8 f j' e2 R* }# ~9 K {+ f. @5 K- h) N$ |
istrstream isin(s1.data());# e, e2 ^6 O L4 G* l# I- b
double d;
# T& N& n- m2 v& t if(fy_Exp::GetExpValue(isin, d))
4 J5 H$ T) d$ x) m8 U; E. q {6 M9 U$ M% q" H4 [5 c5 d
cout<<d<<endl;7 ]' _- S* [# O, @: N J
}3 B+ ?, L+ ~+ r! Z2 d$ R
else O+ J5 J D% X- r# Z* n1 ~
{8 ~& {! w- ^" V7 ~$ W8 c' t- C
cout<<"ERROR"<<endl;* B. h3 a! l2 P
}
7 m! K; K) }, B# [! a1 j& f }
+ v0 G8 j% o t/ B$ B2 q* n0 @ return 0;1 G4 Z' N( I. _+ B G3 c1 q
}+ g$ P. W7 ^: p" v! \- X3 C- t
. [) Q4 T# J2 M# T
, U. r. v a- @" _然后编译执行就可以了(*^_^*)+ S1 v% l1 X( p
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ u% N# }9 ^3 m5 b# `+ {+ u
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|