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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
( k, d: ?! d7 C/ e+ M+ y2 G一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& p3 w* [* D6 ?9 z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ n @( U- r/ u' t, T& V+ i
参数解释:
2 k5 Z! E9 U* Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
9 p# \/ d' z: O1 }9 E, VnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
, \- }5 x% {1 Q2 Y5 a! z/ V" t返回值:# r0 H# d8 P- d7 o1 @
返回非0表示计算成功,0表示计算失败有错误1 m5 M. G6 ~, `) {! T3 Y
5 a- W9 v" C. @6 r% @' x' Q
6 W4 [9 ` t, J. L3 \* t7 U
8 T: E: j; I/ D6 E) f/ m+ }5 V2 O! n程序代码:
8 m& Y, `3 k4 E8 W
2 ]/ L9 w, ?1 P. k, b; @% ?namespace fy_Exp{
; f. _* o( H; b6 q( S! s- nnamespace {template <class _T>
, g* Z5 g2 O- D! O Qinline _T GetExpValue(_T t[], char& csym){
( U2 d2 c" g! L' B char c=csym; csym=0;
0 R. @8 f3 n) y, [' E3 M- u0 Q- P switch(c){ |9 U, X/ Y5 W" p
case '+':return t[0] += t[1];$ r: s* Y3 K4 _9 T
case '-':return t[0] -= t[1];
3 n: p1 K; r0 Z+ s7 y$ o+ }' b case '*':return t[0] *= t[1];
+ |! H& T, F# W* ~. c/ L default: return t[0] /= t[1];//case '/':
# A6 P' S7 ?4 _3 U, D. R: L: [& o }+ X4 c4 ?3 L9 ]) h$ Y
}}
' Q/ S+ w9 T5 `" ]template <class _T, class _Tstream>: y2 J, U4 V+ t
/* _Tstream: inputstream, _T: get return value
. z& f2 }2 Q' V6 V; D. ]; p6 `* Return nonzero if get value successfully */1 L. ~0 X0 M/ ~! D: a
int GetExpValue(_Tstream& istrin, _T& nReturn){
" O+ h {/ e$ I; w3 R9 E% O, r5 W _T t[3] = {0}; //雨中飞燕之作
, Q1 d+ X Z* S6 ^7 T7 p. [+ u+ m char csym[3] = "++";3 l) h/ m0 F/ q6 x
int nLevel = 1, nERR = 0;
$ Q w @ c0 C" H0 u$ I' k5 a if(!(istrin>>t[1]))istrin.clear();
" H) a. Q0 d0 F( T5 M$ f+ \ for(;;){, A( p% J$ t5 B0 A4 Y* a
if(istrin>>csym[2]){
* J1 t( o8 z+ y* S switch(csym[2]){
& `; K& y# S; k# K! o% j# N1 A case '(':
# A, V5 I" @; _1 _ if(!csym[1]){nLevel=0x100; nERR=1;}else, u: b( v9 m( `$ q8 W6 H3 _
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
! a9 X8 {& S+ `1 [, V1 {# } else{nLevel=0x100; nERR=1;}
7 ~7 d) D* I7 [+ r" a, y break;
8 W/ Q+ C2 i( A/ o9 k7 r case ')':7 d# r& N: o' A0 C; [# X
{nLevel = 0x100;}break;
; i) G* A4 X/ `/ A5 E- P" ~+ Y case '+':case '-':case '*':case '/':
2 e8 `/ B% l: O5 h- A {csym[nLevel++] = csym[2];}break;6 }( S, D# K" d* E& ^9 l7 I/ D
case ' ':case '\r':case '\n':case '\t':continue;6 O; f K$ Q/ X. U7 y: Q
default:; ?7 t0 O, D& f. V$ g
{nLevel=0x100; nERR=1;}! A3 p; j' d, O8 c* g
}
, W3 V i1 h# ~. s7 X6 `9 |4 G if(nLevel==0x100)break;" ]2 z, E8 r3 m: o3 g T
if(nLevel&0x10 || istrin>>t[2]){
4 i5 C8 G* p' o1 T: q" n7 W N nLevel &= 0xF;
1 M- t% c1 m o8 T if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& ~ a' U; N9 {8 I$ n+ q3 L' o" U if(csym[1]=='*'||csym[1]=='/'){) |9 I# D% X4 Y4 @% ]7 b
GetExpValue(t+1, csym[1]);
) K! p* S; q2 X }
' x+ D% e. l# q5 u* b3 T else{* w8 M' ~7 `3 g3 u
GetExpValue(t, csym[0]);, S% S. O8 z+ o$ g! K' k
t[1]=t[2];csym[0]=csym[1];csym[1]=0;7 `- O; C, b9 g5 j0 X
}# D' v6 ^- A( k# h4 M" ?9 ^; J0 }
nLevel = 1;, v. I3 @8 i1 Z3 E: p
}% B) c* k) S: t: `) O$ r
else istrin.clear();
) o$ J. d1 N0 L; K% n7 [ }) m( @2 D0 P: M
else{nERR = -1; break;}
8 Y' E6 T. ]; G. Y+ c7 O3 n! ` }" |* _5 x2 z8 L
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);0 P4 G* G T5 |8 \
else nReturn=GetExpValue(t, csym[0]);5 ^( b0 {# N0 _
return nERR==-1?1:0;
0 s% Y" D: S3 H0 Q}}
, ?, b, ^: X8 F% w9 t% f7 R, v4 B1 y" y8 S2 X
" {+ R& `% p* g$ n/ r# `) L' B9 C% @. n4 A
函数模板使用示例:
( i- `8 l- ?* p8 z" R0 h在以上那段代码的后面加上以下代码:5 H+ \# e+ ? b, D
2 H% |6 _/ y# X) D8 Q
5 i' h) E3 H- v2 F" ]- g+ X5 _0 L, e$ Y4 V
程序代码: . v! m9 u- T+ }! ?2 {7 N( n, ?8 D7 c
3 L# u3 ^7 R; T" ?9 J
#include<strstream> f9 \( q2 s) O# E' j8 J
#include<iostream>
* Y+ z8 A# j5 n7 M: G#include<string>/ _: ]+ T: d% N$ P. _
using namespace std;7 S. }/ U0 i7 z* q+ v
int main(void)
; B6 n5 {( U2 Q" w# X z1 x6 i{3 s3 ^, M# V/ m5 W9 o
string s1;! G4 t+ \& L$ z# K0 ^
while(cin>>s1)
2 z6 P7 p7 F: f/ U {
: v; V% |2 ~ g+ R t2 i4 { istrstream isin(s1.data());
( z7 X% q6 j5 m. q# o1 g double d;
: G- A, s, v2 X+ D if(fy_Exp::GetExpValue(isin, d))
* s) Q& C- p8 p7 C! A {
8 V1 o& Q, p& J: N6 \& |+ w1 \ cout<<d<<endl;
) y4 r4 @! O; R7 m3 Z- l }
5 G [& A3 V" P* V else1 ~0 F y: F# W& K
{' y5 T& [3 n' |$ J1 E9 K& W& ^( s" W
cout<<"ERROR"<<endl;& z$ J3 X. |( w
}
7 x( N+ B0 s* b' d }
, D$ Q& h& D+ ? return 0;
) O4 M. I% G0 U% ]! W}+ y7 p" ^" X6 h B& l
# S* |' L8 I; H, v3 R1 h* z
$ v* ?0 D7 T- B. ]) @
然后编译执行就可以了(*^_^*)
, ?8 R' u1 T4 ?7 v) a其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 Z# R: e) X' z0 r P
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|