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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,8 I5 G, D$ ~' U/ A7 m
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 ^8 u. ?8 y, }# o' }只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# t3 f$ C3 F9 f b4 k5 d7 I参数解释:, |9 h' j& m/ J: c! J+ ~: |5 u4 H+ k* e
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 j' Q5 U" Y! h" Q+ o$ w1 `
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 ?1 a9 W1 \+ y6 W4 J6 W' a& [, K
返回值:
; R# X7 Y* K# Q9 Q2 b! y返回非0表示计算成功,0表示计算失败有错误8 \$ S& L9 Z9 n/ w. @* v$ d
" F% G' X/ p% H* w % V+ w! v% M/ c! t) U" S
7 z" v0 c# F# A
程序代码: - ?9 M5 t: e5 w$ p5 k* n* b! ~
3 m, Y/ r; ?0 b1 H3 r0 b8 I3 cnamespace fy_Exp{
6 C4 }7 u, `' Vnamespace {template <class _T>
3 W: L2 s& a( l9 y- |7 sinline _T GetExpValue(_T t[], char& csym){. U" w b/ P% z# f# J
char c=csym; csym=0;
9 ^ A2 L4 u2 g: g& A( Q! m4 l switch(c){
8 u2 ^1 |# D% E/ |. U case '+':return t[0] += t[1];9 y3 }) g$ a# n) d2 [$ G
case '-':return t[0] -= t[1];
4 [* l- H+ ~& v+ g" F case '*':return t[0] *= t[1];
% A( E4 a0 p) x( ~ default: return t[0] /= t[1];//case '/':
1 |- G% n7 ^# B& m }
9 n$ y4 S% V4 k {: V8 j}}
$ @, c, y. p8 itemplate <class _T, class _Tstream>
4 _+ _' O3 |+ a$ z( M5 \7 Z4 x, \0 m/* _Tstream: inputstream, _T: get return value
/ C4 P3 U6 B% `+ B3 L6 H- F0 |* Return nonzero if get value successfully */
: b _+ W% R) _1 pint GetExpValue(_Tstream& istrin, _T& nReturn){" Z- V4 t R r
_T t[3] = {0}; //雨中飞燕之作
M7 R2 ~# O$ R" J! C2 z' e char csym[3] = "++";
, _: b2 x4 o6 I6 w( B# B* q int nLevel = 1, nERR = 0;
5 V+ i* ?1 r/ ?9 i( a# C$ C if(!(istrin>>t[1]))istrin.clear();7 [: ^+ s& l6 h
for(;;){* Z5 a- T; Y# T2 T' t- q- z
if(istrin>>csym[2]){7 ~6 j) S; g7 X# p
switch(csym[2]){
2 S% `5 n- j6 `, y case '(':: s" F9 r- v, I$ o, q: c& |
if(!csym[1]){nLevel=0x100; nERR=1;}else
: v% D9 B% u& v& P5 g, n0 j if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 P! ^- Q( k% H/ P7 \
else{nLevel=0x100; nERR=1;}
8 y/ a4 T5 U+ ^7 o1 S break;
+ O9 } V! r: k4 A \; t case ')':
! c. R9 U% e5 w6 p8 |2 V% Z6 n- G+ @ {nLevel = 0x100;}break;
* U* l/ O P. b( x6 z8 Y4 z/ C case '+':case '-':case '*':case '/':5 Y! |9 V& _9 v) l3 P3 K, B( a
{csym[nLevel++] = csym[2];}break;
4 N, B: T* M( i. y* ^4 A3 M9 E case ' ':case '\r':case '\n':case '\t':continue;' {. x* f) F/ p: B
default: J R0 @4 ^- n. C, D
{nLevel=0x100; nERR=1;} h9 f6 @( c% }( _
}
* ^/ ^. n/ g( W if(nLevel==0x100)break;
0 Q7 e" h c3 k, x0 R- A$ r/ @1 n if(nLevel&0x10 || istrin>>t[2]){
1 f" i o: s: o" p F, z: |! M nLevel &= 0xF;
( p6 x4 `0 `$ N9 }5 h if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
4 M6 W, q- ~2 t if(csym[1]=='*'||csym[1]=='/'){2 y3 A8 l& T# V; ^% K) M
GetExpValue(t+1, csym[1]);
W. Q& g* ~9 S- J' S }& a4 n! ]. k9 F) g( f
else{
+ S( c1 M# f' [0 T$ Z2 q GetExpValue(t, csym[0]);6 S( D1 h# @. S: O" m3 q) _
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 @" u( s, Z+ G/ {2 V }" u. e$ g9 t- j9 c3 D
nLevel = 1;
% r5 N1 G& J% v0 D4 | }! r$ h" J3 R! v/ c& ~2 x+ ] O
else istrin.clear();9 t; d: a8 r% r# h2 @' s
}
; b* W* \! E- x) G+ K i: {9 N else{nERR = -1; break;}
- @! x* j9 v9 z# A }' A6 C& P2 |% e. `: k/ o
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- n1 {, h! ?& s9 y8 G
else nReturn=GetExpValue(t, csym[0]);
$ ~: o# y8 p- E9 x0 D return nERR==-1?1:0; ~2 p1 O0 ]& s0 d. s) O L
}}
4 y1 E2 r0 |+ W& @! f( I% g* q7 p" T) u/ ]! R0 v7 J
3 B0 Z) j7 m# ?" H8 j
) D: }& M$ F# J, P7 T$ x- f$ h+ O函数模板使用示例:& G3 ?% Y ^0 q5 F3 g- s( n
在以上那段代码的后面加上以下代码:
2 H& y# |! W+ U0 H6 R" {% x, X5 E( K$ \" g9 r8 L! r
* N% a4 |$ X) r7 L' z2 V N5 T! h+ `5 g* k0 Z; B4 }7 g
程序代码:
. Q" t+ C3 G1 q3 E/ D
7 G$ g8 b, }/ b* G; F9 l#include<strstream>
% B# ^5 H9 l0 Q) ~+ A- S" R#include<iostream>( ^6 [2 ~! |, D# z1 g) a! E3 n
#include<string>$ H, [1 n& U, V
using namespace std;
9 B; B& J4 a r1 l% `int main(void)
6 E. k' C& T! R0 y; t{+ @7 }/ _9 E% c6 @4 X
string s1;
) t$ |" M* L$ c2 u" \+ B+ E/ O! H while(cin>>s1)
! D4 c( S1 j W4 x+ V Z {$ A+ T8 _: h, v) m( k7 `- G
istrstream isin(s1.data());
: h: o1 {- p/ p, v double d;
, a) h g8 j$ O( e% ] if(fy_Exp::GetExpValue(isin, d)); _9 S6 n7 _, o3 N: O/ |. l
{
3 ]& F% ?8 X, I( M: v* _ cout<<d<<endl;
- g2 ], n: j- p6 ? }% I) x5 V, L9 @; Y6 m
else0 b& |( j6 d! M9 M0 x3 F5 R/ u9 t* z6 t
{$ }9 E: M5 ?4 Z, B
cout<<"ERROR"<<endl;9 L- C" q/ y6 @8 ?2 @+ N1 l
}8 A- L, p2 x8 P
}
+ Z0 y! o2 e) M/ C8 M return 0;" S8 |6 B+ M' S( `( j" P' ]3 E
}+ v, a$ D8 G, P4 j5 o0 T6 a
0 \8 a$ a% s, [( S* k' d) d
2 N( X3 Q9 ^0 p% p% O2 V然后编译执行就可以了(*^_^*)3 ~/ \- A, p# S
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ h# g1 |* s/ q, o! ?
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|