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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
' E/ T8 d2 F" O) s' {0 R$ h一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 D: R" r( G: F3 v! c只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn). I; [/ H4 A, |* B
参数解释:
5 {7 Y3 |, q1 \+ }) Distrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; n( g; O- m/ \1 qnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 ]3 N4 v; |0 i' H; F" a: w返回值:
/ E8 x" ?% w7 |返回非0表示计算成功,0表示计算失败有错误
' g6 c. c" n% I; f) X& \
+ K/ m8 A' _) _ ; L+ m; D5 B* d7 x' z
2 Y9 m6 d' M" p9 T- b程序代码: * _8 M" S! s3 i% d
. E' w3 _6 _) [6 V8 Y
namespace fy_Exp{! O# c1 o5 V) _+ i. a+ `
namespace {template <class _T>! @0 e, F( g$ Q! N9 P; T9 B7 j9 r
inline _T GetExpValue(_T t[], char& csym){
/ T0 n+ C) A3 e' w, q3 w char c=csym; csym=0;
; F, z1 f) [2 |) h9 |- ^4 L switch(c){
2 U6 P: h* W- P$ t case '+':return t[0] += t[1];
! O" { J7 `! `8 q case '-':return t[0] -= t[1];2 v J' e2 y5 [$ V
case '*':return t[0] *= t[1];
3 |- M$ y/ B- }- o4 _% O$ _* V default: return t[0] /= t[1];//case '/':1 V; M$ \9 q8 Q) J. T. K' {
}) B) O, G8 s: U( R3 N# B1 O8 C6 R
}}
& L, s4 z, U% g6 `- P9 mtemplate <class _T, class _Tstream>( u' A) _6 h! W8 A2 m) K
/* _Tstream: inputstream, _T: get return value7 ~# i/ x" C: Q7 I; v) k V
* Return nonzero if get value successfully */# h3 A5 \, u( N7 u7 X
int GetExpValue(_Tstream& istrin, _T& nReturn){, a, d$ Z* P, i. D/ r. @# j" F
_T t[3] = {0}; //雨中飞燕之作
- p6 h+ u( \4 E* G- a char csym[3] = "++";4 X: E% v$ o: j: S4 s7 v
int nLevel = 1, nERR = 0; ?5 n* n8 q) n/ B) }7 k; S) ^6 U
if(!(istrin>>t[1]))istrin.clear();0 B# ?; N; q$ @" k# @
for(;;){
8 p4 i# u3 S/ m$ U5 e5 b if(istrin>>csym[2]){
. U/ G$ j0 Z4 W: ?. i8 j( u, b switch(csym[2]){
" G$ P9 ]# ~+ C9 K/ v case '(':
1 C% m( S7 F4 O if(!csym[1]){nLevel=0x100; nERR=1;}else
0 a/ ^) m, P* u+ v if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
$ i1 J0 ~/ M5 G else{nLevel=0x100; nERR=1;}
5 C7 |0 p, _9 D/ @) W l$ `" b; C break;
* |; x3 v1 ^- Q( m$ `% V case ')':' G2 n- O! t8 C
{nLevel = 0x100;}break;
$ j4 C) w: y# o* I case '+':case '-':case '*':case '/':
4 V& l2 g- z- G9 M' [; a& w- a) ~ {csym[nLevel++] = csym[2];}break;
$ X& Z! @; O. K% q j6 T- [ case ' ':case '\r':case '\n':case '\t':continue;7 t0 h5 |# L5 \3 z
default:- T- h2 S8 l' P5 l% Z# `
{nLevel=0x100; nERR=1;}" ^0 [! F! n' y) M# I$ b
}# R, V: k% ^3 n( d( ~
if(nLevel==0x100)break;. C" ^& t7 r; L5 X. ~/ N
if(nLevel&0x10 || istrin>>t[2]){
% A! x. ]: E7 p D6 ?, @% M N nLevel &= 0xF;2 j$ A' H+ E( O; [/ G7 s
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 @) d; v5 [ R8 s6 H
if(csym[1]=='*'||csym[1]=='/'){4 @4 ~& c4 v" J# J% P, F/ j
GetExpValue(t+1, csym[1]);" x0 t; ~$ L/ Z7 O( @3 O
}
2 K4 ]4 F# s: P& } else{! K$ z: {1 `+ {' O" G
GetExpValue(t, csym[0]);3 `( h1 G8 M6 @7 d. A
t[1]=t[2];csym[0]=csym[1];csym[1]=0;! G/ j V3 K" E9 G! g
}
4 r$ U3 ]! S9 j! e) h1 f! a: g nLevel = 1;9 @4 f* G) n& u0 w) l0 V6 f4 R
}1 f4 |; ^+ V, n6 ~. K
else istrin.clear();
4 S) O4 y$ W+ W0 `( | }$ I' {% y5 C/ Y) Y1 L
else{nERR = -1; break;}
k" k! v0 d9 H% n6 u1 u* W }
/ L9 ~+ u0 I# b if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 c" y, X$ @- }, J4 ^
else nReturn=GetExpValue(t, csym[0]);
+ I \' ]+ v7 s2 c* `2 N return nERR==-1?1:0;3 `1 l( i. A% k$ Q
}}) P5 Y* c4 G7 `) S( n
. _" t' H- m; i6 i2 z9 ]
9 O+ ~5 m4 V% R3 p
+ U$ G( v0 k! n& S |: |: {
函数模板使用示例:
: ~' Y' ]# @5 o2 e9 p: V; {在以上那段代码的后面加上以下代码:
6 g8 \; g& U: o/ p% V$ x; G3 Z$ w: a0 ]- c
! `& t/ I+ k6 D) q4 w. F
. |) Y- E7 [5 {) |9 S1 H, v程序代码:
4 z1 }. g: r' b* b9 R8 W. N0 b& t: { E4 u% i- v0 G0 d
#include<strstream>1 ~! p6 @+ t" \% X" k% N9 L
#include<iostream>
$ L% ]1 y) ?8 {7 _, D$ w#include<string>6 e( f% _% D |5 {* ]
using namespace std;8 m5 l3 G% {, M
int main(void)4 k6 V' }6 Z0 ?
{
) v8 R& a% I; X. G- t3 L# ` string s1;
, e S. ]" _+ R1 J6 y while(cin>>s1). ^4 D5 H* ?7 v" S8 ~; J
{
! A I2 ^7 `! G6 F istrstream isin(s1.data());
2 O& o. s G7 L double d;
3 e. f% i1 Q1 r5 [5 u+ v7 G' X" I if(fy_Exp::GetExpValue(isin, d))# B) _3 R/ h# p2 `8 ?9 |3 j
{
' H! F+ k% {, G' k: v$ e cout<<d<<endl;4 Q1 U2 Q& |3 {3 C
}* T; N) r& w# I% _ o! f
else1 B, B( r( z3 J+ V4 X d, V
{5 x- ~8 f* H) w" G4 A
cout<<"ERROR"<<endl;$ u6 u3 P& r g) T% Y3 |
}, V4 n5 i+ ^/ D7 {
}
% b m% d! Z6 E8 y return 0;# Z+ Q* |/ M0 g
}. K/ f N# ]) w* Y
: W2 q0 N% O: e" c$ H: d, E) r
5 @' \" z& _9 T" Q' y( X) y G) v然后编译执行就可以了(*^_^*)
! J9 i; ]4 ~4 y其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ }& F1 m, s }/ E7 I- Z
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|