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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,. I% m$ T, a# I* m( t. }+ Y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" b) S: [0 a: T3 q0 u; y/ [+ M# l
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 \1 Z) b2 a/ v [) Q
参数解释:) N7 x5 a, ?) X+ T! J$ S- ?8 z; C
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( _. {7 p2 N3 T! b( l) s2 nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- a$ f* C/ R$ \' }1 q Y
返回值:
4 i' D: \4 p3 o2 |返回非0表示计算成功,0表示计算失败有错误0 k, m$ O6 I# K8 E4 A( V! B1 |
: T. |* o) T1 N# o3 Z& M6 ] ( k* _9 B& K! A: s' s
, d3 G8 v2 Q5 T4 R/ e: L
程序代码: % ^# }/ W% V3 D
8 g8 r/ ~+ @* k$ y$ ynamespace fy_Exp{: h8 M. g. R/ F% g
namespace {template <class _T>
2 h$ ]# {# C3 Cinline _T GetExpValue(_T t[], char& csym){" p) E2 Y" d+ ?( Q' [
char c=csym; csym=0;9 M3 S$ |. W& t! @3 o
switch(c){0 U. ]+ h( T* ~3 ?7 W
case '+':return t[0] += t[1];! H0 u2 ?/ J" E0 v# `/ O4 L
case '-':return t[0] -= t[1];
, F; N7 |3 {% c& y; W' P: x case '*':return t[0] *= t[1];( z' {0 l8 f7 Q& A
default: return t[0] /= t[1];//case '/':8 \( x$ A3 I9 {3 l: [
}( h' F2 n* [7 E& G9 A
}}
J: p, g& C$ Otemplate <class _T, class _Tstream>
% k5 A7 v0 v- A, E4 W; c/* _Tstream: inputstream, _T: get return value
& v4 s6 O' B5 N/ t7 c* Return nonzero if get value successfully */% v7 `7 A- Q+ u: I" I3 J7 @1 ~* ~' @
int GetExpValue(_Tstream& istrin, _T& nReturn){
9 ]; N$ x: w1 ]; K& @8 i7 D _T t[3] = {0}; //雨中飞燕之作
6 Z- P: W5 S7 s char csym[3] = "++";
5 k3 C1 c# B" v7 I int nLevel = 1, nERR = 0;
; |# p& _6 r% _0 K7 |2 D if(!(istrin>>t[1]))istrin.clear();( x# U' @2 C+ E) h9 ?) `3 e
for(;;){. v% k% G( _5 t/ U+ ]- i
if(istrin>>csym[2]){, Z' ` T6 a6 k3 m! n
switch(csym[2]){
! }; K: J x' Q& f' e; W; ? case '(':
8 d0 a" _4 C6 }4 b# ? if(!csym[1]){nLevel=0x100; nERR=1;}else0 v& s- R) `7 b
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) V0 D/ ?9 G: n# i" h( |/ C. ^% F else{nLevel=0x100; nERR=1;}
9 z/ t) [" D' `2 S break;" T$ g1 \- ~7 S( B6 B! _, Q% z
case ')':
! ?7 d! O4 L" g8 ]' ^9 z# l( m {nLevel = 0x100;}break;
2 r6 x+ n/ t6 t$ F$ X case '+':case '-':case '*':case '/':
7 C3 s9 `. y8 k8 z {csym[nLevel++] = csym[2];}break;8 s3 Q3 M& H5 Z. K* t- t# E
case ' ':case '\r':case '\n':case '\t':continue;
& G. ]+ Q& j* R( w+ u3 S default:
+ T! Q. {/ M$ c8 f0 d! W% t; w0 r3 v {nLevel=0x100; nERR=1;}4 `, [) g: x4 }$ c U. [/ R
}
. z/ O: ~2 r6 d if(nLevel==0x100)break;/ s* E1 K" Z$ u, {2 X
if(nLevel&0x10 || istrin>>t[2]){
9 b( }8 Q3 {$ ]3 R nLevel &= 0xF;0 H9 d& J# e' }
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
$ e# r Q' w3 S5 q8 O, ~0 w if(csym[1]=='*'||csym[1]=='/'){5 d4 F" a- v w+ Z4 J; M1 m
GetExpValue(t+1, csym[1]);/ I* T: x/ I$ j6 K2 A' F0 V, [5 k
}: E8 H U; ?% o: y) h4 @; Z$ V
else{! p) q& E c( F1 ~0 x
GetExpValue(t, csym[0]);- u! s b2 P& f8 y- F2 U$ [. R
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# R+ t$ ^9 }8 \/ t( A0 V$ \/ h% w* j }
8 t- a" J! T/ L7 ? nLevel = 1;
, |0 ?* g% ^0 Q* v) ^7 h6 r7 j }/ }2 R( K( N$ p- U+ ]
else istrin.clear();
1 g( _, P" }* u1 a }' g- x! W: M( ~' s
else{nERR = -1; break;}" T0 d8 k( r) a5 | a
}
' y4 @! i$ O: C1 {9 Q6 C if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: h' Q- p6 U0 j8 f q else nReturn=GetExpValue(t, csym[0]);
! }* l8 e! b, x5 { return nERR==-1?1:0;3 {) N: l- D3 Y. n
}}/ y6 y7 s+ X" N- k6 m
( j; i2 H6 z7 k" n6 }" X
: `8 `/ y4 @5 a/ w3 c
. H8 ]$ a# w9 E& {+ |1 }7 ?$ |# k; M函数模板使用示例:
" q8 o! ~* G: z6 @& \# d: T9 s在以上那段代码的后面加上以下代码:
% E3 A, n( V& ?% w* I0 M5 G; a7 S
, g! V$ ^% W/ m% A! h! A! S6 `: g / U/ z) |! V: ~1 p! V7 ~$ g
$ w2 M& J7 x$ q, l R+ ?
程序代码: : J& `7 }4 R5 T9 i5 i
N' b+ Y2 {& o5 Q$ `4 Z
#include<strstream>
& f) h' O Y) o% I. |#include<iostream>% s9 D( H4 g4 w' y4 ^6 W5 H
#include<string>8 V/ C3 y& T7 e
using namespace std;
+ m& Z2 @8 m: Yint main(void): N% j1 x' d! K
{
% Z/ o! o5 h. T, ~& X3 i string s1;
0 ^- D( v; x; s' ^( P while(cin>>s1)
7 d% U+ u4 g( r8 S | {
( `% m6 i4 B% e2 b" b8 S- `) n9 f' S istrstream isin(s1.data());: J# n; Y- n6 R6 |
double d;+ ~9 a2 y& E0 `# H% A* [
if(fy_Exp::GetExpValue(isin, d))8 [3 M) ?5 t7 w: X
{2 U7 E+ H- H: C3 U" q6 i/ `
cout<<d<<endl;+ F4 U9 Z9 I8 r: c
} \ t+ A1 ^# \; G
else& h" P: m, Z+ J4 x' j x7 e
{
1 O2 d* K9 x9 i cout<<"ERROR"<<endl;
0 N5 X4 x, W$ Z5 ]& M# N } v i! q8 u( h) X. B' d" h t$ Y7 T
}* t( I& g8 ?- U# S" X& X1 ~6 l
return 0;
" J- d6 G% r. s9 u8 O8 @}0 w+ u: p3 i$ A. v+ h4 ?
7 {+ j8 C O; K: H$ B
4 N8 S' N, b' ~+ e/ _, ^然后编译执行就可以了(*^_^*)
/ \; @# s8 z/ S3 u C6 ?其它:TC++上一定编译错误,不保证在VC6上也能通过编译# e! |: S' U/ N+ e% U
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|