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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,- P8 N: {2 `2 D2 ^7 i
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 ?( b# u4 J: b% Y4 i0 E
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): o2 o: U$ C' X3 T' ?6 l5 G
参数解释:
$ {& Z* a9 \. r5 t! tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; t3 x( f; s' U+ B6 a0 YnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ R" ` v+ x/ O6 P, Q返回值:" U7 h, g/ T' ^: f- n! A, B# }
返回非0表示计算成功,0表示计算失败有错误. U/ t) W: |+ q* x
! Q. y$ C" W3 R1 o 6 n" S- O+ z& L9 U! b/ k
H! T3 f4 _; k! o. D z9 B% n: m
程序代码: 6 z# O1 h, ~+ \
8 R2 _0 ^0 M+ O! T) f; j% Bnamespace fy_Exp{1 Y4 ~' x! K7 |% |
namespace {template <class _T>8 C3 H) K9 K- `. v, r
inline _T GetExpValue(_T t[], char& csym){9 \" R, e. e% v F& j# e( a, S
char c=csym; csym=0;
; v2 Q( P3 c% u6 V" p- R; F switch(c){& |7 m+ p2 x! c6 j1 C
case '+':return t[0] += t[1];
' ?1 S; `% K6 `% Y case '-':return t[0] -= t[1];
0 k8 P" W( L; L8 k/ W case '*':return t[0] *= t[1];8 l8 l3 i7 y# ~8 v% J, m+ g
default: return t[0] /= t[1];//case '/':' d$ W: y2 E7 z c" I* `9 B
}( s! ^; |' F$ [- G: r3 r0 y3 \8 z
}}
0 L: S! K/ p, ~! B) ntemplate <class _T, class _Tstream>
# C" w( `' h5 T. @5 c# F/* _Tstream: inputstream, _T: get return value- ]& S8 m. L; a0 t8 V
* Return nonzero if get value successfully */; R# t0 d! a% o0 ^, w
int GetExpValue(_Tstream& istrin, _T& nReturn){
: z3 o- U3 Z* ~5 x. ~& q8 Z } _T t[3] = {0}; //雨中飞燕之作& v7 f3 D6 n) R
char csym[3] = "++";' \5 ~) Y8 P* Q4 _
int nLevel = 1, nERR = 0;
1 s& n, x$ F& [ if(!(istrin>>t[1]))istrin.clear();
$ Y0 {& y6 I+ i" f0 I, |) e3 y for(;;){' p7 W0 v+ E% d# Y: V# n
if(istrin>>csym[2]){) q3 O+ H% h1 X4 n: i
switch(csym[2]){
! |2 P) ?1 d; Q0 U case '(':
B7 [3 e# \. C, E6 Q! p3 g if(!csym[1]){nLevel=0x100; nERR=1;}else$ t. m: e" \! L" {, T0 E
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 K5 w* t! r5 a# n else{nLevel=0x100; nERR=1;}6 ]) J1 ]$ U" y% x; B3 a1 n
break;
' W: R$ o* X$ k3 t: r5 @$ p" l case ')':
) o) g9 j U$ R/ \- W1 z3 l {nLevel = 0x100;}break;
- r7 ~& r1 I( U+ P. G# p% P$ S case '+':case '-':case '*':case '/':
, f& @/ c- C5 ] {csym[nLevel++] = csym[2];}break;/ v" D9 X, f3 }
case ' ':case '\r':case '\n':case '\t':continue;* O% }* X$ K7 t3 O4 w: _, q$ F v
default:
8 t& w1 P( s- U% o, ?* F) D* Q$ r) |( A$ h {nLevel=0x100; nERR=1;}
c0 M5 T; |9 x' T }9 I% W/ I( e0 F2 \
if(nLevel==0x100)break;- z' w# f" r+ t+ ]( n: c2 m* q5 ~
if(nLevel&0x10 || istrin>>t[2]){& K8 t# b& x$ j4 f6 N2 l1 r
nLevel &= 0xF;2 t* A- O, ^$ e2 |$ ^+ k6 `/ `
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# }9 Y6 h% c ?/ d if(csym[1]=='*'||csym[1]=='/'){
3 d( H" \) ~ W1 L m2 A GetExpValue(t+1, csym[1]);% m3 M& d2 Y0 n; f+ K. y' N
}
% j. R3 y# |, }9 [ else{
' ~4 y8 ^7 ~0 L/ r, n GetExpValue(t, csym[0]);: F1 E" ~. z- m/ B0 [5 [
t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ d! Y4 |4 [5 {" O; w" x. }8 _0 k
}+ E% J1 h0 c4 F" M: W
nLevel = 1;* h2 b# z3 x$ F( a
}
, [2 X7 A0 j( r8 z- E* L* [ else istrin.clear();
% ?9 P8 n2 n& D1 N) H/ w }
+ w! f$ _& M, i else{nERR = -1; break;}" S2 X0 M, a8 |- g6 y1 l9 x, z: Z
}
! U& D# e- p/ k" [/ s if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 `$ z+ M- }8 ~2 ]- z% Y4 P% E6 B
else nReturn=GetExpValue(t, csym[0]);9 l: W0 f! Q6 S
return nERR==-1?1:0;
3 z2 B7 S6 o8 W) f}}. R' R# ?( I$ d5 i' b3 ^6 d
. {. Y4 Y8 Y% m4 Z# d; W' M
3 x+ e9 J* J: `! {1 v4 m- d/ d; I5 k$ {8 F
函数模板使用示例:/ V3 S: c! p- Q; ~3 {
在以上那段代码的后面加上以下代码:
; [1 O: O$ C9 A( x7 G) l
. L( n) W( w ?" y
( a$ b+ @# y2 n* O: Y1 H0 K2 Q5 ]& ^/ x" V( X8 j& O+ C
程序代码: ( g* N3 ]% F) d$ r$ \7 d
6 F) ^/ o' B7 J, E& Q#include<strstream>' N# Y* N: O' W9 K( Q
#include<iostream>
5 D. ?0 O: V9 v2 J2 @" w#include<string># o1 p4 ^! s# j) w3 L
using namespace std;- d3 `* X |1 i
int main(void)
, x# f. v3 ^5 n7 _5 a{* ?3 o/ {, D- ^* B9 N, B# a
string s1;; J$ D3 J% R! V8 |$ L1 K
while(cin>>s1)
/ Y2 E3 E% V0 d" {# N" d! u B( x+ O {
- o. z- H* `) t# I2 V1 @ istrstream isin(s1.data());
5 M) n, v6 o; }( G, l3 S double d;
' d# u" `. H9 P( J2 }( ~# U- A' @5 I2 \ if(fy_Exp::GetExpValue(isin, d))0 d7 n: x# P& x& B) E& _5 k) z$ _
{
& x% Z$ d& J$ i- j9 c- B+ t" \ cout<<d<<endl;
. V: ^' }* s7 x, F$ }* [" ] }
& u$ e8 N. {) P+ g1 \ else
0 K( |* K# e9 L4 |. ~- H {6 Y2 W, e, X8 d; w' b
cout<<"ERROR"<<endl;
4 ~% G, \& a8 f$ y3 R }5 ^1 r2 }7 X7 Y/ \
}
" G* _ m) C' w return 0;
! N) C/ @$ U/ O. G! J& r& d4 Q}
# O7 a( z7 s0 c: h. z5 G0 U( G. |
0 N; y% o$ \: u( W# B9 _/ T; ^* j然后编译执行就可以了(*^_^*)
2 f" z# `. E% r: d其它:TC++上一定编译错误,不保证在VC6上也能通过编译
0 A/ I5 a! [% T 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|