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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
- V6 _+ [, D5 j; G+ e7 t" \& Z一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- y( X5 p' O$ N# r
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ n5 T4 P9 x/ F- a% G# h. n
参数解释:1 ]% C& \) E* O; r; P. q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 A: h4 T3 w/ u% _, q6 L* R6 J% v4 V
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ B1 p( r M3 P返回值:
* K. p- w" Q- T. Z4 I返回非0表示计算成功,0表示计算失败有错误; _2 S5 G V# r+ ]
c, p. |( ~$ m1 v' o/ l
) @1 M8 m# d8 H6 X
% }& s' }' d y/ s* W程序代码:
" i& K" Q! w; p% A' ]2 U
' D9 Q7 ~; c+ r" z+ y; k$ Dnamespace fy_Exp{: U0 j* u: i7 W5 M9 y
namespace {template <class _T>7 S5 ?3 s' g$ c2 q' P
inline _T GetExpValue(_T t[], char& csym){. q6 }. U* t; ]. Q, @ w
char c=csym; csym=0;
) l2 X( b! L# m8 T switch(c){# `3 U i8 \* s3 _1 s
case '+':return t[0] += t[1];+ P D$ J4 r& t* ]+ G) a6 Y) M" i
case '-':return t[0] -= t[1];
I5 b( Z f: t6 I$ d case '*':return t[0] *= t[1];
" O J9 O( k2 ?. U default: return t[0] /= t[1];//case '/':9 A8 M0 P5 ~; @+ V! u
}" K5 M1 @% t4 H7 D* Q- F* ?
}} s) a0 c' a$ W3 ~
template <class _T, class _Tstream># @6 ]2 E Z3 p5 ?
/* _Tstream: inputstream, _T: get return value R& Y# a/ r& }/ w1 y1 W0 A
* Return nonzero if get value successfully */9 ~9 Z2 b2 A+ I/ g5 g* U1 s
int GetExpValue(_Tstream& istrin, _T& nReturn){) U c/ o* G; ]- d5 j5 x8 I
_T t[3] = {0}; //雨中飞燕之作
$ i1 s' z" D% p, @ char csym[3] = "++";
( x6 L0 {$ \ A- ? int nLevel = 1, nERR = 0;
: p" k1 M4 p+ | B if(!(istrin>>t[1]))istrin.clear();
3 z; I/ X M% |: n% i7 g0 W5 B for(;;){
0 N# q, z/ I* G3 `; o( k( d if(istrin>>csym[2]){
5 }. A9 [$ j2 O: h$ G' z/ m! M$ a switch(csym[2]){
$ O% ^8 ^* p# ]7 f4 V( k5 U: z5 ] case '(':
" E$ Q J2 f; {* g( b9 i: p; \ if(!csym[1]){nLevel=0x100; nERR=1;}else1 f. ~' m' ^: h
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 ], Y* g: L# h/ Y3 o. H6 n; q
else{nLevel=0x100; nERR=1;}
% ^8 l* S" A# J% ?2 V break;
9 n: x0 Q' ~- B! J1 n" x2 Q case ')':
0 B( t2 |/ O6 X: z8 j, k {nLevel = 0x100;}break;+ R1 ^+ H) O8 N& @6 O2 s
case '+':case '-':case '*':case '/':
0 j" r2 W( D; x/ u {csym[nLevel++] = csym[2];}break;
6 Z, p6 J: f3 F) ^8 J case ' ':case '\r':case '\n':case '\t':continue;
1 A, T7 [2 Z7 W( N6 I default:
2 h" A/ r+ m8 s) F3 |, X0 v4 T6 ^ {nLevel=0x100; nERR=1;}
5 ]+ K3 b, I7 D* d% n }
. m6 R* I9 M7 q; Q' z if(nLevel==0x100)break;
4 @8 J' F6 v, r% ^1 g" p7 Y if(nLevel&0x10 || istrin>>t[2]){9 c' P) O/ l1 V2 f" L
nLevel &= 0xF;
( Q0 w6 @) P! X0 |0 Q* M& C1 u4 n if(nLevel==1){t[1]=t[2];csym[1]=0;continue;} q; J* ~. j2 M
if(csym[1]=='*'||csym[1]=='/'){' m1 A, {7 b+ ]9 H" S
GetExpValue(t+1, csym[1]);" z* @7 t# y+ O/ B+ t
}
" @5 ]) Z& O2 d- o# y: b( r0 ^ else{
$ v3 t1 ~$ Q$ \6 l GetExpValue(t, csym[0]);8 e |# l/ q, @" N$ p" [ i) Y
t[1]=t[2];csym[0]=csym[1];csym[1]=0;2 F4 H" `& G4 u, n. |) j5 A
}; B/ ]2 N6 V2 b8 M5 b
nLevel = 1; _4 Z$ e+ |6 c8 c& {# y
}
( [( s/ e, K( R, ]0 O, h! o/ a1 M- u else istrin.clear();6 |$ e% f, s! m8 G, U) P1 ~/ Z; u
}: }" f1 A, x7 M
else{nERR = -1; break;}
+ h! Q( v+ i, g }( U& z( j% L' N/ { i4 L5 g
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 V- m' ] y( q+ X: t, C
else nReturn=GetExpValue(t, csym[0]);( Z: B* R+ V! H: h3 B
return nERR==-1?1:0;( \) F+ W$ U$ x/ ^3 l
}}% G/ ]4 j, P3 S9 ]# W9 x
6 s: x7 `% k7 R5 j: C
- L! `% V7 Z3 M
0 L: j) r" ?; {: m% e4 X& H; e' C- H! E函数模板使用示例:& v7 U3 S2 L5 E* x
在以上那段代码的后面加上以下代码:7 k ]) C+ d$ N! t+ [$ r
6 S! @2 e( P) g
9 j; f% o5 X; f) X0 k: M4 t6 H
# P4 X3 L) U+ d
程序代码:
+ E, R0 A, z5 G# O6 s: z- ?1 T
#include<strstream>+ H, E0 E( W( Y' G @% _
#include<iostream>, V5 C* l/ m) m( N
#include<string>- }% F: r; ^0 [( {; W8 O
using namespace std;( x: {! v# D* P" \0 s
int main(void)
. D* b& D- a# O; b T8 M{
& L$ Y7 |8 l9 d* {' H, B$ F' ? string s1;0 \- }! l$ i9 S# W/ @8 l
while(cin>>s1)
9 C0 U0 v2 w% p( F+ ^ c {
) H$ }3 Z7 G/ u1 h N7 \ istrstream isin(s1.data());; k& q7 m* G, X0 C0 O; I3 G
double d;0 }! N& m' P0 ?8 }2 ~
if(fy_Exp::GetExpValue(isin, d))
' z0 m% [1 u/ y) H0 b6 y- m( d X7 t {
1 ^, ~* M$ g1 A6 F% X" o, u% g' H cout<<d<<endl;) W/ x, E3 ^! l: r6 r
}7 q% ^3 ?. }) E" X
else# W% X9 s( W' `9 S9 Z) R" A
{
o z% h9 k+ L9 j cout<<"ERROR"<<endl;
% L4 P! U4 ^! C5 A }. |# m3 V. W; R7 t" d2 r8 p, I7 m0 T; c) b
}
# Z6 N: c! Q+ o7 i" a3 B l return 0;
5 E1 W* F9 P% |$ T+ p}
% C, Z( o1 C( ] p3 {
e) Z$ M0 n( ?; A8 Z; g. i# A9 N4 t0 E4 p
然后编译执行就可以了(*^_^*)
/ y& z: v" p- `0 ?) G3 }1 t其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 V) g- c& }; A, H: F
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|