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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
/ ~ c, j8 R0 [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式% F' o: j0 ` C, y9 E6 P5 @2 P
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 c1 E; U+ l; u4 v; h: K
参数解释:
) i+ F" k5 N9 }istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& _( i$ y0 V5 ?% }# f( G. d. qnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ n' O+ T4 v) O2 [' {; D返回值:* y7 n) V- _7 Q
返回非0表示计算成功,0表示计算失败有错误
8 [" p1 I- t% t) L- }$ R
. H+ X4 U* n$ @& b! a/ d
; X+ a" Z3 ~8 {6 w
( k: X9 U8 z" b9 w8 c) ^9 e: }程序代码:
" y3 H* |& a, b. @" u8 f5 A
" t1 ` H; F& x9 w9 Anamespace fy_Exp{
# w7 g/ G( T' v4 }+ G! m' Anamespace {template <class _T>
& ^" \( p/ G, h, u% o5 I- Binline _T GetExpValue(_T t[], char& csym){
2 C8 w _4 v% r. X. w7 E char c=csym; csym=0;6 ?3 M# o5 ]- _/ ?/ u4 }8 [
switch(c){: A! `8 ^. x- @0 L) p! ^# C& x! m
case '+':return t[0] += t[1];/ }& K# O9 m' ^" d: y/ e: P
case '-':return t[0] -= t[1];
. A8 b- f4 D3 {" t5 G0 L case '*':return t[0] *= t[1];1 \; D7 }6 S! W
default: return t[0] /= t[1];//case '/':* r) r$ r. [! D! w0 Z
}
$ P0 j6 V+ {* ?3 G$ q8 `! f}}! q. u+ r. O+ x; c2 l% {1 t/ C6 W
template <class _T, class _Tstream>
( q( ]+ {& h% v2 L/* _Tstream: inputstream, _T: get return value
: _3 v3 I0 I* t3 D) `* Return nonzero if get value successfully */+ U. p8 z" m$ J# E4 M& Q G
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 _' Z$ q Y0 I9 F _T t[3] = {0}; //雨中飞燕之作
3 f, s: j0 k- e" R; j char csym[3] = "++";6 T5 _ \4 Z) v3 G8 k( G
int nLevel = 1, nERR = 0;$ c6 Y" G5 ^% p# H! Z5 A% D: Q
if(!(istrin>>t[1]))istrin.clear();" u& |% c- X; Z( O2 m
for(;;){
8 k& h- L' j3 S8 }# x& s if(istrin>>csym[2]){; u+ L: R5 j0 K6 I9 Q
switch(csym[2]){4 a# O% X6 R. F' V( F- b$ o
case '(':
% @ s0 C2 C+ u6 ~, H$ s if(!csym[1]){nLevel=0x100; nERR=1;}else
& s) d: l& Z4 ~! k$ {6 @) C3 i# w if(!GetExpValue(istrin, t[2]))nLevel|=0x10;4 m4 W( }( B4 _( e) [
else{nLevel=0x100; nERR=1;}2 N4 `8 h( J3 L4 N/ N: T" \
break;) K" v: I: M# K& D4 t' N4 o, |& N& d
case ')':& @' R% o; u: b1 j& f2 _
{nLevel = 0x100;}break;
6 L- F. |3 @& X' ?5 D5 ~8 ?" l0 X case '+':case '-':case '*':case '/':
& Z& M5 ], F) n4 X {csym[nLevel++] = csym[2];}break;
+ k$ X) R- G! W9 ^7 E. F case ' ':case '\r':case '\n':case '\t':continue;" K- Y" m3 c/ w! X; E$ m( C% R6 K
default:
) U! ]3 |! k( p/ U5 S {nLevel=0x100; nERR=1;}
$ ~7 n6 i' }# U }8 h: z1 y9 [ f6 U4 [* d0 K& M
if(nLevel==0x100)break;. h: c, x" c9 l5 A$ [4 I
if(nLevel&0x10 || istrin>>t[2]){
3 b: E. l! O; I. _# H; @" a nLevel &= 0xF;" m. p% O$ q$ l; b0 r+ C9 R
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}/ m/ v3 f% v* {, i$ k- [
if(csym[1]=='*'||csym[1]=='/'){
2 v% A* a, u2 o, J1 ?$ v GetExpValue(t+1, csym[1]);
! Z+ Q) n3 N3 O }! h' c: v) {( f; V* l. v
else{) I8 ]: v" @$ @ {4 P
GetExpValue(t, csym[0]);" R+ C- q& P* u4 ]1 p
t[1]=t[2];csym[0]=csym[1];csym[1]=0;5 f8 z9 M- w$ z0 O3 A" p
}2 R2 e {, ?9 K! y# C+ Z
nLevel = 1;8 q% Q2 x2 w$ {+ B
}
$ e# o; m# _8 E* p else istrin.clear();, C6 `4 e4 j s8 h
}
8 G( A5 ^5 W: x/ R else{nERR = -1; break;}
. l2 Q4 D Q# J& A! C }* g4 I8 n5 v% x$ k) {; g
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, W2 F, r, g5 ?- I* l! l else nReturn=GetExpValue(t, csym[0]);
( p% E6 g4 H1 c- j) u) C9 x! k! ?% Y return nERR==-1?1:0;
# z. F3 |- E3 r5 n. J% B3 G}}! b s9 N' e* E3 `6 h/ ?
2 v0 {' x3 H, j8 A* z/ R7 p3 \, g8 l$ m8 L
# M# Q' M6 T% B2 v. W; p; |: B, A
函数模板使用示例:
- t3 h1 E' b7 W4 n在以上那段代码的后面加上以下代码:
Z1 b( B4 @; |& b/ B- O
6 {/ M% V& @% ?4 j9 x ( L% p' V4 f. y8 Q, F
# R$ C. N5 H6 E9 ~1 [. ~+ \
程序代码: : v1 t1 [- W% b' B% Y; R
F5 S3 y( [4 @5 U2 f
#include<strstream>
" S4 b3 J# R& K# A t, E#include<iostream>
E' P& n$ u" P' K }$ E; _1 G#include<string>+ P" O3 A& L( q+ k& ` r
using namespace std;
# u! Z2 k1 P8 cint main(void)$ H% ]* J! ^# ?; r. J' z6 w
{* i0 C0 c1 I( e
string s1;
2 m; A$ j$ t4 Y. L$ Z6 H t while(cin>>s1)
7 S9 Q, k3 m4 F* |3 S0 f) r5 ^6 ? {
# A' d. E' i* {1 U istrstream isin(s1.data());
' r' w7 f7 k7 ]. S1 c$ d( {$ l double d;
$ t) P) I* f, b/ q$ N if(fy_Exp::GetExpValue(isin, d))
4 b; p3 u* s4 |% y) u: L' ~7 D {3 e _' a% r, w' o) |# d' X
cout<<d<<endl;
% j8 X$ r2 c1 l z1 n }, L; ~6 N: P. y! x
else
$ U- S5 J- e: t$ n {" ~) G6 R* f) p% |0 l3 e
cout<<"ERROR"<<endl;+ h, o) H! h. {# Z, s
}
$ n- I0 T* f/ d* v }
* p- d" ^8 i( V% [7 r" Z" } return 0;
0 V( m3 G: k5 G# W8 d: n) f- i}
0 P5 ~1 g6 m: V8 L0 q( F. t
! E+ c& @/ e4 R2 z" R
# o, @$ e' m4 T7 D1 J然后编译执行就可以了(*^_^*)( Z! D, u: Q. N& P2 H1 A1 ]
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; H7 r5 A2 E' W" [- [# q* \" }2 a 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|