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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
4 i; \# U- z2 B, Y一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 [3 ~0 b# J0 |! a0 l
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' J: v8 j8 [8 a, M5 g Q
参数解释:' {3 K" L J6 g7 T: z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ ]& N' x) R* w, G) g0 I! U) p5 K% DnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 T3 z3 W, \5 w& w6 U! O4 a" J返回值:
: r7 T' a6 X0 q5 g8 e1 a$ ^% d+ h返回非0表示计算成功,0表示计算失败有错误
# U' y: e9 S) ^3 V# H$ ~
6 F' X! c% e9 v- K" b. R
* w5 a3 ?. G8 H3 Q2 K$ k) J, `% R: w+ u5 u% D8 a; X
程序代码: / [8 K' m& H; {$ R3 e' i
3 I: R/ P2 ~/ L5 I8 W2 Q
namespace fy_Exp{
) h( X! O) W, Dnamespace {template <class _T>
" q* ]/ o% ~' T* n; ginline _T GetExpValue(_T t[], char& csym){: P/ O0 u. r) D# Z* K
char c=csym; csym=0;( N% r; B# ?: H+ U+ Q8 h; F
switch(c){
4 G* t8 Z' n2 `- @; }( B case '+':return t[0] += t[1];5 t+ v* i& q; Z w* |4 a0 e% X
case '-':return t[0] -= t[1];; `0 N9 f6 I1 L7 }. v
case '*':return t[0] *= t[1];
. u1 y8 J; z5 o8 C( U7 O% R default: return t[0] /= t[1];//case '/': B9 y b, q9 \
}( ]+ R7 f4 L5 B0 |$ C' S/ u8 q
}}; U4 a: c" o# m
template <class _T, class _Tstream>+ Q6 [4 s! y% q9 d/ N9 {9 h2 N+ P$ P
/* _Tstream: inputstream, _T: get return value
3 Q, u- g0 f$ |, t! {. o0 D. ^' a* Return nonzero if get value successfully */
9 I" \! t" D$ I3 @int GetExpValue(_Tstream& istrin, _T& nReturn){& J3 R' `+ w% J' U3 X( }/ M, V+ f
_T t[3] = {0}; //雨中飞燕之作
4 c8 v4 N; H" G! d% ~, u j char csym[3] = "++";
& Y. d; u3 u: L) L# @& n U9 a int nLevel = 1, nERR = 0;
0 W- Q5 @0 B* {! x" m" x3 } if(!(istrin>>t[1]))istrin.clear();
2 {3 \9 Q5 ^' Q3 g for(;;){
% z7 M0 E' K- Q5 `8 f* ]( |6 Y if(istrin>>csym[2]){
! S7 i- K/ o9 n5 w, j switch(csym[2]){
7 i t: @ s2 D1 Q! e6 j. G' {2 |3 b case '(':
- { K' N7 O* x/ D, u7 Q! S if(!csym[1]){nLevel=0x100; nERR=1;}else2 u8 t& t4 e# a" h; P
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# j" W* Q' i* e, W; ^
else{nLevel=0x100; nERR=1;}% _! ^% A' N6 b K: d1 m; R
break;2 \7 M1 ?9 X/ t& P" P
case ')':5 ~; z; i' v, h: a7 J! \
{nLevel = 0x100;}break;
& w& q' P `+ F- B& } case '+':case '-':case '*':case '/':
8 ^( z6 ]; T m {csym[nLevel++] = csym[2];}break;- b6 {; h% f5 q' T
case ' ':case '\r':case '\n':case '\t':continue;
" x: o2 M& L# z8 M% ?6 C: M5 a default:
e1 a% @! ?# H, A0 b/ ? {nLevel=0x100; nERR=1;}
, U, K" z2 J4 q7 O: } }$ b4 s' g$ j5 m
if(nLevel==0x100)break;
2 ]/ o g: G& h9 P" { if(nLevel&0x10 || istrin>>t[2]){# D% ]- q3 P2 W% W6 s
nLevel &= 0xF;
1 [0 C0 I% k1 q" T4 L9 K. r4 f if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; _# J. p }6 E1 J if(csym[1]=='*'||csym[1]=='/'){
5 \" |9 d* b! E- M GetExpValue(t+1, csym[1]);
" w4 C5 D' a: g# R: ?* p; j( v, Y }* ~6 p9 D( M3 m% b( F% A
else{
+ l3 y4 j" P) o; A8 j. }9 m: b GetExpValue(t, csym[0]);! J: v$ N8 ?/ h! V
t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 b/ c' x9 |! T$ t8 d% H+ B- m! c( d( _. A
}0 \: ^ _1 C r
nLevel = 1;; a q" Z) z0 [9 D) {
}9 H4 a7 R" s |& y" R. g
else istrin.clear();4 A$ b& ]' p! j0 i
}8 ?- u3 n8 t- ^; q3 Q2 g/ ?
else{nERR = -1; break;}
# |6 V# s* I/ b) {" j3 l! X" e }
1 o8 j6 a$ u& y% R6 V$ C; r- y( v if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
- I" f2 y7 y$ ~ else nReturn=GetExpValue(t, csym[0]);" A7 F- P% u1 I3 v$ F. I, P
return nERR==-1?1:0;$ [; ]' g7 x, ^
}}" c' q( P4 n: ?+ D7 `% a
/ ? r: |9 @0 x' j# }
* Y# t$ l& h2 M3 K. B }6 A. Y" {( N6 M3 q+ b% S
函数模板使用示例:( z% W$ ?9 ^8 Q3 @
在以上那段代码的后面加上以下代码:
6 f+ w+ I; I# |$ }7 x6 |- Y, g
1 L9 s) j; L$ F5 b& t- K 6 r/ D d# C1 R' ~7 N8 @8 Z4 j
% Q5 B1 O4 W+ S6 Y/ P程序代码:
; E7 @7 N( c k8 X/ Z. e' }: M+ o
R3 M. B+ b- e& b#include<strstream>. N3 I9 R/ h% u3 ^' v, x3 o' A7 s( e
#include<iostream>9 x3 g. p$ n, v7 ~% t! j. x: w
#include<string>
a2 F3 Z0 T3 {; E/ X* ]6 K1 f5 iusing namespace std;0 ` P. Y1 r/ t" r7 u8 F" g
int main(void)% a" U$ L9 E' ?- C
{8 M- x5 s ^! O/ K, q
string s1;
5 n' W/ [+ j7 ~, z while(cin>>s1)% T9 J( r: ?3 g' a v4 M
{
1 P% D$ X' ^: f# Z! l0 Q4 P4 F istrstream isin(s1.data());/ M5 d6 u/ R7 e/ d: A
double d;
' m& ^- x0 e1 l if(fy_Exp::GetExpValue(isin, d))
1 f h+ j! |# v& y$ w {
6 v) g! I. |2 g) @2 m3 x, J6 _ cout<<d<<endl;
( T4 A" h4 D8 U1 G- p/ Y5 j$ z. D }
* R" z* t5 Y1 d$ J1 M7 P* o4 ? Y) G else
/ D; p" S. V g4 @6 {" G {
6 n: @2 J: @! K cout<<"ERROR"<<endl;
1 c" U6 c6 U! x2 A+ p( p }
5 y- L1 i/ i' h' J# k7 l }! R4 f6 t Q* F+ Y
return 0;3 }" p2 j4 R, k. t d. Y
}
/ B% L# m* v1 U0 q* z; C( M8 k# ^; I4 W) _ ^* b u
& o! l. B; v! E+ C然后编译执行就可以了(*^_^*)
0 N$ r: \/ x! G" d* e其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 V% e! p- j, B( D/ `+ O 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|