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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
$ @3 |' p) o. g( a+ z一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! H$ r; h8 |4 B' f" m. @, \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, Y w' s8 T1 h参数解释:0 X: q1 z! m2 U3 M4 G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 ?4 s$ M' U2 p6 [# W0 }9 `
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# j) D2 N. I$ G" E: N$ O o3 K返回值:
5 ?8 Z0 h+ t" X- \& J返回非0表示计算成功,0表示计算失败有错误5 i' h4 i' F# M$ @& V- m
6 g# [/ S; D, h+ O% }7 s) u n4 f& f+ P3 [3 ?1 I$ A
; A/ D6 D6 b9 B3 e# o2 a% w! X2 z
程序代码: ) B& n: ~$ R& v! i# h; v8 G) }
: W$ B k& `0 S% J
namespace fy_Exp{
w' _5 Z2 C" A* N/ W! _- ynamespace {template <class _T>! t; c: G6 f- m# q9 A8 T
inline _T GetExpValue(_T t[], char& csym){" d( f% U* C7 e3 y/ F5 d
char c=csym; csym=0;
( K) l: ]. g3 k& d. Z1 J switch(c){% R* s+ Y; C" H8 ~
case '+':return t[0] += t[1];
: p+ T+ I9 b' N case '-':return t[0] -= t[1];' e6 s6 L: v! Z* [% r- X' H
case '*':return t[0] *= t[1];' `- Z: t! _* m: {3 E/ {
default: return t[0] /= t[1];//case '/':' t) n8 f/ }% L3 Q+ @3 a. t
}: |+ `0 B* d7 ~) \5 E! v
}}
1 x& f/ J* H0 T6 }- Q2 W7 Ltemplate <class _T, class _Tstream># ^$ A% u! U9 m; \
/* _Tstream: inputstream, _T: get return value
9 H* G8 _, l8 @3 B9 X6 ^* Return nonzero if get value successfully */+ T! n7 B2 Q7 w$ P2 }# Z
int GetExpValue(_Tstream& istrin, _T& nReturn){
. s% f5 F! M9 [: j _T t[3] = {0}; //雨中飞燕之作8 ^7 ?- `7 T' ~* u( X) q+ n
char csym[3] = "++";4 l( k( M+ |5 a) Z
int nLevel = 1, nERR = 0;9 M7 B$ [; W/ V$ \
if(!(istrin>>t[1]))istrin.clear();
# n; Y8 x/ B, c' B7 V for(;;){
0 |& J' }$ D& R( q6 n, J7 m if(istrin>>csym[2]){* |. K, w9 K% @+ R6 @
switch(csym[2]){- |+ U3 r' v4 g; M6 _
case '(':
- g8 o6 S6 \; k$ q7 T! y if(!csym[1]){nLevel=0x100; nERR=1;}else
6 C# n1 c. o/ X$ [, L2 } if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 ^8 L D' Z2 p4 e8 I$ ^! Z: S else{nLevel=0x100; nERR=1;}
, [' |' s, j6 `' c8 t break;
3 h0 p, g, e6 N, Q8 D+ ` case ')':0 e9 `+ c! _# v
{nLevel = 0x100;}break;
! T" g& H0 I4 p2 I% i( E2 p case '+':case '-':case '*':case '/':
% k; |: m5 }' q5 d1 I+ x Y- ~& Y {csym[nLevel++] = csym[2];}break;; R2 ]& \1 c! V2 J: k
case ' ':case '\r':case '\n':case '\t':continue;
. X1 E5 a u% t) ]* v0 { default:
" V/ c1 V# Q4 o% |4 F: G! P3 _ {nLevel=0x100; nERR=1;}
% j! _% ~$ R: u- V3 D4 e" Z7 B. b }! {. F0 h7 ?% e6 \; q
if(nLevel==0x100)break;
x; Q* I# g/ [7 i1 p+ A if(nLevel&0x10 || istrin>>t[2]){8 U' \' X* i9 H, }; D f' r
nLevel &= 0xF;
# s# ^' y! B, m& e$ ?) s if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, |% s7 H) v% d6 i F
if(csym[1]=='*'||csym[1]=='/'){
7 b; C) `* K: p GetExpValue(t+1, csym[1]);
) g) |' M3 e* f2 A( ~ }
0 S! P: c1 E) R4 H8 X! g6 Z, E else{, x6 s& j6 e7 z% i) k
GetExpValue(t, csym[0]);- c1 @2 V/ H, E; Q( g( w4 f+ g
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" `6 ?+ k9 I2 ~; l& h }% U4 d* J! Q( p. y
nLevel = 1;
* z: @- z [- y+ H3 S, z6 Z9 B/ x }6 L0 L4 q; I# w0 |5 l. E) y* ?
else istrin.clear();; r! R" y$ ]& Y+ Q1 E8 S$ U1 q
}: L! ?; _! m0 \; O+ n7 [! A9 \
else{nERR = -1; break;}; [' U8 C# j) y2 d7 ^$ N0 |: M
}
( ~* V- s, m9 [7 H8 j if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 S# P9 m+ w# f4 X
else nReturn=GetExpValue(t, csym[0]);
3 Y+ }% R9 R5 K! ? return nERR==-1?1:0;5 F1 ~% {7 V3 P4 z8 }% I1 r3 s
}}
, y7 X% l4 u* @) R9 W6 `
3 L5 r: h- P* f) x! }+ r6 W5 B$ L1 v4 C
/ \7 I- {& s6 O! ~ D, L7 u函数模板使用示例:) T' C+ ?4 J. U7 W) k3 S3 y
在以上那段代码的后面加上以下代码:. e c' ]* E1 l
" m, L2 x, y5 |' W+ D
{2 v8 |. |% s) |4 F& V/ m
4 s1 Y0 K# Z- V' w程序代码:
$ f! b/ ^, `4 N f0 a
; @9 q$ [) v( a$ c6 |8 Y#include<strstream>$ E( @, v, ^4 F6 [/ L
#include<iostream>: v! K4 h& b( r4 ?: o
#include<string>
f' G S v3 S' pusing namespace std;
/ d k+ O* H8 G8 o% u! @% ]3 C. Pint main(void)" P; ~' A* i s# C4 t' Q' i1 j# O; a
{& a, e% [, `. p5 H u
string s1;
, h/ k( y( E6 O# s while(cin>>s1)
! ~, H' D4 g7 g7 i {
9 i) l, }9 ?0 T6 O- Y, J4 ]3 h y. ? istrstream isin(s1.data());
6 T% Y& X! ?3 Y6 g" D5 {9 ? double d;
5 q$ d) [2 O: d3 A# @ if(fy_Exp::GetExpValue(isin, d))
( J1 q4 n# e) j2 A {9 B9 u; S( T% c& B* E
cout<<d<<endl;
7 M. Z3 z. T2 B% O5 r }
& F3 G, N4 U3 @" O' W else! u X9 C5 L( Z6 ]0 y- A. [
{$ r! T9 c' H9 i& l* ~+ X5 N) C! \
cout<<"ERROR"<<endl;
% L- Y0 t7 c3 w- H$ |1 C. u& B }
# `1 N: d' l+ G' V% P" B Z* \ }' F2 y" N7 N7 @8 {4 B6 i) B: ?
return 0;
% z6 P* G! B( J+ [6 i}
% T, g) ~; A: A% q" x
# s. r3 F, a6 D* k- @# f9 [ s3 ]1 k+ t8 b6 j: C/ i' ^
然后编译执行就可以了(*^_^*)
2 b; N! y7 X0 F- P2 \/ @其它:TC++上一定编译错误,不保证在VC6上也能通过编译
9 ~0 V- G- |, [- J7 J 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|