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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,+ P6 @; t: @9 S# _& ?+ ?. R' P. Q2 K
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- \5 l0 @* |$ x7 r" l
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ x( P/ z- b1 f8 d( q' ^6 R
参数解释:5 ~2 G) ` S, r" O
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流1 w. ]( C. u! H( q# d7 Z- W
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% V; r; q t; a M/ A2 t0 S
返回值:
# X" I/ k4 _6 t- C返回非0表示计算成功,0表示计算失败有错误; _/ q( C+ \7 e- o# q; ^
* c* E# g r# E
6 v0 h+ a- f( U& {% `% R) r
0 j7 S3 s9 Y; k# \
程序代码: 1 k/ N- J" z3 u `" T
: H, g5 a( o Rnamespace fy_Exp{
4 ?7 d: ?* D4 {namespace {template <class _T>, z$ [9 {: m; U2 \( T# E
inline _T GetExpValue(_T t[], char& csym){
) V% r% J" d0 \# c. f- z char c=csym; csym=0;+ J( W5 h# h! [8 ]! G. Q
switch(c){5 r4 z4 y: ~. T- E8 e0 Y
case '+':return t[0] += t[1];
+ G4 L5 d$ J+ {& t1 R) `* | case '-':return t[0] -= t[1];# g5 \4 x- m6 ]; {
case '*':return t[0] *= t[1];* ~5 N9 ]: X# Z
default: return t[0] /= t[1];//case '/':
$ k* d1 a, L2 o2 x* X5 T; p }
8 l# @2 S% F8 @2 b- I}}
4 f& v, V* P9 q: u& J6 O; t" `- rtemplate <class _T, class _Tstream>
, l# K2 e7 Q7 ~0 ?% \" C$ |/ C/* _Tstream: inputstream, _T: get return value& }8 f* h( d$ ^" U# _8 o
* Return nonzero if get value successfully */
0 x' |4 }2 S0 sint GetExpValue(_Tstream& istrin, _T& nReturn){, `) L% ~6 J# b( V
_T t[3] = {0}; //雨中飞燕之作. Z! i; H( Y3 X+ q( ^- I
char csym[3] = "++";
2 ?0 j; f. Y' v) p! Z( x- j6 n4 T int nLevel = 1, nERR = 0;& N4 f; I- C; V4 q6 c9 r6 h
if(!(istrin>>t[1]))istrin.clear();
y! y" f; \3 w1 [7 V/ H6 h for(;;){
7 e7 ~) J& ]5 h/ ]3 ? if(istrin>>csym[2]){
+ O" b5 }- w0 E9 D switch(csym[2]){
6 }( R( L2 l3 \7 y* ] case '(':+ c2 H5 A, f v/ H/ ~1 X4 s' N
if(!csym[1]){nLevel=0x100; nERR=1;}else
. n) F& u1 `. U( G) W. O2 p if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" I( ]' R0 s% |! C
else{nLevel=0x100; nERR=1;}
5 W0 }+ |5 i7 T! ~ break;
8 t; o% t6 q& H case ')':
& T/ P' z8 p. `) z6 t m4 H3 L0 A5 ^ {nLevel = 0x100;}break;
& \4 i& x" q% [# |, Y u: k case '+':case '-':case '*':case '/': u Y5 x! d+ O3 L! h
{csym[nLevel++] = csym[2];}break;% t) r3 L( f1 V0 J; j3 g* j
case ' ':case '\r':case '\n':case '\t':continue;" ]3 y/ K# U9 n' u3 t+ `: K
default:3 O, e+ ?5 D' e9 q( X: q
{nLevel=0x100; nERR=1;}
' f' Y$ I+ }, u* J. }, _$ w }( ?8 {# \! F0 X
if(nLevel==0x100)break;; `% ] k# b. M) E# X/ I
if(nLevel&0x10 || istrin>>t[2]){
1 V5 u& f" u6 n* K- ? nLevel &= 0xF;
, R' @! H+ i8 x2 N' T) E$ N if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
5 G$ T% x- A) G1 k4 U& n if(csym[1]=='*'||csym[1]=='/'){/ o* f. J, X, T
GetExpValue(t+1, csym[1]);* _3 n5 n9 E* U9 e8 p3 u# X) y' w% A M
}
& F+ @. M5 n2 U' q% I8 R2 f else{
" b @+ {( B$ @4 L GetExpValue(t, csym[0]);" q5 H# |0 A8 K+ C" X
t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 x7 d" ]# A! B% }" e
}
1 O% t3 \% ]8 ~" z" t& |" Y( w1 g nLevel = 1;
; _! x6 V; q" i2 `6 e- h }
* b' a" P' C2 ]/ l else istrin.clear();
/ I* O H- J2 W2 k }- `2 A+ v2 t- k0 w& X. Z8 u
else{nERR = -1; break;}' Y' J8 z" f) X/ `! f- K+ Z6 F
}# }$ @+ r/ `) {: E
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 w, r8 x) o' l' _7 O) p, m* K
else nReturn=GetExpValue(t, csym[0]);
' c; ^2 \3 x9 F2 \8 T return nERR==-1?1:0;# R4 ~/ C5 y4 |4 j/ M
}}# I. o" T# k, v% Z- Q- S4 ?
' u# R! a Y. |- e8 V# T6 \4 a4 h( [: S, M# M3 F
3 `. l( m$ l: C" |( }, p8 g% j函数模板使用示例:
" i: A. n: X1 S6 ^; q在以上那段代码的后面加上以下代码:, W. g. n3 T3 s
6 g* U2 X# K% {0 U0 Z0 E5 ?) h3 G
+ _6 {* h- {: s3 n {: ~' n7 p" W5 A- w+ x# r
程序代码:
. A! T/ N1 V) B6 J2 T
, k5 I. b+ J# d2 ^#include<strstream>
2 r4 o2 w! a' M9 Z5 y; X* D6 ]#include<iostream>( p2 D* E6 C d3 B% r! @% o c
#include<string>8 [6 ?5 C- ^0 a p, @ [5 j# b
using namespace std;
. D- Z6 I$ ~ V3 D% I4 b9 Bint main(void)) y( a t. ] L+ }
{8 n7 W `3 C2 V, d
string s1;$ M4 p+ U- i3 w0 o) W; o1 O! W% D9 V# C9 q
while(cin>>s1)% b$ O4 p: L* H4 k. `2 W- _+ f
{
7 B9 O2 Q. n( e1 w+ x& C- W& X istrstream isin(s1.data());4 [1 r. A7 I: n, H* ~" H4 U
double d;* t8 }' e9 p% ]& ]- m7 E
if(fy_Exp::GetExpValue(isin, d))
! V2 U v/ N, K9 x3 C1 n {. A p, m6 |5 P4 Y9 K, w
cout<<d<<endl;
- I2 X, H8 Y! N/ O9 s7 n }0 G/ N; i3 R n! q
else% ^) }5 l- G; |! s! D* f4 q
{# Y3 q& C# F, R3 x
cout<<"ERROR"<<endl;+ w# y: n2 J' ^4 ^3 P
}
! Q, x- k, \4 h$ C5 K3 K9 z }9 d0 B {( x8 A7 P. M0 v
return 0;* v8 s3 b- l8 S* s; m6 K9 Y
}
0 `; G6 @, n/ s( w/ x" @5 T$ U% s5 U- v+ s% s
8 _+ O' F7 v+ q* n( y然后编译执行就可以了(*^_^*)
" I& k. K0 M8 v3 C( Y5 @7 m其它:TC++上一定编译错误,不保证在VC6上也能通过编译- R r# u2 _: J5 M7 v7 Q& R
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|