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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,& S) |8 I C, n4 S1 F- s- e2 T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 M; D, o2 f3 r6 [ K, ? W只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 ~, i& f7 H& I8 [) j& S! G0 b& H
参数解释:
$ f2 Y$ {4 F v1 @5 tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% S& Q8 t; p1 {6 ?+ s3 F/ F
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定 z& N4 i; A4 w' c4 b" w8 c4 N% i
返回值:$ B: Z# {; i9 R
返回非0表示计算成功,0表示计算失败有错误
: |( S# W; f4 w
" t- k7 J# |4 q8 m$ o( i
; ^! Y& l- Z1 Y5 \
& |( v; G/ ], g) a/ x: c程序代码:
9 X3 P; F( S, m+ i+ Y) Q
+ i5 u9 q. P3 [) lnamespace fy_Exp{; S) s- n5 w0 J! \0 ^1 R
namespace {template <class _T>
7 k4 L$ @5 v, A- h( G* o @inline _T GetExpValue(_T t[], char& csym){, A2 `7 s- _' K1 R8 F2 n* N" R
char c=csym; csym=0;1 ~0 x0 b& h. J5 F
switch(c){3 q: |) F5 s( u2 f0 y6 j
case '+':return t[0] += t[1];
' H3 E& n2 u1 Z; @0 T' b' i case '-':return t[0] -= t[1];
) Q9 F( o! o6 D4 ^0 ]; `3 M case '*':return t[0] *= t[1];1 a4 j6 X7 {. q! z
default: return t[0] /= t[1];//case '/':
/ d8 G' @5 S- S( [ }8 u3 K! S& @! b4 u, @
}}
. ^. k& R! P: j0 k, g! ]template <class _T, class _Tstream>
( F! J; j+ a* I7 p; S8 |/* _Tstream: inputstream, _T: get return value
4 a" f% V9 f$ ^, i# y( U* Return nonzero if get value successfully */
- ^9 N7 [- z# f; ~0 Q7 nint GetExpValue(_Tstream& istrin, _T& nReturn){
( Y( z1 S! r/ M/ p* j; q" o _T t[3] = {0}; //雨中飞燕之作7 n2 @7 ?" O, }% w% C
char csym[3] = "++";5 p' } }0 H& P* q- a* y
int nLevel = 1, nERR = 0;9 O3 r4 a: m5 ]2 F; G8 X. _
if(!(istrin>>t[1]))istrin.clear();
+ u' B4 c8 _. @* _* F# v for(;;){8 y5 |0 j+ T1 t. D
if(istrin>>csym[2]){ s7 M0 x& n, f
switch(csym[2]){- x, Y+ J k2 Y" v3 }( n
case '(':
% D3 o7 Q# Q; D! a ]4 [ if(!csym[1]){nLevel=0x100; nERR=1;}else
' M3 W8 N4 o9 _( k. R* d if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! E8 W# k% x' U3 D0 {) S
else{nLevel=0x100; nERR=1;}
+ q5 a, F: B0 f& }. S break;' q( ?" d* ]7 r# b$ Y( o: E" r
case ')':
' s- ^& f Q% s {nLevel = 0x100;}break;
3 _: ]2 M, G2 O+ A case '+':case '-':case '*':case '/':
l( V+ s0 e/ ?; Y2 C' m3 G {csym[nLevel++] = csym[2];}break;
8 a* N u: {& J case ' ':case '\r':case '\n':case '\t':continue;
8 J+ w9 H. A- t: V" z/ T default:
5 B3 V3 O+ S4 m/ D9 B- y( C- ]; K {nLevel=0x100; nERR=1;}# Z) G0 A6 W2 S4 u
}
; K ?7 g/ R5 x4 l' L( b if(nLevel==0x100)break;
' D# D& c/ B9 \0 c4 m( B- U if(nLevel&0x10 || istrin>>t[2]){
6 J. ]6 w6 L( ^' A% m, f$ v; X9 y nLevel &= 0xF;
* h7 `7 X+ w/ ]9 w- O" V if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, }; x+ ^1 o' P% Z if(csym[1]=='*'||csym[1]=='/'){6 B* `4 k$ l( e# s: b' }* x
GetExpValue(t+1, csym[1]);
: x5 h; S n0 P0 ]- t$ d }
: s3 g/ Z2 Q% c' k% ^" d else{5 W) U& Y6 V. e) \4 h. v
GetExpValue(t, csym[0]);
; M/ D& ? L3 B/ t t[1]=t[2];csym[0]=csym[1];csym[1]=0;! \: k% o; H1 A* l6 x9 r
}/ ]% B0 v7 p k' {) S3 J
nLevel = 1;
# S0 m9 L5 \9 c, Z3 d8 `" ~ }
% g4 n$ |6 E4 c4 e. B else istrin.clear();
6 {3 w' t4 Y9 p }
: [) |0 X/ A/ G( D' g else{nERR = -1; break;}
2 s4 L! n8 V& s- v" M* x }4 w; i* E/ v* u+ ?! [) X
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 w4 W2 u/ p1 _- r5 s, B' K
else nReturn=GetExpValue(t, csym[0]);
! d d5 p5 ]" _2 s return nERR==-1?1:0;
( }' L& A. W# h5 i}}
7 S; K5 U' c4 B6 d( b, b8 {. P% o$ Y
+ y5 p3 L$ i2 A% b y( ^( ]4 q
% Q: }" q' D+ i3 V5 G. M! _函数模板使用示例:
* k' J& [, d; l# Z在以上那段代码的后面加上以下代码:
+ q' @& h% P4 V2 G, f, f- |3 f3 r% T* ~. Z" J% x ~
' b( [6 U: Z3 R, ~; K2 W% s9 Z4 P
程序代码: + R$ `: g& t$ ]6 Q
6 C# D9 F2 U, h, h' d( n
#include<strstream>
" `% m. u6 h2 s, _. [#include<iostream>
( j# R L. E2 J) Y#include<string>. X& j h( [) p/ k
using namespace std;
0 Y: R- v' a0 k P3 ^5 S: Z2 Yint main(void)
- c9 Y5 q! i/ E/ K{
$ a; s* K# ]% ^: k2 F/ } string s1;
0 I: e5 e0 z: M while(cin>>s1)9 { S0 Z1 Q4 B t2 X3 O$ R; v
{
# V5 u& s+ W$ p istrstream isin(s1.data());
: H- z, R( s/ k! B, J7 }0 G double d;4 l8 l1 c( R* A4 ?! s
if(fy_Exp::GetExpValue(isin, d))
; A! a* g* M$ i' ^ h {
3 c% D+ Y2 Q9 N3 R- f3 y cout<<d<<endl;
Q% `. o' K9 S, V" {' h2 l }
# k! \6 g1 Y* E T7 f, W( P4 l else
& F- q/ S) G& y% H0 H6 X7 ~ {
* p6 S2 v: U" S4 e! i cout<<"ERROR"<<endl;
* F) H6 R7 O @ }3 Y4 M" M! H; d! @# ^6 S; v8 ?: I. b0 G
}
- s! D- }3 ^2 h9 P- H# v' c; F return 0;
/ L& P& x8 A8 q" J; Q2 U}
1 S; r: H0 J N. a$ z( H4 N- L' Q2 P) R5 D
& h5 e1 L7 c; q然后编译执行就可以了(*^_^*)
. F8 h) @. A2 d# S& c其它:TC++上一定编译错误,不保证在VC6上也能通过编译: F7 n: F4 N( ?6 S! L: i
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|