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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,+ L3 C& b. o$ L1 z( G3 I
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! q+ s: O8 N7 i4 G
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ Y8 r/ F" g1 F# _
参数解释:! Q. l# f- x3 _+ a x' A3 Q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. }4 v! d) ?2 x' g- L! x& KnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
1 y& q. Q# c% l: t返回值:$ \' x0 o5 I$ d9 X$ s8 Y4 B$ D
返回非0表示计算成功,0表示计算失败有错误
% m3 J) x% |* B3 U% t- C3 @, N8 ?+ L1 w2 T, Q8 S
% l8 I6 G8 {0 v. w. s
7 j7 }0 i/ _) X4 F
程序代码:
& d' b& ?8 A: B* v/ V' Q# \' \% F7 r% ?9 E; O, X; H
namespace fy_Exp{
% q! j$ _0 V4 c( vnamespace {template <class _T>
6 F) z1 f. Z- `2 Linline _T GetExpValue(_T t[], char& csym){
3 s! |9 x* Y- H" s' z. N char c=csym; csym=0;
1 k' W* p/ p; w3 U( v switch(c){
$ w( h- H( D: q+ C- E+ j, m case '+':return t[0] += t[1];7 q% j0 u ?7 ~% `. u) i: ~
case '-':return t[0] -= t[1];
6 z$ ?$ G3 q5 B: {' d: B case '*':return t[0] *= t[1];. Q2 J. B1 |# C+ v, Y0 e
default: return t[0] /= t[1];//case '/':
8 L2 i, A( B# ]2 | n! j5 ]" k6 J6 F8 I }
4 u$ e$ L. F" `! F* K}}& j. e: j% L7 B/ F
template <class _T, class _Tstream>
$ t7 H& ~% q, T* a7 s# d3 b/* _Tstream: inputstream, _T: get return value$ S- @) g5 {$ x' @
* Return nonzero if get value successfully */+ K9 i' d7 E. W/ i3 n) V
int GetExpValue(_Tstream& istrin, _T& nReturn){
) C- g$ ]2 S" i+ o( e/ v _T t[3] = {0}; //雨中飞燕之作
% V" E9 c+ g. } J$ B/ p char csym[3] = "++";
- k) H8 p3 t& q; } int nLevel = 1, nERR = 0;+ h* @' ]" {# f2 w2 o
if(!(istrin>>t[1]))istrin.clear();: X" L" J4 _! M9 [" D
for(;;){
# B7 k" Z4 `0 w. R1 b1 | if(istrin>>csym[2]){7 h- c2 h2 G9 G8 P) d
switch(csym[2]){
; p+ S. \6 G2 x* n: B1 ~ case '(':* M, Q. Y4 n: s+ Q9 R e& ?
if(!csym[1]){nLevel=0x100; nERR=1;}else
* d& Y* t2 r7 F- q7 W if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
6 p+ m9 V- Z) x; P$ i else{nLevel=0x100; nERR=1;}: r- Q) i5 d- b0 w
break;/ p' C' P. c6 S: z* l6 R' z
case ')':8 p' ^# X* r8 i5 E
{nLevel = 0x100;}break;1 ] x5 B5 A+ p4 v' k, W% n2 |
case '+':case '-':case '*':case '/':
4 {* B7 @8 R& s4 U {csym[nLevel++] = csym[2];}break;
$ b1 G+ F- S. F8 _4 {1 L: A K9 J case ' ':case '\r':case '\n':case '\t':continue; X) h% L! g1 a' X2 {$ K- i+ q
default:4 U# u& B8 Z1 s! @% q2 t! b( I# x
{nLevel=0x100; nERR=1;}
4 y6 Z2 W4 Y' @( P! n$ ~+ N }
+ ]: h* a9 C, P: Z7 L* D1 D if(nLevel==0x100)break;0 j& R: j9 G2 t0 y4 b* c
if(nLevel&0x10 || istrin>>t[2]){" H3 K, y0 P1 R, A
nLevel &= 0xF;# q5 ?! W8 A8 z S' j
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 K8 U$ b c& [, d if(csym[1]=='*'||csym[1]=='/'){5 u+ k& {/ A0 R/ T J
GetExpValue(t+1, csym[1]);
9 E+ v- Z7 X/ k# t; g( C/ A/ u8 G; T }% d4 e2 q) B! h2 f8 l5 {& `1 I
else{
3 `* u6 d+ P9 Y1 f# W" e GetExpValue(t, csym[0]);
- j7 z! I8 v& _) K! s/ Z* V t[1]=t[2];csym[0]=csym[1];csym[1]=0;
: [/ q" S D0 N }
9 w4 r( w, m# t$ r9 F% k: @$ } nLevel = 1;
! U% ]& P& I; ^- S7 J }
% U% R/ o* {# G) R9 @4 N* K else istrin.clear();
1 n3 \5 y& n* \0 x }
" P* H, c/ y" f0 m2 D8 G else{nERR = -1; break;}6 a/ Y9 j% U7 ]% W I
}2 c/ I$ ~% |5 ^+ L- p( k5 m
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 D9 k9 n) C: \& e! L1 m) M7 ]
else nReturn=GetExpValue(t, csym[0]);, B' ^* ^- t9 i* t6 o5 S; M( f
return nERR==-1?1:0;
8 o9 n1 i* J: @0 J5 P4 @7 Z3 `}}
) Y# J$ g9 N- K; R! E- |! n6 E! b, b- v9 Y# ?/ s8 |
8 b- |! @8 i' N5 \* G
: X1 u! S- F( e( ~. Q9 } ^" Z. ]
函数模板使用示例:
+ U4 D$ A# s+ |3 ~" N' l: W* }- n6 Q在以上那段代码的后面加上以下代码:
! C' l* R( s+ u+ g9 v t' o9 x' A/ C1 G# \6 L4 ^* M
4 h; a7 D# z6 }
% s& |2 z4 r( O `( t8 X* d
程序代码: : e7 X: T+ X5 H0 V
4 k* Z$ O, h/ _2 F/ \- Y
#include<strstream>
( ^: i9 D( l6 _+ A3 x" L#include<iostream>
5 m" }5 G3 y6 l#include<string>5 e" p; i( r" |% {
using namespace std;, w1 q, [& N1 J3 h" R) L
int main(void)$ W5 @1 S% }7 `, i L# b1 T
{
! \% |- g& x, C7 V string s1;8 L4 L, d: p1 S3 T) w0 o5 k
while(cin>>s1)
! r7 h; c3 X% c( K0 c {
7 B0 N' u) ]8 r" H1 r istrstream isin(s1.data());
6 q3 g- I$ x# T" L. Z$ } double d;( o" r4 Z# k- z8 E
if(fy_Exp::GetExpValue(isin, d))
( Z! e5 g0 c5 U4 t% C/ P {8 ^, X% c2 X4 m5 ~! s; |6 W
cout<<d<<endl;4 [0 @) O. r9 b: u7 G5 F
}3 T! X4 I1 H, I5 O/ [/ A8 d. r
else4 o0 l6 A5 l* V; D" k) p+ N! w* [5 m; h
{* I ?3 |4 k5 \7 |4 o2 j( n
cout<<"ERROR"<<endl;
0 M" R- H/ W% G6 b }4 T( J9 [: I; ~( F1 n( i5 c* l
}
' A) x+ |: ]4 |8 Q% }* U+ y7 X return 0;( m. f- Q4 o" b# q5 \
}
$ O n" ]( g$ D1 [
3 g& @& ?' q( f8 l6 a: O6 D/ N
& F/ r- A" \3 i ?( r9 x* x然后编译执行就可以了(*^_^*)0 O7 r2 Y& y3 I" j+ l
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( x9 e7 P7 c. \4 t! R 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|