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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
: y; P* ^3 @5 s8 T, t5 k一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 ]+ b" ]1 i8 J- o+ o6 p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' d$ ^ F0 q0 z% H; Q& V7 K% x
参数解释:# X* ^% {# @' a6 c/ P+ \& x
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% }8 K" Z/ q* x( o* Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# Q3 k; _2 U* ~' `0 ~9 c返回值:/ Z8 ~$ N) M( |( [% d9 K
返回非0表示计算成功,0表示计算失败有错误& p9 X+ f- u+ o' `, `! L
! m* n) e* o( T
/ q, I5 w- }3 P4 L: L g4 n+ u7 p( o% o5 i
9 w" T: [# |( l8 e6 b& t程序代码: % X! G% r& u$ X4 A/ Q
" ^; y* y( d6 bnamespace fy_Exp{
5 d2 N1 L6 ~; i$ O+ M# jnamespace {template <class _T>" R' V5 I: Z9 Z [& @
inline _T GetExpValue(_T t[], char& csym){7 O+ |9 D r' Y
char c=csym; csym=0;
/ J! P' [. J4 S3 c, ]4 ] switch(c){& P' K0 x* N" W0 c4 P: Q
case '+':return t[0] += t[1];
8 E8 W$ Q v7 g0 `+ e( [ ~; }4 \ case '-':return t[0] -= t[1]; U& o- B0 @0 H8 ^
case '*':return t[0] *= t[1];% r4 O' [! k5 S0 {' N
default: return t[0] /= t[1];//case '/':- Q m% a4 ^2 y
}
( C4 s2 W5 G L4 d}}
; ^1 I. q8 P) Ltemplate <class _T, class _Tstream>' q: N$ s2 V$ h, x v: K* \
/* _Tstream: inputstream, _T: get return value
$ u6 t- ?- W9 U) K( i# U* Return nonzero if get value successfully *// T" G& \/ ?: r( ~4 c. r
int GetExpValue(_Tstream& istrin, _T& nReturn){$ ^3 U* \! E/ `0 Q
_T t[3] = {0}; //雨中飞燕之作4 x$ w& L* d/ n3 \- j
char csym[3] = "++";
1 P9 o+ L4 _' n: w int nLevel = 1, nERR = 0;
* S( v# @: V( _6 {3 S if(!(istrin>>t[1]))istrin.clear();
, |6 u5 c. |3 W* M# V- T, p for(;;){
" r" x4 ]) s& l b" L n) T if(istrin>>csym[2]){' C4 d5 E# Y/ A% c6 u0 u
switch(csym[2]){
' P. {$ H% A4 i% V/ c* C; c case '(':
/ b+ v' }$ K' V+ a2 W2 n) R if(!csym[1]){nLevel=0x100; nERR=1;}else
5 J1 e- `9 r1 E4 h8 g d if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
$ i# X4 V/ t$ j. Q else{nLevel=0x100; nERR=1;}
3 M& A% \ ~& e- m% ^+ j break;
: _/ z, [) }3 l9 [) ^6 u1 P case ')':
: p* l# O7 ^' o: N( S* w {nLevel = 0x100;}break;+ s. d# a6 a! P# P8 |
case '+':case '-':case '*':case '/':
" N5 u' n: f d0 B' ~ {csym[nLevel++] = csym[2];}break;
; J2 c* N; t+ _! o: q/ f" H case ' ':case '\r':case '\n':case '\t':continue;
8 d8 ] `6 V+ Y8 D0 ?3 u7 i+ l default:
0 s+ \# j# P$ u- K) \# `1 }% o4 R: d {nLevel=0x100; nERR=1;}- k5 P2 H. S5 Z7 b" y# T/ A U
}- `+ r1 x; l3 x1 f5 M; D$ c) m
if(nLevel==0x100)break;! k0 D ]6 Y, s0 a' B
if(nLevel&0x10 || istrin>>t[2]){
+ |, w( l! ]0 J5 c- h; a nLevel &= 0xF;
+ t" z! F! T1 g if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 y) m; X1 F7 ~1 }7 n
if(csym[1]=='*'||csym[1]=='/'){! B4 O$ G9 n8 o* r' h: l
GetExpValue(t+1, csym[1]);# E$ g3 i$ L) s
}
/ P0 ~( {, ]8 L S; Q else{
2 }9 L+ J: n' P# ?/ R GetExpValue(t, csym[0]);
) q; l) o( }- V% k* ^4 h' V2 e, u t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ L$ }& Y2 o- e/ B }
* Y$ D4 d9 Z4 {2 d& e& ^) \$ a nLevel = 1;- _: d1 x; v4 U5 H- k
}& Z1 Y0 H4 b8 j
else istrin.clear();
! m$ S/ a' K8 o* u# ` }* H, W4 D% p9 h; Z# {+ C
else{nERR = -1; break;}& \! w& |9 y9 ~
}% H2 i! z1 \( `
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ W+ P3 O4 W3 [; O# k6 ` W9 @ else nReturn=GetExpValue(t, csym[0]);
# k6 G8 I6 W3 [$ v return nERR==-1?1:0;2 b; u' A3 [2 o7 C; r+ t
}}
8 |& ]; N$ ]2 l3 c) B1 N. i8 n" N& O/ [0 y# r$ H* q
$ ^. z# B0 `- B Z' a, r' y5 f" i
$ X, d& D/ }6 j% X/ M5 K9 t函数模板使用示例:
# E5 C# ^* v- t- O& D1 \在以上那段代码的后面加上以下代码:
& |9 i1 s! X& U7 ^
' a, W6 x S$ T- A! p9 @ - h0 f; W: x2 a" x+ J7 o
; `5 N% U2 K- W8 G8 E5 u0 ?9 t程序代码: / _; B- t- ]2 x( J+ R2 T( x5 u0 X
9 N" ^0 T' h, ?% l#include<strstream>! g3 Q: _1 s) r7 I% O
#include<iostream>
$ @, l' h) H0 m#include<string>$ Q& i% _6 x+ s& y* r5 Y3 Y
using namespace std;
/ i* I" m& z. k Pint main(void)* e# J+ e! b2 x9 X, D. }4 v; J
{3 N% K" B0 g3 z3 A
string s1;" D! f- ] _ i) B' J+ b6 G7 z
while(cin>>s1)8 D6 C3 o2 `: r6 N; `
{
8 C% ?& j# a- G istrstream isin(s1.data());2 _8 m9 N+ o+ u7 g
double d;3 n3 Y! x6 H" D1 I7 I3 L( g( r- d8 l
if(fy_Exp::GetExpValue(isin, d))
8 D, |0 Z6 j, S- I# F {7 D5 u) _& ^- S: y6 O& r' t
cout<<d<<endl;
5 d9 L$ }# ]+ X" w }
; Q( w2 m4 O S5 f' Y else1 Q4 |' X+ [: r2 X
{9 i. G. @. L4 r0 H
cout<<"ERROR"<<endl;7 L* g/ N3 }( E( n' v
}* f# h+ l! a# c
}, M% k' L- T( u( s# x% X
return 0;: D' d, n6 u5 S& j6 B- ~5 @
}% s5 D$ `4 [" s- \9 r
7 i; ]* O3 G# c: L4 o, |
! z* Q- G" o2 k* e; v然后编译执行就可以了(*^_^*)
3 G6 H0 k1 {8 e+ y- j# Z. T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: C& X. m8 z& K. x& L. k 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|