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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
: o5 J* f3 r) j一个很方便的函数模板,可以并且只可以计算含括号的四则表达式# @$ r. s7 ?& {9 q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn) s6 G0 }$ V+ }
参数解释:) E! L0 g# f8 O3 v6 n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. D! k5 R2 L' b. C" H* h" ]+ ~nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* j0 r6 `; t. H2 W+ [返回值:
3 ~2 \" R0 J* s8 W& @6 G, g返回非0表示计算成功,0表示计算失败有错误, z$ n6 u0 h( z0 P' `/ X. x
% X) F4 K6 n; K" Y0 M, \
) o# p. t/ b% [$ |! [) k( T i
, F3 R* x. j0 K9 A6 u程序代码:
" S8 Q- A/ ^8 \8 ]; p) e5 G1 }( W+ {# R4 ^5 ]( Y* F
namespace fy_Exp{4 \5 K$ X' H `$ O6 [" Z2 M
namespace {template <class _T>
) c6 S2 D5 J$ E& q9 T$ |. rinline _T GetExpValue(_T t[], char& csym){% B! l, m) ^) c/ I# ?! d
char c=csym; csym=0;
) g8 e( [( ]$ X% Y switch(c){
, {( E$ V$ E+ e, \1 p case '+':return t[0] += t[1];
7 n8 u3 @; C! J$ [ case '-':return t[0] -= t[1];7 g4 G, M! o* b1 J4 y
case '*':return t[0] *= t[1];
5 v" |* V7 X" M% k+ n- A$ c default: return t[0] /= t[1];//case '/':
6 D% C9 c7 P( @- k1 n0 j" | }
3 l4 f( v; V4 C3 ~+ i& S: k1 R1 R! P/ D}}
& \) K# Z1 @- L* q Otemplate <class _T, class _Tstream>
; e# ?, N1 l$ g3 ^2 ^2 E/* _Tstream: inputstream, _T: get return value$ t( v7 p' n) @6 m/ y8 q8 E
* Return nonzero if get value successfully */# \+ ?; Z! H) S/ y1 g. Z) z3 f$ Z
int GetExpValue(_Tstream& istrin, _T& nReturn){) o4 N! ~, Y1 c" @5 t( y
_T t[3] = {0}; //雨中飞燕之作* k; {4 D8 S4 [: m! [1 {
char csym[3] = "++";- a6 R) U3 M' z$ \; Q
int nLevel = 1, nERR = 0;
5 ^0 f" s! W! j2 r if(!(istrin>>t[1]))istrin.clear();
9 W: M: K0 k" V8 ]- y% U, c$ R for(;;){
+ f9 `9 h+ E* \- m( h if(istrin>>csym[2]){
6 u7 {+ O) c) r3 u. o0 S switch(csym[2]){4 t% O2 k7 d7 S1 j1 q
case '(':
$ p3 W9 p% {. b# f4 f' u- A5 ` if(!csym[1]){nLevel=0x100; nERR=1;}else9 W: b L, ^3 \
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
" g3 q" |8 s, x$ I else{nLevel=0x100; nERR=1;}
, L2 ?. @/ _ y9 W; ^9 R! q' a break;! u% a2 R' \7 w: S, R, X$ O
case ')':
. x; \+ K2 \( P0 A5 W {nLevel = 0x100;}break;# e; z" y. S9 C. S. M* K8 `
case '+':case '-':case '*':case '/':
2 u, B5 h- h) A7 Z7 j8 { {csym[nLevel++] = csym[2];}break;! O, S' J8 _2 J$ d; |
case ' ':case '\r':case '\n':case '\t':continue;
- H7 O* {& P7 W- n1 U2 y default:# p" }& w- l: I" i2 [( Y- I5 O
{nLevel=0x100; nERR=1;}
2 W; G1 L; y' N }
! v* u; C8 ^' ` if(nLevel==0x100)break;* J5 b7 T9 k8 S. y
if(nLevel&0x10 || istrin>>t[2]){
1 Y, c. r: ?! ^3 D5 X, { nLevel &= 0xF;
& }: V5 \- |8 k if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& n/ A+ y* y1 }$ Q* F7 K) o
if(csym[1]=='*'||csym[1]=='/'){
/ p1 d* h1 w7 d GetExpValue(t+1, csym[1]);
6 f2 @) P+ q" S" x }7 l; P) l3 {( U4 O! h, P
else{/ {, O* b; m+ e3 M- b& r& M
GetExpValue(t, csym[0]);4 ?3 v5 `+ O1 l; M0 c! b6 s! J. |& @
t[1]=t[2];csym[0]=csym[1];csym[1]=0;7 E: ~1 Q8 Q2 x. @. ?# J$ ]
}
9 a. O; N( s7 \9 ?: c" a nLevel = 1;6 P. F7 P O4 y* g8 Z% `2 @' I
}# v& X6 X9 I. r4 G4 W
else istrin.clear();
+ @# i& j& I( G* Z3 | }
" k5 w8 g* a0 d1 M- H else{nERR = -1; break;}/ X( I$ B! U+ [( Q8 `- `
}
& d1 M. u; h# Y" k) B8 J if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
3 B6 {; y! }. [. e+ V else nReturn=GetExpValue(t, csym[0]);
$ C* a" R1 @$ h# [# Z' o return nERR==-1?1:0;
2 s+ i- T4 M5 s; z0 S}}6 Q/ i; g" X& |9 ^- j
. s" D# k0 M0 @! D
$ ?! s W, i k
0 `( d$ t: `" b! v" g0 S7 i函数模板使用示例:
# c' ?4 p2 ^ Z' H( d$ a在以上那段代码的后面加上以下代码:
$ H+ Y9 E" y' o4 \7 P' S3 F4 V2 h# j! ?
6 F) ~/ N2 R& `7 K. s8 D- ~
( q# k2 A* G; V6 E3 E0 y
程序代码: + Q2 F X) K4 y" ]0 l- z
" Q- j& a- ]1 ^- B#include<strstream>
+ V: G9 u! R9 `6 M#include<iostream>
0 O; E" n% B$ U# l" D#include<string>
" I( j# C) N8 N- g2 Busing namespace std;
$ n1 D% p, Y' d+ xint main(void)
- a' C) y0 H& A/ E+ k# K4 \{
$ ~( q/ F% b5 s string s1;
2 d3 Q x. o$ J while(cin>>s1)
8 S; C4 J* Q: x" N* k {- \4 z( b' ?0 @2 \
istrstream isin(s1.data());
8 i1 }7 J: d& Z- X double d;+ x) }, D* b8 G f* g
if(fy_Exp::GetExpValue(isin, d))! E8 \3 F6 @1 [6 g& G7 F
{
) I5 A2 P$ E& d+ E* Y cout<<d<<endl;" R6 c9 a' T8 G+ t- f- N
}5 G( n! e. K3 g# j
else8 M2 n+ J8 c5 F5 ^5 s
{
' }8 _7 _0 W- L" q# k+ j cout<<"ERROR"<<endl; A& D( Z3 |: a9 r" ~$ U: X
}
9 X+ O8 S# D3 d' G }
* ^* D3 q+ S; h" `* I/ _ return 0;0 ^ X; W$ e; @. r# d
}
5 n& }: q Q4 Z- X0 D1 S# P) p, S. ]$ ~; \5 \
* h6 ~6 W: f' |$ e* B# W然后编译执行就可以了(*^_^*): h3 p+ V [! b5 z# a. O" T
其它:TC++上一定编译错误,不保证在VC6上也能通过编译- T J2 d% n( v/ c, T$ d. M) s* F
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|