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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,2 V% q) ~7 T: |0 K# z e1 k
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式. ?( B7 }+ Q4 M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& ^, t- [- x" ]4 Y参数解释:
2 B0 G. _+ e/ Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
, F* K# P+ z6 V2 L; x: j# ?nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 T/ V" I8 }. G3 f
返回值:( n" O0 V9 f; R9 _. v# p
返回非0表示计算成功,0表示计算失败有错误1 E6 [6 `- e1 F
( o2 E8 C2 u2 n# u) Q1 g/ R" ?# r- N$ Z
" u3 q# v5 l, Z) r4 L! y ]
* u* j1 g: F+ W% B3 ~% k程序代码:
' t* }3 O( O4 G5 h; p7 T- i! ? S; K3 b1 v2 a5 U: d* w+ [( q
namespace fy_Exp{
9 _5 a% m5 |2 o" S5 cnamespace {template <class _T>* O' d* ^- M" I) P6 T% R1 w; d
inline _T GetExpValue(_T t[], char& csym){
) c; r9 p. H( Y% M+ ^ char c=csym; csym=0;
1 F8 n, H+ x5 X2 I- ~# ]- w Q, N9 @ switch(c){
; p" w; `1 g( U# F$ a case '+':return t[0] += t[1];
$ ]6 q1 Q# g* `+ M4 D* b case '-':return t[0] -= t[1];
& r4 z6 [2 f* t case '*':return t[0] *= t[1];
. g! N/ Z ~' K3 t default: return t[0] /= t[1];//case '/':" _2 H' j+ g( H5 e- l" x
}
' b% O$ o0 W/ I7 o3 o* f; C) A}}; P* G2 i- p1 k0 k+ c# m
template <class _T, class _Tstream>3 F: O. K* F, e/ \" D1 N
/* _Tstream: inputstream, _T: get return value! { W( C8 g3 I. k" u
* Return nonzero if get value successfully */
5 W: r( l1 P8 Y* u6 o- fint GetExpValue(_Tstream& istrin, _T& nReturn){
+ G- _" M; q, d" Q, G2 D _T t[3] = {0}; //雨中飞燕之作7 E& ?0 W" H4 U% ~
char csym[3] = "++";; a* p7 X, x) S0 `5 }; Q
int nLevel = 1, nERR = 0;
6 v2 n# \8 N$ u3 ]: Z if(!(istrin>>t[1]))istrin.clear();4 O( [6 ^! O7 d
for(;;){
" E& Q# ]9 d4 d& G+ A3 ?/ O& e& S if(istrin>>csym[2]){! a, o# F/ _ F8 }5 j. D
switch(csym[2]){8 b k7 j4 t/ P2 K- ]7 ^6 W
case '(':
- W: O: F" T2 D- V V6 S if(!csym[1]){nLevel=0x100; nERR=1;}else+ p/ H: d8 c, R2 ?9 Q- `% l8 ?
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
4 Y5 s4 f# @+ l+ ~8 i else{nLevel=0x100; nERR=1;}
# Q6 L! ]. C. s5 T8 G j) B3 ` break;
, ~8 x* @+ d7 c& q. G* e case ')':1 Z* ?2 m0 S: S
{nLevel = 0x100;}break;, C1 s5 G, X0 k9 M; w4 I8 b/ ?
case '+':case '-':case '*':case '/':" D4 `1 L' |; O/ E* t
{csym[nLevel++] = csym[2];}break;; F4 J0 n) t+ L3 Z7 h7 U
case ' ':case '\r':case '\n':case '\t':continue;
3 V# M/ t1 j9 q; U$ P default:8 {9 n% \9 M$ @: ~1 D2 p
{nLevel=0x100; nERR=1;}: t8 N2 a4 H( E6 [7 T
}
2 [* m) y" ?9 p! Q: ]# D if(nLevel==0x100)break;* i3 D8 [. D& d4 O* I1 C9 j; J- v! u5 i
if(nLevel&0x10 || istrin>>t[2]){
6 t8 L, z" |" V9 {! [' F6 H nLevel &= 0xF;3 ^3 r' ^# S4 V) s8 D7 B8 T
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}2 N# V- X7 r) B, p, o$ [
if(csym[1]=='*'||csym[1]=='/'){( m n) H7 H( O; u: ]
GetExpValue(t+1, csym[1]);
- d- y6 u* g1 X( s0 r }
3 {' H1 g) `1 C& f+ G else{6 R6 b7 C1 e# c9 h4 E( D+ \7 f$ b
GetExpValue(t, csym[0]);
; [# H- {" W( z2 ~3 O/ G t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ C: Y% \6 o4 x4 \( f }
$ @9 p% `& R6 k( w5 a nLevel = 1;2 X" @( A% E; l3 L
}
" x: _8 L1 g+ o& |# C& @ else istrin.clear();: p X, E3 i1 M
}7 H2 L* ~# |( O: t3 \
else{nERR = -1; break;}; p1 i1 a7 V% B9 t* n% n, o+ H
}
! Z' u. s L( h8 r' ^0 n, f if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 W# O* Y9 Q( ]# g. ~0 q1 a" e
else nReturn=GetExpValue(t, csym[0]);8 \( H2 W4 W0 J H* }
return nERR==-1?1:0;+ n- s* ]* ~; Q$ Y
}}: B/ s1 @5 q( o* h
& c6 i+ ~4 t6 N$ |
/ K1 M5 w9 Y8 u4 h# R2 K' ~/ z; I
" c! R7 j2 |% m% m: X) ]# V函数模板使用示例:" B& Q2 X4 H/ |7 |
在以上那段代码的后面加上以下代码:$ w3 _6 [3 d# S
: z/ d) i- T" U, O
% `* a$ f) ^- r `
: w) }: E1 ^1 C5 Z程序代码:
0 {; }7 M$ P0 l
: I$ K* F j" i#include<strstream>3 }- ` I& c' m, i R! `
#include<iostream>! q4 q0 f! T/ b/ @! N, h9 ~# g9 d. J
#include<string>: X0 f! j5 m& x* d
using namespace std;7 h# U1 {- w( j8 n0 I6 N
int main(void)
0 w/ A' h! l/ w: l, K" o{2 |/ O1 o7 H; R) J
string s1;
% M* ~8 V, |* q; r/ \- }, h+ H while(cin>>s1); \5 A: P P Z+ ]
{2 x7 l3 W, H2 u, H# d1 s
istrstream isin(s1.data());' s: h. {7 k. q& o {) C4 [
double d;0 p" |( r& o' P6 n
if(fy_Exp::GetExpValue(isin, d))
1 w- r$ b: t2 j {2 j' l7 u+ [" d
cout<<d<<endl;
8 k' e3 ?7 k. D# B2 h) } }) n9 p) G5 f1 m! W
else" t2 j+ L& Z. I# A& [
{+ x/ Z& v2 ?5 E( D
cout<<"ERROR"<<endl;7 T' v9 x9 @4 {5 _6 v3 ~
}
3 N5 g6 ?) Z1 x' a }
7 l f' |+ g8 f' W( m return 0;
) _: t( Y6 N" a( X9 q# M/ v}
5 r( i4 g$ r# A- t9 o- w* q! _; s" s2 U$ ?& h$ x' L$ j
2 a% m3 d" u$ [. V
然后编译执行就可以了(*^_^*)
/ E C& M' ?% k r0 Z! Y其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! ]$ h# ~* F, t2 g8 W 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|