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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,& U. }( X% X8 T5 C3 c/ C
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! i$ q3 Z# l1 V6 ^
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) k% K- K- K( W2 L& f参数解释:
1 H1 U1 y2 u' F) c5 x6 r7 Xistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' b( a- [ n3 b# L6 h
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) K& D) _% G: {7 h返回值:" V" P! U3 K9 Z+ M: ~
返回非0表示计算成功,0表示计算失败有错误9 u' W2 s8 W4 o
3 p- B& e& i' Z( \( N) E/ f. u# G
) N/ ^$ b. t M. Q9 `+ k0 I# C4 W1 C% {1 Z# G4 }$ J- P
程序代码: ( S% ^: ~2 P' N) l/ L' l
0 G8 d+ x: ]1 D! ~- [- [namespace fy_Exp{, X1 Z' \' l& G: x& C$ r2 B
namespace {template <class _T>& F* q5 t; I. `1 d# L) {: `
inline _T GetExpValue(_T t[], char& csym){" u% \8 P0 l1 W9 \
char c=csym; csym=0;' ~& |* ~% b: A0 R: Q- J
switch(c){
. @ q3 f! E' l8 |8 }5 K case '+':return t[0] += t[1];
+ |5 B8 Z/ |4 S) @! S! O case '-':return t[0] -= t[1];
8 z" {& F7 P" c case '*':return t[0] *= t[1];
& i9 @. g( E' v5 L" c$ Y5 ~6 [ default: return t[0] /= t[1];//case '/':! `2 V5 g2 V0 L6 G2 b
}, R9 `% |5 a1 w% n
}}0 X2 r# j2 U2 ]+ ^- Z. l
template <class _T, class _Tstream>
. O u' ?$ w+ Z* m/ m/* _Tstream: inputstream, _T: get return value6 e. k8 T* W6 v( M2 ]# }- B. k
* Return nonzero if get value successfully */. v6 J4 y% O" B8 ^7 f/ n( R9 w
int GetExpValue(_Tstream& istrin, _T& nReturn){2 h. x! j1 K) q# Z( \+ d
_T t[3] = {0}; //雨中飞燕之作$ C+ W5 \$ S0 R5 K3 v/ o
char csym[3] = "++";( A! a& Y: ?6 s- ~$ q
int nLevel = 1, nERR = 0;4 v# A. X9 K; ?
if(!(istrin>>t[1]))istrin.clear();+ R$ e$ {3 X! v& t7 O5 ^
for(;;){. s% R4 m; j; e& ^
if(istrin>>csym[2]){
) F9 ^, H* |/ b; p1 W switch(csym[2]){
( E4 Q9 e7 V* f5 H5 x% L% q3 L/ b0 T case '(':# z1 v; J# m6 e9 v4 I+ q' [
if(!csym[1]){nLevel=0x100; nERR=1;}else
- z2 e/ y' h6 f0 q$ L5 h/ { if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 m$ W- f. R6 u1 x else{nLevel=0x100; nERR=1;}
9 M" I5 A" F$ a0 w& p3 x- q break;, B7 F9 g" O. R) o$ g
case ')':
# N9 f, I! v8 C( A3 o$ S" m {nLevel = 0x100;}break;
% s7 I' P9 A- R, G s- d) y6 b6 n' ? S* g case '+':case '-':case '*':case '/':
; f" x- W9 Y- S {csym[nLevel++] = csym[2];}break;6 i7 y/ c, p+ |9 T4 {! h( t+ Q
case ' ':case '\r':case '\n':case '\t':continue;! e1 t, Z, Y0 C. L
default:4 P- @6 t; ` c3 Q: w, J2 s
{nLevel=0x100; nERR=1;}
H; W9 ^8 H2 Z/ r }
$ D& T+ ]0 b! A. I* g" }5 R if(nLevel==0x100)break;
* q3 m1 \ s% x" Y if(nLevel&0x10 || istrin>>t[2]){2 X1 C5 k! E7 d* o
nLevel &= 0xF;' s$ j& M0 p* Q& n& D
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& x, r5 n* K8 E5 T if(csym[1]=='*'||csym[1]=='/'){ |$ s2 j/ G+ j% s2 a0 k
GetExpValue(t+1, csym[1]);+ |+ R5 Z/ p; Z3 c* Y- i$ T
}
9 R- r5 _( W6 _/ R( N% S else{
, }6 @: ] v) c3 W; V1 m- T. A GetExpValue(t, csym[0]);
+ Z$ h% t8 Y. E `" |3 c o& b t[1]=t[2];csym[0]=csym[1];csym[1]=0;' o4 q+ p1 X2 J# g" [, z
}, l8 g! S3 R5 U
nLevel = 1;1 U4 Q, e& k5 B0 S7 ^& A- N9 ~
}
) B8 G2 ~# o2 s2 v- H4 J. Z. [ else istrin.clear();# f9 D* X* S# K, G( D- P
}
% [ k6 u& }4 d+ k! D% l else{nERR = -1; break;} g! f0 b$ i! t$ i% c/ [
}
# T2 U: X% I. h! ~ M if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ C/ D' w" F; T) U
else nReturn=GetExpValue(t, csym[0]);
0 q5 `& p+ P8 a0 Q return nERR==-1?1:0;5 f# g3 D: ]) T% @8 t' D6 p
}}( t- h+ B: n, @% o
$ y$ e7 J2 F- h. g6 {: x1 c ?
3 Q3 [* J) {, `* |: G/ o4 l o8 S7 r
- b8 x2 Z6 V6 H% i1 Y2 } Y$ l函数模板使用示例:
* j2 s) P% s i; m) I在以上那段代码的后面加上以下代码:
9 z4 V( L" u, y- A5 d: O6 `
/ {7 x i. w9 {3 V6 L8 Z
( b% y9 O# O7 a
( N0 V0 Q* P; @6 l3 K; T/ E S程序代码: 4 }) A t9 f: z# m
% b4 J3 ?8 F# L8 W+ z3 J3 s
#include<strstream> n; D/ _5 ~& L+ V6 D. _
#include<iostream>
- ^ g9 M# \. ~#include<string>
1 X; [- H2 H$ s& e0 u: Uusing namespace std;2 x9 r& ~( |5 K3 h0 R( z" m
int main(void)! a0 q9 J# P4 [: d! ]# L
{
# V6 g! @6 _5 ?# `; E9 H string s1;
4 y/ F# K2 L& G N while(cin>>s1)
3 l. t$ m& Z* }" G% B; n9 V {2 g+ h! o' \9 _; U# D7 n
istrstream isin(s1.data());
/ k8 R" X( u. d% u double d;) s' p" p. n) Y7 h4 q0 Q6 ]; B- z
if(fy_Exp::GetExpValue(isin, d))9 n8 k( n8 f7 p4 ]# J- F, I3 T, {9 j
{
. m3 D0 n" _9 U/ M cout<<d<<endl;/ f u3 _' C* n$ f% |3 f: q
}- y/ X7 U) i* N$ g/ o, ^
else
) x6 \6 f+ _( z! q {
) f* f. E) l* I+ k; ^ J cout<<"ERROR"<<endl;
2 V8 W1 P( O8 J% b" R1 R# u- L. K }# {) V6 _9 C6 \) w$ {7 H# d
}
" o; P) a0 j% O return 0;
# A$ B: {. ~& f7 Y}* b5 ]: m9 i! K2 R
: i) d4 q( o9 _4 ~
7 ]6 X5 z; q/ ?' P# ?然后编译执行就可以了(*^_^*)
/ O! m; k8 Z6 n8 C, V" y0 a其它:TC++上一定编译错误,不保证在VC6上也能通过编译) N3 w' l+ y: J" o/ m
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|