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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,1 S' `7 w6 F: t, z9 R
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 x* o, H& l- `9 b; p' Y只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! @$ B6 g* k" r- s( G- W8 @6 C; L
参数解释:
# h5 i i8 J4 K0 R7 p4 }) `8 q( H yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 X# J$ n( a9 Q, ^) c0 v1 S5 U
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% p8 s8 X9 L: y
返回值:
/ e8 f) B8 E$ x% W m* ^% P返回非0表示计算成功,0表示计算失败有错误
2 a$ ]$ G( U N' e2 G: r# [
9 V7 F+ P- l+ R& O# S
3 s. K2 u$ Q5 ~3 C- j2 s, Z" x
8 R- W! V, |/ H" v7 e& p4 j( y程序代码: 7 Y0 H) f) W7 W' h( x$ h. a. |3 K
1 {1 N# p# j# s- r& N1 c& @& D6 I" ~namespace fy_Exp{4 ^3 O# X' ~# i% M: r+ P" ^4 Y
namespace {template <class _T>
0 g6 Z6 h& V+ N9 Ginline _T GetExpValue(_T t[], char& csym){. A5 h2 u3 `3 U3 X" s3 K1 b9 |
char c=csym; csym=0;9 L, c' \" Y4 E& E& ?
switch(c){
( \% H( h# m$ d# r" L' R case '+':return t[0] += t[1];
. D: h4 ` c2 ^1 F* Y case '-':return t[0] -= t[1];9 Q6 L- {6 n, J! S: f7 o8 u( ~
case '*':return t[0] *= t[1]; l: |: x& h3 X: Z
default: return t[0] /= t[1];//case '/':1 i2 ]! `1 P' L. s l) I9 c4 Y
}- u- k8 M; [$ e! R2 i. c; T& Y$ `% D
}}
4 S7 o; M2 s; M+ j5 d/ J Qtemplate <class _T, class _Tstream> V- N) d) d; Y1 s; x* B0 |7 L7 ^. Y
/* _Tstream: inputstream, _T: get return value+ G( z, b. E4 D; I- ^
* Return nonzero if get value successfully */
! ?' p' n9 N) E) B+ z3 a1 Oint GetExpValue(_Tstream& istrin, _T& nReturn){
' F7 ^2 o% O7 j3 A. I; [) N _T t[3] = {0}; //雨中飞燕之作; J: ?, \( i+ Q2 ?% p
char csym[3] = "++";
" p' y6 a! |1 C. v) S) ^8 l int nLevel = 1, nERR = 0;7 u9 b' S' N: ~1 U% B7 S3 O# Z
if(!(istrin>>t[1]))istrin.clear();
: {. A1 j$ M" e6 ^% S/ C( l for(;;){7 m- z! \2 P" w' ~
if(istrin>>csym[2]){
% V5 Q( l% D) ~- O8 u* c8 j switch(csym[2]){ w% X$ c: [6 p J. u W1 d
case '(':: y* e2 }5 V" X+ ?8 O- A8 S S6 B% Y, v
if(!csym[1]){nLevel=0x100; nERR=1;}else
9 |5 {- D5 D! e if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 G! \2 g4 @# T8 K4 j else{nLevel=0x100; nERR=1;}6 z( K8 P1 X$ L
break;% B6 h# F* y1 ~( Q' S7 ]
case ')':
) b4 ?/ F9 J3 \" m p6 a7 A& n {nLevel = 0x100;}break;
F2 T! @6 O/ a) Z0 K case '+':case '-':case '*':case '/':
4 t+ O' w6 N3 W8 k& c {csym[nLevel++] = csym[2];}break;
6 N3 F3 D3 q R5 {% } case ' ':case '\r':case '\n':case '\t':continue;( w' D: N. z2 r5 R+ J2 z
default:9 c0 G" [5 j% \5 Y5 s
{nLevel=0x100; nERR=1;}
3 E8 l0 ]1 |& w+ }1 Z$ R }. S8 g) X, U" U
if(nLevel==0x100)break;
. c' [- F, r3 G if(nLevel&0x10 || istrin>>t[2]){9 g+ R% ]" \1 n) \
nLevel &= 0xF;0 t2 ~- [2 }; A' B% R2 h
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 [( {" z5 J2 e/ j% o
if(csym[1]=='*'||csym[1]=='/'){2 ?( F, s8 K+ K/ i! j8 e
GetExpValue(t+1, csym[1]);
& b& n( a7 Z& B }- h4 ^) j8 V- v# d
else{/ h2 T% T( E/ m
GetExpValue(t, csym[0]);7 _) I/ F0 P0 Z' f/ l# t6 ?
t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 L* H* J U1 Y! Y
}( X3 N2 @9 h/ N4 X0 l% k
nLevel = 1;, n8 E3 X% K, W5 W6 d* |
}
* i: J- W) u8 W3 K5 q, s$ N else istrin.clear();
' Z6 t( c! @ ~ }: U! j6 G! F$ R, l: r, r. J4 a' t% x! V
else{nERR = -1; break;}4 L" X/ U5 D( M" P& D3 P0 f1 t) C: L
}
- ^' `; E) I$ `6 m6 |8 y if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 w: \: n$ |' S& U else nReturn=GetExpValue(t, csym[0]);
7 u& _' F! [9 }' S' G# U return nERR==-1?1:0;
, v% o1 K2 R+ G}}
, x8 d" W% @$ s) T' s+ E" p. ]' ]: g
! g+ m1 N+ Z- Q
: |. P' k1 R2 c' P# _% e/ U) W
函数模板使用示例:% |, N1 e3 o8 v) S' U
在以上那段代码的后面加上以下代码:9 v# v" p/ h% T( C8 L
: Q/ r/ l2 t/ O* E! w; h $ X2 s. K' |: e8 K. v0 S4 ^
" H8 I2 L9 w" q程序代码:
) z2 X( V; @3 p/ h' I
( N D5 W* s r& R) h) d U, r: R#include<strstream>
1 q( g2 M o. X' w, t#include<iostream>
4 J) Y( M3 }8 j, A( m5 \0 M#include<string>
9 P" o; R: n) L! z$ Iusing namespace std;
& q; C" u1 c6 I! U! Sint main(void)* \! e) Q. C, A( F2 s; t
{) l. A' w+ Y" W
string s1;
$ Q1 `; C. ]8 x) O( K while(cin>>s1)! E' |" x- w) L. _8 w
{' I0 I% E: K. a# {
istrstream isin(s1.data());
; T( ^* E6 k6 W3 h double d;
. T+ n8 E! Z& ~4 Z$ { if(fy_Exp::GetExpValue(isin, d))
+ ?# V) F. S1 }$ N" E4 u {
- `6 l& S" r6 t H) W5 q cout<<d<<endl;
$ k) R: n* K( Q8 N }
, i3 A! Z) z8 ^& S8 h b6 Y else( A% N0 B8 B0 j1 S4 X+ L
{
0 n& x* F3 ~8 R* R6 T! o2 r! q cout<<"ERROR"<<endl;
; |" J; ~# h. W7 v }
; g! e/ N2 n& N7 _9 ] }
9 P* X5 P! \ D; T3 a2 H return 0;" w; L! _# m% c0 d- E8 A
}9 ]; c" S( S4 Q. }7 a, X; k
' h' c1 `4 p4 b: v1 K; q/ Q0 U5 h0 X3 m- Q7 _% r M4 H/ `* X
然后编译执行就可以了(*^_^*)
9 D' _. n! {4 @" |0 _7 u2 y其它:TC++上一定编译错误,不保证在VC6上也能通过编译; }0 d! i) u& n
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|