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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,) D0 y7 N1 Y: _8 h; y- p* \
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& E2 }5 X6 Z/ k j
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& |# U. |7 G$ U G, N) D0 w3 {参数解释:4 X1 Q# u$ m7 E" [$ {+ L" d
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
0 J8 ?! u5 ?, I# Q3 nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 |: v$ ?& j+ i4 k
返回值: a" n3 F% J7 N8 a
返回非0表示计算成功,0表示计算失败有错误
: h; x* e. O+ {7 e U; b. J8 A1 D4 \6 q
2 a2 j( E: F5 Y! {+ D4 p
/ k w+ `/ q. H& P& b% v/ }
程序代码:
8 M* U0 v3 G9 c/ ^/ U9 z$ P! Y4 @9 S6 y, T6 E' E! y( J
namespace fy_Exp{7 I [( N M/ ?: L+ W& C
namespace {template <class _T>
1 f+ ^! y% e' ~& G3 ainline _T GetExpValue(_T t[], char& csym){
' ]. @! X. n3 K5 ?/ ?7 [0 t4 |+ V char c=csym; csym=0;
5 h3 p) [, o! @3 q% ] switch(c){4 S' }3 w B" o$ x( K- [2 x
case '+':return t[0] += t[1];* q+ W! e5 z! t; k6 V
case '-':return t[0] -= t[1];
. H7 v- P5 X( i+ j8 D+ [ case '*':return t[0] *= t[1];
. q1 ]8 Y% n$ P! k1 T; o6 F default: return t[0] /= t[1];//case '/':1 W7 Y' I P% _( p$ j- O \& ~
}( H+ w. ?( Y' W( D2 v% K
}}
' F1 M: {/ K. ^. _; O) etemplate <class _T, class _Tstream>
X Z" m, l) J' C* A) A. Q5 D$ n/* _Tstream: inputstream, _T: get return value
: O: ]3 q9 a9 C" ^. m0 F* Return nonzero if get value successfully */) {' G. y5 I5 E q* x
int GetExpValue(_Tstream& istrin, _T& nReturn){
# _: D3 g: a* H# l3 y, W9 E2 k _T t[3] = {0}; //雨中飞燕之作
1 {% n$ _- W* P3 B char csym[3] = "++";
3 W6 `5 m( M6 C9 a' {6 B* u8 V( R int nLevel = 1, nERR = 0; \3 ]3 N1 O6 |8 \; Y' X: U4 V' J& H
if(!(istrin>>t[1]))istrin.clear();
) K) O' ]! E' r' L) h for(;;){6 ~; Q6 D. H1 _# @* m
if(istrin>>csym[2]){
; E0 u( Q5 m+ Q. G8 y4 Y, | switch(csym[2]){
! J7 ^' m. L; @4 y, t- D' o case '(':+ ~0 ~1 ` |3 T
if(!csym[1]){nLevel=0x100; nERR=1;}else
" i7 H- g* Z& N2 p; M if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
; ]- g- X( n6 ^& d# K1 q$ ~ else{nLevel=0x100; nERR=1;}8 R3 W8 }" g& U+ e% c5 m1 n# |
break;
6 Z4 |7 j+ s& `" q4 y( c1 W case ')':. F [. z* {3 [ r/ f. ^# X9 Q: k
{nLevel = 0x100;}break;! ~' t6 i+ n! Z/ i
case '+':case '-':case '*':case '/':
7 w* `' s) x9 j) ^5 d! n! j {csym[nLevel++] = csym[2];}break;% L* }6 D* Z0 j. ~2 Z9 W
case ' ':case '\r':case '\n':case '\t':continue;
1 F, C+ Q8 n0 J u, b default:+ l4 I9 ]$ W6 {0 b- R3 D
{nLevel=0x100; nERR=1;}
6 H8 G; M6 N) }' P- b. C% b( S- {& ` }
, U0 J2 m0 q5 B# f+ ` if(nLevel==0x100)break;3 x% Z: X% ]3 `' z
if(nLevel&0x10 || istrin>>t[2]){6 x; ~7 _5 P2 E) H# |4 ^# t" f
nLevel &= 0xF;
, i& L- p" e$ H. N if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, ?, h+ ~* l* J7 X, V. k
if(csym[1]=='*'||csym[1]=='/'){7 q4 G# w# F+ ]3 j, o
GetExpValue(t+1, csym[1]);
9 w+ Z. s( I5 `2 w. n! i }
' C, P* A! v( g/ ? x else{
7 {3 g* t" M0 ]! q GetExpValue(t, csym[0]);
. [( d2 d6 V: k; C. a2 M t[1]=t[2];csym[0]=csym[1];csym[1]=0;
]4 _9 n, n$ ~! D2 Q2 J6 P }, ]0 s; ^7 W: Z+ f7 g
nLevel = 1;2 R( n$ j: \9 D- s$ Z6 a7 u
}
. e. |, R/ V- y$ s: b- a- T3 B, M, j else istrin.clear();
- Q' g$ b* s' J" f6 d7 A" K }' T( U+ Y( O8 d# {; ^3 C
else{nERR = -1; break;}2 Z. Z0 L) e5 b
}2 L& N. C$ n, F$ a) H* d: J A& f
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ B1 F) A/ ^1 j; b; Q% @! x# S4 E
else nReturn=GetExpValue(t, csym[0]);7 ?! c4 w' h: P/ X) r0 E" H4 `
return nERR==-1?1:0;3 z; c- j- b, J0 _
}}
$ i, O% P1 G9 O8 i; S- [) a+ z+ W+ w: u0 b3 j
, w. b9 Q* S1 C
" C% T4 u8 y# {函数模板使用示例:* K& S3 P0 d6 i4 ]* z, L
在以上那段代码的后面加上以下代码:5 y( J5 |# H5 t. N9 H# O8 c
0 `& T4 I4 `0 k1 M; D, V3 O. M
: y& X* _) V( a6 s
; f& ~* e. \; y7 {: ?+ l! }
程序代码:
o. A) \1 h0 T2 u# ~, J' e6 G' `% N" B& Y7 O. T
#include<strstream># q" \- x7 w- |4 p# d/ S- c* U# |
#include<iostream> n- i6 i/ h1 O4 ^) S- I X
#include<string>2 I, V- Q4 z/ B) F2 y8 f' B! ^. i0 B
using namespace std;& e7 j% k. H6 c+ j, {: a& W
int main(void)
2 ~# }. @( ~: J, Y{
) U, Y" d; U; A4 ~* v n, s string s1;
I! b, ~3 p) U+ [ while(cin>>s1) |' P" K$ j4 I5 ~7 O
{9 n1 K4 ^, {% z! n! y
istrstream isin(s1.data());
! V( \! f- c& w8 Z) n5 H0 G double d;; F5 ?1 e' q/ W' y) I/ U
if(fy_Exp::GetExpValue(isin, d)), ~8 Q" F% B2 l; @! K b
{: A( `8 z6 Q0 v( j" | L
cout<<d<<endl;7 k D: ^: Q6 |' z: O
}5 T) q+ F! M2 H5 h0 H) u
else* A& f6 V% O# [( b) x7 l' s
{/ w# N7 S {# P" I
cout<<"ERROR"<<endl;
: B/ E9 r4 D2 m }" b- m# t" M. ]
} a' Y' ?8 e. B' C& d
return 0;8 w8 z" @' r* H3 q' P3 }0 S
}' E2 n$ k5 N# g; W
0 u d' y+ H* x
; w, S. y# A- a然后编译执行就可以了(*^_^*)& u4 c2 R* h, a y$ c8 |
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* A2 f% Z9 U: _0 g; ~2 p- z2 @4 k 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|