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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的," R! ^9 u) t' ~# z: ]4 ]: ^
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( J2 ^. Y2 J2 \3 \% ?; t1 F7 M6 L
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ d; q* ~" G# p" `# ]
参数解释:, K! z j" a3 Y1 y& ]. s5 F/ C
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
5 \7 ~: [+ L0 fnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 n1 {, R) w, ^+ T9 K
返回值:; Q/ W9 G- @" g3 `3 X
返回非0表示计算成功,0表示计算失败有错误
: k! [' s$ C) ^% C6 a) l
' }0 x) G% X4 C% ] . F5 t+ k! ~ w- U. o
& m, d7 E7 I# j- o; [
程序代码: 7 K6 j1 J; b9 z6 T$ U+ H/ w
0 h; o# K) t7 _- j2 E4 n
namespace fy_Exp{, L i* f( p' j. S2 h* t4 @
namespace {template <class _T>5 G! J- k' A X5 V6 ~
inline _T GetExpValue(_T t[], char& csym){
6 h$ v0 m3 ~. R0 M( c3 E/ g4 b char c=csym; csym=0;+ X8 T$ I" K4 Y
switch(c){
2 }1 d, R( Z$ y( E( |4 e* c; J case '+':return t[0] += t[1];/ R* W3 x& [) i& ^7 V( A
case '-':return t[0] -= t[1];" c: v0 X8 j' R- H
case '*':return t[0] *= t[1];
6 f7 C3 f+ m6 U) P' z( }& @ default: return t[0] /= t[1];//case '/':0 f* d. n5 J+ d! U% r r A2 q$ m4 L- \ z
}
4 [$ w4 H; J: m( |" j}}9 u' ~( s y1 e) {0 F5 K( R
template <class _T, class _Tstream>
$ j( E6 ?: c d/* _Tstream: inputstream, _T: get return value% Z6 ]- r" p$ Q& m
* Return nonzero if get value successfully */7 k, k# X9 v6 w9 C
int GetExpValue(_Tstream& istrin, _T& nReturn){9 _: {- }- s0 Z1 C+ ?6 c
_T t[3] = {0}; //雨中飞燕之作: p1 m \. i+ E8 u j
char csym[3] = "++";, N$ F( Z( N( N! m
int nLevel = 1, nERR = 0;
- T" K) [3 o1 [! j7 o" e( _+ U if(!(istrin>>t[1]))istrin.clear();9 Y: O5 Q& g. i
for(;;){
+ \ W% ?. H1 j: h8 N9 R! b if(istrin>>csym[2]){, _4 u9 ]- L7 t- I. B) |6 F
switch(csym[2]){: U/ _! ]2 R1 h$ o9 u
case '(':
" W' X. r' s0 @, i if(!csym[1]){nLevel=0x100; nERR=1;}else
8 m' t' h# f+ Z% Z if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. H7 c, n" ]3 C7 l' T6 M" B else{nLevel=0x100; nERR=1;}9 ]$ \9 e8 Q+ S/ H4 E
break;
$ D4 s1 j# O% v/ v case ')':
0 q4 l4 e) k# s9 d- U+ g. q& ^ {nLevel = 0x100;}break;
( R2 h$ W' Y9 i+ g( J case '+':case '-':case '*':case '/':# U" H4 k; m% J8 i' v
{csym[nLevel++] = csym[2];}break;' S6 s4 U9 {) B' z& z4 L0 w+ S, x( ?
case ' ':case '\r':case '\n':case '\t':continue;) ^" l5 q) _6 l% F/ o0 t6 a6 X' s
default:
5 s) W6 z; c5 e {nLevel=0x100; nERR=1;}9 ^2 U* K4 u" e+ M6 j2 T
}
8 x0 q, U, O; g) F+ [8 L& P2 I if(nLevel==0x100)break;
! h. Q! \; t# o3 a& G/ z if(nLevel&0x10 || istrin>>t[2]){, [+ I1 |/ D! T# ^) _
nLevel &= 0xF;+ d7 E2 C& T" S) b3 ]
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" X* F v, _" H if(csym[1]=='*'||csym[1]=='/'){2 |2 O& P8 D+ Z* `, z: W
GetExpValue(t+1, csym[1]);
8 `7 X) \, b" ]4 F }* D5 q) n: T5 _ p
else{1 O" H+ P9 c9 F: t& r
GetExpValue(t, csym[0]);
U$ m. f# `6 @0 ~! O! J# N; H/ P# n t[1]=t[2];csym[0]=csym[1];csym[1]=0;* E% v# E: z& `& I; @' J
}2 g; h- _- {1 m& a' e% W
nLevel = 1;+ k5 n( e) @4 D6 \8 ~. p
}
9 V' r+ f+ f8 g. P' ?5 Y else istrin.clear();' p- `) ^, W! x3 ]0 q0 s; d
}% b5 K4 H5 Q; ]. M" w6 R
else{nERR = -1; break;}
* M- ]2 b! S4 `9 k/ C }' V" h% h4 y% m+ F+ `- S- [
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ Z3 n$ n) z4 [$ ]/ u8 e else nReturn=GetExpValue(t, csym[0]);0 `. a9 ~3 W, o0 A4 r0 U
return nERR==-1?1:0;0 p& d) R6 w+ R
}}2 f' A# A9 _2 F- l
1 m6 W6 Q$ Q; t3 `/ f. ^
' P B) r% p. l2 c: v0 h* v
- _+ _, T; ?/ y9 A4 u* p6 D& t/ w
函数模板使用示例:
. D+ p N, I( m8 h _: \8 \1 _在以上那段代码的后面加上以下代码:
0 z, Y/ N% }% d5 j; f# C/ o# f. U2 S5 c* d/ k4 Z
9 \7 B d; Y, N1 r. n# x _6 |* T( W+ U2 n) ?# v2 R
程序代码: / G" k+ v: t& b
6 i h8 M8 p5 ]' ~4 E4 B4 R#include<strstream>
6 f' o% `' ^7 t6 V#include<iostream>
- M( T% I r* d8 ` v7 P#include<string>
e$ g8 j4 Y: susing namespace std;
0 s' j% b0 g$ W7 R% }int main(void)
3 h' @. w9 U& s D+ ?! _7 a{/ ?* c8 t; C7 m: C7 v$ E
string s1;6 r0 x0 h# `5 b# \) }4 N
while(cin>>s1)6 |/ d0 S: g3 h5 h' l1 b; N
{
& k- A1 q+ w& u9 ^ istrstream isin(s1.data());
) s6 P1 Y- E/ g2 @& @ double d;# m/ h8 A, f/ Y" D4 a: p
if(fy_Exp::GetExpValue(isin, d)): ?) T" B0 o6 L
{
) z& q' T2 g! S cout<<d<<endl;) N' |, r2 m) Z" G5 W) U' t0 [! f
}0 `) w/ d& F E/ n' T
else
- e9 h' A( |- r1 S {- `' X' C. [% t4 W# Q2 ^
cout<<"ERROR"<<endl;
" ?2 x9 G/ B' v6 a. d* z" ~# x1 n }
4 m# M3 c4 {6 e4 z3 v }- \) U7 E" v* _7 L$ e" o
return 0;
, U k7 C' t, Y Q}
8 @' l) k8 p5 a _6 R2 S- ?% F
* n: ?; O; w! J8 G% ^
然后编译执行就可以了(*^_^*)- Z7 i( a* y9 d# `; }9 F, y8 B7 k+ n5 l; H
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
- M+ }/ P5 m8 ~ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|