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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,* H' f4 O" y( F7 W$ u. D0 p
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ ? V- ]& Q9 W. f- b: L/ A4 L
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 ?& j! l3 ?6 ~: y
参数解释:
5 z" g9 u- i( I: g( i* _5 |istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% p4 b V( y+ k6 _/ \2 i
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
2 I% c" P' }& v% C! C6 f/ d9 [: b返回值:
2 k* `9 R; ?; k: ~/ H1 r返回非0表示计算成功,0表示计算失败有错误
0 [# R' z2 _) V% i1 ~2 V2 S e5 g6 g' g: t) O: r
9 x3 `' K& q8 p7 e! t
% X+ p" X/ N+ S# `, R程序代码:
+ \/ Q% v! G; a2 m1 \0 y5 P+ W; e' k1 X5 x$ z9 ?
namespace fy_Exp{! _9 w) @& ?; |
namespace {template <class _T>
) y" n" w; A- }$ Iinline _T GetExpValue(_T t[], char& csym){7 K; D# ^3 k% c0 l" p& b( g
char c=csym; csym=0;
4 c4 p+ f' U2 U* O switch(c){
' R- Q" h O! q3 D( ]5 z case '+':return t[0] += t[1];
4 X4 l5 T2 r3 e" i) F case '-':return t[0] -= t[1];
8 \ J( u! J- v3 S case '*':return t[0] *= t[1];
1 q$ E! ~) D# l6 ^! f' A2 P default: return t[0] /= t[1];//case '/':' Z# f5 p1 g8 S$ d% G
}5 [8 \. b0 ~7 i& G( {' g; }
}}5 Y4 e4 ^1 ^+ s l% n
template <class _T, class _Tstream>; R' ^1 G+ ~% D) F2 i1 J- U) x8 I0 d" v
/* _Tstream: inputstream, _T: get return value% b# N. V; _6 d, ?
* Return nonzero if get value successfully */
) w7 P! g7 s. `0 ?int GetExpValue(_Tstream& istrin, _T& nReturn){
. o. K. h6 C- a3 A% U+ x( ~ _T t[3] = {0}; //雨中飞燕之作
( \" t4 n. B; L$ X! i4 Z! e7 s char csym[3] = "++";9 S$ q( v2 T L! T; x
int nLevel = 1, nERR = 0;
; X. p* V3 U% \ _, c if(!(istrin>>t[1]))istrin.clear();
: v3 N3 g( U7 ?/ V; a: ?1 u for(;;){
' r3 O- N, n5 m( e# } if(istrin>>csym[2]){
. q5 i& F6 S5 g. d. Z; e' O( k switch(csym[2]){
6 A' Y' _$ x+ f0 ^; |( Q case '(':) Q0 R" i$ f' [) G
if(!csym[1]){nLevel=0x100; nERR=1;}else
& Y( C% x% \8 P# d+ f if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: b/ }& l$ A+ I% W9 b# V else{nLevel=0x100; nERR=1;}0 D+ y( F! D% t: o' T# h' s- X
break;
, y* x5 ~6 _5 |; [' h% \" X" f case ')':
4 C: f0 c/ X7 c ? {nLevel = 0x100;}break;
2 @, A4 S& |7 h* s case '+':case '-':case '*':case '/':
9 s- P5 q# o% y3 P& S9 ~) X {csym[nLevel++] = csym[2];}break;
" C" _7 U- w" I) [: y2 q case ' ':case '\r':case '\n':case '\t':continue;+ H, s1 Q6 F2 y' a
default:
4 y8 b4 x$ z0 ^. [ {nLevel=0x100; nERR=1;}
: Y3 g n% o' ~7 v }
8 z# J+ E3 |# D) f- ]; q1 U, y0 d if(nLevel==0x100)break;
\# s& B& a; J8 E5 i if(nLevel&0x10 || istrin>>t[2]){
& `" F0 o3 l7 q' O0 ]" x nLevel &= 0xF;) r3 ]8 | ~5 ^( j3 _! |% L
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" W. K5 W9 _* z4 k8 P" ^ if(csym[1]=='*'||csym[1]=='/'){
S( i4 a" Q% H& ^) L" X, W GetExpValue(t+1, csym[1]);
3 d& D0 V V7 ?4 I( F; N }
9 Y2 a2 s- _7 ?" ^ else{
9 c! z6 j! r: f; X5 C GetExpValue(t, csym[0]);
R( I& \# S# s4 U: S4 ~, m t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 O( H% `- w0 m( Q7 ` }
( X! ~ g6 o/ y4 L nLevel = 1;
- s% }# i( z. Q' X4 M }' J) X; ~8 d. w* i7 e2 H
else istrin.clear();1 j$ J1 _8 o' a
}
* R% L, ?- \/ m+ n. Y! k. r else{nERR = -1; break;}
, m+ \# Z6 m* M! m& w0 m }
! A9 _* w; B: V3 \4 u$ [ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 v# H/ r6 |- R# b else nReturn=GetExpValue(t, csym[0]);
" E9 P7 ^; d G+ _* D return nERR==-1?1:0;! @" f8 E4 N( m& d7 k% M& v' H
}}4 c- t1 U/ B" z+ C! s# L
: R3 g) P9 u/ c9 y2 h
1 _/ @6 a8 J3 T5 ?$ j/ _3 B/ U
# a7 ?5 x& T9 n! W. M7 d; U8 d函数模板使用示例:
$ p) U% u9 g' H( ?: B/ m9 o; A) S在以上那段代码的后面加上以下代码:
. d' f6 @7 X3 A( D6 g, z; h& X( H _, K; t. ^
" K. T/ k+ [, _* J1 q5 K: z# e
. Z6 T5 _; U$ b# y$ w0 I/ H1 Z
程序代码:
) X4 M, ~% o2 @* q+ f6 N
8 C9 a8 n6 u: |+ B+ _# u0 N#include<strstream>
4 T* P1 Z; k `/ @; g#include<iostream>5 N5 m" o4 |/ t* c: u
#include<string>
. }5 A$ D/ [ g1 u* [8 ^- Pusing namespace std;
, g% A4 N) j& [" |* F" u" hint main(void)
5 v% L: z# \1 O9 t A _3 u{
8 S. [4 \* L# _0 {- t# L& | string s1;8 M5 T; B. \9 U" O6 M. f W- W. m
while(cin>>s1)6 N, l Q) l) ~0 ?; B' `
{! @" r! l8 ?$ q0 @6 m1 N
istrstream isin(s1.data());
$ W6 f K- c$ u& b6 C/ j. K3 l double d;
( d% N9 X8 J0 Z: H/ U: O7 D; q if(fy_Exp::GetExpValue(isin, d))
, ^; E7 `& d, K1 A) W% Z; c$ C" F {
2 A" [7 @8 E) X- f8 F cout<<d<<endl;
" S: E% ^+ u- r& a% Z6 K" q: | }
- S, V) m/ t+ l2 i else' R1 n% ^- J0 k1 l
{
, T% c& ?( R; x0 L0 q cout<<"ERROR"<<endl;* X; b9 a. {" k
}( {. S2 C, C6 P0 J
}
8 u5 l8 h* z6 o& x. e. a, }$ a return 0;
# U* W) b. C' V9 {4 W}; s, u8 E- n/ g. Z
4 S- L' i, c" H' c/ Z$ N# |! d7 l- q
然后编译执行就可以了(*^_^*)
5 l- V; ^7 x/ r6 i' N! R+ T5 E2 x其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 Q, [' W) \7 C: d" U 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|