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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; U- O; Q. P, F7 N6 b+ y2 i一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ p/ k" D6 h" {% t, m, x只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
5 }5 w# \, _& P; a: _( E' a参数解释:
, X1 }/ Z" R6 l# h) w" H7 B0 ]# b0 Iistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流5 ]8 W1 A1 w0 Q& {
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) m5 f6 I2 u! P: G! D* s/ L
返回值:; ~2 f1 n& R% h7 `. b
返回非0表示计算成功,0表示计算失败有错误
/ A8 f" f8 ~, \/ ?5 {/ ~) q2 u8 n) k" a$ B y: o
9 M* G7 g9 K: ]3 f9 L
v% s% q/ }8 d- ? D, M: ^0 r0 F- u$ C程序代码: 6 O2 |2 u( |& F" d9 y2 {4 E
# R0 w2 E! W# _& m4 n" Pnamespace fy_Exp{# e$ D+ ~# i" y& t/ f( S
namespace {template <class _T>- L# T% I2 h3 ~( S
inline _T GetExpValue(_T t[], char& csym){
, M; x+ e5 X3 S$ w char c=csym; csym=0;
: O2 ~; g% C( x% G switch(c){
; v4 Y( P7 z! O5 o& A0 T3 r9 o case '+':return t[0] += t[1];
) }) n t" {2 }* h. Z4 s0 ` case '-':return t[0] -= t[1];" R/ ~4 L+ Y& s8 f% j
case '*':return t[0] *= t[1];+ E" ~% Y; O. |" d% Y
default: return t[0] /= t[1];//case '/':3 h7 E! a6 D9 h* }7 l$ S- V% U
}
# G6 ~! _+ F [% Q2 i' {9 @5 j}}: B6 e! i& z0 D; O& [) R' }
template <class _T, class _Tstream>
8 q# K, A' A8 z" L4 s; s/* _Tstream: inputstream, _T: get return value9 U9 W8 d$ Y8 c+ t
* Return nonzero if get value successfully */6 }0 x- Q; K$ s2 k% @ k0 X
int GetExpValue(_Tstream& istrin, _T& nReturn){ c" C G, I, ?/ d
_T t[3] = {0}; //雨中飞燕之作) B R+ P/ y, a' c; g
char csym[3] = "++";% f/ \! h6 `* i. g/ N, g9 T! J
int nLevel = 1, nERR = 0;
P/ R5 X9 }- n, o- f0 J- M" F0 P if(!(istrin>>t[1]))istrin.clear();
. _5 [& ?+ Y8 W# z( F8 I" n6 o, T- w for(;;){5 M7 F' J" R7 O9 w) M5 w9 c1 }
if(istrin>>csym[2]){
& r; g8 m% l9 k switch(csym[2]){. G& q7 E/ k' X( W: @
case '(':3 F) h: z/ h% `1 L7 c; W
if(!csym[1]){nLevel=0x100; nERR=1;}else
0 V3 S! c1 t7 H3 L6 ? if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. O- ] |2 S; u, K else{nLevel=0x100; nERR=1;}+ F) c0 K6 |& z2 v+ r3 O+ t
break;* e; z( O7 Y+ V+ {
case ')':! c8 g- Z- J2 |; ~* @- t2 ?% h4 g
{nLevel = 0x100;}break; U4 s/ X, a2 g( g/ y
case '+':case '-':case '*':case '/':
4 M% N; h) h( Z3 S3 _' }4 h7 E {csym[nLevel++] = csym[2];}break;
. K1 ]! {0 V' W( a( N" M% W case ' ':case '\r':case '\n':case '\t':continue;# N8 i$ T0 j# x/ Y, w- [9 u
default:' \1 j8 c# A/ O5 l& B" Y% z
{nLevel=0x100; nERR=1;}; I# s0 o: C% k: A5 Y# ~
}
4 J5 \1 R) M0 k* l( Y if(nLevel==0x100)break;
0 C7 j# ^! U1 H9 ^/ y6 n+ o if(nLevel&0x10 || istrin>>t[2]){
8 j: ~8 d$ k5 ?* B: M- z nLevel &= 0xF;
) E G$ H! B4 g( Q. A1 { if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 w: E7 Y* b7 j: e4 s9 e if(csym[1]=='*'||csym[1]=='/'){
' @. `; x* O: _' I) d0 k GetExpValue(t+1, csym[1]); z( z9 E' D3 G6 N
}
9 ?0 i+ `8 Q1 N6 c1 F$ | else{9 f- W8 O: ?( B( ^4 U, `* M
GetExpValue(t, csym[0]);
w+ p6 s) n1 K5 J4 q t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- z' F4 y% _" g3 s }, V. y7 K8 u( }) y* J
nLevel = 1;$ I; ] I$ m4 w1 y7 j
}& F: E! n# Z1 ?4 r9 g# g
else istrin.clear(); p: s/ M- x# I4 s
}0 c. |* f+ a, M" K
else{nERR = -1; break;}1 d8 E& W5 [8 X1 C w" a% B
}
5 S# c! C {* d; c& k if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);* V& P! { v; @7 u( A
else nReturn=GetExpValue(t, csym[0]);, c3 H: u. D) e8 Q' Y6 u
return nERR==-1?1:0;$ n2 M& M4 }% n' b0 x' n6 w! x" P
}}' l& s6 ]1 q' G# e, r
0 {) S: P4 z; M+ k9 J; z
* A9 @$ B4 H0 [* c' Q9 i- m
! P- ?2 i% k$ _! f% b) n6 s0 M
函数模板使用示例:7 V: ~( ]* A' J8 M7 D! ^
在以上那段代码的后面加上以下代码:7 n4 ^4 D+ s" v. N$ y; w
8 R$ k8 Q( a9 D7 h5 N
/ b" S! N% h9 a, v6 _# r8 U, a$ Z- p1 \5 X! u( N7 A0 b$ ^
程序代码:
1 ^9 K8 Y1 S, H4 G0 @$ L0 S( m! [5 b# D- X
#include<strstream>" V, r5 {5 @* E1 O* g( Z3 T! Y
#include<iostream>
( E- s+ n2 F8 M' K- L#include<string> K; ?% J7 ]0 l3 s
using namespace std;& m: C4 k5 X4 F
int main(void)
7 O& k: K4 O3 K5 c5 a& B1 q{
1 R) V) H% l& m# c8 m string s1;
/ x2 c( J2 C' H: `2 Q a: a while(cin>>s1)9 o- g' B0 r" }! z. p7 s' Z! n
{5 V, |& D: t& D; v! F( O) F) k5 w! G
istrstream isin(s1.data());( s% o+ H7 {+ Q' G
double d; S4 ^0 `( n# t& D
if(fy_Exp::GetExpValue(isin, d))
% V* r2 F4 q8 f( ]( N, z {
- }; g& R! g) E7 h cout<<d<<endl;8 |* p/ X0 o2 s9 p
}
( u+ t2 m# {+ }! C! [/ e$ K* M else
3 m5 r2 A: \* T4 X {$ g5 p7 w7 r: G9 c" L2 `
cout<<"ERROR"<<endl;
, J0 ?1 U: n; q! c7 c }3 F7 t% j# k. S- d
}
% i4 ]5 y8 m7 W- P N# C0 T: d1 i return 0;
( g4 Y& x( V8 f}/ B* ?$ _! O: {9 @! Q7 [8 f5 C
# [. T' ?8 g1 \% ?2 _# Z, W3 K1 W
然后编译执行就可以了(*^_^*)
: Q: _( X5 O$ ~4 p' I其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 c4 l8 J" w, f) e) e: y
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|