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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,+ N8 {: W8 y+ m6 X
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式9 e0 q) X; R# Q( t
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 k8 [. I1 |& f2 ?3 P- J参数解释:) x& ^9 O$ P* f9 v. j6 d
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" ~ e a; P0 k/ P& a; I3 hnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
6 _( H! h! H4 M8 B( C& ~返回值:- M Q' U4 p: D, x
返回非0表示计算成功,0表示计算失败有错误$ F, u7 K+ r& [. c% T, m
% y5 Y+ e3 V t+ ^3 T0 Y) k 8 l) k/ W8 e7 ^, G
3 a& T5 l& s: K0 u' {程序代码:
0 v" }9 F+ s! B q) G1 }7 \) Q" y) e/ @, p2 z% M
namespace fy_Exp{
* ~( o7 J }6 w6 snamespace {template <class _T>: ^4 c2 H6 x0 T4 V6 o: ]. Q
inline _T GetExpValue(_T t[], char& csym){
7 ^* B3 _) H2 C' C6 o char c=csym; csym=0;; Z4 J! L" ^- D3 g3 s, ]
switch(c){0 \" t8 Y% s4 i; T9 U' g+ e
case '+':return t[0] += t[1];, G# V9 p$ R8 f3 R$ G- f, q
case '-':return t[0] -= t[1];8 L, g7 D- q1 o# G* O
case '*':return t[0] *= t[1];! Q1 C, K6 j% H k- D9 o+ u$ @
default: return t[0] /= t[1];//case '/':
! P+ K8 u4 g! b& Y; h( h5 I7 o }: H1 z# t2 W; m/ F6 y' a/ i# p
}}* e+ y% O4 v3 A& T. B1 A
template <class _T, class _Tstream>
# u2 o# U4 y% O' i6 n/* _Tstream: inputstream, _T: get return value
, I1 ~" I! {. H+ \* Return nonzero if get value successfully */+ M# B$ I8 ]9 a
int GetExpValue(_Tstream& istrin, _T& nReturn){
$ O/ b: i9 V6 O- L! _* C _T t[3] = {0}; //雨中飞燕之作
# S: f1 g0 ]/ p3 k2 x: i char csym[3] = "++";
5 l$ X$ O i# F+ N+ }/ d$ [ int nLevel = 1, nERR = 0;
- u' n. m: N) u$ b; S, l if(!(istrin>>t[1]))istrin.clear();: l6 S2 B% V4 g7 D
for(;;){
% ]5 Y7 T, `/ D) d if(istrin>>csym[2]){
" ~ z0 ?6 V: L- j+ O: U switch(csym[2]){# E: n1 X/ K/ L& s8 @
case '(':
+ S, E& U) F7 U if(!csym[1]){nLevel=0x100; nERR=1;}else
5 {9 U$ c8 h v+ [$ u if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 l/ I2 w+ {: j+ w9 d# {# } else{nLevel=0x100; nERR=1;}$ q5 G, e* V( I+ u! e2 q; E
break;. r" E% i) a- L1 q
case ')':
2 ?: v9 T& h1 m; h9 K3 e {nLevel = 0x100;}break;9 e: i9 f& ~$ {6 Z" S. K
case '+':case '-':case '*':case '/':# D* x) n) ~! U1 ^+ {, y4 {
{csym[nLevel++] = csym[2];}break;
6 t! R* I) C$ D9 L5 T8 w4 k0 c case ' ':case '\r':case '\n':case '\t':continue;
& ~2 g9 E# g. u1 N; C default:
& s: |- k- N5 E! I% [ {nLevel=0x100; nERR=1;}
2 K. b" B5 S. x" x: e* [4 Z }
5 S& {- z9 r1 S. \! h3 h if(nLevel==0x100)break;6 [) U8 R8 |3 B9 v: {
if(nLevel&0x10 || istrin>>t[2]){
% ?& U- a) A/ K( k- \ nLevel &= 0xF;8 U$ {3 A: X, ^5 \' s2 j. V( K5 K
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}1 s: `# L1 ~5 [+ s2 a
if(csym[1]=='*'||csym[1]=='/'){5 x5 c U+ d' F, h5 p# }/ K
GetExpValue(t+1, csym[1]);
* E/ o4 E" [, V4 ?: e. G3 V$ f3 _+ e }
, c# |) A2 D6 ]# n else{
" G: N m$ B' `& C w$ I$ N; M GetExpValue(t, csym[0]);1 A/ E+ N3 e+ I1 ?
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! ]( i/ O8 p$ D, B5 y }5 C Z4 \- D2 G, b
nLevel = 1;
* c8 T4 X6 E! Q6 I; ? }
& a m- l; Z9 ~. z! P& `7 A else istrin.clear();
2 Z7 o8 Y R9 x7 w }, W" I& G( V4 _( X: J: E. Y
else{nERR = -1; break;}# I+ ~* W7 {; b: W
}
' S, D* X$ H8 g7 v; n' j- T if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" B; @( }4 `4 ?$ t else nReturn=GetExpValue(t, csym[0]);
/ G |4 A1 W9 M6 t$ B" A return nERR==-1?1:0;4 a( r( c: g1 J9 e( v6 i7 R' k
}}
: O5 ^8 u9 c1 P! a& [% M
. l2 ?0 v* U8 P! j) F+ `+ G& g4 b; {# ~ K
+ z" k, k+ ]0 {. j3 M9 z函数模板使用示例:
5 m3 Y9 s1 `+ {8 h/ b2 c在以上那段代码的后面加上以下代码:- p8 Q5 n/ X; I- C. Z% O/ b6 r
- o6 t D% i* k2 J4 Z" w+ `0 j
6 G2 j0 l6 Z' J( r% c3 W1 x
* O: y6 r' c( A8 \# Z$ V- v. `( ^) b6 z& k! d
程序代码:
3 S* N; m2 a" X% q; M
' K' S. @+ z) n2 ~#include<strstream>
! l1 `5 ?- `; v) X2 X' D& b1 |+ Y#include<iostream>
4 p6 g- o8 @+ }& H( ^#include<string>6 s" Q; u3 N* ^0 [& H- S
using namespace std;
) `7 z) \- L& z4 M9 ]' C2 j' \, Bint main(void)
2 X6 D4 @) v$ f. H/ e5 F{
+ j$ D& `" W1 j! i' {6 k2 g string s1;
2 u5 A+ J/ K2 f6 E0 g* D while(cin>>s1): x3 g/ l* q; U c9 J& _1 j
{1 l1 Y8 N5 T& y9 ]7 t% U# i
istrstream isin(s1.data());0 j9 |; [) x" ~: O' [" j) z5 \
double d;, D1 |% q L" w! o- U3 @
if(fy_Exp::GetExpValue(isin, d))
' {& p& U/ ^1 E% o- H2 ? {2 |: M% v9 \: J/ H3 a, h4 Z
cout<<d<<endl;
; l" t' k, j, k2 |) T" ` }
0 I/ j! G6 C( A else/ a. m& I3 o9 v% `- ^: G6 [0 r: v) t$ e
{: f8 \1 [) N" b
cout<<"ERROR"<<endl;
- [3 f3 o+ i: S7 d) y7 l }8 [) }& \% v9 M
}$ y. |4 s5 s; P3 l- _
return 0;8 k6 h$ F8 M0 O3 J0 @! q, Q3 S
}" ?0 y* \8 |% x1 y; k( i, w. e
* A q' d3 a. [' l/ V" e* \' I( R2 ]+ D( A1 ~- G: l- Z
然后编译执行就可以了(*^_^*)6 x! U+ w# |; n( w9 }0 o7 j. C9 D
其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 Z h. p* |" Q% {& e
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|