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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
) Y" J0 Y9 t2 T. J一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 V# B+ m! A8 i只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: X! o1 [, B8 W* H, i4 ~参数解释:
0 K2 ~( R2 C6 E2 x/ ?9 zistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 D, Q' F3 W$ Y7 P, m4 X, K5 I
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! H3 z& n/ {: K8 o& z. y/ x
返回值:7 k8 Z( m) t, l+ Y2 e# W4 G2 e
返回非0表示计算成功,0表示计算失败有错误
8 l4 b: @" O- y D
2 z3 d l5 z7 o% H0 I 5 T5 v$ U( _* N. L% R" {; b/ Y
3 [* ]' t, S2 p h程序代码:
, ~$ ~# c, I |2 D* x$ _2 R
! t: A2 J4 W+ B; y( O9 L3 V5 rnamespace fy_Exp{7 {3 i* |- S) d& N" v
namespace {template <class _T>
' u4 _, ?* l8 e4 Jinline _T GetExpValue(_T t[], char& csym){+ C/ H( h" c1 l" x h$ {3 ^2 K/ F
char c=csym; csym=0;
7 K+ b1 A1 ~% A' l switch(c){
- B/ _; f8 z% s+ h case '+':return t[0] += t[1];( Y; L7 D9 v" t9 B# Y& k; E
case '-':return t[0] -= t[1];
3 [; C, s( ` |% y case '*':return t[0] *= t[1];
7 D0 K0 t6 y$ o& `1 X default: return t[0] /= t[1];//case '/':
$ Y" i9 r) o: ~ }) |( j/ W b |( M- X/ l8 I
}}
+ i) V; W/ U3 z/ ]template <class _T, class _Tstream>
8 R8 l1 q/ D, b1 u4 G4 Z5 ~/* _Tstream: inputstream, _T: get return value
% S2 o* P, Z4 F; b6 g5 J* Return nonzero if get value successfully */
) D) s f! I& M; I9 Y' \# w# Iint GetExpValue(_Tstream& istrin, _T& nReturn){
' w/ y1 n. m' w8 D- w& P _T t[3] = {0}; //雨中飞燕之作
7 a+ |4 g7 n e; k+ U7 m) q; s char csym[3] = "++";
+ D. D, {, q" S" V5 s" |: T int nLevel = 1, nERR = 0;
: t& t }$ S3 t9 z& @5 l, p if(!(istrin>>t[1]))istrin.clear();
* `! \! l Z- g b% I) v for(;;){
0 R) I7 N: V# _! U+ \3 U$ I- d if(istrin>>csym[2]){
- _9 n1 y, d- E switch(csym[2]){2 P7 d5 E( i( H& t/ ^* g
case '(':, t: n: Y- W: b5 {, o- g
if(!csym[1]){nLevel=0x100; nERR=1;}else
- i! G, }; m0 D7 y. O5 R6 d$ | if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; D% m0 F" R$ \2 t1 Q5 v
else{nLevel=0x100; nERR=1;}4 E* c- _/ z y7 h# d( p6 W
break;
9 U. A& F" P0 ]" Z& y& M7 T case ')':7 F6 t9 {2 D, [2 H) }* p: G
{nLevel = 0x100;}break;
: S4 S& w) V3 d( K | case '+':case '-':case '*':case '/':
. s8 H1 o8 f5 G: n {csym[nLevel++] = csym[2];}break;4 V @/ D! n* |
case ' ':case '\r':case '\n':case '\t':continue;
( H& ?9 L, a' h+ U9 X1 h# x default:
2 P- `$ q; `! D* g% ? {nLevel=0x100; nERR=1;}
6 z/ ?3 r9 e0 j5 d$ w5 p8 _ }0 w% p) ~8 ^% s
if(nLevel==0x100)break;
! Z2 f0 [3 H& _1 a2 Z& q9 E! }& L' P. k6 w if(nLevel&0x10 || istrin>>t[2]){
2 l6 Y1 v4 }2 x nLevel &= 0xF;2 i- V: B3 O v
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
* @" g+ L- v% @7 x* V if(csym[1]=='*'||csym[1]=='/'){# D4 W! x* D j+ o& H. l& `* ~) e
GetExpValue(t+1, csym[1]);; g; p, b( J4 X
}' Y3 P2 D1 i6 `. E' V# D
else{
: h Y- G" r3 L- R. l GetExpValue(t, csym[0]);$ K1 S) N. K& I: Y1 A8 G, ?
t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 K1 y1 p c2 S' y
}
5 V5 ~. k8 c- I2 X' d+ F4 X4 ]& Q nLevel = 1;7 z* ?1 E7 @ K( i! c
}
, W- Y( P; C- h% n) V' }, b( H0 g else istrin.clear();
6 T: s9 c9 i) t. x }
' w, ~4 W8 Q( x* A2 C else{nERR = -1; break;}
5 j8 t% n. X+ F" N6 l [) U8 D }$ k, a7 N/ I- @& W, T: z
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ g9 A7 L) I( C0 { else nReturn=GetExpValue(t, csym[0]);8 r' I) a4 \+ M$ J1 l; k2 o
return nERR==-1?1:0;; O& z" P! ?: d( m3 \
}}& c Q L& m/ Z7 p( Z" h( x
2 d, }) o" Z4 R6 t
8 b9 l& ?- B# l' R0 J! i5 `$ y* Z) Y# R% U0 J# G! d1 F
函数模板使用示例:
: k+ r$ P( C( V0 @& p在以上那段代码的后面加上以下代码:
" e# a' u1 F: K8 k% B/ `& b# p
; ?( g" |0 p# Y3 A- z! k0 ^, O0 c
+ U( P# M, p" S3 [7 |
0 T9 P' y% ]( X. |0 r! i程序代码:
( ^, R; P L$ s- Z/ \/ W2 p& X2 q5 \( N1 d9 f% g/ ~" o% B4 H
#include<strstream>+ }. {2 M) j& N" S; n% I
#include<iostream>
. t0 P/ ~: k. u% L0 q, o: M#include<string>. L3 r0 x- y, |+ Z
using namespace std;4 I4 \: L F( L
int main(void)7 R, X. A- W2 }5 A1 f9 j
{0 X( L! U; F, E# p% @! {/ T6 A6 g
string s1;; T( o5 c g3 ]' z. ]: v4 o
while(cin>>s1)
: {/ s; e. l7 _0 @2 \, t) W {! @/ Q7 c0 a; H ]9 \; I
istrstream isin(s1.data());
( r9 K0 U5 L8 F3 V$ Q5 k& H double d;7 u" E3 F7 q* f- Z/ [
if(fy_Exp::GetExpValue(isin, d)) V4 l& I' F; M* N( d
{
2 A8 n) {8 V, S* X9 z cout<<d<<endl;
8 M/ y* {7 U. |3 Z w$ y' { }
, ^3 q8 r2 c: n) M/ G+ z3 H5 d8 H else x# c4 y. `! P/ ?
{
. o, B' b! [: v cout<<"ERROR"<<endl;- q t) t; |4 s% {: {
}
) i4 Z6 D% U# E1 I7 |5 U k }. R" N; h' B2 O# w- v
return 0;
% q8 i1 }3 w( u* P- [}
' S2 t- O' `( h# M% T9 d0 C* \8 Y: v3 p, g! m5 E! H
0 T9 n, f, u$ _& R然后编译执行就可以了(*^_^*)
- m4 i+ e' ~* {& j3 [其它:TC++上一定编译错误,不保证在VC6上也能通过编译& X V/ [; D+ S
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|