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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,/ C; I: O Q0 S, D
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式9 m- P3 ^. p# s
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# O! ~ N: y, n" g参数解释:
7 {! S) o* T( u, P. ?0 y( q% ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( w$ K; X, J& K7 Q7 tnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 Z6 q0 b& u( h
返回值:
+ b7 `, k A1 l q返回非0表示计算成功,0表示计算失败有错误
% M& P, z6 j* A& o$ F- g5 { P" N3 S; R
& F( a: N2 A2 J2 p6 T
# K( j; g0 B9 z) H程序代码: 9 L6 i0 m7 l' M" A3 f! b
. ]( R+ Y) `* mnamespace fy_Exp{+ J [5 j! ?( d6 E
namespace {template <class _T>
" j9 H n, x; C. L* A1 a4 C7 {inline _T GetExpValue(_T t[], char& csym){
7 C1 m2 V5 ~0 z/ U4 T+ I! V char c=csym; csym=0;3 J6 U' b9 P) N! v( ] \
switch(c){: q" f$ ?5 _1 o. }2 c( \
case '+':return t[0] += t[1];' M8 ^6 Y' B, i
case '-':return t[0] -= t[1];2 f) h3 q6 ^6 ]. D2 f" h
case '*':return t[0] *= t[1];' s! ~- `4 U- r: G6 q, F, c( V3 M
default: return t[0] /= t[1];//case '/':
( a+ }# t; I! ^! P }
/ t6 J6 R1 e6 s6 Z}}: P1 L' r W1 ?* G, L
template <class _T, class _Tstream>
" n9 [' Q6 A9 e' A/* _Tstream: inputstream, _T: get return value3 n S, z+ Z; b4 M" W
* Return nonzero if get value successfully */& A- `1 B& I5 S- F. c/ H
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 H% Q' q. X8 i; V4 m% z _T t[3] = {0}; //雨中飞燕之作
) d5 ?. I" D- P, v char csym[3] = "++";' m7 h5 x/ N% Y* h" @" n4 D
int nLevel = 1, nERR = 0;
; ^2 _- K, [: P9 F1 p% m if(!(istrin>>t[1]))istrin.clear();/ g( D) @$ U) z
for(;;){
2 H+ t C& v) i' d/ O" _ if(istrin>>csym[2]){* a, U y5 v# F! p2 T6 O* N4 n
switch(csym[2]){
; |) }, \1 p6 q; _( x/ w case '(': [, I2 j' R" \' d/ ~/ H8 G/ t
if(!csym[1]){nLevel=0x100; nERR=1;}else4 k9 \! W# j% ~7 M5 X
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 j: ?' @+ N# R! a0 X
else{nLevel=0x100; nERR=1;}
3 H t5 P/ W. b- I& J0 b, g break;5 }8 v# M' d5 ?! k4 N9 F' G
case ')':
' l1 o. T1 h& B0 o9 T0 t- d {nLevel = 0x100;}break;
# x7 d# M" J- i; M case '+':case '-':case '*':case '/':
% g: K w S6 W# v. y) E. J {csym[nLevel++] = csym[2];}break;9 ~! o1 `4 h' h2 `1 P
case ' ':case '\r':case '\n':case '\t':continue;0 \/ f, I+ r$ s* d6 ?2 j& k
default:1 I* r! t1 O {5 O
{nLevel=0x100; nERR=1;}: V) C/ H* t. W6 ~! [
}2 T# K% Y* o/ b( |2 J* R0 ?( ]
if(nLevel==0x100)break;- z0 H3 }9 p1 z5 K" K$ }6 N
if(nLevel&0x10 || istrin>>t[2]){
5 ?, P" k1 {* a( i- D& X9 S" C nLevel &= 0xF;4 n& \4 f" c t) j& r- R, E
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}2 R2 j6 w, C" J
if(csym[1]=='*'||csym[1]=='/'){
* r# S& U W% A. M( g& O9 O: j GetExpValue(t+1, csym[1]);* _, I+ O# B: \2 y7 X8 e6 Q
}
: M8 t0 K. Y" g/ Z5 Q9 D& R else{+ C$ [% P6 P' Q1 N; D; U7 N
GetExpValue(t, csym[0]);& S# f( f$ M- C9 P% n9 ^% U
t[1]=t[2];csym[0]=csym[1];csym[1]=0; Q. F! j0 ] N2 n" ~/ ~
}; l# g! A; r+ z, l
nLevel = 1;
* {' y7 ]7 p; A) S3 _ }
$ X( J* u- ~9 k K0 u2 J: w: n& V else istrin.clear();
: \6 I5 Y: D- F& m( [8 j }# F6 T& ~% b* q1 J! D
else{nERR = -1; break;}7 \9 I4 O, Q% K3 m
}
7 T8 [, c4 Y3 w* t5 v9 v if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 K, o5 @2 h2 K/ o5 P" C
else nReturn=GetExpValue(t, csym[0]);- {" x9 _* O* p4 X" R% ^0 R* n
return nERR==-1?1:0;
+ m+ }5 t" c; c}}" Z/ a: t* v+ s4 @0 V+ `
o/ X" P8 T T% S- f0 S
' s4 G2 Z! a! H/ S; A/ f; {0 H
+ J {% o$ b/ j( E4 A: Y: c函数模板使用示例:
9 k4 s9 X; l* Y" M在以上那段代码的后面加上以下代码:- T. p" v f7 q$ D. f" p& x5 }
^3 y0 v5 p9 U; b
" ]2 k) e: u0 }
" f0 E7 h4 n0 T! r程序代码:
, z/ G! g$ x& @# S) K: y6 S$ q) P. v J( A( H/ A
#include<strstream>* r/ T1 {+ s; V. u: r
#include<iostream>6 ~. G! K9 o9 u- Z
#include<string>$ M; O9 e( F/ C
using namespace std;8 z2 k( e1 R8 r* _; w+ V6 Z1 s
int main(void)! `# C* K7 Q6 X1 Y3 Z
{
9 Z0 w8 z5 e- e# {$ F, h- Z string s1;
, a+ \. L6 i+ K% c while(cin>>s1)1 G; K% }9 R0 m$ o/ G8 P& |
{
) P5 k; U$ H) c/ t* {8 x# _5 r istrstream isin(s1.data());0 A% ], j4 \7 @" N( v: P
double d;
' z; h. n# D* J+ l6 O, O' i! X if(fy_Exp::GetExpValue(isin, d))
# _3 ^) N8 m, P( K) t8 g2 J, J {" {2 o1 i. X+ i k
cout<<d<<endl;5 R9 K: Z% F9 U) S8 V
}0 C7 b7 g E% Q) i: D4 _7 ^# r; x
else! f3 D; \9 U! l* ~+ B8 W8 a
{
# w" n% R! R$ Z9 Q. z& ~! ?- c cout<<"ERROR"<<endl;0 o# {5 ^- g; l' c1 c6 K
}
$ u5 b, p5 C- |* c, b; m7 q }
% E6 w$ H/ A( d y! ]3 J return 0;* h* k& M) m9 q9 W- U& l
}* `, r) o8 `) T8 V
: G3 H3 V. |: D& o4 P
J; I0 I, N% w, e然后编译执行就可以了(*^_^*)# G+ N% F; m, M% Z9 H' [/ H
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
l6 I7 y9 G* B+ Z& v8 `8 p 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|