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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
: ]+ ?3 f6 |9 O, N0 o. t# x一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% d8 K6 I4 z% S8 t只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% O2 h' f; F. z9 w7 b* {
参数解释:
7 e( b; c2 i/ sistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 t! \5 K. L) `; ^; _9 j) P6 Q3 x
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 N3 ?6 l4 Z2 O- B2 m$ F
返回值:. g: z( g6 C. e: R! L. r {' i
返回非0表示计算成功,0表示计算失败有错误
9 y) o- D0 E0 N. E9 I% t1 a& C8 g1 g" L& m# R" G
8 S$ x+ W! {" m3 k
& u( r4 g6 f1 @- ~! t- k程序代码:
a. s! F7 M" R; c! w8 ]
0 R6 h1 O, P* B7 m U- Wnamespace fy_Exp{: ]2 s- H2 I3 F' T! I8 P
namespace {template <class _T>; b9 w( J; ~# F* B
inline _T GetExpValue(_T t[], char& csym){
5 D. T( O9 {6 z0 d char c=csym; csym=0;
; G- v. ^- ]+ w4 `( \4 q switch(c){0 w B* Z" k; J9 }( e: v2 b
case '+':return t[0] += t[1];. y% m/ L2 j7 |0 r9 x
case '-':return t[0] -= t[1];
' B8 F& d5 x+ C- o4 a' U- _ case '*':return t[0] *= t[1];. P ]: b5 I7 D7 H
default: return t[0] /= t[1];//case '/':
+ T0 p1 d6 X( Y5 ?, Q! | }
% a* Z5 V! \& @: b: i8 G6 m}}, J6 L7 o8 K/ k. C0 f( D
template <class _T, class _Tstream>7 @- o8 J" J9 N0 G
/* _Tstream: inputstream, _T: get return value2 ^( r7 ^3 C9 C2 F# o& J7 o
* Return nonzero if get value successfully */4 v& ^7 i% ?5 q& h. r! [
int GetExpValue(_Tstream& istrin, _T& nReturn){# v. N, x8 V* g1 `# M0 l
_T t[3] = {0}; //雨中飞燕之作# O) I4 Y1 r- |* q- G
char csym[3] = "++";
6 |$ i/ ?$ r! G* s& M6 o6 q i" a' r int nLevel = 1, nERR = 0;# \% t2 ^- }8 r U6 k* x
if(!(istrin>>t[1]))istrin.clear();
; j" V2 @5 N9 z+ W$ t for(;;){
8 B7 Z0 C1 I% w; {, ]" Y) O if(istrin>>csym[2]){/ B, q, g% q% X0 z; `! \
switch(csym[2]){+ [ N3 b! ?: O$ T2 Y
case '(':
* ~$ E6 C4 N$ p }: } if(!csym[1]){nLevel=0x100; nERR=1;}else
: Y# Q/ y- V% P% b) A if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- L3 O* `9 \2 z4 |4 u+ f, V else{nLevel=0x100; nERR=1;}
" L/ x' A- q K) ^( m7 b9 x: ? break;
# D6 O) Q8 g! { case ')':
3 h9 l( h- O$ j {nLevel = 0x100;}break;
6 s N3 K H' ]; q+ P case '+':case '-':case '*':case '/':2 c. F/ N. g B
{csym[nLevel++] = csym[2];}break;5 y3 v g& J- S- t
case ' ':case '\r':case '\n':case '\t':continue;7 @/ n( u" z5 E1 v7 A* s
default:
- }* d2 w: u6 | {nLevel=0x100; nERR=1;}4 L: R. j' g8 Q8 X5 _: p
}
2 S! G) z8 a) K# G if(nLevel==0x100)break;8 n2 N$ {' C$ A# M6 B' q5 P
if(nLevel&0x10 || istrin>>t[2]){
" ~% X8 M8 L& V$ T) N nLevel &= 0xF;
! y. o8 v# c1 X/ N if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}4 w7 w% r! v$ U3 O7 ]
if(csym[1]=='*'||csym[1]=='/'){% J8 M' B7 I0 ^! D& L- R
GetExpValue(t+1, csym[1]);
0 Y+ D5 o0 @' L3 P" R# z }
1 Y' j4 Y* h( A v5 Y9 h, y3 _; L else{
1 D3 B4 P+ Z+ Z9 Z9 u GetExpValue(t, csym[0]);
! m, B+ w7 W2 [4 \$ U% s t[1]=t[2];csym[0]=csym[1];csym[1]=0;! }5 m7 c# T; Z; B, r% Z9 U& T) s
}
' ]8 I; ]' N3 i- B nLevel = 1;
8 D! m- J2 B8 T }
/ m3 B3 J" y) d else istrin.clear();
9 D3 a! E2 t+ s1 ~4 @ }
2 t9 {* r- f- g5 q else{nERR = -1; break;}
! l0 y2 S3 b( y- K }
$ H; a/ b7 [4 D0 F" I1 _( g; E+ F if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; C; T' l2 m) }( S. h
else nReturn=GetExpValue(t, csym[0]);
3 h% C7 F# ]7 q- ? return nERR==-1?1:0;
0 K9 e( C8 j; [8 x* N4 R8 V}}
7 x z8 }+ q% x- F, ? X+ j' ?) k- K/ X$ N+ q1 J' b0 Q
{1 Y, L% O& \( |6 ~& p+ W: i, h+ X/ `% Y. ^
函数模板使用示例:% k5 t0 V; F: o6 N7 k- A" F! |
在以上那段代码的后面加上以下代码:
5 T; w9 [* X: K. L6 W& S% e2 Q C
' A" ]; r; @% k2 f( I+ ] u
6 @9 x# q1 f2 z0 J* b4 ?程序代码:
/ ?* h8 L" e3 L" s- s3 C: k: n. m* @% H8 ~" e5 T7 y+ Z
#include<strstream>
" Q. b3 W( e6 O. F% u T#include<iostream>
2 t$ y5 w \7 I O#include<string>3 k: P5 a8 h2 M8 R$ m L) ^
using namespace std;8 c3 _( }4 d3 H1 A- Y
int main(void)
* P2 n6 u8 t- _% W{
4 s$ E0 s. I+ k6 n; r0 M string s1;
+ R/ J1 e5 D" x+ T3 I while(cin>>s1)
: a$ z; q) u: L( B" n1 w0 M {6 ~& y- w0 X, c }4 s
istrstream isin(s1.data());; M; T+ M, j% e) ^( I
double d;8 \( V1 Z$ R5 e& c. ~" B
if(fy_Exp::GetExpValue(isin, d))' c8 M5 H: H1 X, N
{
3 W# }6 i, O# `, I1 B6 z* M6 X x cout<<d<<endl;
7 u) a) z4 j2 o$ I9 Y }
6 v( g# n z. `" F- v' }) m else
7 x" F i; ~" P5 l% a& P4 p9 a {0 u5 [" { j# U
cout<<"ERROR"<<endl;) E1 |6 P/ Q3 {& }/ L/ f/ `( A
}
2 U# ^: B3 p9 F0 y0 @* r$ z9 E }3 {& h/ G2 l6 h+ G
return 0; |) u% e* u+ v n9 D" g
}% C6 [ }2 L" t2 t2 {+ n
/ P: ]) D' s5 x1 J; v7 z, c, s
; h5 y; c0 L6 D$ P
然后编译执行就可以了(*^_^*)
0 D# [7 J% Q' w: d, V. u其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 _' v3 }# ?" d5 i3 n' Z2 X
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|