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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,3 U+ ?$ I) K) ^6 Q O
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 H. ^2 @/ D+ Y9 p9 J" h) |只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn) J" r X4 F$ K! K( \
参数解释:$ z% G# x8 p+ O9 B+ z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( `; P6 T& |4 V" N z% `! fnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定/ P4 E3 c+ n5 y% B
返回值:7 e! A; [2 D7 N7 ?( C
返回非0表示计算成功,0表示计算失败有错误; \% E5 Q' w' E9 E+ s% `2 p, \* I$ Y
# k/ a# z5 o& P7 ^+ ^+ O8 }0 Y/ v ( n* d6 m9 B, M* h8 e! ~
9 E- \6 K" r" K0 |程序代码:
9 L$ E0 K% w+ x! L- _: i4 O3 ^" ]! |% }" Z7 e3 H3 v
namespace fy_Exp{
1 a2 F. ^3 c' N( Znamespace {template <class _T>
2 K! J: ^" g2 o+ W2 z' o6 Jinline _T GetExpValue(_T t[], char& csym){
4 c! E7 X& ?, b+ m m char c=csym; csym=0;
9 ~8 \! l4 v) A- E0 @. u7 L switch(c){7 I f b6 ^1 Z7 v( s# c I" |* t7 V
case '+':return t[0] += t[1];
1 @, K7 ]* j" O- W- J case '-':return t[0] -= t[1];
3 F2 A3 Q2 _8 x: e! `8 | case '*':return t[0] *= t[1];
7 d' m& }! o* C( h/ [6 A/ w* | default: return t[0] /= t[1];//case '/':
) k: p/ h" k4 U }
% Y$ n- Z, k' l4 I+ Y}}
% O: D& m, L5 @5 E& {0 T) Wtemplate <class _T, class _Tstream>; a. N) ?8 Z# ~" |2 Z$ [0 h. [
/* _Tstream: inputstream, _T: get return value
' J. g' l- P9 J: t* Return nonzero if get value successfully */
! t' W9 M: Q' Q* q! cint GetExpValue(_Tstream& istrin, _T& nReturn){
. ^9 Q5 ]4 w& {) o2 p. E) | _T t[3] = {0}; //雨中飞燕之作9 C5 f6 C" F! c% Z3 k5 H
char csym[3] = "++";
! y5 ~5 i0 E+ u4 G% t int nLevel = 1, nERR = 0;2 S1 y0 d( B* G3 q+ a
if(!(istrin>>t[1]))istrin.clear();
' S: ^( s# D% x) p) n for(;;){
1 Z* a& X. J4 Y if(istrin>>csym[2]){8 D# W( u" f2 E/ |; R: Y6 |1 u
switch(csym[2]){
3 R; a( U- e8 u; s case '(':# E. j6 f# F2 g( a1 p2 B& |
if(!csym[1]){nLevel=0x100; nERR=1;}else/ o B/ {* b: C1 [" P7 N& ?" I' c
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- p( N! Z/ G) T else{nLevel=0x100; nERR=1;}
) W* j2 L0 r( O0 C" Y break;) X; f' d5 P, f: w6 Z5 z+ T
case ')':
9 a( u1 C) z! m' {# d3 O, Y {nLevel = 0x100;}break;" `$ ?' @4 h2 C: f. F
case '+':case '-':case '*':case '/':
6 E# E# u, f8 D- e1 X* c {csym[nLevel++] = csym[2];}break;
* {5 ]4 z# A; T+ ^. M) F, d case ' ':case '\r':case '\n':case '\t':continue;
; X0 n8 a J: c$ k) @9 J# ^$ J# k default:
2 w/ |& o* `2 `/ E n" K" f {nLevel=0x100; nERR=1;}5 ]7 M; W4 K: U* l+ o, h z
}
: G6 \6 _* Q" u- I2 i! O$ F: K if(nLevel==0x100)break;
8 K# _: G& w+ |9 j8 j) S- M; l8 s if(nLevel&0x10 || istrin>>t[2]){
# j7 A3 p' j2 v$ [ nLevel &= 0xF;) N" y- I7 d6 A6 y5 k4 G
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ f& P8 H6 E. O/ N" ^( h
if(csym[1]=='*'||csym[1]=='/'){# P( `- t5 H w6 R$ l6 V) H8 u
GetExpValue(t+1, csym[1]);. V" o' J2 k, y' I2 M
}& d" e; N8 W4 u2 O2 v
else{
, t+ d5 \: q# N/ f& G, m3 x GetExpValue(t, csym[0]);
" |! V- \1 a" R% B( J) g7 g* L t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# J5 p& b: T- e+ M8 J( m }
3 X. M4 R4 \6 |. g# r, u% y nLevel = 1;( K D0 s* Q0 T7 o
}
5 e* m) h/ \- u& ^# S) K8 ]& l else istrin.clear();6 w2 _3 ` o2 X. M
}7 ~( b0 f9 C! ]! b/ J- m; e& c
else{nERR = -1; break;}
K) n; _2 M8 q; R }
; N5 `1 @4 y. Y! W/ L if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);* [" M* i A) y, v
else nReturn=GetExpValue(t, csym[0]);0 s* Z8 j8 f1 E# W5 l
return nERR==-1?1:0;% y$ b% Q& v. p* l" [6 S' ?: J
}}
) a1 ^, w9 e$ X8 V2 P7 F( g+ t
! }# W2 U6 r; i& H/ m$ X: j7 f7 H ?7 ~
" m+ d( p9 F$ |" ]4 d. ]
函数模板使用示例:
3 o) |4 Y' Q; c [7 V0 D在以上那段代码的后面加上以下代码:: N% |7 u- [* w/ m S, K
. ]% _+ y& I# p6 |% O0 z
! ~' p8 C" w, Z, w% v- C' @/ f* L$ o
程序代码: - _- t, {; T- Y/ y6 R' c2 f
0 l) |& e! ]" c& ?9 \#include<strstream>
& @) w! [2 c/ A! F0 U3 V& _#include<iostream>
& I9 X$ v+ O, r+ W$ ~#include<string>" `! d' I8 |9 o/ z) r4 R. l
using namespace std;5 T; D, t* s" N& G3 _# c% f# J5 V
int main(void)" t8 q T, I/ m1 O! H# z
{4 b$ R1 E1 L4 Z0 j3 ?; `' Z/ J% ~
string s1;
- T6 O S5 W5 D3 P' k2 p while(cin>>s1)8 \- t/ e. A, e2 a
{
. T& F. t; ^7 W5 ` istrstream isin(s1.data());0 K Z" G- T) O
double d;5 U9 I1 u3 {; z- M# F n
if(fy_Exp::GetExpValue(isin, d))# k# Q: J& a5 q1 X
{
, E" a( z9 N6 b- o cout<<d<<endl;
7 e/ _2 N+ U+ r$ f: z7 j }
( a. N/ b. S* Z' }, j else
3 a9 B+ i( g6 F& F {
4 n3 k. K0 U( \9 u6 K! q cout<<"ERROR"<<endl;( N6 _. e( D7 ?' l6 v
}; m# R4 g/ \+ h# k: T
}3 F, F8 b% Q- Y' w
return 0;
& V" Z: o- V3 N1 \8 d/ P n- j/ V}+ b9 Z \* \/ ]+ C/ x/ N) e: g
3 V0 G8 m6 r# P3 q1 u0 f% j( x# v6 C8 o( @; U E
然后编译执行就可以了(*^_^*): J9 x; |# U. P3 }' F, W' _# u1 x/ R
其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 g6 d0 K* h/ | B
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|