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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,- o3 Q! {6 a v0 q* |/ p, z. \
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式* X2 n' _7 k4 @- j% i3 x: f) u
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
7 [% i6 S! T9 U3 M7 g' Q参数解释:6 y1 R9 Q, p' R) c/ |" @. L3 V4 Y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ I. B. [; ~ M4 N, m
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 q3 q0 \8 ~: v1 A* _" h
返回值:; D" v6 K3 I, ?9 r: ]2 u, Z- O
返回非0表示计算成功,0表示计算失败有错误
# i( E& w+ a- f1 j8 q9 z) Y. S1 H0 p y( F. L' x5 O' h
3 K. Z( g2 T+ t% M
$ k' ` e! Q( R5 ^
程序代码:
. W3 [ ] P; ^5 e) g7 \- v L' m8 [4 m* v
namespace fy_Exp{
: E1 E% ~& L7 Q/ \& B0 K+ A$ Vnamespace {template <class _T>" q, K% @/ m1 v6 Y+ H2 v& @3 \4 l
inline _T GetExpValue(_T t[], char& csym){0 X$ o1 q% `8 Q4 b# a+ `4 M9 W
char c=csym; csym=0;( T: l4 c" \% [: U4 A$ I
switch(c){
2 p3 P; U! ~# X D4 U case '+':return t[0] += t[1];+ C/ O) z( @# W- }' u7 w a: E
case '-':return t[0] -= t[1];
$ [' B. Y$ ?2 i+ F% i8 X case '*':return t[0] *= t[1];# i, J) k6 L' Y! O/ `9 _
default: return t[0] /= t[1];//case '/':4 \* K/ K' Q* G$ H* h
}
9 P/ M0 x |5 `}}
$ y+ V4 n% O$ Q3 I2 e& wtemplate <class _T, class _Tstream>
3 y- |/ _& p: f/* _Tstream: inputstream, _T: get return value: @; t* |! `5 Q9 S7 ^, q- F5 h
* Return nonzero if get value successfully */
/ x3 k* d) d" o p6 Dint GetExpValue(_Tstream& istrin, _T& nReturn){
+ X6 m" m8 Q j' F0 c _T t[3] = {0}; //雨中飞燕之作
: @/ U; J: C4 y" N4 \ char csym[3] = "++";
6 T4 q4 `# G1 W6 b# v* h int nLevel = 1, nERR = 0;
1 i+ }# ~' Y% X* y z. A if(!(istrin>>t[1]))istrin.clear();! J9 a! ~8 X8 J& [3 K2 o
for(;;){
" l! Z; s4 q) t% _4 f: L3 E0 B if(istrin>>csym[2]){3 o# s3 Z- N9 q7 M3 j1 K
switch(csym[2]){
3 K$ x2 C; r# m" ?0 d9 [ case '(':
) H! D* ?4 @: h+ i if(!csym[1]){nLevel=0x100; nERR=1;}else. W+ o' ?9 ~# `: u. Q
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;) M; _7 ?. V/ E( x7 i& X7 i
else{nLevel=0x100; nERR=1;}
- S( x) o8 o$ Y. U9 F* | break;
6 s5 Q" _0 {5 O& I case ')':
; ^% @, Y; g8 A% L {nLevel = 0x100;}break;
. {9 V; q# l; e" J7 z case '+':case '-':case '*':case '/':
. h# o* ~' X1 X! t( w3 ], @ {csym[nLevel++] = csym[2];}break;
) U1 j. @& M6 G4 ]+ Q- i case ' ':case '\r':case '\n':case '\t':continue;
8 b- h$ Z5 _7 O! l# S4 }1 c! t+ h default:) v; h1 |; r+ Y
{nLevel=0x100; nERR=1;}
, H- Q ^0 k4 V! A" X9 u/ I }- p0 L, r! P' U. c2 q y0 g
if(nLevel==0x100)break;$ v! ?4 D# |- Q% t
if(nLevel&0x10 || istrin>>t[2]){
! {0 y. x3 z* M: k V: Q- H nLevel &= 0xF;
0 D; `: p9 x; D/ x" F& T if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
b9 n% [. h' Q% g. C+ K+ | if(csym[1]=='*'||csym[1]=='/'){
0 I+ v, X; G& H- M) e9 @" u2 w GetExpValue(t+1, csym[1]);8 [: K/ c6 [3 e
}
' f! g# Z2 v. `. ? else{& `4 H, J( h% `) s1 C1 }' R4 M( m
GetExpValue(t, csym[0]);7 {% H7 X! y* y9 l; h( n$ r
t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 f8 ?) W2 {( a
}
$ |) F1 M, S: @ nLevel = 1;
6 ~1 n) ?6 h$ R }9 Y; D, }/ T& [& n2 f4 \1 j7 _4 R
else istrin.clear();
; B ~$ o$ h! `; l; h }
' ?+ J! E: v7 Q. \% u* c else{nERR = -1; break;}3 B" ~9 u$ y. U+ U
}
! ^* \! g/ e) \9 |3 D" ~ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 P, w, J& @. t( N% X* z H else nReturn=GetExpValue(t, csym[0]);/ ]! ]6 }$ M* B8 A5 `; r4 L! g- p3 p
return nERR==-1?1:0;' Q/ l! [/ f+ w8 K* r( n9 Q b
}}
, E6 l) M2 N: H
: I4 ?! h Q; I, h0 X+ E/ @
; M$ f/ S( o2 k: b: e
1 E* k k) q& B; p3 l8 e6 Z3 [函数模板使用示例:1 w6 e( i. V) E
在以上那段代码的后面加上以下代码:; @# U9 j/ \" R) F7 b( F
3 e2 z. ?+ H7 o4 }+ f 6 d# i4 c2 v( m) n. f& ?% S- Q
9 u2 I7 O: N, h
程序代码: % A/ `6 }; i7 S% V1 A1 V$ ]
6 M: [+ N: D) O( R
#include<strstream>
+ ?# w' j. E# Z#include<iostream>
+ U- {/ u% ^) }: ~: [- G% P#include<string>
+ J; }6 n9 ~% P1 C. K& Y, Susing namespace std;1 Q4 C7 v! v* N- K
int main(void)
. ?# u/ Q$ q& z$ Q, [; j{0 H" B2 d& s+ }/ \7 T
string s1;
9 Y; }* |) V8 W0 s; X4 c while(cin>>s1)2 R/ [, k7 ]+ n# O7 c$ b
{# j! }9 f$ H1 ^2 p
istrstream isin(s1.data());3 {" \! o0 O6 ?; [
double d;( a2 s. r4 U6 U0 @0 b: t0 N8 u
if(fy_Exp::GetExpValue(isin, d))
' B- t! r2 _! I& P f {
3 [# q' L: F& G% k cout<<d<<endl;
6 I9 m: N3 W! i2 l8 ?9 }' u; B }
$ [7 i2 l$ B. B& `: H6 m, ?8 d" j0 F else
# x; X% q3 E/ s5 G2 b3 O {
' g8 {" b o5 j3 ] cout<<"ERROR"<<endl;" r7 F8 T+ [! ?$ D
}; [) `- ?& @' z& }2 Y _
}
4 ?9 F% f! m, G7 g return 0;' }6 J! F' F) M; F/ Q
}: r- F+ | l3 e) l2 h+ E
+ ?9 Y1 y& o' o& d) J3 j# [
) H# w; F1 [3 F5 f, x然后编译执行就可以了(*^_^*)2 F5 c4 S" l1 M: e
其它:TC++上一定编译错误,不保证在VC6上也能通过编译; r7 H$ V Z. T+ z+ A' V; e
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|