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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
8 [6 s+ N- N* N S一个很方便的函数模板,可以并且只可以计算含括号的四则表达式9 B" b6 `. _. N
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& |. m1 r5 t' s参数解释:
( R2 r3 M Y% zistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( J- s9 ~) _1 ^9 \
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) U) W8 y0 s6 q* v; N \& \, E# ~& B
返回值:0 `3 b. W7 w) \- R. l( `- M& [
返回非0表示计算成功,0表示计算失败有错误
! @# \7 t- C: R6 m6 J. S! b8 R M7 c2 F z- M
9 W" T0 F5 \3 }# ]% f! S2 T
$ s' g5 T5 d! a% |程序代码:
/ \* J: Q7 z U) n# A/ z n9 x0 g( M" b: p
namespace fy_Exp{
- x8 u; i$ r( x8 y, _$ Z, Ynamespace {template <class _T>
& h3 ? ]$ y' I5 T n. Vinline _T GetExpValue(_T t[], char& csym){! l' K: k/ V9 `+ o7 ~9 Y
char c=csym; csym=0;* D% r( |+ o3 U8 z# h- C# u' I( i
switch(c){
& k! W3 |# A6 B+ G1 t& t case '+':return t[0] += t[1];4 \. l2 r+ e3 |; }6 K0 y- i
case '-':return t[0] -= t[1];+ g. p3 ]/ ^3 O
case '*':return t[0] *= t[1];
/ T9 ?" j! o0 Q4 h( _3 F default: return t[0] /= t[1];//case '/':# W+ P0 j0 r- i$ C+ e3 ^- P
}
' j2 n3 y* \ _, f1 G; K- c}}$ G) Z i; M/ S7 R
template <class _T, class _Tstream>
* k+ o1 b7 j0 W9 k% g$ T. I% n/* _Tstream: inputstream, _T: get return value0 N; x( f5 Q9 C* Y- R+ I; ^
* Return nonzero if get value successfully */
- G! K6 _$ W) u1 d! oint GetExpValue(_Tstream& istrin, _T& nReturn){; }, M5 H& v& k/ F7 n) n
_T t[3] = {0}; //雨中飞燕之作
) d) D6 |1 M9 A char csym[3] = "++";* ]# ~) j+ o) P
int nLevel = 1, nERR = 0;
, }. s5 E$ T7 t3 P) U' `2 b+ g if(!(istrin>>t[1]))istrin.clear();
' X% Z8 x5 `( P: |' f for(;;){5 O2 h3 f! V! y. Z3 q! ~
if(istrin>>csym[2]){
5 g2 y4 o; V+ Q: { switch(csym[2]){
' z3 r% _1 e1 h- H+ H5 e case '(':) V M: Q9 P' m5 \% Z2 n2 v
if(!csym[1]){nLevel=0x100; nERR=1;}else
H& n; @2 ?. A6 }& m+ y' ]% s if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' h/ a6 y c- |. M else{nLevel=0x100; nERR=1;}
9 v: r. ^4 `' E3 r break;: d" }+ E& v0 ?
case ')':- [2 i9 B2 j4 u: ?+ v* }, S
{nLevel = 0x100;}break;9 M* r3 H+ a+ X T3 L, P- E
case '+':case '-':case '*':case '/':- T& O/ a2 |' D# Q1 G4 B1 X6 D
{csym[nLevel++] = csym[2];}break;0 t7 ]. F {+ e8 Y& a: C4 @
case ' ':case '\r':case '\n':case '\t':continue;
2 H3 ?* J0 R& K default:
0 p' a V! M/ X$ j2 a5 [ {nLevel=0x100; nERR=1;}" ^7 W6 a# u; ~: @
}" G1 z- o* @$ g& M- v g3 r
if(nLevel==0x100)break;
7 x- x, n& @! \1 m& `2 K0 i. A if(nLevel&0x10 || istrin>>t[2]){
$ |6 ^4 \& m R7 s0 j nLevel &= 0xF;3 t+ D% ^ z- h) W3 H7 Y
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# k; [( v9 g- u9 Y
if(csym[1]=='*'||csym[1]=='/'){1 }" |( `- w% f. r3 `! {
GetExpValue(t+1, csym[1]);) W* J3 m! w; n6 Z/ f. B" m$ u4 x
}! x, [$ g! j. b8 x7 T0 t4 a
else{
6 w- A! e3 i+ H" [& M- C5 a- G1 m GetExpValue(t, csym[0]);
) Z$ H, m% R9 |4 y2 ?# K/ ` t[1]=t[2];csym[0]=csym[1];csym[1]=0;7 |; \- ?, Q& ]& H" B2 P
}$ y: r* S, n2 f/ `2 U2 b: z% N
nLevel = 1;
+ e/ u+ k3 r, v; m* I }
9 x. i; V) L d. b- d) W else istrin.clear();: C4 O6 [; w9 k) Y8 K6 O
}
8 y. i5 U4 w+ l' q! O else{nERR = -1; break;}* i9 f p: Z; v# T/ t
}
8 c4 {- d6 F: F: V$ H* J% E* g8 W1 T if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]); B& \5 E# M2 t, }9 |5 G
else nReturn=GetExpValue(t, csym[0]);
! R- q" U- x1 g1 a' ~ return nERR==-1?1:0;
% q2 q8 L3 V; ^5 H5 A, n, i}}$ ?0 j! {. S) J& _( ~# E' g) a
9 X3 O o5 l6 L/ h$ u# c# l1 t+ t" Q
, h# G5 p# d9 ?% E, i' W! O5 C
函数模板使用示例:5 ?, M* T; q; V! g. W4 a& {# X9 l
在以上那段代码的后面加上以下代码:
8 _4 I3 e4 k: A. [, w0 i: g. H3 e7 w! o M$ k9 \0 y* M/ e
) M! H6 j- d- v9 U w
+ C6 i! }8 D" I4 k7 H
程序代码:
8 b* S; _% H/ }' g6 r+ z* ^- t6 K( N' o- X! b
#include<strstream>
% G: A! M* \9 k7 P v& z2 Z$ i) I#include<iostream>2 c- H. O" N6 s0 u+ }5 ?
#include<string>8 V' ~$ U6 B: x. q6 I
using namespace std;% R7 } ?3 v" q0 K- f, \
int main(void)0 ^9 j" h/ a( |1 D% Z8 n4 i
{, `# ?5 ?' S ]
string s1;
1 \9 p' B5 M) X6 e' p/ y6 C( Y: |) { while(cin>>s1)( N: G; ^* c0 P/ j! L( |
{
8 u$ J I. b2 w& b istrstream isin(s1.data());
/ {4 V" m J2 [7 c* p double d;( z+ Z" m+ j$ R, z+ n
if(fy_Exp::GetExpValue(isin, d))- G1 Y+ T4 h( k& u
{
9 ~* [/ X+ ]/ R2 g8 d8 I3 } cout<<d<<endl;
, A4 v2 h9 t6 {5 i8 x }! K! r2 f& S- B4 \6 w$ M3 _
else a: o3 j$ k! z7 a6 r$ b! b
{
% Y, Y \6 P. P cout<<"ERROR"<<endl;* h6 _8 n- G" q- F& E
}0 N( [1 ]7 m2 U0 W- w% o& m z8 p
}
h' q6 z% ]0 t9 X. ` return 0;
' g; q- ]* \4 W4 j}! w8 H* B5 C. [2 \
& a1 i' r) o- \
$ g6 y/ ]. f' l* a然后编译执行就可以了(*^_^*)
4 X: o* F, p3 x) P. C, T其它:TC++上一定编译错误,不保证在VC6上也能通过编译! Z6 z% p. B, Z! F4 ?8 W
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|