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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
4 s1 o) t7 S4 P7 Q G# h& }+ o一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ t0 ~7 V7 f- d* \3 G% D7 f3 Z' ?8 r
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 R) g7 J: A9 s v" r8 T
参数解释:
p* A8 A ^$ w/ I0 [- o( [5 D& N; ~istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
Z2 q2 D/ A9 K' EnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定, M. m5 v0 ?% R% S+ n9 ?, F0 G
返回值:9 D8 H$ K$ b! U$ _1 B
返回非0表示计算成功,0表示计算失败有错误; R, N( ]6 l7 Y+ Z- g
2 y( q, J5 E8 F9 e; U
" v; w" v7 h4 I& j4 R# E, t
s5 @9 D$ H) ~& j5 C程序代码: : t' L3 C2 G, f9 k
# }- A3 H) ]- i. F
namespace fy_Exp{/ o% w! [6 s* {% I( x/ Z2 d
namespace {template <class _T>& B; G% [$ k1 `2 j6 \; S: g3 T" ~$ N
inline _T GetExpValue(_T t[], char& csym){" P6 R7 h) \: f, ]7 N/ P* t
char c=csym; csym=0;* _& K% j1 F8 B" H
switch(c){
+ R2 d5 w" @3 p8 O2 m case '+':return t[0] += t[1];
- y- H8 O# `, ?( W case '-':return t[0] -= t[1];2 S$ o* O1 P2 l( u* e
case '*':return t[0] *= t[1];
9 Q M/ N2 @- K! N' t& a; r default: return t[0] /= t[1];//case '/':
) J+ o# F% F! ` }; w# V$ P5 `" a6 L% V- V' ]
}}+ v- q6 d; T0 L: l
template <class _T, class _Tstream>
; c3 _, z* k5 B9 p; d2 _3 ^9 A/* _Tstream: inputstream, _T: get return value. w- i; O: z5 o- Y
* Return nonzero if get value successfully */
% \- ?& M& g2 [2 w* ?/ q$ pint GetExpValue(_Tstream& istrin, _T& nReturn){! y/ f' a. W6 Y: f
_T t[3] = {0}; //雨中飞燕之作
, u/ J3 \. Z* h char csym[3] = "++";7 D5 B0 e# p. \
int nLevel = 1, nERR = 0;
- V4 |7 s8 `8 f9 Z1 G1 F if(!(istrin>>t[1]))istrin.clear();
8 V6 T) X: ]: A4 }/ l0 q for(;;){
9 J0 C4 ^' s# y$ G if(istrin>>csym[2]){" J$ c/ i/ Q; X9 T) _7 c! q
switch(csym[2]){( U; h) Q! W& J0 v) a& P
case '(':
" i7 H, A! P! \' m+ F1 o if(!csym[1]){nLevel=0x100; nERR=1;}else! {* U9 }# j/ I2 B8 b3 t
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. X N) h2 z; J! B+ C
else{nLevel=0x100; nERR=1;}, o3 d8 \* ?& }7 e0 f
break;
3 e, l/ L# `8 {/ Q7 C2 @ case ')':
- O* {1 N% o' s/ e {nLevel = 0x100;}break;
* E5 W9 M- ?' ?3 q# I7 `2 f& q case '+':case '-':case '*':case '/':
/ Y D/ c& Q' D, H {csym[nLevel++] = csym[2];}break;% n* p* }8 ^) o* [! }, m
case ' ':case '\r':case '\n':case '\t':continue;$ I2 l( C+ {' K' z
default:
* H% r7 K& k* E: A+ U$ `8 [5 T {nLevel=0x100; nERR=1;}
# u" N' S, j: f; b7 x0 E }: b' s( i* g/ \; Q
if(nLevel==0x100)break;7 d1 U+ N0 x! C5 u! C- ?! `2 h! s
if(nLevel&0x10 || istrin>>t[2]){
! t+ i" H9 J7 h+ O$ M7 O- c nLevel &= 0xF;
6 f! ]8 ?. h+ K& O) v1 l if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; t2 I6 w: d$ @) a5 D if(csym[1]=='*'||csym[1]=='/'){
- y$ m6 a. z, ` GetExpValue(t+1, csym[1]);: c- Q& L* Z$ {' s+ n2 f4 N3 t( v* T1 Z2 m
}# o- O" t `& } \( o: A
else{5 k" h* x! h9 F. Y, x+ Y E
GetExpValue(t, csym[0]);9 c$ g$ w. {6 N0 e9 ~
t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ c6 ^1 a4 C6 N; q
}- K) A0 ]) \9 x+ L3 \
nLevel = 1;
. R7 \4 _: z/ j W }
' a+ ~8 L. z2 |- _6 H else istrin.clear();
# K/ N2 l$ \% L( i, K }& a9 @( Z, |0 k0 t: \% ~3 k! N! {& J
else{nERR = -1; break;}
" ~' v* t9 g( D) J& X+ n* c2 f }
L% E- r9 c$ |' g5 W3 a/ z+ { if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 u1 [+ `( F5 M. f$ \+ m else nReturn=GetExpValue(t, csym[0]);0 ~. |* M, m1 p! P; l6 P
return nERR==-1?1:0;
( Y" M# ]6 Q0 f+ S$ K" k/ ]}}
0 b3 B/ D c! K) i7 ~3 B" t2 o$ h' t; @0 x; B) j
7 O+ U" z( |; [
% P& i/ }8 {% c; t% g" M- H& Q$ h函数模板使用示例:4 B8 U; Y: t: s/ \
在以上那段代码的后面加上以下代码:
1 B7 @' H2 E; `! O1 ~; u( s/ Z
7 M( c# r, r& I$ @2 Z% R. _# B & q# A I; F' Q0 X, `7 z9 I s
0 K3 L, [3 g: R" Z: F4 c
程序代码: # `$ p, H, C1 {4 U; ^ X
. U0 _% @2 [) M; H3 G- A' N& J; d#include<strstream>
\* j9 P& u. s" O; _9 T- N* N#include<iostream>
3 R/ i9 D, G5 F( ^" h( t6 b#include<string>6 l1 C( Y4 s) N3 q/ W
using namespace std;
) R/ z, ^; G: ~/ l+ Fint main(void)
! B+ F( Y; e r% e5 O$ w6 a) h& O{
; Y; b/ R, ?& ~3 d7 r. h& d, X% U string s1;& t# L. z! F, p3 T
while(cin>>s1)
. I V7 J$ x! f, ]" Y3 @1 o7 a {4 u4 r; u* j9 ?& A0 R% X
istrstream isin(s1.data());
- N) C& x6 J" E! g double d;
3 u$ w$ \7 {8 _% ?) d; M if(fy_Exp::GetExpValue(isin, d)). \6 ^& N, Z8 Q5 _) m- B; z
{
! o( s# _, J; c/ p cout<<d<<endl;
) _# a7 ]5 Z. ]; B3 }; r. } }
, l+ y! u% e. G9 O+ c/ F' p else1 _) A/ r; e7 |6 q3 J
{
9 w; X, [3 q1 _5 U' i( C cout<<"ERROR"<<endl;
' O" f5 M! Y9 }4 J$ h# J$ A8 d }
: k; I$ `( G3 s" i- `( C }2 O3 b6 _/ I: U* ?# n/ c; h
return 0;* v1 r( q. {6 b3 `9 t Z
}% Q- u0 W- P0 l. _
! x& k7 Y: a, s6 J. G" q, |6 i& Q2 h, A) \& }* v
然后编译执行就可以了(*^_^*)
: H. m9 d' f+ T- |其它:TC++上一定编译错误,不保证在VC6上也能通过编译. J# @4 q$ @" ?( M% S
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|