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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的, g v& h9 B3 V
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- G4 F/ M, G% o8 O7 o8 m/ ?
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- U/ b6 A% b- ^6 h3 r9 x) K: r
参数解释:
S0 I. u, C* [0 R4 l8 {( B, H! [istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 F. R$ \/ z, |5 l: Z% E( A
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. T5 t# T% p; a8 b; L5 f
返回值:
# m4 Q, Y, i0 }/ `! h返回非0表示计算成功,0表示计算失败有错误% L. J; S8 ~0 j: m
) c! J! ^/ W# s' S, a1 \
1 ~6 f' g6 s* @9 _6 F; @5 _! z/ ~) R0 T( [. c9 z- a8 p% [8 s2 X
程序代码: ) _) w7 o" i- h; x; I
. F& e* R+ v: I/ Ynamespace fy_Exp{, \; }# I; p) T4 d) {
namespace {template <class _T>- T; k& |- O @1 L3 u' d9 Y9 _" z
inline _T GetExpValue(_T t[], char& csym){. g; W* [- H& y( n
char c=csym; csym=0;
6 q1 Q) t0 E% s switch(c){2 L; w; v! W& W" |* C4 e2 B/ a. B W
case '+':return t[0] += t[1];
6 x9 n0 G4 i5 e$ v! ^# ?$ v case '-':return t[0] -= t[1];
6 ~8 w | s' V! A5 p, g' d/ v case '*':return t[0] *= t[1];8 K, J$ T, b2 z8 B$ X/ u$ C
default: return t[0] /= t[1];//case '/':
2 Q2 g9 n1 E3 g: S# _! T }
% E+ ]% `) Q" ^3 F( S$ [}}
- g3 C% M! ]7 U3 [* @template <class _T, class _Tstream>
! q- ?% T1 G% n" L% [/* _Tstream: inputstream, _T: get return value7 ~$ A( f j% Z# w2 w1 |) a! a
* Return nonzero if get value successfully */8 P! x& e! @: H d3 J7 x# U
int GetExpValue(_Tstream& istrin, _T& nReturn){
3 v9 b- j# H7 K' f/ S _T t[3] = {0}; //雨中飞燕之作
: Z- h k5 K0 v4 a# z6 s, [ char csym[3] = "++";
$ J, w" S7 k& g' L1 e int nLevel = 1, nERR = 0;
+ L- ~, u% Q5 b, v* { if(!(istrin>>t[1]))istrin.clear();
+ H! I3 p# ?1 y6 b4 b: { for(;;){- D: l: T9 @, I% [& L; @
if(istrin>>csym[2]){
4 x2 W. Z; q4 X# |" W" b) n& Z( _ switch(csym[2]){$ B9 g4 Z" c! |+ z
case '(':
4 d+ Z* B. t& n+ z, C* _ if(!csym[1]){nLevel=0x100; nERR=1;}else
: r6 V/ [: M& L) n- f if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 _0 m4 k) \) V" X3 q ?5 J else{nLevel=0x100; nERR=1;}, |) V( m$ ?2 v+ ^1 f6 P
break;
8 G: P$ x% R; d( ~1 C$ K case ')':: @& ?) d6 h9 \( W
{nLevel = 0x100;}break;7 `5 F/ K+ \4 V9 S* Z5 X$ A
case '+':case '-':case '*':case '/':# J* M2 s; x3 U* c' g5 C1 u+ f, O
{csym[nLevel++] = csym[2];}break;
- {) n9 P1 R$ p3 A4 R, H case ' ':case '\r':case '\n':case '\t':continue;
4 b( h2 `, H* X7 {7 r2 S& t default:
% T* V- r* Y& r {nLevel=0x100; nERR=1;}' U: b& ^; C* `
}
6 P3 @6 [3 _% |' h0 R: l if(nLevel==0x100)break; u6 j, f6 N, a0 v0 a% Z
if(nLevel&0x10 || istrin>>t[2]){
* Y, a# I- K- c8 w% z( q) ~ nLevel &= 0xF;
, [% n! Q' x7 }8 \( c8 i if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; f4 u' c; h8 q' ^2 B if(csym[1]=='*'||csym[1]=='/'){
M3 x8 l3 z) q# S GetExpValue(t+1, csym[1]);8 Z& I, w3 j! C; }2 {4 Q
}
" \2 P x0 C# b* [ else{
! ~$ A0 L3 F2 e8 p l( s GetExpValue(t, csym[0]);
% A8 @1 m0 V' Z) ~ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 ]) N9 g+ t: R }4 I/ h* y7 Y8 i3 i) C
nLevel = 1;
m0 y+ F9 K" F/ L }9 m6 C7 W" {5 V& Q# L
else istrin.clear();, G/ [9 V2 F# f& o
}
' d8 c2 k7 S ?. N else{nERR = -1; break;}% L) g/ Y$ u" m
}
, @1 {% K( n$ s* s! c" b9 } if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 h) l; q+ f! M) ~ else nReturn=GetExpValue(t, csym[0]);- }% {# v6 z% ]: }8 o8 C* |' w9 m
return nERR==-1?1:0;
7 K4 @) u' ~8 \+ Y! i/ D4 j# c) V}}& b; _- t' i4 N4 z _) @/ W
% e, S8 u) k& V* A2 b- i' L7 H5 s$ G* w5 M& D! V
9 f. c8 a l% E w: F函数模板使用示例:3 g- `) N E: i! d* P' l
在以上那段代码的后面加上以下代码:% O8 O% ~) d; q4 D) |8 T7 B
8 R5 E9 ^# X+ G, I, F3 R* |+ F& |) ~
! ^% L* t1 U/ _) W9 A
$ i2 f# U8 ?9 h+ }4 X/ e程序代码: , \. e9 s' q) H6 D' A) C
4 Z2 s! {9 }* J: n#include<strstream>
* d9 g. G& B& I @#include<iostream>
! u, h, N# t! P! Q1 G, ]#include<string>
! `6 b3 b1 V9 kusing namespace std;3 k% ~ c4 v/ Q# L& k( B
int main(void)
$ U5 s5 o8 `0 q! C9 P J/ j; U' T4 R6 J{6 G& n7 l& w1 \$ ~
string s1;
, U6 a2 t; i) S) j8 f) T3 R while(cin>>s1)
7 V( K! b) N+ y- ~ {( M1 }0 J; K& B
istrstream isin(s1.data()); V D- y$ G- v3 D0 P, H9 L' F
double d;0 }: y4 `- Q5 s9 |- v6 A
if(fy_Exp::GetExpValue(isin, d))+ y! {1 D) H+ o( P! S
{
; ]' G2 W* J0 V' y; S. w cout<<d<<endl;
# q$ J& i# a5 D8 W3 u! q }" v! f5 d" U# F4 Z, ^7 i
else
0 n7 j( D( E1 N& r6 M; k; l {
" \/ z3 z3 A/ |; Y+ ] cout<<"ERROR"<<endl;6 s0 y+ C' N4 `0 A2 V8 m
}
3 e1 K* s: n/ |* c, `: w }
" B2 T" H+ b% b: k p return 0;
r3 c! V& o6 v6 U. U' B# [& ~}
& v7 d" i1 P( u/ f$ c' p3 ^; b) m! k; ^0 } m Z# j! k
. A3 D5 ]4 H l1 c
然后编译执行就可以了(*^_^*)
& ?4 I0 ~7 P% L+ t其它:TC++上一定编译错误,不保证在VC6上也能通过编译0 v: t; P8 ~& @
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|