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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的," s3 m. u9 X7 Q1 y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! F! x7 k X, S4 X& s只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 x; T; S- A) [7 e! A \4 y
参数解释:2 h% h9 M1 V' {
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- Y/ I7 m+ {0 ] [nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
; w8 D+ @ a; {* y: I- A$ q& a返回值:
3 }% [8 G- I3 c" X' O- r# O! Q; R返回非0表示计算成功,0表示计算失败有错误0 g/ w3 D: ^* W+ }0 `' N" S
6 F5 t' ^3 E' P" ]9 F6 ~. u6 C$ t , |; a# z. ?' k) ^1 s. b: e7 z
: F/ t, t- y# p8 c4 ]$ u& S程序代码: 8 f1 Y. N; F& ^0 S; i$ j
5 |3 m2 W; [. r+ @/ n9 m- w- ^namespace fy_Exp{
' M+ a' j6 q0 u2 `3 b1 _( ?# R% I- ]9 wnamespace {template <class _T>5 x* w4 }9 F% ^7 Z
inline _T GetExpValue(_T t[], char& csym){- @3 p+ e: P8 Z) D, ?& E
char c=csym; csym=0;% L5 K# `* F9 V' r! P* l! _
switch(c){
2 G) N$ t) K9 b+ E; T3 j case '+':return t[0] += t[1];
7 B; V: P8 u7 ` case '-':return t[0] -= t[1];
9 [$ `0 p* |! x2 o case '*':return t[0] *= t[1];
5 T1 A2 z6 v$ D6 v: Q# T! @ default: return t[0] /= t[1];//case '/':5 u: V$ [% V) e& P! Z9 K7 K
}' F1 C9 z4 Y" X2 b
}}
) q+ |8 t: A- mtemplate <class _T, class _Tstream># p+ L1 b h1 _
/* _Tstream: inputstream, _T: get return value" P3 b. r" E' r- u" R- W9 B/ F
* Return nonzero if get value successfully */
4 V) q% J/ u! A9 u. g' qint GetExpValue(_Tstream& istrin, _T& nReturn){: x1 K# W/ ~4 N2 Q0 e0 s+ B: u6 r3 d
_T t[3] = {0}; //雨中飞燕之作
: P& p' |7 M/ ]; [, k char csym[3] = "++";7 d& F, P3 k/ r7 {
int nLevel = 1, nERR = 0;
$ Z/ K. W4 C9 o1 O0 d; `+ h* ? if(!(istrin>>t[1]))istrin.clear();
6 p& [7 G! I( ?2 S: K" F6 B* W T for(;;){8 v/ N, z' j: V1 X" O
if(istrin>>csym[2]){
# L9 q( J5 \ J; |" u" Q9 M6 P$ i, E switch(csym[2]){
6 S$ W# @( `1 G8 I case '(':
; s% M% r% |- {2 m. \! W' n if(!csym[1]){nLevel=0x100; nERR=1;}else3 i' _ Q% \7 o0 K- c9 C
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 c5 v) A. r6 Q7 {$ N7 A
else{nLevel=0x100; nERR=1;}/ j) L$ B) N! ]* W
break;
" q; {1 j: Z0 u5 I case ')':6 \5 b3 B. A9 q9 q" |0 s1 ^3 }
{nLevel = 0x100;}break;% V5 @+ I+ S% H" I' T, C
case '+':case '-':case '*':case '/':9 t0 k2 _" r7 E! W) m+ ]2 {& {
{csym[nLevel++] = csym[2];}break;* O) z. N$ j) p; k6 ?
case ' ':case '\r':case '\n':case '\t':continue;
! s- f2 R2 g, @3 q default:
6 }( `0 O8 [$ \3 b" ^ {nLevel=0x100; nERR=1;}6 I5 V y) w: v! \ H+ C
}. n& s/ R8 ?; O2 ~
if(nLevel==0x100)break;/ d' ] b h" _, ?( M e* D- h+ J
if(nLevel&0x10 || istrin>>t[2]){
" G3 j) [. L! W2 B- ? nLevel &= 0xF;( h# J5 P y3 N7 C& v1 B
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# ` S+ ^& T, C: w4 V9 C/ n# {
if(csym[1]=='*'||csym[1]=='/'){2 C0 Z5 U: j$ ^, Y) L
GetExpValue(t+1, csym[1]);
4 l6 y* z, l% n }
' x0 ~4 B2 K" ?* s' u/ u else{
: F( ^1 C5 z) F; z5 @3 j* L( O- O GetExpValue(t, csym[0]);9 O9 |2 u4 _; E1 K& U( ^
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& ~4 T% F e2 [( {( g& E' f }+ \6 E/ {2 A8 `5 f$ K
nLevel = 1;
& Y) U3 z2 |/ w" t4 B4 v }. F3 U+ P/ A' L6 N% o0 r
else istrin.clear();
0 S7 g8 M, g# @. X W4 C9 q7 Q3 `8 Q }
9 e5 d7 H& Y" J, e7 j else{nERR = -1; break;}$ j& I' E' z! i- t6 `
}
: m" B. J% H2 I if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, | p& `* @& H2 `- { U else nReturn=GetExpValue(t, csym[0]);) a1 x) _2 [( F9 H# P; }
return nERR==-1?1:0;
2 F9 y5 i/ o8 h$ ^: c}}
' U1 ?' ^8 |9 {# }6 b! c# A2 D( Z
7 R( O/ w- v5 n, W# F( ~, n; p+ N5 h* C; v1 I2 z
( Q, h% V' G1 S, _7 q2 ~
函数模板使用示例:6 P: t+ ~( z$ F9 ?( h/ b4 r
在以上那段代码的后面加上以下代码:) V! ]6 Z" F: \% f" H# W
9 @+ z' I5 Z- U* {- a
& x# v* @& w( _4 G! V3 Q- o+ ]$ t+ l0 c" ~6 L1 E+ G
程序代码:
3 M, H& t4 M* v) A) g ~ Q w/ z# i& `- n
#include<strstream>
* z6 M; \) O* m#include<iostream>
]) g9 k" Z4 b#include<string>- h- c3 Y2 V0 f& d. Q
using namespace std;, q2 A- ^( F0 X) v
int main(void)9 f! ?, ^' I$ s# C/ I
{. P- D# X/ X. C3 L
string s1;
/ ]) ^% k" Y, d/ k7 W while(cin>>s1)6 @5 d* A% l2 A6 D' ]1 w7 x! T
{1 R: I, G6 F+ ?- ] }" j' X0 @
istrstream isin(s1.data());8 {7 G: Q1 i; D- l* h3 ?
double d;
% F8 B% D5 b, v3 \- v. D if(fy_Exp::GetExpValue(isin, d))* M& F e# y% T+ g+ D& O& m
{4 m+ ]7 U" u7 k+ K& A9 v# D0 L& H
cout<<d<<endl;6 \: F+ f% e4 h, _+ s
}0 K9 W& q* I! s3 c1 A! H
else! o; n/ S/ Q2 Z1 z$ B; y; R
{
2 ]$ L" U0 k. S3 f! w; m cout<<"ERROR"<<endl;
5 y+ `& K) N7 K; X$ P! `) K$ p }2 A7 k' L( h, G4 @- z
}
% ?6 h9 \5 x1 l9 Z( s return 0;
9 k/ y: s2 ~; u g+ I6 P}1 F+ A/ g9 }- s* ~
# e' D9 @9 P2 S1 \' i
* b5 m0 }1 d `: m' C# x2 p然后编译执行就可以了(*^_^*)
2 V% u8 H$ x: x其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& k0 R _3 o0 d8 p: ?6 L( H 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|