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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,& L! ^) K! y* F* y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! A+ `) T2 |6 g: j: f只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
5 y, v' x1 t5 G7 b) o# r参数解释:
( y' z: P' C: q8 U4 Z1 Xistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 R Z% b( D( G- D2 |; hnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
% U. Q+ @/ U8 v D. I返回值:
8 `; f5 h" g9 b; Z6 d返回非0表示计算成功,0表示计算失败有错误( F, g) X" b4 i& w, Z2 x; W8 }) Y
$ a( M k7 C3 w! z: |& B; n6 q 4 V+ t6 u k( B) [& c! b; A. c4 g
( i) X6 y2 \- a2 V+ S程序代码:
* Q* Q M) z! n6 e9 g* w
6 I2 J+ M( k' ^+ M3 z" pnamespace fy_Exp{9 i. H; z8 Y0 l
namespace {template <class _T>
7 s% b" J8 C( Q3 C3 `. }( oinline _T GetExpValue(_T t[], char& csym){
" J3 w6 E: @- o+ O char c=csym; csym=0;/ n4 }9 |* s) r/ ?' n# w
switch(c){1 g. T% Q5 U; W5 }
case '+':return t[0] += t[1];
& A: q+ |+ H8 J9 M( e9 |3 h case '-':return t[0] -= t[1];
/ D: s1 o0 {$ j; T; } case '*':return t[0] *= t[1];
& _9 E: l& H& E default: return t[0] /= t[1];//case '/':
5 h( |( `: D: l" S }
6 o9 u1 I% B$ w! |- V}}
: Z4 y/ J6 C+ E+ H) P/ o) o) x r/ Ntemplate <class _T, class _Tstream>6 e' E# O5 ]2 H" [4 k* y7 L
/* _Tstream: inputstream, _T: get return value% k3 M" t' [" N5 b
* Return nonzero if get value successfully */3 K, P1 H9 i7 Q) T
int GetExpValue(_Tstream& istrin, _T& nReturn){
) r& E; {0 Z$ _# ? _T t[3] = {0}; //雨中飞燕之作% c2 z( f% H. D n+ D# L
char csym[3] = "++";
$ l" m& f6 b) B" i) _ int nLevel = 1, nERR = 0;6 L- S8 @6 h2 H; y4 R' T: b
if(!(istrin>>t[1]))istrin.clear();
6 m' v$ U) r, V% }, S! j for(;;){" x+ Z o3 J% w" _
if(istrin>>csym[2]){
3 ^6 y8 \; l6 G$ y switch(csym[2]){
: Q+ B8 G+ H" ]2 d1 j8 ?2 S, | case '(':
: c- ?, z, ]. Z if(!csym[1]){nLevel=0x100; nERR=1;}else2 _6 |4 w. T+ ]2 X2 T4 T& q
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;$ E5 @7 D @3 v# a; t
else{nLevel=0x100; nERR=1;}
+ e, f; J* T) u" j3 o3 R& } break;
& @ i3 q/ E1 C( P case ')':
5 Y9 N; ~. N; |8 J) ^( ? {nLevel = 0x100;}break;
! s0 z" D# Q: W S case '+':case '-':case '*':case '/':3 Z( z u: a+ l
{csym[nLevel++] = csym[2];}break;6 f) y9 _& G! r5 q; Q: i8 J
case ' ':case '\r':case '\n':case '\t':continue;
. q) q( U; o/ F6 _& U. r# L1 T( ] default:
: K/ x) v- v: H0 h2 J {nLevel=0x100; nERR=1;}: \: V8 Y- y( t- {) P' O
}' h% F ?6 h, \" X/ l; d, X q
if(nLevel==0x100)break;
- ?' |- V2 J# Q4 s; P if(nLevel&0x10 || istrin>>t[2]){
* Q7 n9 W! I- S8 c7 V! u nLevel &= 0xF;
' ~+ W) e- T( _ w/ Z if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" w9 p6 o4 L% t+ u/ P2 V3 {0 X if(csym[1]=='*'||csym[1]=='/'){5 B* B" H7 q' W( ^
GetExpValue(t+1, csym[1]);+ [ S `7 S b$ e
}: L4 A' k& o. j9 m( f" f+ k6 g- R% h
else{. |1 ]1 L3 N: E" _& a3 Y
GetExpValue(t, csym[0]);
9 l" |, l6 l1 E5 b8 c' ]. Q) u( g t[1]=t[2];csym[0]=csym[1];csym[1]=0;& y6 X5 L n5 c* s
}1 Q# A6 w, v4 z
nLevel = 1;$ u2 o" C4 o% c7 A. g0 s
}
5 k2 h# M2 y3 v; G6 \ else istrin.clear();, }/ j Q) X1 M! e6 v
}0 N' f( \7 C9 k! g1 h5 M+ G
else{nERR = -1; break;}0 B6 E) N" }$ G( ~$ \8 u
}
8 v3 \$ _; Q. l1 L8 P3 G6 t if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
$ i3 h- f/ q O else nReturn=GetExpValue(t, csym[0]);3 J4 r9 |. }% a3 }, s8 ~/ c
return nERR==-1?1:0;% q3 M( n9 h; `& H
}}
, N8 J! B& d4 N( i" \& z" B6 n2 k S) y
! m5 E8 _ A# r) D8 M" o/ h0 b+ {6 {9 o* ]# ^; B
函数模板使用示例:% h" X' }3 I# T$ r2 t$ Y' L
在以上那段代码的后面加上以下代码:
" U4 P! I5 n9 e. b4 p
F) }( S- ?2 M' C/ u4 ^ b
2 K4 @8 e& v7 Y4 ~0 n. w2 S! p" q
/ d' s5 g+ F5 a8 F: Z程序代码: $ G9 B% J$ I2 ]' B; {0 N
1 S: R* R) I) c( Y
#include<strstream>
- {2 w& n1 V* G" e; ]* N4 Q#include<iostream>
& C# Z; w4 _ C7 Q0 y#include<string>( `9 o. Z3 R8 ~3 `( q6 z
using namespace std;
# {9 D6 H/ f1 D* ^/ ~int main(void)
+ ]! [* r0 q- a{
$ i2 ~ T2 K! a0 g% g string s1;
7 ~" y, w* M/ _8 Y8 H8 ^ while(cin>>s1)! C% c+ u1 `( h$ J7 H0 a
{( ]* g- ?0 N% s0 B5 G
istrstream isin(s1.data());0 o8 x: \$ x! W" R( P
double d;4 g5 P2 ~7 M2 [. M% G
if(fy_Exp::GetExpValue(isin, d))
' ?3 q- V) T7 v' X {
7 @% Y4 ?! C" u. ]0 U- N' o. o3 P cout<<d<<endl;
0 _& ^( H G. Z }
$ F' | t4 a. ]3 P0 {( j else6 q( }: u9 P# y( C% w# P9 U0 V* O
{/ z) T7 g( d( _" A' V- i6 j+ _
cout<<"ERROR"<<endl;: Z2 n. S# [; {% d8 t4 m
}9 T' N M( P& r
}; H7 a* J& M/ ?/ w# a* W1 }& W# W
return 0;
( `. ]/ Q0 v, d$ z}7 j3 o+ o4 Z7 S6 x/ `9 V$ l9 j- Y
) v7 O6 Y& ]& e+ ^$ N0 K
1 R( A& |, `& V2 G然后编译执行就可以了(*^_^*)' L1 C: {6 |4 o* G- v9 J
其它:TC++上一定编译错误,不保证在VC6上也能通过编译; ~ j0 k( L9 u: e: c" j# g$ u
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|