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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
' D; |, F5 V, Z6 ^一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 C6 x# f1 m( J2 R" d只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! a/ E2 q+ i9 W参数解释:
3 F* {. u$ z6 o' S5 sistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! d$ @4 b* A/ q" T$ i7 q/ tnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定4 B8 I7 V& w5 v4 M" s
返回值:
4 K, x- ~' Q* M4 r; E* h返回非0表示计算成功,0表示计算失败有错误
3 I+ E. l4 I- d5 n/ X; G' R5 q1 ?9 _2 K1 |4 W3 R9 [
* F. v; F" M6 H2 F0 E
5 T L" A5 `8 f! m* |程序代码: 8 h O& D# \' X( t o
( A; s, @; Y" j, f, v
namespace fy_Exp{) w: K2 s# \+ o6 j( N) w1 M/ b2 M
namespace {template <class _T>
! T9 z' T# L. H) F! Finline _T GetExpValue(_T t[], char& csym){& J* H6 R! v6 z, g+ U; ?
char c=csym; csym=0;
: f3 K: Z) s/ ~0 U, k; O switch(c){ o6 o" q' _; Z! P P
case '+':return t[0] += t[1];, {3 s2 c3 |/ c) z
case '-':return t[0] -= t[1];
' N L4 L5 U9 ~: e; i case '*':return t[0] *= t[1];
8 {( Q& R* h1 L+ ]6 G5 C default: return t[0] /= t[1];//case '/':2 E( s0 L3 ]8 K) s# n- U8 L+ M
}# Z" q+ N( W. p# R1 a
}}# k( Q1 @8 ]" {( J; N9 ?2 D4 `
template <class _T, class _Tstream>" U) ]2 A& U$ x0 F8 F! d
/* _Tstream: inputstream, _T: get return value$ A. x8 _( o) F6 B- A* b
* Return nonzero if get value successfully */
: ?3 |) R2 \1 g! j8 w. B* S" C( r! _int GetExpValue(_Tstream& istrin, _T& nReturn){
7 D$ G: v# c6 {0 U5 Q _T t[3] = {0}; //雨中飞燕之作- B0 z* X( ^; u2 T; w! R/ q, N( A
char csym[3] = "++";
1 f- U7 J3 R, ~9 a int nLevel = 1, nERR = 0;
9 ~. K0 _' M2 O0 B if(!(istrin>>t[1]))istrin.clear();& V& G# F& w- b
for(;;){
- i, g0 N0 F' ?" _: I* o$ m if(istrin>>csym[2]){) q2 K5 ~) i! e2 F1 \& p- m
switch(csym[2]){3 N1 `3 N7 H, n: |
case '(':
* N: G! q% {, f if(!csym[1]){nLevel=0x100; nERR=1;}else
; ~& X1 s( s/ E) u0 Y( r if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 b0 d: f; x% P2 L0 |* m else{nLevel=0x100; nERR=1;}
6 K5 f) v: N* F: z6 e9 A# K- V3 { break;( T' D# v! F6 p) }' w- U/ ~# Z
case ')':
/ j9 ^2 v& v* q8 A {nLevel = 0x100;}break;# ~6 b- h' J' h6 p, y/ \9 ^" h
case '+':case '-':case '*':case '/':
- `/ U2 u9 ]( H0 d; s7 p& A {csym[nLevel++] = csym[2];}break;$ l' ~9 n7 N- s6 l& q7 F
case ' ':case '\r':case '\n':case '\t':continue;
h" ~. }9 _" h& ?7 {2 e2 X; c default:
: N8 o& I# w; Y3 P& p {nLevel=0x100; nERR=1;}$ ^5 r. t5 b! l
}
, q/ Y7 s, ?0 ~* F# ` if(nLevel==0x100)break;
% K0 p2 [4 X8 w% n8 ~- Y5 L if(nLevel&0x10 || istrin>>t[2]){
3 D: U! t( v7 f) R% e: H0 W. _ nLevel &= 0xF;
, g% y- i# I5 l& ~ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}5 F. K. M5 Q+ t' D
if(csym[1]=='*'||csym[1]=='/'){
. i: ^* Q4 b/ ~) z6 t GetExpValue(t+1, csym[1]);
. B4 x' J1 R0 J+ Y" d$ } }; I, t$ v! V) W* O* g
else{5 [9 g9 E$ X5 z/ Y! j; T
GetExpValue(t, csym[0]);
+ B. T) n% l/ D3 q5 s0 X" T t[1]=t[2];csym[0]=csym[1];csym[1]=0;
9 X4 j6 x" V. _* b# @- D( O \* b }" Q8 I% N. K0 z: X8 |4 J! v
nLevel = 1;* ^- I# W* O' q* _
}% v v9 J! f( c) T
else istrin.clear();/ _( }% D* q$ C7 k
}
9 Z* j1 U4 M- [7 N6 b else{nERR = -1; break;}
2 i- i a1 N; R+ Q" W }! ]7 }7 w2 F; `8 v
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. ^* o0 R7 H& x0 w2 D else nReturn=GetExpValue(t, csym[0]);
) d# N8 u8 t% L return nERR==-1?1:0;6 C- l" I! t* _ C6 k: ~9 L
}}
$ E0 d+ S0 P9 v
" i$ [+ h* Y+ k% J* E) W: A( K" V6 Y
8 k; ?; h% \$ l8 t% k函数模板使用示例:, ]4 O/ n1 i4 w& v
在以上那段代码的后面加上以下代码:
" G. h1 _8 c: D2 L" Y9 i
" }6 i5 {6 h! R! s& ~
. i8 O$ _1 i* X2 S9 I1 w, K
( d6 o/ Y7 z! z5 a; y8 X程序代码:
: ]% a: _6 b; g; r$ A; I- }- d5 n" E! z3 `3 N4 x) Z9 D
#include<strstream>
9 ^- e$ c$ J7 E% A1 g#include<iostream>! x6 [ D7 t2 t* v
#include<string>
/ E. a; \# I6 D4 e; _- A; n8 lusing namespace std;. U! `+ J1 B' v6 o8 B, R
int main(void)* A/ i1 [3 C9 n+ W( w
{8 R6 }5 d2 A) A4 u
string s1;
3 z+ @$ q5 i$ w( m while(cin>>s1)
& j+ M2 ~+ [- v3 _5 ~0 [" L {
9 U4 i) g- ^4 [$ o istrstream isin(s1.data());
8 l" s& Y' o: e$ N3 | double d;4 }% P" a+ C- u4 B
if(fy_Exp::GetExpValue(isin, d)), z G- H! m5 M% e% _6 ]
{8 n! g4 @# f- J1 Q) B& F
cout<<d<<endl;
' f8 c. e2 l) l }: f, V0 |0 f7 A/ G( _9 k
else
' @- B& x4 K5 q: \% T# j {2 ?, o1 P+ G$ f' h" Z' j
cout<<"ERROR"<<endl;
8 R6 T! r8 r+ q! ~* b/ L }. b3 ?& D1 \0 I. r7 D- h3 m, i
}+ x: r6 X4 Q: }
return 0;1 c! i* ?1 p+ l; @; u
}
- i9 q3 `# N, N( l( W/ n% n2 D
: A L( d7 s' d2 }! Q. X. V) [# c- R0 m3 U# w/ M6 x* p" W" _0 o
然后编译执行就可以了(*^_^*)2 h" F, u# S% S$ V
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& ]; N* `, Z# _. \, B/ Y6 h 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|