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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
4 s7 f% z: D. U6 T一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ ]' c. R/ b2 f7 k只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# K) I0 Y' I: F! v7 ]参数解释:& Q# K- n# n& H2 ]) r$ v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ j# `3 S! w3 D3 n8 h
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
7 @; L2 h7 y+ Y$ ~- d8 S3 z返回值:
9 W. M! B. s( J3 `( h; m返回非0表示计算成功,0表示计算失败有错误5 c/ V! A7 i# {7 D; W; Q
" j& H5 s+ F/ T; P ! O6 ]* |& m, }& A$ P* _
3 H5 J8 q: Q; }% S c. @7 w" E程序代码: ( ]/ W6 P! T7 H5 y& T
: C' R: |: E3 E8 x: S) Q; ~" ynamespace fy_Exp{! H- f9 }" l! }7 ^- A1 c+ z% T
namespace {template <class _T>
' z, _ z) U' I3 M+ v q1 @inline _T GetExpValue(_T t[], char& csym){2 S# r9 X- z t% ~
char c=csym; csym=0;- q) @! w" L+ c' Z
switch(c){) h; S. f$ x9 ~9 H; d4 z7 m! m
case '+':return t[0] += t[1];
+ r: o0 T) S) H* z( g1 N case '-':return t[0] -= t[1];* U; J. I/ w( D; u4 n
case '*':return t[0] *= t[1];# c& r U, C4 c, a w- G) @
default: return t[0] /= t[1];//case '/':
* R" q3 z e2 o }- z/ y" g; T# J8 R% K. m
}}
! e8 n3 z3 {+ R5 r, T( Y3 B. g$ Qtemplate <class _T, class _Tstream>
0 Z' A; h/ O P' j+ j5 }/* _Tstream: inputstream, _T: get return value
1 {+ c7 N2 u2 o1 X& ^* Return nonzero if get value successfully */
4 N. N D- x4 b+ ?int GetExpValue(_Tstream& istrin, _T& nReturn){# H. ~( B. z4 o7 d# ^2 n: _3 @4 I; J
_T t[3] = {0}; //雨中飞燕之作, g2 t4 c _% [$ i1 g% O
char csym[3] = "++";8 z9 N2 v. w4 i7 }+ r
int nLevel = 1, nERR = 0;" O& Q8 Z/ k- O6 K6 {8 I
if(!(istrin>>t[1]))istrin.clear();# j$ k; _' s+ y2 p
for(;;){: d. [. z( ^% Q9 ]) u( i; O7 i/ Z, c* S
if(istrin>>csym[2]){
- {" W' r. K! U" n8 q* O" e switch(csym[2]){ _1 O H' @' k
case '(':
/ v! B8 V; W7 Q7 l8 x4 S7 E. w @ if(!csym[1]){nLevel=0x100; nERR=1;}else w0 `+ n8 }8 I8 {2 @! C
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( W2 j9 ^& U( i8 U I. }4 }& G; K
else{nLevel=0x100; nERR=1;}
) I; w; Z" _7 v$ b. @ break;; W0 r' ~- K$ \$ F& D6 [" U
case ')':9 u: e2 ^9 a2 l! f4 I
{nLevel = 0x100;}break;
* ?; K" \) n! T! I. y0 w case '+':case '-':case '*':case '/':
/ F# S( d+ X3 c& {! _# g& i# a+ @ {csym[nLevel++] = csym[2];}break;5 }$ ~$ W J; |0 h, r( j1 A7 ?
case ' ':case '\r':case '\n':case '\t':continue;
( R7 J1 j% s* Z* `; K" \' o default:6 U B0 d- |: T. F7 h/ u
{nLevel=0x100; nERR=1;}! }# E0 a& _. O1 I$ q
}
6 b: r9 K& o$ B' l; \ if(nLevel==0x100)break;; ]0 E n# ]0 \, h* Y, r! w
if(nLevel&0x10 || istrin>>t[2]){$ ^- X/ T& |, F& A9 \3 M
nLevel &= 0xF;
( a0 |3 t9 r; r; Y4 a: q- E if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}+ G% |5 W! {; \+ C
if(csym[1]=='*'||csym[1]=='/'){- {+ ?3 |! b1 H% i- x# @( r
GetExpValue(t+1, csym[1]);
: G; k9 _5 L- K }' r5 \+ z2 q5 `) N. s* X, M
else{$ ~, K" G2 I! k* F
GetExpValue(t, csym[0]);
6 s9 U: v" F* ~& a* @ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! d$ K; X9 a# d( k3 T2 O* B( E }! P# }1 l7 x- S
nLevel = 1;
% X4 h x: w: v! m }
, s+ i2 h1 z) P else istrin.clear();
% U9 |4 k0 o4 l' Y, b }& `6 P* v6 v5 v: y! }5 s+ L
else{nERR = -1; break;}" T* b) ]% |" e7 g, m
}+ U3 ^) d5 S9 e7 C
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 H& l& H* y* c/ F3 Y5 p4 g# N else nReturn=GetExpValue(t, csym[0]);
% x \4 [$ X, i! H+ H return nERR==-1?1:0;7 N3 C' @" x$ @
}}
# ]# ~5 v# l- x# F" y/ N
2 L7 M" P& k' Z& j" p4 ^
[4 R/ X/ H/ T) {- L" c, _: Z7 D) I, s- Y r, z- V u( i: A( t9 w
函数模板使用示例:
2 \6 q0 b" V: b& A# m在以上那段代码的后面加上以下代码:
4 g8 t, ~6 d7 W/ y6 K! L; _1 l
- L9 E# U# ^9 ]7 n1 o2 T7 a 7 k( h! c3 k3 A2 Q
) `; B) C& L; F i5 J$ h
程序代码: ! _7 e* k5 o! k8 Q
1 L" v% X+ p3 S E/ z#include<strstream>
2 i1 f# [% V$ V5 N4 N#include<iostream>
* J8 V0 E7 B! X" E# `2 R#include<string>3 u5 A5 B. s t; O1 c
using namespace std;3 H4 y7 d2 A4 I# J; i2 h
int main(void)
I% R7 X! Q1 d; L( I; L* a; {! ?{( M2 G# P1 n5 k, A0 m) X+ M6 F3 W
string s1;* i/ M4 `: ^4 a" B3 E8 C
while(cin>>s1)
# N4 {+ b4 l H% M {
5 c: p+ u' U) |; X: [4 Z. r6 O istrstream isin(s1.data());% J# ~0 _) _: L/ i6 B8 Y6 Q- o
double d;
) y7 F4 |* f' f2 r3 j if(fy_Exp::GetExpValue(isin, d))
. H. Q+ l# n. @4 r( t2 f {
; X- R1 I; C! f* E( R cout<<d<<endl;) g- [) C% {. T7 | }
}7 P; p9 E7 m2 [8 l: _* S
else3 s# S6 W' I1 J, P
{# k# f5 n0 {8 ?# h* K
cout<<"ERROR"<<endl;
4 n u6 c2 u) o' z }
4 i2 W# ?* V- K. E }: n7 D/ u+ z7 u3 @1 m0 |! }
return 0;
# a1 j1 |1 Z$ o- \( Y}" m8 @4 k h9 k3 Y, a W
1 |' O( g4 |- g
+ @5 Q6 ?- ^ r9 f G. T5 q然后编译执行就可以了(*^_^*)# [; r6 s2 { ?, R$ ?: @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译1 J. k& ~8 n/ `
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|