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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,# g6 p' O1 P8 G5 W: ~
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 |* J- H% P) s/ A8 `/ l
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* K2 ]$ q5 L! K8 U' z% C
参数解释:1 `7 U, X* k) f/ `( k
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* n$ z" r M" U u) nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" Z" C' k: |$ z# h2 l2 H返回值:
( h" |3 e0 c" k I- ~; }返回非0表示计算成功,0表示计算失败有错误/ q+ n, J+ o, [
# P) L/ U0 m2 U. g5 S ) P; Q& z# I/ H5 n- {
/ x* O3 c' b6 w程序代码:
7 u" w9 Q \- ?) a+ n+ A0 X
9 V/ C2 z3 n0 }; c2 jnamespace fy_Exp{4 a' F- i2 M- D! L
namespace {template <class _T>
# g3 ~" K( j. v3 B, ]# Dinline _T GetExpValue(_T t[], char& csym){; H, N% N; {: j; v! H) R4 C
char c=csym; csym=0;
8 u- U% v7 ?: k e- _ k switch(c){
# v1 U$ s+ E/ ^ case '+':return t[0] += t[1];8 N; o* g2 F) j8 h1 H; _
case '-':return t[0] -= t[1];
' i: P+ O/ _4 a: a: { case '*':return t[0] *= t[1];
# x) a* b8 H% @+ R default: return t[0] /= t[1];//case '/':4 [ D' W! p1 u
}
$ ?: z+ ~( u1 {) k/ a; Z9 j7 t+ ~}}
( @: e$ u! f! c% v2 b E' itemplate <class _T, class _Tstream>
2 m$ q; \9 \3 e) M: x/* _Tstream: inputstream, _T: get return value3 t5 `* y6 r9 k) Y$ z5 q
* Return nonzero if get value successfully */* }1 l+ h" W4 L( N- M
int GetExpValue(_Tstream& istrin, _T& nReturn){( V5 A0 ~& l, o9 Y+ j8 I1 C1 D+ b
_T t[3] = {0}; //雨中飞燕之作
2 d& D, x! r8 ~) L+ @ char csym[3] = "++";$ f. n/ ~" U) R- s H5 y
int nLevel = 1, nERR = 0;
6 b |- P% i6 {: h4 s if(!(istrin>>t[1]))istrin.clear();
2 z8 d9 w: x9 W7 ~/ V for(;;){
% j# f: ~9 C$ _! b5 p7 n if(istrin>>csym[2]){
; \# _2 L2 P- o switch(csym[2]){ u v/ i+ J" b3 p n- c o
case '(':
& D! i! _- D9 B. K* X: a if(!csym[1]){nLevel=0x100; nERR=1;}else3 ]0 H& A/ C2 o& E: v& _
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 ^1 d' S( ?. q0 [% _( V else{nLevel=0x100; nERR=1;}
]. p$ c7 u, Q3 I; T5 { break;6 |/ s$ d* X* ^4 M0 W
case ')':5 k0 B6 i8 [+ {& Q
{nLevel = 0x100;}break;
: m1 h2 n! m9 T/ M, d case '+':case '-':case '*':case '/':
. p; ^- M( C# `5 u* \+ X/ o {csym[nLevel++] = csym[2];}break;
: A$ O+ } p; [) q, y case ' ':case '\r':case '\n':case '\t':continue;& M/ O! `8 p0 G9 P7 F# z( j2 j$ ~. E
default:
& f, F Q3 p8 v! H) t4 z {nLevel=0x100; nERR=1;}- b w1 \7 E- ~0 }) Q
}
; y! _ h2 \% \7 z3 r5 `" j if(nLevel==0x100)break;( t0 \! e$ v7 A4 S& ^8 U
if(nLevel&0x10 || istrin>>t[2]){
7 B3 _! T, b6 s! M nLevel &= 0xF;- [) P V# P' E/ c+ m( o
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}' o# ]1 e+ `6 G9 ^3 p9 }: {
if(csym[1]=='*'||csym[1]=='/'){( b* Z% A. W' V& N' i" H+ d& k
GetExpValue(t+1, csym[1]);8 \2 K* X& g. N# u& h) r' X
}& ^6 r2 g* s2 Q
else{
5 B( \: [$ E5 z$ l- e5 @ GetExpValue(t, csym[0]);2 t) x, [+ S9 Z# Q$ x, E
t[1]=t[2];csym[0]=csym[1];csym[1]=0;% e" h6 d5 Q! W0 L) Q2 j
}
9 U1 A, g4 F. r. B! r- j2 A7 H/ I nLevel = 1;
& ~/ c0 r [" b: F9 E9 t }
, x; ]* q# G; W' p. Y) x else istrin.clear();6 L! n) f( ^ A+ _/ _# I) K& l$ [
}2 s0 a* r/ {$ S. w- _4 s
else{nERR = -1; break;}
$ G- Y7 _! _8 G( c- h9 I1 t8 K" _ }
& }5 r5 g9 \- S0 W( ]# d: ? if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ a) h$ `0 T8 @
else nReturn=GetExpValue(t, csym[0]);
) C; y: ?9 } Y* ^+ }4 c& ^ Q, v, z9 U return nERR==-1?1:0;
! o1 O5 B+ }4 O" Z/ C% P/ ]}}8 |' m: I3 d. `' p" t
! ?* Y! T, \! d
! k- a5 N* F# U* h
3 g7 q; c9 V F. ~8 e函数模板使用示例:6 H' [5 j* z: b5 Z; c5 u
在以上那段代码的后面加上以下代码:
1 g( z( W3 m* R; E0 s7 G9 h9 F, x/ O) P1 ?
- w2 J- j4 ^; W% m. C2 f: Y' }/ {, N* l
程序代码: # X P1 o+ |; G. d7 \' x" u
. R9 d# S1 t1 H#include<strstream>
S' V8 {5 Q3 r3 n: E#include<iostream>
+ f @, d! D$ r" K+ R#include<string>) {7 V1 \1 ]: z* w( @
using namespace std;" q$ E( Z% U; D C
int main(void)1 i4 v7 w& u/ I4 q2 O
{
* H' F5 q4 z# w4 O: v/ g- k string s1;1 E# E, g4 R. z- y+ X: \
while(cin>>s1)% C: a8 J @/ p
{1 E& I+ X3 Y9 Q
istrstream isin(s1.data());
1 W( C) H7 b- {8 L( j- V: E double d;4 F5 J6 e, j+ |# W p: ?
if(fy_Exp::GetExpValue(isin, d)): u4 L, k: A: i6 _; \" l6 @2 H. X
{
5 ^4 V5 \" l( L; f! r1 w' N cout<<d<<endl;
* f3 r$ d6 T% M }
0 ]: W: P8 F3 y else
" R% Q" z& m, W j {
& M& i4 ^9 i1 t. w: r cout<<"ERROR"<<endl;
' e, X% V8 R9 O; G }+ x- Z2 w, p' j# e
}
: E+ m4 }1 N' h" ] return 0;% B J1 y: |0 ~- J }5 E0 R
}
3 x# B( J) ~6 D' V$ o
0 R. c7 Y; @" ]+ V1 ^, O' [9 K/ N& y! Y" K5 A) r0 h
然后编译执行就可以了(*^_^*)
: u6 B# A+ l& ^4 _1 v7 Y6 A其它:TC++上一定编译错误,不保证在VC6上也能通过编译" _* g) ?9 N0 e6 ?; m
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|