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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
4 }9 F; { _) _- T! {0 w' h一个很方便的函数模板,可以并且只可以计算含括号的四则表达式* I0 D0 A) C e" L/ ^8 p7 F
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, H' u0 d {) f1 C& K3 c2 w( E参数解释:
0 ~ T* S! A6 w3 ~' \( N' tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ U3 k+ V/ C6 J% enReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定9 i$ p7 T( e3 C/ O( h' d
返回值:6 U. h" D. P: k! @
返回非0表示计算成功,0表示计算失败有错误3 n4 [& b" C. J& f8 X* l8 v
2 c$ j' G- P- h- r1 H# G* @
4 V6 m, X' H7 q6 g4 P" p, b2 d! g8 Z- w' [
程序代码: 7 L% ?- C6 u- Q9 D0 k! u! e& F
5 B7 A! K" t( w$ _7 o2 [namespace fy_Exp{
/ n2 v" ]" \/ g* a; z3 H9 tnamespace {template <class _T>
4 z/ t8 m- T: y1 ^$ [inline _T GetExpValue(_T t[], char& csym){
/ d7 I* f1 A/ ]* b char c=csym; csym=0;9 j9 M' U5 s' \
switch(c){! w4 W, q7 |& r1 @9 z1 H; E% k" F+ I
case '+':return t[0] += t[1];
4 C3 U0 c& y' e$ d case '-':return t[0] -= t[1];7 d' {; {. k) I) a
case '*':return t[0] *= t[1];
4 M# @) c5 h1 ^5 B default: return t[0] /= t[1];//case '/':5 i2 \4 x% D6 X4 y+ f
} l( r" q+ B6 X1 h: ~) }
}}
7 ?) v& u" I* u. p% r1 ktemplate <class _T, class _Tstream>9 Y7 B' g# \+ V+ S) ^+ }
/* _Tstream: inputstream, _T: get return value' g% T- W+ s6 ?& G) ^4 ~7 `
* Return nonzero if get value successfully */ u% o; H0 j) l6 y5 d
int GetExpValue(_Tstream& istrin, _T& nReturn){# `8 L7 J K& P/ _8 U+ I/ }- z
_T t[3] = {0}; //雨中飞燕之作 Q/ f2 A2 I; U x: y, [9 p9 S
char csym[3] = "++";1 ^' [7 S' O" F8 f& j
int nLevel = 1, nERR = 0;, T" R2 N2 ?# r& a/ S
if(!(istrin>>t[1]))istrin.clear();' l5 a3 L8 k- @0 m
for(;;){: @8 s& F1 K& @- P9 m0 U! u
if(istrin>>csym[2]){
, z1 M. ~4 [! _ switch(csym[2]){- ^6 x7 p5 I1 b
case '(':; H3 G& N( g: r
if(!csym[1]){nLevel=0x100; nERR=1;}else* n2 @! P. x% E5 R6 T
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 ^* b" t3 R6 f* w% r else{nLevel=0x100; nERR=1;}
3 T( K' H+ c; g" g* `# T break;. s* C0 J) Q/ Q1 _5 ~8 H
case ')':
$ _! N1 i4 `! i5 u$ U0 G {nLevel = 0x100;}break;
- |4 b9 ?% y- u+ f' |8 ` case '+':case '-':case '*':case '/':- p& S0 O: v+ c% o. Q
{csym[nLevel++] = csym[2];}break;
3 X$ j u" p4 `" ?' @ case ' ':case '\r':case '\n':case '\t':continue;; W. G( V t- d
default:) f5 [# A4 r' R* M
{nLevel=0x100; nERR=1;}
5 Y! x& _4 H. }2 k8 _) J+ V' L }1 @) X# n- f, `
if(nLevel==0x100)break;+ k. u! s* [; `" t, D
if(nLevel&0x10 || istrin>>t[2]){
& @% ?$ z" s1 Y6 |% e: r8 K- D nLevel &= 0xF;
1 Y3 t5 g. \# U8 s# k if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( ^( o; q) v, I! D5 f8 o if(csym[1]=='*'||csym[1]=='/'){
( S. D7 ~% C, d. Z5 ~* R) _ GetExpValue(t+1, csym[1]);
0 E, r4 ~' V1 o8 | Z4 H* `8 g }6 [ b) _4 l/ V( ^
else{* N. Z) r3 b2 a5 {( l/ Z4 J
GetExpValue(t, csym[0]);
: Z$ w& t2 ^0 y: _ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 x ^& ^! S3 p+ Z. ~" t }- g0 N0 [2 W& \8 F3 Y
nLevel = 1;+ B" h# n* r5 h/ A$ l6 W6 [ N
} U# ` H/ N( P( v" W
else istrin.clear();
' A& E% s- }2 Z4 \1 R }
1 {& |* j2 ]( C% X. i4 p else{nERR = -1; break;}* p, w6 ?8 x/ z; _5 q
}
* ~* u) p: b2 P$ A$ {& R1 Y if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 u' M( h6 q U5 S: [# r
else nReturn=GetExpValue(t, csym[0]);# c( G n" R- c l1 K3 W/ A* z
return nERR==-1?1:0;
2 {/ n0 C9 B, y}}
7 D. {, `* N* N' ?+ I
Y( R$ `% y) S- A7 j) t
9 N. m6 h M+ U; Y; U% D: G# v- p1 _ L0 b+ l/ R1 g8 m
函数模板使用示例:
: k" i: N; h# w在以上那段代码的后面加上以下代码:6 T' d+ M/ }. [
; m- T2 B! e% [+ U% x) u. n, _5 v9 K
- T8 H( ?! D4 G
9 O# ^6 x1 [% v
程序代码: 3 L7 B: S# F; t& J: u. U3 V) I
4 k6 Y& _: E& \5 L% C8 z9 v
#include<strstream>
- @: e* D1 s& ?#include<iostream># T$ g( r- v1 z+ b
#include<string>' j1 g3 C: R$ `
using namespace std;# G% o4 X2 s0 T0 i, Q5 y$ H+ t
int main(void)4 i2 ~$ e( v7 k
{4 e3 A1 T: V2 o/ i' a. h) m1 y1 t* H
string s1;5 a2 r: o3 Z: A8 x* [, f
while(cin>>s1)
$ p0 q3 v3 h- }; t {
" h7 @) K" n. G! J% Q- U% X) j istrstream isin(s1.data());4 l% @' y A( _) Z0 ?
double d;: P) g6 z; L1 P/ Z. O
if(fy_Exp::GetExpValue(isin, d))
& N( b. q8 `7 ]4 U* I# J9 p; v( y {
; R! F+ G- w3 q' T cout<<d<<endl;
4 z/ m& {9 a) h }
6 q8 j, r- |8 O# X4 ?5 n else
& ~6 L5 E# Z( I' [7 C {6 e; D/ ?6 K; C5 x9 ~: i# E
cout<<"ERROR"<<endl;
0 g! ? k6 p4 Y- c) g% O7 u1 } }
# o( C L- P1 z5 _2 G- e# T }/ s8 c6 F- S1 D( k) H* B! Q# I
return 0;* b6 o6 O1 o8 u9 ]) S0 B0 k. E
}
y' o9 A0 V) F$ r$ e; L/ j! Y# |5 m
% i8 \) ]' {" M1 I$ j4 g# W
然后编译执行就可以了(*^_^*)
8 F: `- O. D$ q7 _2 i3 U9 T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" @& `) G8 R- U. ^" p G 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|