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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
, f/ d% p& E' f- C$ P一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ s* e+ W' L# s- [, W" P$ i
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( I/ r" X" \/ ^" R6 q参数解释:
" b( a; N5 Q6 U/ }istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 A" j# B: K: ?& F0 n/ D: ?
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' L% s5 l- i p: N
返回值:
3 m! w! q7 C$ w# w9 }, U返回非0表示计算成功,0表示计算失败有错误$ {" j' ^) ~+ n4 `0 b- {
+ c/ R3 ^7 k, N& p9 ? N8 g
" Y7 i0 H( V" t5 E
7 a7 ~- `2 S6 T程序代码:
& b: F. l$ C5 d* p; U3 b; ^0 f# o6 `, I' `; N! d
namespace fy_Exp{! R- c T4 W9 d; K0 j4 K
namespace {template <class _T>
: x3 |% W' U0 I9 L- Iinline _T GetExpValue(_T t[], char& csym){7 o3 k# V s+ R! v, \) K% [
char c=csym; csym=0;) f& t! Y3 r$ c
switch(c){9 z3 Q5 k0 y4 {% Y7 W4 V+ h8 ~
case '+':return t[0] += t[1];6 c: j9 [( Q; s8 O' |
case '-':return t[0] -= t[1];
' Y1 J" E+ t: Y$ u case '*':return t[0] *= t[1];
* T6 `. X& ~2 K( V( x default: return t[0] /= t[1];//case '/':1 O) s- w: L- s) a+ b( g' I; G! `
}% R, p& K( I2 G/ e( u) v. c7 l
}}4 v+ X3 F1 ^1 U9 D
template <class _T, class _Tstream>7 X7 m6 P) w" ^2 q! J( Y: m
/* _Tstream: inputstream, _T: get return value* i8 }1 s" s0 x1 j" h) U
* Return nonzero if get value successfully */
1 Q9 m+ x* n) O/ }int GetExpValue(_Tstream& istrin, _T& nReturn){( f8 y% P g; q8 q
_T t[3] = {0}; //雨中飞燕之作" D R6 H6 L( ^, t1 N- g+ b; x3 H
char csym[3] = "++";
; D7 b/ c8 P5 c! \. K int nLevel = 1, nERR = 0;' A' x q3 ^; u% y$ v/ c4 Z& u
if(!(istrin>>t[1]))istrin.clear();. { G6 E5 c/ R# i5 e5 a
for(;;){
$ M1 b# V( u( N' }& l if(istrin>>csym[2]){
2 C0 G* j r3 s0 a switch(csym[2]){* {* b* K/ @# [* ^$ e# b0 i
case '(':/ s0 k) O% p, p% `
if(!csym[1]){nLevel=0x100; nERR=1;}else% j! t. y) m7 ~( l
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
! M# t7 _" ?! D2 {1 e else{nLevel=0x100; nERR=1;}
! C) d; B3 \8 o: r( }9 `: x break;- J+ V T" Y' y
case ')':4 c8 o1 l# q! `; V7 b. E4 E
{nLevel = 0x100;}break;4 ?& j- l# }+ R3 q- }
case '+':case '-':case '*':case '/':
* ~) L M& v' q {csym[nLevel++] = csym[2];}break;
) F ]! v1 O3 Y5 Z3 i case ' ':case '\r':case '\n':case '\t':continue;
' h0 ^6 ~: |8 h) V7 L) O default:
* _0 Y3 @! @* R1 J- j {nLevel=0x100; nERR=1;}/ O) g5 o6 D" {, x
}; U0 q2 ^0 X5 L- ?
if(nLevel==0x100)break;
2 }. t$ o; |3 M if(nLevel&0x10 || istrin>>t[2]){
* D" w' b, I2 A: o v5 v ?- F nLevel &= 0xF;
# ?) H$ z" s( n- M. o5 A3 r if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: c; U/ E; K8 m" N+ O if(csym[1]=='*'||csym[1]=='/'){8 f( V. P3 s" Q1 F
GetExpValue(t+1, csym[1]);9 J$ m! f0 q+ f* _
}' f& Y( o. s/ k$ U- L3 F
else{
7 i* a& X7 J n- u GetExpValue(t, csym[0]);
+ _: z! q& l1 z' y# d t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 \( n, G/ J2 z# R% E2 ~0 s' ^ }
' {6 o0 I. ?# L! F* e* h, X5 |" z nLevel = 1;6 Z' M: N$ \, b! L7 l
}
. w% G. R; Y3 u' i+ t8 l6 J else istrin.clear();; o! G' k" A" w' B
}$ [+ G6 y q1 D* t4 U% a% s6 u2 R
else{nERR = -1; break;}
0 K6 r6 Y9 H) @" J/ z }5 S4 V6 |4 u1 q
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( v, G) W( b2 v5 X1 S: L8 _% l else nReturn=GetExpValue(t, csym[0]);. R6 n* G2 C3 ~1 T+ t( \
return nERR==-1?1:0;" B( v1 i+ H& L! r5 K3 s" y
}}* ^; `- F+ | ^6 w. ?0 i6 Q
% G9 r$ x0 B6 Q7 N, t) E. q
, Z$ v4 s9 Q2 U; D; T6 a y
; H7 l2 O* I! C函数模板使用示例:
2 N8 m$ \4 L6 Y4 ^) g" ?! R/ e6 t在以上那段代码的后面加上以下代码:7 G$ n" ]$ I% h6 M% D0 O
% [8 h/ ]$ r$ b- y$ m* C7 R0 O' W
" J; `! `5 j2 I- _. ~) t4 z
# E0 d8 l9 s+ r) M9 k, I! N程序代码:
% G9 Z8 V# b, A7 {! f3 A! H; `9 X$ ] l9 }$ t: ~3 z' }, @
#include<strstream>
8 ^5 c& _5 g8 a+ O) L# ^6 p% Z#include<iostream>' x# _. A5 l% p1 F' R* h% Z) |
#include<string>
2 p; t" U# D7 Q: x% r5 [using namespace std;* m- t* |8 ?1 {( n( z
int main(void)/ ]1 q' ?: D$ l% l
{
0 e& H; r4 I/ t$ G string s1;; {% G% z O$ O
while(cin>>s1)$ R" h3 |0 @- T( C4 N% } f: q
{$ r# U8 f2 V% H5 F
istrstream isin(s1.data());5 ^. s" ]9 C% t, D
double d;. |% K7 W1 _" n) j
if(fy_Exp::GetExpValue(isin, d))
5 |& H# N: c8 N9 ~6 | D; y: z+ i2 R {
% \0 ^' ~- [+ z, j$ Z" g2 B cout<<d<<endl;& j4 Y( I( b' f" X' A8 V
}# H7 m$ s. z3 E! |1 \/ K8 z
else1 M4 B- x$ x) O2 V' M9 [% P
{
- e6 y2 A! j1 R cout<<"ERROR"<<endl;
7 f" ~$ S* n" p8 M) @ I( I+ m. m }
- n ]3 d' q; H3 c0 r- u( v }
% C6 r. @! j$ r' M1 f" E# Z return 0;" O1 j9 x4 G; |, \
}
( w" K! E0 k$ @% i, f7 e9 @& w# w5 Y
) ^6 t! B* n) w
然后编译执行就可以了(*^_^*)6 G) f* W* c6 P9 k# m
其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 u: d& d# K* r* W
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|