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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
/ p4 U6 F3 B& Y! ]: H" {2 r0 q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式% y: N" f7 k) O ]2 r# p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 K8 O* l$ l7 v0 k3 P4 b' u
参数解释:
) j- p1 n: G/ p, R, ^: ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' v% S# Q9 J4 F& q: m+ X
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* X/ ]! _, B1 S4 W: c `8 I$ R
返回值:& ?# K- s, I' b$ l3 u$ `
返回非0表示计算成功,0表示计算失败有错误+ L+ F. z# n2 z. S, [/ P
, _9 P% b& A- n+ M! a " j$ k/ `7 ]- b. A
; @% x# i( _/ {5 u1 f8 R+ Y程序代码:
+ Z; l1 |& d7 d! g; T- A0 ]) V3 n( U Q' z6 A9 U1 C2 E% k- ^: ?
namespace fy_Exp{
$ }) X* B% j7 p7 z' { t9 Qnamespace {template <class _T>
5 r0 ~% D3 z, C8 S) d: H( e- Binline _T GetExpValue(_T t[], char& csym){
, k, M0 p/ }' H9 v5 ~5 f" v3 l$ }0 t char c=csym; csym=0;; T! \: I3 s' S
switch(c){
; O9 U: G) I6 L! U& p) N9 c4 i case '+':return t[0] += t[1];& Q. O( I9 J; p ]2 U
case '-':return t[0] -= t[1];
& z) A3 B. \! z* s, {- U case '*':return t[0] *= t[1];* w' k- d7 h: a& ?+ |
default: return t[0] /= t[1];//case '/':: c+ V" V! S+ Q1 L7 N$ A
}
: c4 V' l- a- E* o, u}}
$ X7 z Y. z! x9 W% R/ @template <class _T, class _Tstream> w) ~# }' M# b$ r1 ^) c
/* _Tstream: inputstream, _T: get return value
% ?7 I& O# \& `9 p/ D* Return nonzero if get value successfully */5 o2 u7 e+ l4 _* |
int GetExpValue(_Tstream& istrin, _T& nReturn){5 g' ]- n4 \7 J$ O7 I5 r! ^/ ?: v
_T t[3] = {0}; //雨中飞燕之作( K) x* f8 L8 E
char csym[3] = "++";
: T+ E0 s# }3 H# c9 @ int nLevel = 1, nERR = 0;
3 }: B" l" p6 l) \+ C$ \* C if(!(istrin>>t[1]))istrin.clear();: ]) N; O3 L) u* l7 Z4 e; T
for(;;){; {1 t! b# s% |
if(istrin>>csym[2]){
4 _ r& \2 j8 d switch(csym[2]){. t5 Y" p5 Y) E$ X5 K1 s0 e% a
case '(':
' a V9 o# s# c r& T( b0 y if(!csym[1]){nLevel=0x100; nERR=1;}else' x. q6 h& Y, ^/ A+ P3 J" L
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 j( \- b6 q! ^: _+ F w6 R, G
else{nLevel=0x100; nERR=1;}
5 f7 b$ z: O+ j! [1 Q: v7 E break;9 E; N0 ~9 G ?" R5 x
case ')':* z& R q. x- O* r: K& O
{nLevel = 0x100;}break;
* T0 W9 y. Q* E. a0 _- c3 M case '+':case '-':case '*':case '/':
* L" s# y% i# h6 W {csym[nLevel++] = csym[2];}break;, Y' c( u8 c& \: [/ g$ W" D! ^
case ' ':case '\r':case '\n':case '\t':continue;: n8 P5 ^% I. m: M1 Y/ e
default:
$ g3 I# ^4 W# U/ m2 P4 c- Y {nLevel=0x100; nERR=1;}- J+ i! b: P3 y- Y$ Q2 R$ s! f- ^
}
; Y4 ]1 f/ j/ o9 x7 d' g/ \ if(nLevel==0x100)break;4 W( m0 i/ J) B2 G
if(nLevel&0x10 || istrin>>t[2]){4 x8 M5 p7 i% F# M- X
nLevel &= 0xF;
9 w5 w8 W2 k+ b4 ~- _$ J if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* D0 w4 }4 Q, R8 {, w7 t
if(csym[1]=='*'||csym[1]=='/'){
% w) m7 r# ?7 Y6 l/ F GetExpValue(t+1, csym[1]);
; N4 M2 G1 o3 X. T }4 q; h0 `5 d& S: L. S
else{( b" H! j; {: e' d+ f) @" w, F
GetExpValue(t, csym[0]);9 i# ?' x r- R% T3 g3 J: S
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" j+ R8 X# E2 w4 t/ k: x, Q" t }
2 a9 Q2 X0 u4 n6 E: N- S: `9 G nLevel = 1;
. ]/ g1 e# @6 B1 C3 a# l7 f5 M8 H& O }
1 ^$ n! k! K" V$ U8 } else istrin.clear();
& H z4 D* n, q3 U }
/ Y8 K: K( O1 |9 Z6 l0 y, x+ m else{nERR = -1; break;}6 ]* d, f Z8 I9 X5 ] V4 V
}
. l8 w, Z4 V }( m& ^1 i8 E if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 c7 U$ B, f0 q
else nReturn=GetExpValue(t, csym[0]);
- ^7 p, c, F8 L! j: Y return nERR==-1?1:0;
1 E3 l K {2 \+ l" K}}
' \* m- z5 X* C2 x( i) a* @7 [; O9 U$ O$ H: x
$ m% n2 t; E$ ^# B; F8 A1 g$ K v$ [% a0 A) n: n$ R) b3 _6 { }
函数模板使用示例:
1 O$ D. }9 }6 D, T, n3 \在以上那段代码的后面加上以下代码:
4 o8 w1 v w$ p% u% W, v
v" ?3 ?- _: ?& Y2 @1 s/ Z + l) L1 W7 A5 U! i* Q! [
) x3 m" F+ Y/ ^2 j5 Y$ A9 C
程序代码:
+ u! d$ ?+ j+ T" ]" J! Q# G3 ]
9 W3 M( V8 D4 `& o/ k#include<strstream>
# C y* ~6 G7 ^# M$ ]. {" ~" I1 b#include<iostream>
+ T, H6 D2 q1 N! l& H" b#include<string>4 V$ k0 O# S. M
using namespace std;
. T( B# Z& X: U% l1 u, Fint main(void)
$ Y/ i( ?$ i4 Z) H9 o% p6 _{. E4 {3 r- G; }* N8 U* W1 b
string s1;7 L6 g4 u% C) m' z8 O
while(cin>>s1)
' F, ]: i, U5 w1 Z( { {, s! j$ E; F- l! \
istrstream isin(s1.data());: D; U8 T4 w# ^) t4 S' C
double d;. B/ J5 a. P& U. e
if(fy_Exp::GetExpValue(isin, d))
% K. K' A9 D9 d7 ? {
! F) n. Q& J1 C$ U, L cout<<d<<endl;# L6 L4 j$ O8 v! M1 Y+ S* c* [
}
% v @% U: z/ g0 h else: A1 \: ]/ {1 a6 Z% W1 L2 T! p
{0 E3 r+ [6 f5 e' v+ j; w
cout<<"ERROR"<<endl;
+ r+ v- U& V( C [9 X6 A; Q; ~& }& |; j }* c- s. f0 `4 A6 }( {4 b& s; s
}& F5 W# z/ t0 t" q5 s: w
return 0;) r# a% }/ G" U7 x) C. }1 M
}
* b/ @/ T' {" ]1 w% }. m% I" _5 d# R% W6 {! `
2 I( I6 O3 P* q e% H" @然后编译执行就可以了(*^_^*)& J1 ?8 |+ I: E, e1 I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! t9 G. O( \2 r8 [8 ~ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|