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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 n Y& d' k: u( n一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' p y. w% O; n7 l3 t8 W4 Q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
5 Y C9 o8 \1 Q6 F参数解释:
8 N5 L" x$ y- Gistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- N! ^% \- s: y. ]! H2 CnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定$ N. v! _7 t1 Y/ q( d6 d( z3 f
返回值:4 b* q" h' s3 H# d% c7 |
返回非0表示计算成功,0表示计算失败有错误
: @3 V1 R1 ]* `& } t2 C* b7 g- g/ P; P8 g+ v5 r
4 ?! w" x7 F+ I* I7 ], W
% N+ l2 C4 a% [: k* N$ A& y. G程序代码: * J% [) X; Q% i/ q% `
~3 y; T ^, D7 b
namespace fy_Exp{. S0 c! Y* a; U1 q! U6 [8 |
namespace {template <class _T>% q& k5 d5 K7 Y2 p( k
inline _T GetExpValue(_T t[], char& csym){
$ V3 z( z4 J. x" a! J( s char c=csym; csym=0;' X. |# Z9 R; r4 a( [! ^& w) f: o
switch(c){
: X* Z: k) p" O h4 t) o case '+':return t[0] += t[1];; r0 e, p* `8 A! d, I
case '-':return t[0] -= t[1];+ N$ Z& `, D- Z5 H& p0 Y# u! S- }( H/ B
case '*':return t[0] *= t[1];
& P( K( ~5 p6 M+ ? default: return t[0] /= t[1];//case '/':
. G' y+ H: m* ?: B: A }
5 o1 q; i* t5 m. c4 t6 V}}
" y* ]( P3 X6 j2 y0 qtemplate <class _T, class _Tstream>
J( W# s! I" m' X6 j9 z* c# l/* _Tstream: inputstream, _T: get return value( F+ _5 M4 }& ]
* Return nonzero if get value successfully */3 K, u% K ^* y/ n2 H
int GetExpValue(_Tstream& istrin, _T& nReturn){
; t6 B6 v7 E' z4 @" j _T t[3] = {0}; //雨中飞燕之作
' M! c+ U8 [ `. b- U' T2 ^ char csym[3] = "++";
- b; O9 o) w. i' r+ K/ ] int nLevel = 1, nERR = 0;! m8 o+ K$ s1 u7 V6 v3 e% b# z
if(!(istrin>>t[1]))istrin.clear();2 i# C5 }$ I; ?7 q" L- `
for(;;){
- ^0 e0 R3 h& d8 v" t1 `) j; w if(istrin>>csym[2]){0 c1 I2 \" R5 K7 n
switch(csym[2]){
( e/ ^4 J1 d0 s" |: p( h case '(':
1 f1 V9 B' q, X& O. T9 L if(!csym[1]){nLevel=0x100; nERR=1;}else- R r+ v( Q, O$ m O2 ]
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;& ]# v% G q0 r5 ], w1 Q3 ]9 |" S
else{nLevel=0x100; nERR=1;}3 M4 l* [& i$ D- P, I
break;
$ \- m* f/ G- X/ F' n# N- e6 v case ')':8 e$ e- x/ R* F+ e
{nLevel = 0x100;}break;
) P4 r% Z9 P( I4 ?/ b0 q6 r case '+':case '-':case '*':case '/':, s% Z- {0 Z" c2 H6 Y' W1 J- H- f# ^
{csym[nLevel++] = csym[2];}break;
, h# S/ ]$ ~- t& J- c case ' ':case '\r':case '\n':case '\t':continue;
. q" M- M, z3 F. E& Q/ G default:
2 `$ C7 z7 a/ h- O9 p {nLevel=0x100; nERR=1;}
9 F5 }# W G; D" F( y# v" E( X9 b }
0 B0 j' ~ X! Q# ]/ m; P% C if(nLevel==0x100)break;
4 S# g# B8 Y& u, y8 h" r1 m+ Z. U if(nLevel&0x10 || istrin>>t[2]){
; V' V% X) y; e `" ]' h2 y7 m2 j# S nLevel &= 0xF;
' [/ j' M) W. s1 A9 V if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 n6 z9 ~0 ]& g1 x" z
if(csym[1]=='*'||csym[1]=='/'){
6 C1 Y4 a+ S' a# G& z" ]- z' w GetExpValue(t+1, csym[1]);
4 Q3 o3 Z: ^2 x8 _' t }
* |# d6 Y0 \( a3 H else{/ v" j& V4 [) j6 {9 ^. b- _
GetExpValue(t, csym[0]);$ o7 J0 X% D# H
t[1]=t[2];csym[0]=csym[1];csym[1]=0;5 e9 t! P; U3 A9 u2 a+ _
}
2 P0 C2 ?* d+ P% R: W9 |1 p nLevel = 1;
! b0 {$ n! j* k5 d9 A8 F8 q }- n. l; l' G, ]( P, N6 e0 z @
else istrin.clear();
& a" ?0 e2 |1 s7 B" G }
0 U# B' M( }; B% j, t6 p- c else{nERR = -1; break;}
8 q& |& F- {& S5 i }6 x8 ?! Z( j) T# ~! k
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& }* w5 s' ~ V+ B# \6 u
else nReturn=GetExpValue(t, csym[0]);
" g- y. i8 o# w0 G( ~4 l) n" N return nERR==-1?1:0;
! u% ~- L4 `( `1 Z/ b9 @* F( n}}
0 C5 G8 r+ z) Y& K- R0 m& p/ M4 ^+ S
( J& D/ _0 u2 K5 _
( E0 i2 S8 ^. r9 W1 D+ l函数模板使用示例:+ o- e" {# r% ^( l4 \
在以上那段代码的后面加上以下代码:% F: v8 A# N, s5 {! N: ^3 n5 I! `) u
2 u# _* u4 O- u' V+ N# k! h W
" y4 D: u- ~" `1 U( D
; T, r+ d3 u7 ? O( V程序代码: % ^8 w* u/ a F2 ?1 K- `% l
/ [) \2 }1 b7 C' n% d4 e#include<strstream>
% B" x1 K1 @7 \7 T6 ?0 |#include<iostream>
& `" o; x! T0 r! \8 {4 u' R#include<string>0 S1 ~5 E: l G+ @; e
using namespace std;
4 f2 C3 M- S6 h; Sint main(void)( D: d5 [- i9 z C
{
) D( }6 y% a$ P3 r" t string s1;
9 K0 S$ j8 I: i( q! I6 f while(cin>>s1)+ b) O6 I- G) g( S n/ X$ D6 M
{
6 ^. b: i1 S) V4 `1 c2 N2 y istrstream isin(s1.data());
+ I; i6 Y, [, {. g9 E% t5 o double d;6 v2 ]2 Z& S6 l7 V9 F: g
if(fy_Exp::GetExpValue(isin, d))
* t) _ O. Y5 @$ X+ Y1 _( K {
8 u3 K: z' [: t+ p% o) n! Q( A* n7 N cout<<d<<endl;( |7 H2 d% @1 [- n( ^; Z
}7 F+ f' Y$ s8 d9 D. o0 x
else
- J; p4 s: [6 I( {% J8 C6 d% h4 _ {
* F1 r- Y1 Q4 e cout<<"ERROR"<<endl;& f3 o+ G" o! u4 P, c3 c0 `
}
4 ^8 i& b1 j7 H) g3 @0 B: w }/ C' A: I5 C, O6 f( v- ]
return 0;
% \' r* D2 S$ c( g}+ M5 L5 s$ g+ D: F+ \/ D- C
# H% I& D, b8 }) L# L! S; a/ l- S4 b9 ?
: `/ ^0 l! L$ b然后编译执行就可以了(*^_^*)
: G! y5 J- v$ v- k其它:TC++上一定编译错误,不保证在VC6上也能通过编译
, r" k& Q# A( j9 i8 u9 V& N 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|