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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,% a" F# p' F8 T, G* e- F
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ e! y- C0 n6 i- I1 i' O9 b8 L2 X只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( G# n) P0 Y- H; O0 |" q
参数解释:
3 x f0 {: O# o8 z) u$ distrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! W- |: K& g u/ ?/ W
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定 \: G( e3 Z/ m' T+ ?" G
返回值:
3 Q1 w/ R+ q- u9 ~7 E- i- M% o# c返回非0表示计算成功,0表示计算失败有错误2 O7 X) d6 Q$ k! f
3 U3 [) x, D, v
0 ~4 W& ~& S2 C6 w" _
+ r }- i0 x$ J, q程序代码: 7 z( K4 P B v% |
' q, F. Y$ L7 d: g9 N) P+ [+ I+ }0 X
namespace fy_Exp{
; |* Z: m4 A, D6 snamespace {template <class _T>$ d' B8 F, W0 A5 Q
inline _T GetExpValue(_T t[], char& csym){5 K3 s/ B- F9 m) u0 R" F! r8 }
char c=csym; csym=0;
3 A$ T' r1 E% p- T; a switch(c){
! ^7 X6 A/ T+ U case '+':return t[0] += t[1];- q) ~/ w1 Y T! g) H i
case '-':return t[0] -= t[1];
1 B* P7 Y2 k! I* Z$ Z case '*':return t[0] *= t[1];9 @7 ^" C6 K" M. G! N+ D# U
default: return t[0] /= t[1];//case '/':
2 Z$ t4 ^0 I7 Z& ^' ]9 c }
% t0 {0 m2 _" S2 s1 K}}6 ~$ l4 [ f \) p$ {
template <class _T, class _Tstream>
7 F$ B: M* x5 R' c) W/* _Tstream: inputstream, _T: get return value- P/ \/ d4 R) `3 ~
* Return nonzero if get value successfully */& t) A! r; {) j" n9 N m
int GetExpValue(_Tstream& istrin, _T& nReturn){
. z$ \+ G/ g$ G# _) W# A7 ^ _T t[3] = {0}; //雨中飞燕之作
7 A" [2 r) x% F3 T6 q char csym[3] = "++";1 k+ R q/ t: ? ]
int nLevel = 1, nERR = 0;7 `4 ^ K- W9 y% ?: l
if(!(istrin>>t[1]))istrin.clear();
& S3 Q4 t/ Q2 F" q2 H( w for(;;){# n6 Z4 M; W0 a' y: p! x2 J
if(istrin>>csym[2]){. @' n$ f* M0 z1 {
switch(csym[2]){ b0 p# A- G7 X9 x
case '(':9 R5 q3 C( v, x3 m5 m
if(!csym[1]){nLevel=0x100; nERR=1;}else
+ Q3 {( `% j: _& M$ E1 J if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 t' M3 w& g; z# r3 L else{nLevel=0x100; nERR=1;}
0 G- {, o* b! Q4 t6 m$ M break;
& a: h: Q9 f% E; p1 H case ')':
! {. j$ i9 T, b {nLevel = 0x100;}break;
# ?* G# d. B" a3 p- L case '+':case '-':case '*':case '/':7 w+ n) P: t# K) D; M; ~9 X
{csym[nLevel++] = csym[2];}break;
1 L* m* ^" y( Q/ I7 {9 ~7 m case ' ':case '\r':case '\n':case '\t':continue;
0 ~% r. p! c+ z% ~8 I9 V default:/ ^2 u, y& j7 }/ I( C% f
{nLevel=0x100; nERR=1;}4 e( y( M. R5 h7 }" u/ o2 y9 e' B& u
}
3 G0 ^ g' X: |# t# S/ V; ~ if(nLevel==0x100)break;
! k. F% u1 Q" M if(nLevel&0x10 || istrin>>t[2]){
# ~* v0 E) ~5 O* V- a+ f" C nLevel &= 0xF;* Z: X4 Z% O9 p7 M4 j. r
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;} [3 Y9 ]3 H4 `
if(csym[1]=='*'||csym[1]=='/'){2 [% }4 R* W7 N( o$ ?0 h( ?0 o
GetExpValue(t+1, csym[1]);; r& z& T9 E" {+ ?" T$ N
}
Y# I1 l/ |# S7 B( B( u else{! @7 f1 X! N! n$ i) F' T
GetExpValue(t, csym[0]);
* A- U3 D4 N- T) {9 j) Q6 S t[1]=t[2];csym[0]=csym[1];csym[1]=0;) O4 x2 q, [# A; a, u& o7 s* r* y
}
3 [; ~5 e9 C: |- ~ nLevel = 1;
, o9 A9 g/ b: T8 Q5 Z% K }7 u7 {$ G) r4 I: ~8 C: y6 d7 @, o
else istrin.clear();
# ~# k. y/ n! K! c4 q) ~ }
' k1 ]3 d. t0 L. \( e else{nERR = -1; break;}
^% v2 L3 {$ j8 l }. f( S& U M n& T8 L
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 M+ b# A9 w5 @$ Q6 ^# L
else nReturn=GetExpValue(t, csym[0]);* a- ]4 M( I9 F1 v
return nERR==-1?1:0;
1 B, s: t1 y1 o2 Q* j2 a}}
' T9 c; E- [' B* e" V, d. z, v* O7 H8 K
/ ] A! E+ j+ v" e' r k
2 C0 k5 `( p3 K* h$ U1 X' ~. F" Y函数模板使用示例:; P7 r, H$ ?# j2 R) w
在以上那段代码的后面加上以下代码:
1 W2 T2 Z2 L' ]/ c
0 L/ p6 ~3 t# s5 S! H
5 w/ y# S8 R7 G3 p/ a
6 Y" d$ x! @& }6 Y程序代码:
5 Y$ l5 x; m# @ Z" D1 q! C& I% a8 {5 G/ E/ u% b/ ]. K
#include<strstream>/ s/ B3 B" Z* X/ D0 ?, U$ ~8 F! d
#include<iostream>
' Y' L* Y" A6 q; u$ B$ P" ]#include<string>
- b! n# f2 A; Q3 o( n0 q+ d% z% lusing namespace std;2 ^3 \2 s+ Y# b& m
int main(void)5 V5 j2 r# |2 z( Z, c
{ c- @2 ?4 T* w6 O
string s1;' x8 `2 s, t0 I3 {" J
while(cin>>s1)2 ^: @5 n. u- }) B2 W2 P% |
{
/ Q# F4 u T8 ` b* N, y5 r istrstream isin(s1.data());
( ?$ b( [6 C2 y; d5 ~+ u7 U double d;
) Z, i2 h1 x/ o& s! d if(fy_Exp::GetExpValue(isin, d))( Z) r0 i \2 Z
{# t. h- t- W4 k, C% ?( L+ E
cout<<d<<endl;
8 W- R# w [# w Q+ f4 ^+ F: X& ^% r }
) d7 X# O, N; i$ Z else6 I* N& Q; ?; T) q
{& }; y( E2 j [# A. }0 y& ]
cout<<"ERROR"<<endl;
" h8 {7 U# g1 i4 ]" K! l }; e' B7 }& e5 W- ]
}
. d4 A- V' O1 Y return 0;; v& E: E: |% f T
}3 T8 U# w* M5 R+ v5 K- k
! G3 a7 l% n K8 x
" ?) u. X/ {' v* W, h; w4 {# u( J) u然后编译执行就可以了(*^_^*)7 I1 V, A: k) h5 g9 Z; d: a
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 @ o" F3 L0 [7 @1 |6 w4 ` 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|