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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,0 U, Q8 b7 O- t1 a
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 `9 u! z9 m9 t2 o/ z
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' r% r2 i5 X' a- n
参数解释:) V' ^% m# N# q/ S/ \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ P. M* d) ]4 C
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定9 V4 z% k. o8 |! t: d2 w+ v
返回值:9 x+ _ n) X: R8 ^
返回非0表示计算成功,0表示计算失败有错误
2 w' @2 o {! c+ Z3 q6 F4 U- ~5 G0 X7 c' k# H% g
2 V/ R6 n8 z- u$ s' [
5 @ C' |$ a; X$ `4 E z9 P8 p程序代码:
/ ~9 y" ]; v+ O& K L% }! n; l8 D+ F" P; H, X. \6 c
namespace fy_Exp{
% B X- E& M* c3 m; ]) nnamespace {template <class _T>1 v* s; {: D8 T7 G
inline _T GetExpValue(_T t[], char& csym){
+ n6 j) G0 b+ T8 g! l! X char c=csym; csym=0;1 ]6 U# H/ {$ U, g
switch(c){% P: f( s' M2 I9 U: a
case '+':return t[0] += t[1];' w5 }0 b$ P4 L6 ]# R# B
case '-':return t[0] -= t[1];
* i$ E/ M4 K; b, R% d' I case '*':return t[0] *= t[1];
( }5 M; b, p. J1 E( c2 x default: return t[0] /= t[1];//case '/':" w9 v9 v+ w" X; u, b! f
}: M/ S" x. R Z; p
}}
9 L2 L# J) j9 n. b) \: Z3 ?: ktemplate <class _T, class _Tstream>
3 o% ~% E- r+ Y" H2 o B6 p0 ]/* _Tstream: inputstream, _T: get return value
0 B) j7 f+ e7 R* Return nonzero if get value successfully */
/ C' ^5 H, s H: mint GetExpValue(_Tstream& istrin, _T& nReturn){
; u1 x; ^3 S. N# P- |2 I# z _T t[3] = {0}; //雨中飞燕之作0 J1 z% c2 p+ [1 A+ `/ t% I
char csym[3] = "++"; Z T2 M" f0 L$ {3 o% S8 s" {: |% Z
int nLevel = 1, nERR = 0;
1 Z9 S) M3 u. o K. I. B9 T if(!(istrin>>t[1]))istrin.clear();4 i- e/ v; |* n& C5 O% _
for(;;){, \1 i4 {, m8 g
if(istrin>>csym[2]){6 k4 F% Q$ U: B- T
switch(csym[2]){6 h' N- @3 W8 Y4 x) s1 s. y
case '(':9 v& f- n; f0 K* e- j- T6 |2 G- G
if(!csym[1]){nLevel=0x100; nERR=1;}else, u2 _& i% _, T- f$ Y# c
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 K: A' J6 m) C0 z% ~
else{nLevel=0x100; nERR=1;}1 C9 l% ~) t' h/ y; a7 J8 O2 H
break;
6 a5 [6 B: D9 h! f case ')':
7 b( i" Q5 [* O" w% K" x {nLevel = 0x100;}break;
: z A' f. z8 Q case '+':case '-':case '*':case '/':, ` I9 K, o# ^1 O' g
{csym[nLevel++] = csym[2];}break;) J8 _* O6 R0 @8 g6 z0 Q- U f5 `
case ' ':case '\r':case '\n':case '\t':continue;
/ d6 o( p `* P8 `0 Z/ h/ h default:; d7 `7 w; o1 }# G+ Q2 X" ^
{nLevel=0x100; nERR=1;}
; n3 E0 J h1 S. d }
# s! g; b0 F1 ~, W# `6 R if(nLevel==0x100)break;
) `2 s7 h6 R/ m8 h1 g. `7 a2 N1 b if(nLevel&0x10 || istrin>>t[2]){
8 H. u @! U7 ]. q- j. {9 x nLevel &= 0xF;+ v7 e! D- U& f% x) [
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- A& l/ l1 m4 D) W Q& D( q if(csym[1]=='*'||csym[1]=='/'){. \6 `8 q% E4 b1 l7 T( W
GetExpValue(t+1, csym[1]);
' K& h, ^1 ~1 k: k+ G9 ]) j }) E3 k* `: I3 A4 e' P
else{
; Q3 {+ Q8 |6 E* q7 M* D7 { GetExpValue(t, csym[0]);
S$ x2 i3 t- ^; y t[1]=t[2];csym[0]=csym[1];csym[1]=0;! _, J* N5 q4 @/ ~. O
}
* {( w" _. a3 F4 e2 L2 A nLevel = 1;
( B$ [# i1 l+ Q# e5 B# P }2 g9 M ]+ {% T: k; ]: v
else istrin.clear();- t* S( J9 P( t, P3 d2 Z: y
}
5 N& m) G5 I! K; @7 N { else{nERR = -1; break;}
u) h2 \8 n( F+ v$ L }1 |1 }: d* u' ~
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
O) H1 q( l+ g9 Z else nReturn=GetExpValue(t, csym[0]);
: a; H, X: Q( y3 N6 w. T: l# Y return nERR==-1?1:0;
8 o+ L% v. `3 H! ~}}
- m! y0 L+ {, J! d( O% i+ X6 C0 Y; U, L$ ]: a5 Z
: v: v" K6 t- U* a! q
9 W* q* }/ h( |' w. M2 k. g
函数模板使用示例:
! o5 t0 ]' m/ C# F1 W2 K9 j6 O在以上那段代码的后面加上以下代码:) U$ C+ n: G1 F' A
( ~2 H, }% R- |4 E( ?: K
- s( e; ^! f8 `6 U* @% W
4 J H( E7 R# {9 ^程序代码: 7 n- t: \! i& f! ^: h0 ~, o
; \/ s* j6 ?( A: K( k
#include<strstream>% i& I; }' @/ x( }( V% ]& F
#include<iostream>
! _8 M" h% O! V* S#include<string>- `0 ~6 f9 V2 `3 w
using namespace std;8 v7 b, V- H* d* t" j
int main(void)4 n; R5 r) b) ~+ H3 W
{
" h; Y; t2 x$ E string s1;
G' U# }# u7 W! r while(cin>>s1)7 U3 T" e; m) [1 o5 B" Z
{
8 t. Y W, ?! h9 g. o. v- T1 {( q istrstream isin(s1.data());1 `$ L0 K* ^7 G
double d;
" m2 E P: Y/ F, f' J if(fy_Exp::GetExpValue(isin, d))% G8 j; L1 ~5 x6 k4 z% i
{5 j) l: B. n! h9 {
cout<<d<<endl;0 O; t' b: T( J! z% v3 l* f
}, S/ o) G0 q" W) i& w& w. `
else
9 Z0 i3 G0 ~( G3 B) y {
k7 a3 \, \7 J: ^, ?7 | cout<<"ERROR"<<endl;
" c& l( s5 i9 O0 g! {, z0 U8 s }! z( m# y& H1 R) z8 z/ L
}/ T& q/ O4 n1 X+ b& L! q7 N8 q
return 0;8 ]; Z9 R1 r/ @% q/ S
}
9 t$ k. r8 D* U0 x( d8 Y2 u/ s- r4 Q; z
0 M6 O4 J; ?- L- A; a. p3 d然后编译执行就可以了(*^_^*)
+ T' V3 Z6 m4 g# w其它:TC++上一定编译错误,不保证在VC6上也能通过编译% r/ @( ~9 a- C1 Q
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|