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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,, ^$ h; L( e9 z& `: b; f
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 T5 r; F+ H$ {* j% m0 O! C
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
; t8 E$ f. B' E' X参数解释:. g3 P2 z' q8 A& l# Q3 @
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* [" d: |7 q: e* i, q1 ]$ D- w
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 n" x# G6 L; e9 D" f4 J0 i$ a
返回值:0 w" l$ {. L. a
返回非0表示计算成功,0表示计算失败有错误
}! {7 i( h3 C2 n
6 q- m+ \; y7 h- U! R% {3 _9 _ 4 t$ o( h7 M3 g& h! C5 }3 a- n
' A0 S) c2 T# q# A0 G
程序代码:
3 {. m. I, m+ ~0 ~, V& \1 z9 i2 }
namespace fy_Exp{
7 b% N9 t. G0 w3 enamespace {template <class _T># Z4 e0 i2 |0 A! h0 ?
inline _T GetExpValue(_T t[], char& csym){
* O0 Z+ E) M% `3 I, Y char c=csym; csym=0;+ N4 {2 z* ^& m$ J
switch(c){
. u4 w3 W( t Z5 Q E7 C1 y) S0 M7 ^9 g case '+':return t[0] += t[1];* O) ]/ b' X' O, }, G" n5 K
case '-':return t[0] -= t[1];) K6 c2 o% j _. e+ ?; Z+ v
case '*':return t[0] *= t[1];( h8 a* S3 Y) y# g4 O, ^
default: return t[0] /= t[1];//case '/':
+ K, n. I3 Z) y2 R' E1 F% B }
6 `* z" T( ?: V% [2 G8 O}} |2 t1 [/ W; C R m
template <class _T, class _Tstream>
9 I- G3 A( b, \$ |# D/ [0 [/* _Tstream: inputstream, _T: get return value+ Q9 ?; T- j7 R9 z
* Return nonzero if get value successfully */; Q, m" h* g0 v* x
int GetExpValue(_Tstream& istrin, _T& nReturn){7 s) p/ K' Y! l! U
_T t[3] = {0}; //雨中飞燕之作
) d7 [7 j, e0 n: U* S# ^* n char csym[3] = "++";
; f5 T4 ~1 ~& S! x9 E. v; x. O int nLevel = 1, nERR = 0;; ^- e. N8 p! E
if(!(istrin>>t[1]))istrin.clear(); E# w- C! v( k
for(;;){1 d z2 A/ x+ \* y
if(istrin>>csym[2]){* X" g* g# v3 c6 G! ~
switch(csym[2]){/ d$ E; A, D( C/ ]7 [" ]
case '(':
0 n& `. k+ O; r" f if(!csym[1]){nLevel=0x100; nERR=1;}else3 j; T7 \0 m1 Z y
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, D) Q7 W' W: z# ?" K else{nLevel=0x100; nERR=1;}3 y& D8 A5 G7 h& f- ?9 n5 b: l
break;
7 Z7 A' ~& n" Z" n) B2 y$ J- { case ')':/ Q1 P, J# }2 }7 h# v' Y
{nLevel = 0x100;}break;
6 q& r$ `, @. T6 a; J! ?/ B case '+':case '-':case '*':case '/':
; ~2 l3 u6 \# [2 Z {csym[nLevel++] = csym[2];}break;$ ?+ w' \6 h' s; V+ r. n! k7 s8 y
case ' ':case '\r':case '\n':case '\t':continue;
1 B# n ~2 n% y( `5 [- q default:
( r; f8 e- O+ c/ ]4 l/ Y# A {nLevel=0x100; nERR=1;}
# ~) b" {( W, d5 G1 C }
7 x% {2 B5 j6 o# `& B; V; A' G if(nLevel==0x100)break;
$ p& b# g3 `* _! }5 H, [ if(nLevel&0x10 || istrin>>t[2]){
+ r7 b2 e1 E3 F! h4 E' g* g" N' { nLevel &= 0xF;
8 }. f9 h# a) H if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}+ c6 f* c- D( T7 v# F
if(csym[1]=='*'||csym[1]=='/'){
z% j) C @$ m GetExpValue(t+1, csym[1]);
0 S- ~, E! X- i% g+ n) w# W }
4 Q0 |! U; U/ [+ k# V else{
6 L) n& ^9 Y# T0 e- j# t GetExpValue(t, csym[0]);
5 f" T- a% G; H7 s t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 H$ g* r$ X( _ p! I
}/ l6 x& O" w5 S$ a
nLevel = 1;
* V, }0 W; ?( w9 T" S5 R }# T8 K% l1 m1 X. Z2 F. ?
else istrin.clear();- M6 C9 N* X2 k7 ?# n T# V4 c% J5 X
}
3 i; k3 n) k% T% S else{nERR = -1; break;}
( t# r/ M l% A8 G% R7 Y }
& u$ c1 L+ `. `. q if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) Z7 D3 b/ J' K- Y- B( E' Y
else nReturn=GetExpValue(t, csym[0]);& p& ^& E" I. n4 C# e. p
return nERR==-1?1:0;7 T- S A6 I3 R; R. [
}}
7 a* x1 W h' H- ?( g0 z$ T/ Y$ f. e+ h, r. _
! |" J# C3 ?" s/ T
, N) G3 t/ V* X5 z( Q* p1 }函数模板使用示例:
5 ^# |: N- B6 M; J W在以上那段代码的后面加上以下代码:6 N9 t. G6 U* f* u
# i" @5 y7 h3 h
8 n; C$ }+ S& _3 K" R% x8 c) B9 e8 q) N4 y& R5 n
程序代码: ( x. n7 T9 K$ J; C5 ^3 R) U
2 \) d* O' w' v
#include<strstream>
; N* g& s9 K/ A) t+ r#include<iostream>
; l+ e5 n! E$ F#include<string>
; Y$ J) |$ ]9 j7 Q4 D5 ^8 n( Wusing namespace std;" @0 H% w! w" Y0 X
int main(void). m; h6 k" J* |- p- [- |
{% B5 Y; ^0 | [
string s1;
& Y" N" n3 f. i; d while(cin>>s1)( ], u( p4 I ^$ _1 R3 ]4 V
{8 h# S: m+ s# J5 k3 Y" ?
istrstream isin(s1.data());
' x6 @/ b. t, F. c/ G$ @" ^: j- f double d;/ G3 B/ i& V5 i1 ^; ]9 o/ |* C, S4 N
if(fy_Exp::GetExpValue(isin, d))
3 g1 p; d4 P$ l {
' J Z+ T2 D+ w7 @ cout<<d<<endl;( Q7 |) [' Y9 {0 h; a& X( D$ d
}
( @, ?. H3 I) a else% a5 \/ b0 Z! E, x
{. w& F+ [# \9 K: m. T0 e2 e$ ?
cout<<"ERROR"<<endl;! }2 ^8 R6 B$ M5 u( L
}
( o8 T- [3 _; |; L5 L }
6 z3 E* @7 S5 G) m return 0;
% \: g- k/ j: k$ c: Q}* d9 E# @) G0 r- S3 O. t
4 C& A/ S/ J) a2 U; ?- [) P: ]* T3 m% ^3 ^
然后编译执行就可以了(*^_^*)
( K) l- _/ c1 d; I7 M* J其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ \) Z8 n3 O/ B+ S# F# X 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|