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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
5 O7 `/ P! [: E一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' U1 x L, L: J; f& X; O. H只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ U, A5 V* N/ d. o! U/ ?参数解释:
& F5 R1 v, F5 n# }! ^istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
/ H9 z. ?# x E* I* unReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ X$ \5 [2 S8 f" \% ~
返回值:
J" {+ ~% \% n+ A$ K1 N% ^返回非0表示计算成功,0表示计算失败有错误6 ]6 C' b! J0 y2 Y2 e8 d- g3 k
+ x; [* h( U, ]7 a
3 K }) t+ _; Z" {* t
) @. x8 y8 f3 H: {6 ]5 A程序代码:
- `- _; L5 U/ e* m4 k6 j
( y3 t" ?( \5 B7 N1 Hnamespace fy_Exp{* v6 K+ ~ {) P( {; k
namespace {template <class _T>
" M& T1 |5 T \inline _T GetExpValue(_T t[], char& csym){7 u9 i* A( S) J" `
char c=csym; csym=0;
. v: {3 a3 \+ [7 v+ [+ O switch(c){; t' c, ?7 T# _% t7 K0 `
case '+':return t[0] += t[1];; a# R5 z+ @" K
case '-':return t[0] -= t[1];! [9 a* I6 u. u3 m/ i/ r! l
case '*':return t[0] *= t[1];" N" d% o. j7 r) C; L) S
default: return t[0] /= t[1];//case '/':) c2 T: e4 k- b% ?# ^
}
+ I) R/ m+ e4 @# T' z, \4 Z}}
/ Z, ?# z& r3 h' K7 ptemplate <class _T, class _Tstream>
, @0 U7 @: H% B- |6 v3 q4 l/* _Tstream: inputstream, _T: get return value
0 u! k! `; |" ~: ~; M* Return nonzero if get value successfully */
5 ^' y/ {: D# _/ `1 nint GetExpValue(_Tstream& istrin, _T& nReturn){& M. E0 Y: G( D1 M0 A0 p
_T t[3] = {0}; //雨中飞燕之作! e: c- D# |$ q* F- A: _
char csym[3] = "++";
, ?! P6 y) A- T R, ~ int nLevel = 1, nERR = 0;9 c; g; G* l2 u& y2 }2 i+ @/ ~! J
if(!(istrin>>t[1]))istrin.clear();4 G& [% ^4 T* }
for(;;){# ?: s) j+ w9 b* O2 W
if(istrin>>csym[2]){
) j, {. z( G# V6 P; B u2 x switch(csym[2]){
. I5 g3 c o) n7 K" M- v case '(':
3 g) _! A3 @/ [/ o3 S if(!csym[1]){nLevel=0x100; nERR=1;}else) W7 [$ ~/ q) ~9 c
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! c2 Y, y7 j: w. R5 ~
else{nLevel=0x100; nERR=1;}0 F6 O6 ]8 o( K$ u1 j0 W5 N% W$ Q' S
break;7 p' b z4 ^6 _" L( w( f- l
case ')':% r4 A0 x& y$ z/ A' Q0 Y; c' _
{nLevel = 0x100;}break;, k0 C. i: A* O9 F$ R: b* I! S
case '+':case '-':case '*':case '/': |2 g+ ]. j2 G
{csym[nLevel++] = csym[2];}break;
5 T- ^& O1 E* w C8 o l' A* V case ' ':case '\r':case '\n':case '\t':continue;5 }8 Y* N4 s* \3 M! t
default:% Q& a ]3 i; n2 i" _3 C; Y
{nLevel=0x100; nERR=1;}
9 n" F9 D+ e: k, \ }
3 z X8 r2 _7 |8 @" {* I' [* b! |& g if(nLevel==0x100)break; U# F* t, Y7 h o' S) k
if(nLevel&0x10 || istrin>>t[2]){
2 I5 ~# ]9 O% c0 I# k4 W5 L4 T8 e nLevel &= 0xF;) y# n, j5 G1 m: p: \- U! I m Z, H
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& N; u; T r, z/ R9 j if(csym[1]=='*'||csym[1]=='/'){
3 c( f9 {8 [, b1 k W* \# { GetExpValue(t+1, csym[1]);
) n; |4 i* y/ g/ B; |5 Y" n8 o }( x6 y' z! o3 @) n; t1 t
else{# U z1 M# S+ M
GetExpValue(t, csym[0]);: g8 n* k& t$ j% ^2 F0 }
t[1]=t[2];csym[0]=csym[1];csym[1]=0;. R% F' d- v% F/ G
}
( Z0 W8 t( V, W3 D/ h" Y* o7 K nLevel = 1;! W5 G0 b0 g2 [( f, P# S% N! [
}: s2 L$ d3 Z; I
else istrin.clear();
+ c/ f/ f3 s- p }% a4 P' y" ~% B5 G- s
else{nERR = -1; break;}1 P& A6 |) a& Q) p+ Q' p
}! P) q( k. b: Q9 G; s D; W+ i7 M
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 l3 P; G( n7 M+ ]# W
else nReturn=GetExpValue(t, csym[0]);
# n+ V. Z: g, p! w a return nERR==-1?1:0;
, l4 N4 h+ d* m}}
5 `' [: }9 g d# k: i0 L0 d6 ?
. o0 B, N3 b5 u Z0 T' b
9 \8 B E v/ V: h1 N$ Y
* f# M3 {& b2 d" \2 s函数模板使用示例:1 ~+ r! @" M- c. g% i$ d
在以上那段代码的后面加上以下代码:
9 P$ a5 Q2 q# }' \( a0 }1 I9 C% D5 {& v
+ v" n1 A: @% g/ y" [% C5 E' ~" Y' u3 S! P* F
程序代码: : V6 N! N2 I4 l7 T% I
q8 \, w4 d P5 E' b: m. \#include<strstream>* C/ I4 `+ G3 S! c r9 A
#include<iostream>
7 s. j# n# Q, F" V! @#include<string># ~" N4 b$ ^4 ]+ Z
using namespace std;
0 ]1 @( S1 t! v5 `5 oint main(void)
/ [" @3 k c. J3 }% J) T{/ G+ F7 \7 X' B
string s1;
3 A7 [9 E: ~9 }! y: X3 m) n while(cin>>s1)# M# \' v4 e/ p+ g' n8 V d. o& d
{. M2 e7 E6 }* |2 ~% @- z; A
istrstream isin(s1.data());0 \- j. o0 U) v- R
double d;
5 w; ^6 O. D4 |* R' A& V if(fy_Exp::GetExpValue(isin, d))9 b) e: ^) ]% y1 O
{
^# K, U z8 k: w" J6 H cout<<d<<endl;
9 n' D9 u0 t, f; U% _2 z }7 K) {7 v P, o5 [) _( u
else
* x# ]* ?: D. u- t& Z {2 J7 [3 i; Z# u e. K0 j
cout<<"ERROR"<<endl;1 w: d' F! g. o
}
& l: u! {" H0 k1 Z4 f }0 H: {1 R. S6 a+ m
return 0;
9 M4 s$ U4 F+ `4 y& b0 T# y}1 \( G' C* G/ b3 x# a) n+ G8 E& v! P
G- h: Y5 U. ` W* P: Q" D& \) ?: i4 q0 I q
然后编译执行就可以了(*^_^*)
0 U8 q" i% s0 t2 `( ?7 q- K' f2 ?其它:TC++上一定编译错误,不保证在VC6上也能通过编译- l" L" f9 b7 _8 n5 {
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|