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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
Q1 H, l2 R' w1 V; D$ P一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, S4 R% X9 _! K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 C) }6 ?' l3 w7 t+ V! `- k
参数解释:
7 N# D0 o7 ]6 X+ ^& o" B' R: fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流# U7 B; G# `' z" u _! `
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! G, U; a) L0 n/ U0 v# h- d" N; H
返回值:
0 Q" q8 p" u4 n/ w* z! q返回非0表示计算成功,0表示计算失败有错误
/ }8 ^% z2 \' ^4 U/ k4 w3 F# O4 B" e8 Y# y
: a+ l% P8 R P% A6 _7 `
* r& j$ y* _8 F2 i/ g程序代码: 5 o6 }* q) @- y; ]: u& K- S n
( ], w6 L( ~( F% g" C
namespace fy_Exp{$ y% x0 C% d# |1 o
namespace {template <class _T>
" D# i1 b9 R/ Q; `; binline _T GetExpValue(_T t[], char& csym){
0 I1 w4 {& H j: A5 B" M char c=csym; csym=0;
9 o1 l [2 r3 w) s8 A switch(c){
/ |% t, ]! ~3 {/ C/ t case '+':return t[0] += t[1];
; M r" _" S: l# l case '-':return t[0] -= t[1];# B i6 h$ w1 o1 J+ T3 f3 H+ a
case '*':return t[0] *= t[1];
7 p+ F4 _9 k. Z0 ?* Q( X+ D1 T default: return t[0] /= t[1];//case '/':2 k9 B8 ~0 c8 R# j* c
}
6 t# Q1 J- h3 X* x}}
3 q& n: w- z) ?7 m2 Btemplate <class _T, class _Tstream>; C9 Y* {3 R# C% B
/* _Tstream: inputstream, _T: get return value' y1 w" V C; \: _3 I
* Return nonzero if get value successfully */
1 d* ?# ?- [/ J* rint GetExpValue(_Tstream& istrin, _T& nReturn){1 T2 Q" ?3 l! @
_T t[3] = {0}; //雨中飞燕之作
# a! s( g0 l& @ char csym[3] = "++";
. B# P1 T5 ~' r" A; T/ v int nLevel = 1, nERR = 0;+ x2 m C3 N/ C4 w/ X: c8 _
if(!(istrin>>t[1]))istrin.clear();
- D4 h) n$ J( k$ \. U; k3 x+ A for(;;){
$ a: y% L+ [/ f if(istrin>>csym[2]){2 y* D/ a2 d- r- ?& }
switch(csym[2]){0 s9 u T9 o1 r( v* |0 X4 ?
case '(':) x2 k) d- u2 G1 g' o
if(!csym[1]){nLevel=0x100; nERR=1;}else
% k; |! O" x; k |& x5 X( p if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 A7 a. L/ O. f$ m8 D
else{nLevel=0x100; nERR=1;}
v# C) ` w5 I3 g; y+ H% _ break;
' J- |4 S. y( `, x case ')':
$ Y+ h: k% ?% P+ t9 \. H {nLevel = 0x100;}break;" _: J( `( i9 c9 e/ q" }
case '+':case '-':case '*':case '/':5 J, j) h2 e, f6 j' K2 S
{csym[nLevel++] = csym[2];}break;/ |7 ]7 r5 B' m- W! e: m
case ' ':case '\r':case '\n':case '\t':continue;; t, L" O/ I ^8 E
default:, C9 M8 G$ X' h( X( t' t" T
{nLevel=0x100; nERR=1;}& A R+ Z. k; `& i
}' N# ~0 f5 D1 j* f# U/ e% W# M3 U
if(nLevel==0x100)break;3 R0 P" |& v+ u. o- h; Z! |
if(nLevel&0x10 || istrin>>t[2]){" y4 y/ M) R( l! [8 ^
nLevel &= 0xF;
8 W' @; i5 I; q0 E% G! ` if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; F" G! i0 g. Z$ V1 V/ _1 t
if(csym[1]=='*'||csym[1]=='/'){& ], ~, s+ D8 n% d" v, y
GetExpValue(t+1, csym[1]); q9 V8 B2 m5 Z# C" ~
}3 D5 E4 L8 o! h* ~7 d! C1 x
else{7 C) e) g* h+ H& b
GetExpValue(t, csym[0]);
9 i! U6 |. `% |5 t! |" } t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" T, i l Q6 d3 l }$ V9 A/ r9 d0 ~4 `$ n
nLevel = 1;( E5 [3 O! h3 S1 }
}2 ], J8 b! q2 P" x5 K& n
else istrin.clear();
* H, B" X8 _. U: c& R" G o' V6 q }8 ~( D- z6 V. r- ^& U
else{nERR = -1; break;}
0 X/ V+ C+ b' z) p, M- H. c }7 i/ D: P, h) @( J2 c' M `
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
3 ]$ R$ \6 n% E, Q/ v3 a2 q( U else nReturn=GetExpValue(t, csym[0]);
* I8 P( X1 ?( S6 m return nERR==-1?1:0;
; J: d1 L/ @( ^. K. _7 v9 k}}6 w' k$ w; Z7 p( M
, X+ X, \$ _3 `; ^2 }7 s( d% s1 j8 [: u% g
/ l8 {) s' O$ K5 O5 p函数模板使用示例:
! s: X& t2 n% M* E) y7 G" d在以上那段代码的后面加上以下代码:- \) H L/ I1 J0 R- x, _
6 U8 c _- H' h$ ^7 e4 q
8 @% \8 |* ?" f1 _+ _3 T$ `
; ~+ M- |0 ]) ^程序代码: ) c, ~1 J0 F0 \* B( u: \
* z- |* _4 e, c! D6 j( d$ B#include<strstream> ?! O1 E$ a; n
#include<iostream>
" ?6 i' I1 `! n i( k#include<string>. X! `1 s: r7 X' B1 T. M P- i7 b
using namespace std;" [) g9 }3 ~3 s5 n G
int main(void)
6 o9 y9 ]+ _2 P5 x{
( B* y* J$ @* G1 q3 S2 k4 S/ q' u string s1;0 H# }# {0 W9 G4 j, z' c( e- U
while(cin>>s1)* s/ x$ G0 j0 ?# Z
{
4 B8 Y! x3 m1 ?1 R" F istrstream isin(s1.data());2 ^- U+ ^: U1 {3 g c4 c0 p1 Y
double d;: }4 c9 W8 s$ B- r7 a8 j/ J7 d6 K$ J
if(fy_Exp::GetExpValue(isin, d))
+ _( T; w, ~8 e8 C {
& E6 M) {. ?* w3 V2 x cout<<d<<endl;5 K4 ~9 D" `" e0 c2 H9 Z* F
}. g( _- E) e& k6 E
else# u/ H8 |$ |; k$ c4 O. `, S6 I
{2 a' H! Q$ S$ h
cout<<"ERROR"<<endl;3 K* J' S" {0 l* S
}
& G6 e) b! z) T: F' Y# @8 w0 Y) d# K }0 c Q" B. |% y8 w2 j i8 P
return 0;0 p* o/ R: K( ?% |( [3 w
}7 a+ L- D9 p6 ?" I- g& i" }0 l# L2 s* y
) R- { r6 S' w" `0 K
- ^2 T1 K2 ?6 e然后编译执行就可以了(*^_^*), x* H& g4 ~. a9 [4 j7 E9 n
其它:TC++上一定编译错误,不保证在VC6上也能通过编译* I n3 N% i7 \8 C
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|