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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,5 c# a) ] ^0 n: K0 S
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. w& p4 Y4 f) e6 ?/ v4 }! U只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)) h. r( s! y% h- z
参数解释:/ o& W! n2 g& a d' \3 J
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' a6 ?9 I4 d# R/ h# g
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
' Y( [, F, e# I6 u3 V返回值:, u% O5 ^- u- L# p; G6 @& E3 P
返回非0表示计算成功,0表示计算失败有错误7 w7 b7 X2 L9 f4 B G: J/ G9 G9 [
6 v+ z @' q1 B( o9 t: Q6 c8 k) M
( y, n/ @ C" U
1 J, A8 S+ s v. y5 Q8 f
程序代码: ^( I' `* ]% [ h! X$ y) A' S
! I, E: |3 y0 k) M
namespace fy_Exp{7 B$ c7 g* {- _ f4 r9 N" \
namespace {template <class _T>7 B) O+ E8 j. J. b" D# c9 \% B
inline _T GetExpValue(_T t[], char& csym){- z! i' K2 E1 D4 l* D; ]9 m. X
char c=csym; csym=0;
" N9 f, {7 o2 J+ l switch(c){
2 m5 g9 j5 b& w# k) E case '+':return t[0] += t[1];
4 r# _$ N* ?5 b$ k" ?' q! r9 W case '-':return t[0] -= t[1];0 g9 A5 e" m/ I( y
case '*':return t[0] *= t[1];
3 [' l" D% M9 S% R( j6 i* f8 V default: return t[0] /= t[1];//case '/':3 M( m& Y+ o* k) A( a
}
w/ x5 H% O# R, ]}}
: A+ Y" G0 Q' |template <class _T, class _Tstream>- y, `1 d$ p: J6 i0 o
/* _Tstream: inputstream, _T: get return value+ e; Y8 m" T# l4 X! A
* Return nonzero if get value successfully */
& o& t+ [" `2 h. mint GetExpValue(_Tstream& istrin, _T& nReturn){
; A2 X) y: P6 e* u% W _T t[3] = {0}; //雨中飞燕之作
; a1 _5 U5 Z5 K. Y5 c* |. H( O! r char csym[3] = "++"; S) E2 @( C! `( h0 M
int nLevel = 1, nERR = 0;
% D% D/ q$ A2 d: p' S+ d# j if(!(istrin>>t[1]))istrin.clear(); E3 L$ i* v0 y: J( D5 v+ M
for(;;){
6 J& w; r# H0 t) |. w if(istrin>>csym[2]){3 s' R+ N% `. a. ^- d: ^% {
switch(csym[2]){3 p0 O( _5 ~5 M% Z. t
case '(':$ q. B1 a# L. e5 N
if(!csym[1]){nLevel=0x100; nERR=1;}else
7 m5 G# r. P0 Y# m9 u; Z) ]7 K if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 P% X+ B0 u1 d( k
else{nLevel=0x100; nERR=1;}
& ^ P [% q. S break;( \( Q% v# d, i; C+ b
case ')':
@! h0 V6 Z' ^7 f; A5 O. Y# r {nLevel = 0x100;}break;
. {- Y$ Q) g; M8 X case '+':case '-':case '*':case '/':
+ N5 {' u; O$ E' X {csym[nLevel++] = csym[2];}break;
- q" J0 ?4 a8 m1 w& Q case ' ':case '\r':case '\n':case '\t':continue;: E4 o* \5 i" z" A: y) k9 G
default:
8 c: a3 @# x; B {nLevel=0x100; nERR=1;}+ t+ L. Z" N# y, p
}% {9 [: q$ {" h1 M4 k, l
if(nLevel==0x100)break;' B; B; V4 J1 Y, D4 [. s& F1 G
if(nLevel&0x10 || istrin>>t[2]){1 C8 B8 L! q4 r2 U
nLevel &= 0xF;" u# B9 [1 g1 R1 u. P) w. |+ O
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( W$ w2 [; p2 z! L d1 K7 y/ d: a if(csym[1]=='*'||csym[1]=='/'){1 x0 ^: @$ z$ C# d1 x& c
GetExpValue(t+1, csym[1]);6 i8 p! K* ]) ^* Y4 K5 v
}
5 M7 D! V. _( d else{- i6 _! b3 V2 y4 V& R3 f
GetExpValue(t, csym[0]);
- t, ~) n; Q4 e; j9 p t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 Z1 m- p9 j1 m
}
M2 k( ]7 o; c7 W- d; G; D nLevel = 1;9 N. u/ m: ]2 I7 y; P8 m, t6 Y$ @
}% T7 [$ m- c5 x7 O1 {% p% p* ~: U
else istrin.clear();
% c7 F5 U8 V4 t& r }1 s7 Z, \2 o; E3 W& s; s2 x% B4 @
else{nERR = -1; break;}
4 u# ]! X i& s2 @) X3 ~ }: W: ~6 x/ J& F
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 B, _' T: s8 h" \ else nReturn=GetExpValue(t, csym[0]);2 v9 w1 @" P+ {
return nERR==-1?1:0;3 H) v- T* \+ N" k
}}/ c$ W# y; @/ {7 j" X6 K: t
' |) ?' \' s" a) b$ _2 j! D
# q" w4 x7 Z( f# s+ n
! _4 d0 r7 x3 d/ d4 x" I函数模板使用示例:, I; p( O- X5 D# |
在以上那段代码的后面加上以下代码:
- ~! i l8 r8 [8 l1 z5 {* R) V/ ?5 I- w a3 J* q; J3 `
1 z5 {/ T7 ^$ F. C3 w$ q5 k! C* A+ `1 B0 @" r% {
程序代码: - r' c0 d& }/ f; R8 l
$ F; q. j) J6 ^2 y1 Q) q! A
#include<strstream>
* p6 g/ Q' k4 w; t8 R+ F#include<iostream>
5 ^& X8 |9 t, ^#include<string>
' g+ _. T; X6 j; x) Rusing namespace std;
# O; o2 G; r% ~5 f* w& vint main(void)' F) n- G( I" h8 g, v
{
+ R% n0 r( p& ?* v3 `% B" O3 ? string s1;
4 o, v3 A4 _6 V/ q while(cin>>s1)
7 c8 A) u* @( u% H( | {! a9 F* g& O( v T. ]
istrstream isin(s1.data());
* A: u# ^$ K( _8 ^( }3 ` double d;
' t4 z8 H6 v! ? if(fy_Exp::GetExpValue(isin, d))
) ~1 Y2 R4 C: z$ z1 O4 N {
; Q( J$ U) m( k, a2 R9 R2 ~6 k8 l3 ` cout<<d<<endl;
- j( Q9 x9 `" @) ]1 t. B j }
8 M6 z! n- d. `6 C$ c+ ~ y+ ^ else
. Q- y; U$ Z" V v& { {
* k9 t* S/ e" y- l: s cout<<"ERROR"<<endl;
' C$ T- V P, t2 k: f }
3 m7 f L0 w( D( ~ }
6 j; }4 \; j8 t return 0;9 C. B" k$ p- V2 N& N1 ~4 C: c
}
, `& l. M% D; Z$ t l; \0 S# c) b" Y5 y) z- ^; C" R
; |: F! L8 c3 D+ i
然后编译执行就可以了(*^_^*)
1 m+ _1 ?5 c* x4 r: \7 X( R' r其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 R, b; m6 R8 V 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|