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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,- D/ {1 z+ a W4 ?; a! \" J
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. u+ X9 X- F: I |5 c* i只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# G/ u4 L( D6 Z0 R; \8 g8 q参数解释:
$ ~& o' F6 k. c4 p% {- n# _istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 g$ S% |( I+ q" I" `nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% c7 [+ Y" C3 P: L3 x* p6 F7 w
返回值:
6 I# ]. J0 Z/ X& [7 G% z返回非0表示计算成功,0表示计算失败有错误9 ?6 Q) F% W- D2 T- b" b- I2 L
- J$ ]& g' { C4 E0 f$ G$ ` ; Z) e- v5 E& J) K* B) g1 |' @
1 R- V3 j0 X' w3 S2 O* z8 o
程序代码:
" y: @5 U/ a2 o$ y+ ^% r5 O. f. ^3 |. d0 Z( n1 c( g9 c+ c; m
namespace fy_Exp{: P6 O9 v/ r1 ^ |+ y1 m4 a
namespace {template <class _T>
+ i7 P6 S4 p$ Pinline _T GetExpValue(_T t[], char& csym){
9 a; R R" u+ i2 f# B0 M* \2 U char c=csym; csym=0;/ c) t* F/ }9 P$ m' B+ @1 @/ p) ?
switch(c){1 U, {7 H8 S: b7 C r2 d8 h/ M
case '+':return t[0] += t[1];
; B) [$ I' H! d% _+ U case '-':return t[0] -= t[1];
" r, {% N3 S, g! W; J case '*':return t[0] *= t[1];1 |. M- I; z- g. s$ ?
default: return t[0] /= t[1];//case '/':
* d2 N/ P5 @6 S, ~5 s1 n }2 I- G2 ^! g! F1 |
}}7 K7 h4 W& F) G& @
template <class _T, class _Tstream>8 U7 P F; C4 h! S% T& w
/* _Tstream: inputstream, _T: get return value) z9 v" \, u- T1 i
* Return nonzero if get value successfully */
( Q7 r4 n( {: o+ i/ O( a7 B) oint GetExpValue(_Tstream& istrin, _T& nReturn){' n' Z$ V1 S6 d$ I
_T t[3] = {0}; //雨中飞燕之作: d. {1 B0 P1 r: b
char csym[3] = "++";
& r$ s3 k \& R( y7 \& Q( e' P int nLevel = 1, nERR = 0;
& E$ H: F# W' ^6 L Q0 X \ if(!(istrin>>t[1]))istrin.clear();4 p$ {) T0 G" ?
for(;;){
5 N+ q+ Z0 `& g; Z+ S if(istrin>>csym[2]){; B( [! I) Z% J! d! f; Z
switch(csym[2]){
( q7 b1 G1 f0 C7 ]; R. d3 n case '(':; Y! {* E" a1 ]. ^/ M
if(!csym[1]){nLevel=0x100; nERR=1;}else
( ?1 a( U. b; s0 S* A: ^) b if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 h0 B2 x7 v6 N2 z- b
else{nLevel=0x100; nERR=1;}
) Y1 }1 K( h! S" I6 n, T7 P) r break;
. w3 ^1 R: _3 I( ~' D2 l case ')':2 x( L: p9 ?0 v! c
{nLevel = 0x100;}break;( O' |* I1 k {. _" E1 Q1 o V# z- o
case '+':case '-':case '*':case '/':
% F5 m) K- ~5 K0 D1 G# [4 ? {csym[nLevel++] = csym[2];}break;
" R* E9 R1 w& ~: s( c case ' ':case '\r':case '\n':case '\t':continue;
2 ^. r/ w' h7 W default:
) {( q& M# N0 ` {nLevel=0x100; nERR=1;}
/ m' {' [8 P% Y }! \" {6 O( P Y8 f$ h
if(nLevel==0x100)break;
; S. B) ?" [" p. a: N; K. e9 f if(nLevel&0x10 || istrin>>t[2]){
8 O& S" L* |6 Q, K- y& `6 S nLevel &= 0xF;
8 i% I3 [4 u8 M" x. P: y. |4 j* O5 I if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! K- K b/ R( \$ J: U" S
if(csym[1]=='*'||csym[1]=='/'){& O y; C! R* @; g+ V y y
GetExpValue(t+1, csym[1]);
1 [" v6 r5 @8 G( C }
V2 u$ g6 x+ v$ L else{
`0 N( s) D( s* s; a& V GetExpValue(t, csym[0]);
5 p6 F: e1 K/ Z- n8 | t[1]=t[2];csym[0]=csym[1];csym[1]=0;& ?' c, K, ~% w" s A9 }
}
+ D$ y7 d! A7 o# b" Z/ B$ [9 ? nLevel = 1;
& ~3 j9 ^" v, B: q5 @ }" Y) H7 U. [6 h5 m1 O8 m! E: k
else istrin.clear();, o% s4 `3 f2 S$ p
}5 C* E1 } y/ o
else{nERR = -1; break;}2 Q8 E' U9 v, c$ Z& {6 v
}
4 {: C. o# m+ ^ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 ?5 q K' J& o# i
else nReturn=GetExpValue(t, csym[0]);7 q* V4 _; q9 N- r
return nERR==-1?1:0;6 |) c2 Q! o; }0 Z s
}}
! o6 W$ u! i1 X
9 N9 Y0 l. J3 K: }! Z* ?" w& g6 H4 O$ N
2 M( ?- N% ?2 P7 X, G1 P4 @函数模板使用示例:
! Y5 ?: A; M' f8 d- ~在以上那段代码的后面加上以下代码:
, ] F) C u$ k7 E/ Z( Y
( n8 L$ `& B! U4 Q' A$ T
/ x5 E4 `6 [- l Q6 {3 B7 ^4 W6 ?
程序代码:
& q- h+ F$ h2 \# E4 Y, G& |9 o0 ~) K" N. e5 J% ?1 E
#include<strstream>
) u5 T L7 E( [% g7 J0 c% Z3 v0 F#include<iostream>
# `& I7 o* a6 i; m#include<string>
- l0 D. f6 z% B" P& [- [9 D+ Zusing namespace std;% t) z* g& I, B9 `( E
int main(void): }' o5 C1 l5 S. l; i6 E2 J
{
+ I+ ?7 P _! M3 u$ | string s1;
D. I* A" k1 H! _7 j while(cin>>s1)
% q6 r. D1 h3 J {# \( i/ C n9 L2 m+ |6 X' f
istrstream isin(s1.data());, j9 a5 a5 ]$ r, o' l Z& T# o5 i6 j
double d;
) b1 L" K* C p; W if(fy_Exp::GetExpValue(isin, d)) O" X& N( E: k# B/ ]) g7 C
{+ \, r/ K' c0 J" m+ h4 n1 w8 P+ ~
cout<<d<<endl;, L6 ~0 E/ G! n. B
}
1 B9 Q" X/ |8 q& N8 e; ^ else
# c* z; \* F$ z, {- o. { {! u% A& w/ L: r. v+ O; }5 Q" O
cout<<"ERROR"<<endl;
: W" ^/ F$ v: ~. d8 o }
& D' V* l& X9 K4 K }# d" F" O: u$ Q T' k% h& S
return 0;
8 Z$ o1 i- }% Q& z. A" d0 H/ a0 d}9 ~; z, ?$ V6 n8 o( x
. z7 @) I G# m9 S. u3 e4 Y2 N! C$ D5 z) ]" ^6 b$ q
然后编译执行就可以了(*^_^*)$ |: u; B/ Q9 @& a: I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
6 s; [% q2 n3 R% S) q7 {+ U9 \ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|