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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
, t/ n- M s7 T一个很方便的函数模板,可以并且只可以计算含括号的四则表达式8 J* w% D+ N4 q% C, r- Z2 p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
0 y1 F2 [ A. J# n8 u+ o( H$ y2 @+ N5 k参数解释:& u) a" o! b' q( r$ u2 g2 p1 w `
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 ^& l3 P2 E6 \0 i$ L9 F4 c+ k- MnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) C7 W9 z, Y+ c$ @/ V返回值:3 V2 e" A: C" L& p$ V
返回非0表示计算成功,0表示计算失败有错误
/ n; H- Y% P! p; w( N$ i, k j% o* K. i* C M, {) W" X( V
# v# a! w0 K2 F8 `' o
9 L4 `' F. |% d" l+ Y- R程序代码: 6 e; a; x7 Z- w
' K. p) N( C) r1 c1 v; ]( L8 Q) g
namespace fy_Exp{7 F' h$ W9 p2 a7 N4 [
namespace {template <class _T>
9 S6 s% x/ T+ d: ?1 tinline _T GetExpValue(_T t[], char& csym){
+ D( r6 p6 y3 U4 u char c=csym; csym=0;" D* w# Q# h# m$ \
switch(c){1 [- T# e+ h+ }. l+ {) r
case '+':return t[0] += t[1];
7 d. U+ Z9 _7 Q2 f9 G case '-':return t[0] -= t[1];
S' n# t0 f1 c case '*':return t[0] *= t[1];% R. N. x* ?! ], c" j
default: return t[0] /= t[1];//case '/':6 g6 I& X+ O. N& W
}% q5 _: d7 M: R, Y) \
}}9 X4 u B [2 z, }; k8 S* _: P" {* d
template <class _T, class _Tstream>
2 y. X" ~; T* |. W7 C- X5 a/* _Tstream: inputstream, _T: get return value
z3 v: a1 C& R' E7 R* Return nonzero if get value successfully */
' P' E5 `4 _. U& W \3 e: H7 Jint GetExpValue(_Tstream& istrin, _T& nReturn){
+ |1 F9 b8 n$ I6 h7 i. R4 A6 d. F v _T t[3] = {0}; //雨中飞燕之作" |" A- g, q0 n/ |5 \
char csym[3] = "++";
( F. k# r) H7 h int nLevel = 1, nERR = 0;
5 w" {! Z- c5 t( O9 z' n; T% G1 y' j if(!(istrin>>t[1]))istrin.clear();% E" B8 E% c' r0 p# U
for(;;){& `3 Q& n9 q6 O C+ ?, |
if(istrin>>csym[2]){) H% p5 l. _; n1 l l9 f) L
switch(csym[2]){
) m% C8 D: U: ]# }$ m' d case '(':, j& z' H* l! d2 V3 f9 X1 `+ {
if(!csym[1]){nLevel=0x100; nERR=1;}else4 b2 O1 c$ m9 F$ ^: t* e3 k
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 d+ e/ C" ^3 e* W' L6 X" m
else{nLevel=0x100; nERR=1;}
& W3 t* I- p7 Y# M0 W( X4 {' L5 h break;
5 M- u: Q+ A, O' m& [3 e/ x case ')':
* |8 s+ W$ i# Y) x; |! S$ A {nLevel = 0x100;}break;
% C2 y8 z( b( d case '+':case '-':case '*':case '/':
4 q* N% {7 ^& R; n* L3 `$ C6 ` {csym[nLevel++] = csym[2];}break;
4 }: H! w% l" _* o0 y case ' ':case '\r':case '\n':case '\t':continue;, g" m4 I- e6 b( r: p" y5 l4 d
default:
( U7 C o; }' U {nLevel=0x100; nERR=1;}
# U8 s! y" c9 y }
( I8 a: L3 ^% ?# g if(nLevel==0x100)break;
7 g# X# i; C1 a if(nLevel&0x10 || istrin>>t[2]){
8 z' @4 z4 h% Y9 t) ?5 Y nLevel &= 0xF;
5 H+ h) D$ g) g/ e0 E* Q if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 m% o+ T) a0 r# N if(csym[1]=='*'||csym[1]=='/'){8 g# _6 n. M. T7 R0 ]
GetExpValue(t+1, csym[1]);
& l1 q9 R- d/ R8 a* N& m3 y% C }
+ A1 d1 _/ Z b5 ] r \( c* o else{
7 F$ Z# Y3 P# z9 Z1 L GetExpValue(t, csym[0]);
" J& V$ m0 q$ O, l1 {% l: a t[1]=t[2];csym[0]=csym[1];csym[1]=0;- |: Y2 u& {! L
}# o" J8 [- E2 V( u% V
nLevel = 1;
3 o/ J3 x6 C2 l j7 S }5 ]+ I6 P" d/ e7 T" c5 M) K
else istrin.clear();
1 c* z. N* g, E' O }
/ L2 {: @ ]% q! p, ?4 f2 H else{nERR = -1; break;}; F7 u$ ]4 E2 P, y6 H
}
: |5 R% K8 a2 G/ L! v if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ H: ^ P5 A( y+ J* p else nReturn=GetExpValue(t, csym[0]);
" `; \+ k8 u' n. D8 F! S8 { return nERR==-1?1:0;! r* W3 D5 g7 P
}}
1 F2 [7 A8 b6 ~ X- h( ^3 M: j+ x/ }2 h6 J
2 h- g& B- d3 l# W3 ]
0 S* r! l* z. j7 H函数模板使用示例:' E# K5 q/ U4 ?/ [. F& W4 J
在以上那段代码的后面加上以下代码:% o- O q! T0 Z
9 s; p& ~6 V1 O
" U m) B, \5 o" M( F( n* Q( f+ m
程序代码:
9 ^- h; |4 J4 k) _/ o
2 u( R4 G' i8 U#include<strstream>) d" ^6 U& H. \$ c9 U
#include<iostream>4 |9 P% [) T2 T
#include<string>
) ?. H0 F" y9 v% g8 W2 Yusing namespace std;
3 q2 Y& |& u! s5 n; eint main(void): O' k" R" F% z1 Y+ Y
{
( h5 V" I' G2 [$ t string s1;
9 Q5 c7 a( _# r7 G( M# _5 E$ l5 ? while(cin>>s1)
, m3 c% c, l. G" M( N6 m# g {: P2 ~' N, j" @7 s- r$ V; Q
istrstream isin(s1.data());
% V) H9 V) t! x double d;3 S% ]) W. J' Z' i, N$ A- B
if(fy_Exp::GetExpValue(isin, d))
5 A/ a. T) g7 P9 |, z8 Z# Z6 b1 @! l: U {
6 M+ p. |: N) h" t$ R! f, g! x cout<<d<<endl;4 ~+ T! J+ Q9 s1 G: F
}
% ?8 @7 m1 \1 U: Q9 V6 | else6 u0 x& }5 h1 `0 ^3 a+ r0 S, f
{3 U7 v# m; @* }$ T/ z
cout<<"ERROR"<<endl;0 x0 ^, X5 g" i5 K$ U* Z
}
/ u7 f- [; {1 I5 h }/ P R6 w( l. K! d
return 0;; ]: Q0 O7 t* k( F. m0 e/ m' [
}
8 D! r: n6 \" Z1 ~: `
& P3 z* U. N9 Z+ M( m0 p6 w+ W' ^/ v+ F7 @& s4 O% j2 ^9 {
然后编译执行就可以了(*^_^*)" [1 C/ D- D8 E# K( U- B8 S
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
' w( L% ] P+ u6 Z9 f, ` 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|