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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,: X4 h8 A- K" t7 H4 l% l
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
i% D7 R @7 H/ d) F* W$ g只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)$ B ~) l" h8 h7 \$ M
参数解释:% l7 D" F2 c n, K; w( G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 u# u1 \' j1 p& H. n; O2 p O2 JnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定, r+ k6 h( n- k1 G w
返回值:2 m( s" N1 M7 Z- q+ L4 |0 C0 c
返回非0表示计算成功,0表示计算失败有错误2 k! U0 A2 @8 @5 E; s1 \
! c% T3 e1 p, g) P) J( S$ q3 k . ?- I$ w. X' @. J8 A
7 X; H! V) ~% Z% e, _- t7 J
程序代码: ! Y4 S$ ^9 o& X3 Q% c3 }5 V( j# r
# f' Y) `8 H3 L% `8 { F# ]
namespace fy_Exp{
( Q$ V' [* g7 ^1 d7 [ bnamespace {template <class _T>! ?) d9 V" H2 c9 l
inline _T GetExpValue(_T t[], char& csym){
2 J; E* h! w( E7 Q char c=csym; csym=0;
0 Q9 P) Q2 s: }9 o5 T" ^ switch(c){
; ~& C, o& {4 _8 l9 ?* d case '+':return t[0] += t[1];, l p9 J& F7 K- D+ s
case '-':return t[0] -= t[1];
m5 a' L5 G+ M; L+ [9 ` case '*':return t[0] *= t[1];
0 ^0 ]8 }0 p! }6 j/ n( _ default: return t[0] /= t[1];//case '/':2 R# F7 l0 r( x% r, v- p* }
}$ N x0 h( s: v4 e+ ~. K
}}) e% ?1 ^/ R" K* }& R) p7 N
template <class _T, class _Tstream>
$ N( d5 Q, N1 _" E& l% e. _/* _Tstream: inputstream, _T: get return value
) \7 G Z: t8 M7 Z. e B* Return nonzero if get value successfully */
9 w! {! Q2 L9 F2 i x5 Bint GetExpValue(_Tstream& istrin, _T& nReturn){
7 }8 d& F* Q! Y1 b1 ? _T t[3] = {0}; //雨中飞燕之作
/ f5 _8 _: R3 l1 |2 p char csym[3] = "++";$ ~+ D) |" O, G8 [/ T
int nLevel = 1, nERR = 0;
2 f* t1 z) O; D7 Y' F! `5 B2 E4 n% k if(!(istrin>>t[1]))istrin.clear();
: e5 E8 V+ q9 L8 b for(;;){
5 o0 U( D" A$ J, a$ u2 N: d if(istrin>>csym[2]){
; f( s; c4 o9 ?& W switch(csym[2]){2 b% }0 t* _* `; `/ d
case '(':( G% Z$ J9 u/ E. {! p2 x3 ^4 S
if(!csym[1]){nLevel=0x100; nERR=1;}else
( {. v* F3 l) s4 c1 e; f% @5 l if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 w0 ]" e4 M s& y4 A) Z0 ? else{nLevel=0x100; nERR=1;}$ [# l; h, L' A% o) l8 e; q- x$ M7 C
break;1 O: {0 r3 j$ T0 W. l/ [
case ')':
1 F! }0 {5 V5 }% D2 P {nLevel = 0x100;}break;3 p! Q, S$ V$ u! q" q3 ?5 _ ?
case '+':case '-':case '*':case '/':
8 G+ O, J& x4 K7 A! X {csym[nLevel++] = csym[2];}break;1 C1 a% a @" _7 `
case ' ':case '\r':case '\n':case '\t':continue;& z+ {. K$ T7 K4 X9 s
default:- X( L$ e; Z8 Q5 j9 L c; b0 X
{nLevel=0x100; nERR=1;}' ]+ \9 f: @% l0 g3 F9 c0 @/ W
}) }1 Z' c0 H* {
if(nLevel==0x100)break;) W1 g' N) \# F7 G! j' Z/ }& _
if(nLevel&0x10 || istrin>>t[2]){
4 l( L/ F5 |( D- o/ G F9 u4 C4 L nLevel &= 0xF;3 c" O# c. s5 d5 n ?
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; M& F7 D& t# {! b& U0 l6 S* i$ r
if(csym[1]=='*'||csym[1]=='/'){( t! A7 M7 T* d
GetExpValue(t+1, csym[1]);
: t% h1 i- I! c0 V0 x }* l- D8 S$ i' A
else{
7 l7 y2 j( h# q8 {# n GetExpValue(t, csym[0]);# y: A, W# f. E) @! f1 ^0 G7 u
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ K1 d4 y% k/ e( t }) V' g- s! U9 \ j6 p; R0 t4 N% ^
nLevel = 1;
0 S; {/ C! `1 w1 W5 N4 l }
# D5 i; B+ _/ y" \ else istrin.clear();1 E3 x8 c* ^* }. C
}5 n# O) r! p8 p0 R2 L7 Y% ]
else{nERR = -1; break;}
( i/ k: T+ X( |7 V6 ` }1 C q; C7 [( c5 w9 q% E0 ^7 x+ s1 k
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
$ n7 r8 k L9 d else nReturn=GetExpValue(t, csym[0]);6 |& L) K4 ]7 l/ l% c* N* i
return nERR==-1?1:0;8 q% \3 g9 k7 k; n8 T
}}& z& b4 g8 s% K2 P: j" n! {. Y' @
9 o l5 L' m+ L7 m' U2 _! J
9 E3 H* t9 p% ?1 m: h c
6 e8 t4 v& R7 L& y7 g- j函数模板使用示例:2 Q% m9 @- q' i# I0 a1 }
在以上那段代码的后面加上以下代码:
- L4 Y4 p2 B% ]2 c4 K! U# w
' ~% D" q" K0 C# v" S4 p
+ c: R+ x* k& q# T) ]+ D ^% E: P+ @7 [0 ?( W* l
程序代码:
9 m1 S* V/ b2 |& c
0 g6 A5 t) f" o6 `#include<strstream>
9 u0 X; i. p4 K. c, S#include<iostream>
! j( N ]7 x0 a. a! o& m#include<string>( @) h, B% k# @( g: O: E! c" ]/ x
using namespace std;- @1 [: Q5 Q7 ~5 O, h
int main(void)) s" f2 u- R; S7 r0 ~& b
{( l" Z$ Y& l# g* b# `5 Q4 O; O- A# g) J2 c4 |
string s1;+ I; A$ Z9 J, I4 I; N5 |
while(cin>>s1)
. T; W! P5 r% N# [0 w- t5 P7 w m {9 c5 [3 [( g( a
istrstream isin(s1.data());, A: `" K1 d) g4 F; g& z) l) S
double d;, d: w: R& V# g1 c
if(fy_Exp::GetExpValue(isin, d))
3 _( o( T' p5 L- f N# H {
7 p/ }8 }0 A/ d8 | cout<<d<<endl;
0 C* H" V$ o0 `2 O" f }8 j( w( k1 k- K# K7 S. h. L- W
else
5 w* I: L! {, v4 D0 z {. j) ^6 D( l9 ^# p8 G- J
cout<<"ERROR"<<endl;
+ l5 ]3 |2 F J }/ Z2 C& w) L* ?
}
% |6 E3 k* n+ P1 c8 ~+ p; l9 v! s return 0;! L7 f7 Y/ b ]! D7 p* p
}- C! n8 Z$ Q& U( Z8 w% K5 d
4 G' W! V M2 h3 [: z
% l1 q# p4 o& u# V: g# I4 ^然后编译执行就可以了(*^_^*)5 \: H( v' m& j( y. `! ^$ u7 N- O! O
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ x7 [8 H0 g! w/ a, S
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|