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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
5 J: o7 x0 E: C0 i- L一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' J3 p7 G/ z- S2 g* w! C# Z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! B3 W/ R9 R2 c' r* k8 I1 I' y6 ^# G参数解释:; B! f6 }+ a% b7 E% i* c2 I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
F! [; R# h2 e: Z+ YnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' P9 {6 K% ]0 `& F$ u# a
返回值:. \& s* {: _$ O, ?) W+ g- v) Z
返回非0表示计算成功,0表示计算失败有错误
/ F6 f0 O1 F) k' g
|2 y# t. ^# U8 p& R ' G5 v, C- g; t% v& h/ w; p
' r9 l% g+ I- [- J! {6 x! `) M5 O程序代码:
9 C" H, @8 ^) J/ |3 c! [2 `: o$ m; s6 B6 P3 s
namespace fy_Exp{
$ q) m4 f2 h: E9 P7 K, J$ {4 ~5 l) _& Knamespace {template <class _T>7 D; M9 L3 X G: r
inline _T GetExpValue(_T t[], char& csym){! k! B7 s; q" O ?, A
char c=csym; csym=0;
/ [+ |1 v2 U% ^! H switch(c){0 ^$ r6 b! `0 C
case '+':return t[0] += t[1];$ M ~- a% X7 b, f i2 a; d
case '-':return t[0] -= t[1];
7 v0 F3 s; Y2 A' B' b* F case '*':return t[0] *= t[1];
) @6 s2 _3 {" g7 G8 u default: return t[0] /= t[1];//case '/':
) l/ M* ?9 S" E' T8 d( ]6 a( [ }
4 u8 T1 A$ h8 X% u& |: v}}: T, X/ v8 y# ~. C
template <class _T, class _Tstream>
" Z3 V2 [( W9 v6 Y1 L4 {/* _Tstream: inputstream, _T: get return value
0 @+ S6 |7 d7 N* Return nonzero if get value successfully */3 R# p9 x4 d$ C! Z) h4 l; U
int GetExpValue(_Tstream& istrin, _T& nReturn){+ G5 b, x9 q }# ]5 ?; N
_T t[3] = {0}; //雨中飞燕之作& h4 q3 E2 d$ P. ?) u
char csym[3] = "++";8 L' g, ^4 S( J* e; i. T6 y
int nLevel = 1, nERR = 0;: V, I2 X2 x0 M' L1 N1 W; [
if(!(istrin>>t[1]))istrin.clear();
4 k" }4 [4 d e5 b; s* J for(;;){
+ ]( x( B" j Z( d if(istrin>>csym[2]){
; }5 Z9 k y6 J9 g1 } switch(csym[2]){
# i" M, h; i2 f& u5 G case '(':- C n3 o$ {" Y$ C0 u+ O
if(!csym[1]){nLevel=0x100; nERR=1;}else# z; {$ _( q. m0 e1 t/ Z! F1 m4 s
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- @6 y d H" a
else{nLevel=0x100; nERR=1;}8 x- j8 r F2 ]4 V3 I" p
break;
: h3 b# S9 P% E% V! Z. | case ')':; p9 U* F; x! z" z
{nLevel = 0x100;}break;; g5 m! ?- V6 C: T$ f! w
case '+':case '-':case '*':case '/':3 E( h5 @2 K% D
{csym[nLevel++] = csym[2];}break;& y2 U# M" n" M7 A/ B; B, w0 z' H
case ' ':case '\r':case '\n':case '\t':continue;
- w9 s0 Q) V y) n: I+ t default:( ~4 ~: |1 Z/ Z; z
{nLevel=0x100; nERR=1;}
, v7 I/ b: N/ k. Y }
' ?) @( O2 w+ Q' c( Q" ~2 h if(nLevel==0x100)break;
! {! X. q; Q: j3 n: u; r if(nLevel&0x10 || istrin>>t[2]){) K$ R; S; b' y. h( B0 Y
nLevel &= 0xF;
/ k' `) A* C8 @$ c4 K3 j if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( x) y: D" J* U) I' p* E if(csym[1]=='*'||csym[1]=='/'){9 K9 r3 C2 Z9 S( f" o0 N! |$ v l, Z1 t
GetExpValue(t+1, csym[1]);5 [: b! n. j O$ i' }6 m1 z( ?2 r
}9 g# T0 \2 E0 j
else{
& i- _3 E" j# D- I. ]& @ GetExpValue(t, csym[0]);7 j% w" ]. ^9 Q1 f, L/ W8 d
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! L3 ^% k* x5 w: V8 ]- a: S$ l; J }
2 R+ E! \$ n" S `/ @: } nLevel = 1;
+ a' I6 p, @6 j6 n3 c' H }
4 ^( t& k, O, Z6 k2 v |" e else istrin.clear();( K3 \) `" S2 q9 @3 ~) @
}
4 j9 s/ j' N! f6 C- ^( A) Z: E else{nERR = -1; break;}+ K+ U) Y. h# c
}% _2 A; k" _ Y: Q$ t
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 @. D2 i/ k: ^* g0 k else nReturn=GetExpValue(t, csym[0]);
, e- y( A8 D3 n return nERR==-1?1:0;
8 ?2 a- V- F# g5 p3 c2 f}}
4 H% ~4 S- S8 t% G* c7 s
8 w( p7 ]! Q7 n0 p- ^ o7 W. T2 d: v+ K
+ F% H6 a0 t* ^2 {
函数模板使用示例:
. ~5 _% r0 y* P( K% S, I- d在以上那段代码的后面加上以下代码:. o$ C2 j$ D, ~, B5 X; s8 r
0 F, \5 W) e" E1 I
8 j$ G1 u( \9 a7 b+ W& b5 H8 I
, {7 c. H& s2 i0 `; z; g$ R# {; d程序代码: ! S) z7 A8 Y( _$ \$ ~9 P! Y1 I
9 T& [6 J8 ^- z
#include<strstream>6 G) J+ F! o; c; k$ s6 U! L( K7 Q
#include<iostream>
9 x9 m* s% d' a: L#include<string>+ b6 @) V( M) U" o3 A) e" I2 P
using namespace std;
$ Y* R( J) B1 H _; R& V; b$ c9 |int main(void)$ D, ?* P) r/ t! [3 _
{$ f- q# v& w: t6 A, i; h
string s1;# r5 E) u' Y4 m; w
while(cin>>s1)
, Z$ m/ ~1 e4 r+ O {' l4 B. l2 ~4 P& c, b0 P
istrstream isin(s1.data());
- \. t& N/ J& C5 H3 [( O7 e; A double d;
1 \7 {( L' | a3 F' T if(fy_Exp::GetExpValue(isin, d)); l( _ N9 h. n* @ Z, r
{- s% }6 E7 Z3 N3 v0 }% t, n5 G( A4 f
cout<<d<<endl;) X" W7 I; F( I
}
" P2 K. U8 ^ x8 Q4 q else. q4 g4 |. i/ {9 G
{
) `3 {; T r8 s! g a/ Q( H cout<<"ERROR"<<endl;
) A9 d. U+ m0 K* V8 ~ }
! G! [# J5 p | t# w) R }+ `; }& D( v# b! V( A6 ^
return 0;
! E9 Y: g5 N, B# g}
4 I4 k4 z4 c$ u ^8 W# @* q
- i3 x) h1 k5 H: T& E% n
# g$ \3 {9 h' Q( e然后编译执行就可以了(*^_^*)/ v) L& ~1 G, B1 n, U
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 V9 z$ S: a5 f1 `2 _- U6 d7 ^ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|