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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
6 e4 d" U. W9 w7 M& r% _& g/ i一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# B- }& k% u9 I只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): k) `8 @, L5 A2 m) @( D* E% R
参数解释:
5 ~4 ]1 a5 B% o9 @6 Qistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
, K" \' D9 c; R3 o/ C( H4 lnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# O5 e0 h+ B3 P7 Z! a返回值:
. ^4 W; s8 T r' j$ z" d: g* _返回非0表示计算成功,0表示计算失败有错误' z2 L$ J2 G- G9 B$ G1 j8 x
, ^3 S, C9 F( A0 z! F- K & L H8 D# E" ?$ e! }
' D8 V; \/ s7 C* K: N- k! E4 _
程序代码:
1 e( f. n; d1 P; S* A0 {* L7 f8 D' J. x1 ~2 ]5 I; b
namespace fy_Exp{
+ N0 H+ Z' B6 Z2 S- Dnamespace {template <class _T>
; T) G) J/ c! u/ S' N2 f+ Pinline _T GetExpValue(_T t[], char& csym){
# J$ U3 l$ a% }: r4 U' S$ J- K, _; U! _ char c=csym; csym=0;
+ H/ P8 Q9 s* M- ^ switch(c){" m/ e3 r; J: j% f* X
case '+':return t[0] += t[1];% R" q' g, h, Y& v/ O
case '-':return t[0] -= t[1];
" h7 a4 L3 F$ i case '*':return t[0] *= t[1];& v) t' h2 I. k8 g. A
default: return t[0] /= t[1];//case '/':( P1 t! l8 V9 n d# {% q5 a1 P
}
8 P8 V! D* W4 _% z' z}}2 Y1 r( b1 a. v1 @# k! K5 C
template <class _T, class _Tstream>
; |- _. ~. j# }# \: z0 t/* _Tstream: inputstream, _T: get return value2 \( @* T' y# G0 u! |
* Return nonzero if get value successfully */7 B/ |9 s+ T" _4 z4 C: {$ w2 E
int GetExpValue(_Tstream& istrin, _T& nReturn){
& Q; G+ z/ @3 x) x# b _T t[3] = {0}; //雨中飞燕之作
& J3 u9 N5 ]. C% j5 l8 n0 M char csym[3] = "++";; G3 I0 {5 p% V; S* ^2 i4 l, N
int nLevel = 1, nERR = 0;
" F) ^$ N; g* Y/ h" F9 t! _ if(!(istrin>>t[1]))istrin.clear();! ]8 i" m) w6 h" M! Y
for(;;){4 i" [; P* d5 a
if(istrin>>csym[2]){( l# g) J% _0 _
switch(csym[2]){
+ |7 r. G3 f4 x$ a- ?# W2 A( [ case '(': w" k% P2 w9 V" G% P% S! S
if(!csym[1]){nLevel=0x100; nERR=1;}else; P+ @6 b! @( l6 J
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 d I5 R6 W1 U+ K) Z" g
else{nLevel=0x100; nERR=1;}% @! D6 I0 E: p/ M
break;
# z* s2 |, ^- }3 q0 A/ F' [1 U' e case ')':6 T6 c; e( O" l/ f7 m
{nLevel = 0x100;}break;
0 b# h! n' I: V, k8 B case '+':case '-':case '*':case '/':
3 l1 K; v& t" O# ~) c3 c- R {csym[nLevel++] = csym[2];}break;
/ v9 I( n% Z- S$ h" W case ' ':case '\r':case '\n':case '\t':continue;
2 f$ q3 s& D1 Z/ p3 ^ default:
/ b& @3 g. V" M' r4 f/ ^ {nLevel=0x100; nERR=1;}6 T, K2 |1 w8 p6 S
}) I# x: O x" n: v
if(nLevel==0x100)break;
$ o$ X: ~6 r+ J; ?0 r1 ~$ U; t* r* e if(nLevel&0x10 || istrin>>t[2]){% B1 e, W! j+ K" ^* n5 D0 g' \$ a `
nLevel &= 0xF;1 f1 ?; K, i6 ^1 I1 ]4 O( ]+ F
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 B; A# z7 Z( O1 j( E+ S
if(csym[1]=='*'||csym[1]=='/'){
) \4 q2 p9 e/ G% Q8 p& D GetExpValue(t+1, csym[1]);
6 ?( Q" i3 j5 R! e* s2 {4 A }! P$ w9 I+ U$ {- l8 E3 a
else{3 A2 N- H3 ^- w0 L* @
GetExpValue(t, csym[0]);
/ L" I" k/ n, l0 t3 ]2 p t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 {5 r$ j) T! f4 d H3 }# K }. Z& a# ?& E3 U+ s
nLevel = 1;' C+ y/ \) i) q h, o, u% A! b
}
4 W3 ]+ \0 ?, B4 p/ h else istrin.clear();# ~. V' N& ~, J6 c& c
}
- c7 U' A; L0 u% G M9 N' B4 U else{nERR = -1; break;}5 a# d8 |- {9 r! ?
}4 W9 K9 k, D" i
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 f; ?+ z. n+ q4 y2 B
else nReturn=GetExpValue(t, csym[0]);. h6 c' i( Q4 Y; Z
return nERR==-1?1:0;
) a2 A( {, K- u5 r8 }6 t" \}}
; t! V9 M' `4 A. G k0 x: V7 R
# W( J9 g& U: U4 c, u9 K6 E6 F' v2 } h: D8 b7 I& q
: ]4 z; |4 R- |; w5 k函数模板使用示例:8 G: _; F2 g7 P8 v
在以上那段代码的后面加上以下代码:2 b! v+ U0 d+ Z3 F/ e- V1 F" ~
0 d' Z* C4 \. g! {
" o$ O" ]9 A3 K* E; y# E J
4 U1 O5 w* I* K! S1 z6 C
程序代码: ; N$ v" f+ y& ]6 Z+ ?
4 P. {( {$ k. ~- X) g& u5 i) y: E
#include<strstream>
8 F+ a! m% V: G0 |7 H/ |#include<iostream>
! J0 F! c; y; Y#include<string>- a' V/ B2 P" z% p
using namespace std;
; Y# S8 Z' J0 V, \- o& E4 A, Iint main(void)
7 N8 E. O1 a( S6 q0 m- m" ^6 ]7 z9 V{+ p. @" g# {: C. s2 ?1 ?4 }
string s1;
+ X* |) w& {8 r3 x while(cin>>s1)
* @; t; V$ d5 F {
5 t7 {, R' Z# P* H) H7 U istrstream isin(s1.data());
. R6 @; k) Y; y0 f5 o$ O$ J4 E9 I double d;# j/ S1 y; J, `1 ], L+ |
if(fy_Exp::GetExpValue(isin, d))3 H0 i5 ? p: Y" f3 I" \0 }
{
; F! a: B! ?% ]; n0 o! Q7 }# u cout<<d<<endl;
8 h: {% J! ~+ [; v# ] }
+ M5 Y( E8 `" U8 S) S else4 P9 ?* p& c6 s& _3 E% ]: {
{' D: W) E3 O* t3 y
cout<<"ERROR"<<endl;8 M$ c$ h! }# H. |) y3 c
}3 J& }' r# t/ F. J/ B- c& K. U
}
: [5 Z u$ }. q# P return 0;* F3 z0 q- ^0 ~$ A5 y. r9 J
}
2 c2 J+ g+ E+ @# o' e* M: I" e; ^1 j
2 L0 w- Z. G4 d8 O: @
然后编译执行就可以了(*^_^*)
0 j6 p. y' o" g8 N, I) r& L其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% } J5 { F) l. N- T 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|