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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,* Z- x1 u# {: q, [% V+ x, W3 b
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: L/ Z% K0 [, V+ W0 {- P只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& w: }+ G0 V/ D1 ^ @参数解释:% }" O8 l% W" Q/ T ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ k$ ]8 [& P1 B& f3 O: ~
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" y! [ l, ^2 g: k' t: n: ?
返回值:9 ]3 p; s1 ?! C5 o4 K/ N
返回非0表示计算成功,0表示计算失败有错误
+ D3 X+ p# W6 [5 |2 Z1 ~. i# ]+ h5 r* Y* N
, j# a" U) z$ C/ m- t
0 U$ m$ B& k$ {程序代码:
4 d* f/ Z; x2 t. K7 U" a3 F6 _' [( x
namespace fy_Exp{
g( E' V& o1 @# T# ?7 G5 dnamespace {template <class _T>
9 a) u) Q) n. oinline _T GetExpValue(_T t[], char& csym){
1 u! _! z1 R7 t char c=csym; csym=0;& K) J8 i% R! r
switch(c){
3 i8 o& }8 g, k4 q' Y: t% R+ R ~- H case '+':return t[0] += t[1];
0 @6 z ~1 j( {! } case '-':return t[0] -= t[1];* B: k& K7 i# O0 p+ a+ F0 e7 Y
case '*':return t[0] *= t[1];
0 g# A! @. @- ~3 L& n! R# C default: return t[0] /= t[1];//case '/':
- J: z7 I e1 T: s" L* [ }; P# t+ _. f8 q+ G; i
}}
. d5 n. Y) ?% s2 Etemplate <class _T, class _Tstream>+ g0 s1 O! f8 S' f ]& c* I( U
/* _Tstream: inputstream, _T: get return value
5 ~3 z J: R( h ~* Return nonzero if get value successfully */) c5 Z& r9 t9 c6 a* T% p
int GetExpValue(_Tstream& istrin, _T& nReturn){
& I5 ^8 s$ U& g3 E8 s1 _( C _T t[3] = {0}; //雨中飞燕之作( o* L1 }- j7 o; i/ D' c5 Y
char csym[3] = "++";
. W# c* v5 B) Z% B" L7 j int nLevel = 1, nERR = 0;8 {; c3 E9 u4 K1 o& ~& d0 n
if(!(istrin>>t[1]))istrin.clear();
9 e0 u1 K* t* A' _" U& W) q for(;;){2 }# S4 e' D7 d- O/ m) i
if(istrin>>csym[2]){
1 I4 n; y( J8 z( y2 ~0 U7 J* A" q; Z switch(csym[2]){6 I8 N7 B3 G8 g2 n( U4 i! u5 g0 I0 p
case '(':
3 [! o2 u# K% a7 {$ f# B _ if(!csym[1]){nLevel=0x100; nERR=1;}else$ U# a0 L# T; J5 R' i
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 L D. a) K$ b else{nLevel=0x100; nERR=1;}
/ ^3 h) a; W, j$ ?3 f6 ^ break;4 _# x/ M [6 z: T( @; g
case ')':
0 K! c7 f2 D) q/ Q% m d {nLevel = 0x100;}break;; ^ n' t c @9 o$ V/ t) |
case '+':case '-':case '*':case '/':) H Z5 v$ x( K2 e$ B D; V4 k
{csym[nLevel++] = csym[2];}break;
8 N1 k1 w. |5 P# Y case ' ':case '\r':case '\n':case '\t':continue;: |# i) S$ U" S) ^" _: Q
default:0 A9 s( P0 h4 b& w4 e M7 _* e
{nLevel=0x100; nERR=1;}4 T' R- M6 w' v& \: \3 h1 Y, U# K
}
3 d% N8 r. p5 N1 ?* ~ if(nLevel==0x100)break;6 T8 h3 B g" q! @
if(nLevel&0x10 || istrin>>t[2]){
' x; E* k' Q$ r W nLevel &= 0xF;1 F: x$ S& I4 _4 q- I
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! H ~6 l( ^0 B8 d& V8 t
if(csym[1]=='*'||csym[1]=='/'){" y$ l* u$ Y0 H6 M2 W. R
GetExpValue(t+1, csym[1]);' q1 R4 {1 g+ ^
}
+ N7 ]3 y# u# ]- h4 A+ _ else{
8 o) n: _6 U1 \, u$ A5 l GetExpValue(t, csym[0]);
" G+ g, F/ p. U+ `" j t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 V9 P1 O5 ?) @: O# Y/ G3 L }
5 d+ A3 T; a5 L nLevel = 1;
' I' o2 e, k5 ]+ F8 W5 c# `$ `( n* L: i }
" f; _2 Q3 I0 `& H3 j8 ^; c else istrin.clear();
% E( q/ z, A! W% s( \# P6 K% s }
- e* z3 @, D4 E' J* s# M else{nERR = -1; break;}
% }8 U) v) V% ^& \ }7 o x$ H( ^8 v& z- z- s& j
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);* k$ E8 C3 _9 B1 s, _% H
else nReturn=GetExpValue(t, csym[0]);. d4 {3 j' |' q' S% }" q; P4 ?
return nERR==-1?1:0;0 `5 Z) U; \( T* E( c
}}2 t# T/ d, R$ L! i- Y: G
_; y8 X. |( g0 J
- k4 e0 L v* a# z' }
8 v/ i; y' f/ P- O/ Y4 {* V. T函数模板使用示例:# z6 Z5 o8 G2 P4 @
在以上那段代码的后面加上以下代码:
* n0 x3 t' K9 M% M' Z0 o
" r, B8 z& N' B6 z, {
" p& O: O# [% S- E6 m& R# D; {- V3 Y( G0 T/ [ {
程序代码: 0 x' x l; I; T
9 p, j$ g7 J5 J1 A4 [1 e3 X#include<strstream>; E; j( s" v- G! Y8 X7 P
#include<iostream>
2 g9 D5 l7 M7 y7 v- p: ~3 F# b#include<string>
9 w2 k+ G+ f* B( tusing namespace std;
3 ^0 s3 i! C3 i8 fint main(void)4 v0 b, e* U" b
{. \! j! B" z' ~7 z2 z/ x' [; U* L
string s1;# J. u. m/ e; i, ^2 O
while(cin>>s1)
' ~$ k2 k4 U- d$ L, y {
% ^' G5 J. }! K/ S% ?% }3 M4 G; e istrstream isin(s1.data());; a6 [9 r( L9 B$ ^
double d;
: b5 s$ }; t( T6 k5 S9 y" h if(fy_Exp::GetExpValue(isin, d))1 ?1 b$ J' B" M" \
{5 v3 B) u- ]/ S& j. U# f2 d+ _9 z$ l
cout<<d<<endl;
8 H) R; \7 V* I* Q& o }
1 I! D( d' ?9 n5 Y else6 g( y: p6 _! o, u
{
; \& o8 Y3 q2 w4 `6 x cout<<"ERROR"<<endl;
( W4 l/ `6 y7 W( t }
1 L/ e' i, Q$ G- [ }# H, M# b' `6 N1 i3 N! q% t
return 0;
4 N0 A6 F$ p/ d; f0 K s}
( h" N; `$ o) z2 K: E: j4 }, [
/ W$ ]& Q1 N" G4 s4 S4 {3 L, A
0 o3 ~; d" J: \7 p2 r/ g然后编译执行就可以了(*^_^*)7 `- p; Q( }4 }0 x' f, ^% L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ x$ D( ~) ^1 _4 d2 J& k
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|