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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 ^2 y& P% v( q: ^一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 n. k5 p: v f* j
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! A# p7 o5 Q. e7 K0 ~$ x" Q
参数解释:7 S0 p# i' L# d0 u
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 [2 k6 \/ T6 O; unReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定9 L% t& P) Q' z/ O* L n
返回值:
- ^' ~5 i, T4 X' p5 |6 u) h d返回非0表示计算成功,0表示计算失败有错误- m W% Q: }0 O6 ?4 N. r
, J; O. j2 P0 g" e
}) {0 G9 e8 Y) J
3 _. W v+ t" V程序代码: 4 w* I) T) K/ V& d
' ^& a, m( o, O. a& u$ F- p
namespace fy_Exp{
# r# ?3 C- m8 w$ m/ y" N1 k; lnamespace {template <class _T>
3 y( D6 U, a# Oinline _T GetExpValue(_T t[], char& csym){
' _9 {) D9 _5 c5 l char c=csym; csym=0;
* k, o) L& A; \: ]$ P- ^ switch(c){
6 {% u; g, r- R3 w; k$ j' d3 e case '+':return t[0] += t[1];( ^' I1 g; C# q0 n, d/ T% F6 [% F
case '-':return t[0] -= t[1];
+ k* Z7 g% b9 q [ case '*':return t[0] *= t[1];1 q. |/ K4 P$ @( m. q# d$ P/ @
default: return t[0] /= t[1];//case '/':# _ V# ]/ x* l( h! r
}
: R! j/ s1 a# |# w8 Z}}9 q/ h1 V, h# `4 q& L8 {
template <class _T, class _Tstream>
7 w5 R# W4 i4 {$ x. y0 Q/* _Tstream: inputstream, _T: get return value7 [6 v! q9 D6 F z
* Return nonzero if get value successfully */
5 l" a0 ~' k4 B* r4 ^; A- y* N2 T$ Vint GetExpValue(_Tstream& istrin, _T& nReturn){
1 R5 z% i, V m% L _T t[3] = {0}; //雨中飞燕之作7 f9 o0 W% U4 m% k
char csym[3] = "++";7 \2 H: v& G2 I3 j; k8 N: ]3 }
int nLevel = 1, nERR = 0;
* G9 C _) X$ y if(!(istrin>>t[1]))istrin.clear();& }% D) s) B0 J+ j) m4 x( |
for(;;){
$ q0 V) h3 B% z0 }+ d& H1 D if(istrin>>csym[2]){
& e7 q8 O# U8 s' T, `6 Y switch(csym[2]){( k( Z3 [# W' j6 p2 F/ B
case '(':
$ \, y/ x5 i8 ]/ u, s g if(!csym[1]){nLevel=0x100; nERR=1;}else6 y" e% z5 N! o# K2 L6 g- i9 C! M
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 Y. z) R- W7 Y else{nLevel=0x100; nERR=1;}
6 {) \" s1 Y% R. [& E break;. |) c, z+ _, t
case ')':
5 u) n: F; b2 j" \; C- \- h {nLevel = 0x100;}break;
; |; v6 D2 a: v4 ^ case '+':case '-':case '*':case '/':
' `0 @) ]8 S" o {csym[nLevel++] = csym[2];}break;
. p2 X# f2 E" r0 E case ' ':case '\r':case '\n':case '\t':continue;
$ A5 [* Q$ m, ~" J) Z" e$ B* \6 T default:. t9 H( n, M _# P9 O0 Y0 @* f
{nLevel=0x100; nERR=1;}! b5 c' t6 {# \$ v- _
}
+ h2 Y2 h' D1 A/ ~/ W2 f! d. |8 \ if(nLevel==0x100)break;
- b& C/ i# y, D if(nLevel&0x10 || istrin>>t[2]){
8 u7 V$ K- R; P% I6 I( Q( V nLevel &= 0xF;+ T3 E/ O7 Q% C3 T
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}+ ]; @7 t1 Q U: R" b% L! }4 w4 j7 x; i
if(csym[1]=='*'||csym[1]=='/'){
8 I: M1 X0 f3 M) S GetExpValue(t+1, csym[1]);
6 l- S$ n$ R% E( f, c. K }
1 W( w9 k! B" ?! @& Z else{! L* i" O7 D7 B5 T7 Y
GetExpValue(t, csym[0]);
+ N# K$ P, Y |7 \. B% d3 b t[1]=t[2];csym[0]=csym[1];csym[1]=0;
: \2 R1 ^, m, }; f# m! o }
% I5 \9 K3 n1 H9 _ nLevel = 1;" V" J1 m/ X, ^
}
: P4 w W9 p6 F else istrin.clear();) g% e7 I+ }# M& v* |4 }
}
3 z& d7 m9 U7 O else{nERR = -1; break;}
# h/ v* f7 |, b9 F }
b; Q' I. q6 H* s if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 _ n4 l5 |% e- H
else nReturn=GetExpValue(t, csym[0]);# }5 `2 o8 T" w6 C3 R' p0 \' {
return nERR==-1?1:0;8 A4 |) N1 T7 J" Q, C& I; Z* B
}}$ Q: t8 f' d8 {
( ?/ j) @; x# x7 N8 M& B9 {0 q
8 ]% R- h/ P* l; l( c' Q! y$ v' [9 e+ G
, k) w3 f7 j9 `9 H) @
函数模板使用示例:
/ D! d: t. t+ v2 k/ z& i! \% Y在以上那段代码的后面加上以下代码:; b5 q; k$ A! ?6 V
6 L, }3 m! J6 s; s8 I5 o" o4 a1 R
7 R. x2 W0 X9 Q; m ^) q
. P5 J0 b: B K4 D$ {( _4 b程序代码: 8 B* A/ g" {7 c) Y4 q
6 y' L2 r) T' ^" O
#include<strstream>
* p4 X* W8 ~- `9 a6 x#include<iostream>/ ^, T, u2 d! l$ X
#include<string>
5 V9 r" N) o" z- Husing namespace std;( c8 h. {* l$ L6 ^
int main(void)8 o4 z* Z* R) M0 q
{
+ m0 @( |% | V; o6 {8 c( f string s1;0 f8 E' Y5 X5 x7 V1 z: v
while(cin>>s1)7 X3 ~/ ]( E8 _; |+ }+ V# c8 D$ I; h
{/ q: a/ g1 Q3 m; Q0 |
istrstream isin(s1.data());6 [4 g% Y9 E( }; h* |. O
double d;% V9 n, Q% t, ]/ t: f
if(fy_Exp::GetExpValue(isin, d))9 p) b, Q2 O7 Z. B; Z6 W I
{4 y/ J9 ` j. l- E8 A
cout<<d<<endl;; R1 @# o* ?5 J, \
}
?# a& ^' F8 r( m, I else
, e: E3 B* z/ `: h3 ` {
7 ^) r* K1 M$ \ `# _9 ~ cout<<"ERROR"<<endl;" n2 {' ~# W' @# [
}. Y: t5 B ]6 ~8 w' J( u7 m5 M
}
$ i* P; m- C* c. K% A# D return 0;3 f) k; i6 P/ b# y" U; _; { _7 r
}# C& N) P' r( n8 r- `" g" x
7 ^( t3 {- m, o- D8 `" w3 n( a0 L* a2 p% m1 A5 z
然后编译执行就可以了(*^_^*)6 j5 Y0 A* ~. ~7 S
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% G2 S, |- e2 ^" w% c, m* K 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|