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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; _5 o0 S: Q; c9 f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' `0 r4 c' C: H2 C& [8 S: b
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)# d: f0 R3 H l/ r: D: R
参数解释:
# B B' o* I1 Sistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( ~2 g* f j. Y# \- c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* C* b1 Y! w7 c7 f2 j- [
返回值:
$ \/ Z2 k8 t- z返回非0表示计算成功,0表示计算失败有错误
2 U9 k9 z2 D; Z4 i+ X$ h: d4 x8 D8 _# n' f
5 m5 E0 v0 D! c
; P: c! ^# K9 @( Y3 V5 Q% I程序代码:
) ]1 _. G3 }7 }- l8 R) k( a& h" |3 N
namespace fy_Exp{- x. ] j8 ?: k. s0 c
namespace {template <class _T>1 R6 w2 E* U" i" i1 E! w
inline _T GetExpValue(_T t[], char& csym){8 j5 ^ W' m3 @
char c=csym; csym=0;3 N. q# o0 _! I# o
switch(c){- r% Y5 m9 X3 b4 R2 `5 [. K7 h4 ^
case '+':return t[0] += t[1];2 P2 ]2 i0 S( s2 R& w
case '-':return t[0] -= t[1];
. i, b+ N3 t, e+ q3 C; [: m4 C case '*':return t[0] *= t[1];+ z- s+ Y0 i ~2 {% Q) m# I2 r
default: return t[0] /= t[1];//case '/':
# h* c) [8 S2 ]/ u }7 L. f6 q) p; V! P- t9 `9 s) V5 F
}}
- Y3 G: k5 ~: S5 A2 j6 d5 b4 etemplate <class _T, class _Tstream>
* q2 a9 d& B$ L/* _Tstream: inputstream, _T: get return value: i0 U/ K9 n8 o3 i4 H
* Return nonzero if get value successfully */3 Z" M2 @ ?4 K( s
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 ?2 b. n" q7 H+ A* O( x _T t[3] = {0}; //雨中飞燕之作3 @% O2 j! t( K+ e7 X/ k
char csym[3] = "++";& ?# }4 i6 o- d; c5 y. C" Q
int nLevel = 1, nERR = 0;1 h- T: c2 j3 x3 s- f
if(!(istrin>>t[1]))istrin.clear();
3 P+ p7 l2 @. P" H4 P for(;;){
& h7 T' c3 D& N' Y if(istrin>>csym[2]){
; ]) z# D3 }2 V" Q6 \0 I2 A switch(csym[2]){6 _# [9 s1 h$ z9 g" K8 K4 V/ M
case '(':5 L" m* \1 m* G; M
if(!csym[1]){nLevel=0x100; nERR=1;}else
# O# q" R* `& I+ J# t7 c" G if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 |) h- j. _; {. e else{nLevel=0x100; nERR=1;}# e$ U9 T3 Q( R& F
break;
% n2 B& C% G- Z3 E; p3 E8 B case ')':
, m6 }) b a- E3 @% O {nLevel = 0x100;}break;
- l2 j! b6 `8 [ case '+':case '-':case '*':case '/':* q8 Q( V9 j6 a, D
{csym[nLevel++] = csym[2];}break;& f" ?: J! Z5 K% D/ l+ ~ Z
case ' ':case '\r':case '\n':case '\t':continue;3 b0 a& u$ D1 g! Z# s
default:
. Y" r/ r5 T2 |3 @ {nLevel=0x100; nERR=1;}
# x! d' Q: r7 ` }* {0 H! H' J) {6 J; m, s
if(nLevel==0x100)break;3 {- @* g9 a0 z; C
if(nLevel&0x10 || istrin>>t[2]){
" w$ h% ]' ?/ K* V nLevel &= 0xF;+ [# W4 `) S7 d a7 j
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}5 e: h7 i7 t( ~5 e6 z% p
if(csym[1]=='*'||csym[1]=='/'){
& R# r3 x: X/ k6 q+ ^ GetExpValue(t+1, csym[1]);
0 T- H' w& V C }' |! h2 o3 ^" [: w
else{- q" e5 [% M) ~. S: H+ A
GetExpValue(t, csym[0]);* }6 _! R( g8 P
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
A- t! s5 a3 g" T# Y6 L }5 |& |4 z8 B0 a' J
nLevel = 1;/ f6 W9 O# i. L }* e5 H" Z- b7 H
}0 M% t! c, u% [1 \ d% z
else istrin.clear();$ t$ C9 f7 W+ F1 @& J* W
}
0 E. G/ s/ `; f! o else{nERR = -1; break;}5 J- _- j" _& [* t4 \9 l
}3 ~% z% j1 l' Y5 W# l
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 u# Z$ x5 d( k+ a8 J' _: ~: b
else nReturn=GetExpValue(t, csym[0]);1 ~4 o0 T' ^6 |
return nERR==-1?1:0;% N+ j8 \9 ~# U
}}8 T( J* H& r( @+ g% L
& C& Z) [4 @! N! y5 X
: e4 ?4 @/ s) C7 z( E B0 i( `6 Q
函数模板使用示例:
- [2 |2 ^6 M9 D( C+ ]) h+ S" e在以上那段代码的后面加上以下代码:+ P% I5 O- Y5 p
' \3 z& z" U1 S" A 8 o6 h* u: z( L* e" E0 \$ _
6 j: k7 e& F: M: H
程序代码: ; O$ x7 x$ V3 w2 B% e
* G! o& i2 l: p7 Y! l1 Q#include<strstream>
6 }' {3 n- g" b) d7 G( `( @7 j$ E#include<iostream>5 Y0 B" n0 P* ]% P% g$ {
#include<string>
& h/ }3 ^0 d3 z5 x/ [6 [using namespace std;
6 r9 R0 h2 w/ i( ^int main(void)
, R- ^7 z3 ], H3 c9 B4 W6 t{2 i* Z3 W: d9 u3 m4 e
string s1;
1 b, C8 Q: G0 c: }; H while(cin>>s1)
6 p) D- A8 w6 c {& A- u! _7 x7 N; s1 @. W" ~
istrstream isin(s1.data());# }" f$ p4 G) w& p
double d;6 R% S& d2 ^2 Q" b3 _" X
if(fy_Exp::GetExpValue(isin, d))
2 E6 v% X" K8 o6 u) Q& C {; i4 ~' T; u7 h
cout<<d<<endl;5 k5 Q8 x) o/ S9 H7 T
}, k5 o1 ?" o5 R ~9 `% i
else# _9 i5 r& n% u9 [' p, D" C1 _$ Q
{
( H+ ]5 R2 K, i0 m( e0 q) k cout<<"ERROR"<<endl;" I6 N0 y( k, _# E
}
: k. v$ G2 d* _: x7 v6 b0 P/ b }
- q, S, k' T# ?7 Z return 0;% X1 p/ O1 ] v9 c" {
}
1 K) b6 S6 W- T' n
* q( I$ p2 N' _% _4 T9 X# [! G" k; r- j3 j1 K' W: a
然后编译执行就可以了(*^_^*)% O3 _/ i) n# C
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: U, @$ w) h4 b6 \ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|