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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,1 K3 P1 @3 N9 n9 ]: k
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# G9 c U2 W9 ]6 P+ C# T只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
0 j) R1 D5 L2 W+ u参数解释:
. `- ]7 v) e; J# Aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) d, a3 Q/ i4 r' }7 Z- U* MnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- k4 t. f" ^" x) g2 f0 O) p$ E" ?返回值:
9 ]$ N7 ]; ]& q) v" X5 ~+ l- b3 O1 x返回非0表示计算成功,0表示计算失败有错误
; O, g4 @. `* N; ]6 [2 B# e1 K* h3 G( y, {7 T2 M# M' A
* T, F$ R f2 O4 {
3 @, J, {- s% ~) Z, W$ G+ q程序代码:
0 O6 ` Z, R, g' P+ O& j; C, h* v( C% m- R( R
namespace fy_Exp{# B H3 ` i; n) P. `, t
namespace {template <class _T>
* x- e/ v' O, p8 @3 pinline _T GetExpValue(_T t[], char& csym){
9 [: h) h9 H9 s2 S: z2 b char c=csym; csym=0;
+ f7 Y' ~- x- G9 b& J; F switch(c){
# y3 i9 ^2 h1 E2 n4 ~% d case '+':return t[0] += t[1];
! y" ^& }+ A; _& p& a0 l v7 F case '-':return t[0] -= t[1];
0 c$ ?1 K% i3 n2 e5 z case '*':return t[0] *= t[1];
* S. A8 h4 B( e+ v6 W4 ^- U default: return t[0] /= t[1];//case '/':9 H: w7 e! K/ k0 I- s3 ~, k3 f
}2 j1 K& p$ L* @; y# m) @. C: f2 m
}}
9 `, o/ }7 h" i: F2 btemplate <class _T, class _Tstream>$ i' M, H3 r7 D4 F# ]) a- m
/* _Tstream: inputstream, _T: get return value8 B( n1 d, ?4 z) Y0 U
* Return nonzero if get value successfully */1 B- L* `, v. D% _
int GetExpValue(_Tstream& istrin, _T& nReturn){6 G0 N: D0 ~: K! O
_T t[3] = {0}; //雨中飞燕之作/ `$ I: M* Y) a1 i' c; f4 C4 p- S% q
char csym[3] = "++";
$ _- H* ~. j# P+ Z9 o3 Y3 q int nLevel = 1, nERR = 0; r( L" ~. ~: S
if(!(istrin>>t[1]))istrin.clear();
- _4 P8 t2 F8 B3 s, G/ N- P) R for(;;){
* v' o- j+ d- l if(istrin>>csym[2]){
" `! K; a! l' ], p switch(csym[2]){& M3 V; \- c2 n( D! A' \8 |4 D, F4 P
case '(':& F- r4 z4 B6 B
if(!csym[1]){nLevel=0x100; nERR=1;}else8 {' n2 a7 f/ G4 c
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 _, L- [& N8 D8 w) Q/ u1 I2 h9 [ else{nLevel=0x100; nERR=1;}" e7 b- ]/ E" f3 w- e
break;
/ ]. O( f) E- {3 a9 \ case ')': i8 o, c2 K. i$ [! d( R: S
{nLevel = 0x100;}break;
) x7 u/ o2 F( f. l* x* o& p% o case '+':case '-':case '*':case '/':0 ?1 \) F, |) p8 C) G7 H+ s
{csym[nLevel++] = csym[2];}break;5 I( N5 ?; I/ r4 s/ f" ~( r
case ' ':case '\r':case '\n':case '\t':continue;. C6 l* @! J; ]5 u
default:
& q8 Z" h6 f7 E, p% T* S {nLevel=0x100; nERR=1;}4 d" u' j9 |/ L: U( V' L! s- A
}
0 b% P- N' ]! F6 u1 Q if(nLevel==0x100)break;
L) N7 J* L% G if(nLevel&0x10 || istrin>>t[2]){" n0 v# I+ k6 b1 n
nLevel &= 0xF;$ x2 j% W' _' {! w: q% L6 p/ ]- i
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, |& ]2 [5 I/ r' w3 W if(csym[1]=='*'||csym[1]=='/'){
, B; S6 G- M% t& y& h/ R( g GetExpValue(t+1, csym[1]);: r% v7 M. Z: m8 I8 R8 ^( v3 @
}
! c3 @3 F4 o4 D: {* ^ else{
/ s8 a* K; B* C e. i GetExpValue(t, csym[0]);
: p( o+ M. h* J5 q/ j t[1]=t[2];csym[0]=csym[1];csym[1]=0;: Y8 ?6 G% t) M p5 x5 n" `! Y( F. v
}
/ P" v) i1 ?' Y& w) N7 Q nLevel = 1;5 b( T: a% V7 O$ w! I
}: M6 S& P9 B6 ]
else istrin.clear();
$ H/ u: v" b S* Q g1 j }, N9 M- `& }: ?: W! S, f
else{nERR = -1; break;}
( J/ M; J j. t G: V }0 `. [: I) z) C4 X* f# \
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 z6 s! e' K# k) F5 j- c# A* O else nReturn=GetExpValue(t, csym[0]);
+ A7 H, m. Q, p! S/ }- l( T; } return nERR==-1?1:0;
- o, G9 s' ~8 p+ N6 @4 t; P9 _}} b: @3 o8 D* e
5 N4 y u! i+ Y! v7 W( w' t
- z+ R* |4 J: S! {6 c' H
% @) {: `7 p, R( x4 }+ ]函数模板使用示例:$ u+ l5 W# L' ?+ L' J
在以上那段代码的后面加上以下代码:; y% l" `% O+ @+ ~4 j( c
, w2 n6 w: A% d1 V3 ]2 l! `
1 f! K6 O, K% v7 v
/ j- t9 d: p' r
程序代码: ; K+ H7 A. m) f. o+ H8 P
# _ Q% i/ ^+ B! J
#include<strstream>! N, t. R6 l2 B S! {
#include<iostream>
$ u% X" h9 y2 K ?' y! L8 m#include<string>
2 K6 e+ @. {; L" ?. t9 f2 m3 Xusing namespace std;
" J6 Z- W# |1 d7 j1 |4 {3 g: Xint main(void)- y- p% c9 P& X- q3 l9 r
{
, u1 \+ p- W3 l! s string s1;
2 K/ p; h p: L$ t, k: ^! G+ u while(cin>>s1)& Y2 T4 ^& Q0 ^# r6 v
{1 T% f. J; ]" c: J
istrstream isin(s1.data());
& X# Z1 g+ {+ u h+ r* o) ] double d;
6 o4 E1 A2 S0 G' d7 u% G2 r if(fy_Exp::GetExpValue(isin, d))) K& w9 p) f: y
{% ~8 b! ]/ B8 n
cout<<d<<endl;
4 M; U* O& c/ {( A7 `! v( a6 _ }
( v8 b9 T8 W# \& N3 q( @, H else0 _% g/ F, ^* e' F
{
7 T' G8 v3 r7 I cout<<"ERROR"<<endl;
6 b0 N! z1 g5 A c4 o; I1 ^; J }
! q) @( A0 [' [8 p% A* J+ f4 p }
" N- T# l/ B" a4 }% ^7 ]5 P return 0;$ o! z" I* F) A1 I1 T' ~
}, ]. ? O. {2 M# x6 u4 @
; v3 E/ B3 D) C! _( p) i3 a6 y; ~" ]0 O
然后编译执行就可以了(*^_^*)9 n$ B. G- K- D& l# ]. C& J4 @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: W" m7 r) L: ?$ b# }' d 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|