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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
! B. p' ~( P6 h# F! b! J一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; b" H4 l8 q# [ L
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ S) p) ]1 Q3 V1 h参数解释:% { }% [" l5 k: f% {
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( ^, \ n) D: R$ O! F/ L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- c2 Z8 o* h0 u7 B! O5 [9 f) \返回值:( Y5 T; i0 l' I9 l
返回非0表示计算成功,0表示计算失败有错误
h" v1 k+ v5 c; ]: a6 e$ c* B: ]: y4 A. k: S) p b/ O2 |
3 ]- L* t9 ?$ Z9 v" Q/ X$ w
5 H5 y- N9 ~8 T$ h' S程序代码: ! q: M3 U& k# g6 d+ {7 U0 |5 Y
5 o- `7 r% @* y( G# A, E
namespace fy_Exp{4 z' E, l6 ^* j
namespace {template <class _T>: b O8 j* E8 X: F% j
inline _T GetExpValue(_T t[], char& csym){
! C! |. j8 `' I1 k$ p- J) y char c=csym; csym=0;
9 J1 X/ T/ i- Q- L. t D8 U switch(c){
7 k- t- x% G" P( p H$ T0 f case '+':return t[0] += t[1];; j% @2 N3 F; s( G
case '-':return t[0] -= t[1];
C1 @9 m9 z. c5 P# Y/ b case '*':return t[0] *= t[1];
0 w' }( F# ]. z8 F1 b: o4 d" | default: return t[0] /= t[1];//case '/':7 I( W: T- T9 z( x% _
}" o' Y& S1 F+ }( U! @; c. m- [/ V
}}
' E2 Q* P! f- C. R2 S0 ^+ f! ^& vtemplate <class _T, class _Tstream>8 {/ G" e6 C8 k
/* _Tstream: inputstream, _T: get return value' Z9 ?! a& L% b g! Q
* Return nonzero if get value successfully */4 h" ]/ m+ m4 Y$ `$ O% S2 C" x3 k
int GetExpValue(_Tstream& istrin, _T& nReturn){
% V# l+ R) N9 ?; Q n, h- } _T t[3] = {0}; //雨中飞燕之作: E9 o9 e5 W }. w
char csym[3] = "++";
# j$ Q9 w9 L n6 Q3 | int nLevel = 1, nERR = 0;
: l8 h/ K6 A8 n p! V9 R if(!(istrin>>t[1]))istrin.clear();
9 w/ R! `4 ^' B1 Q8 ^ for(;;){
( i" e. J* x; v, m+ f5 L if(istrin>>csym[2]){! p( f6 B0 p" c: E
switch(csym[2]){- w: _ t2 _ {# i# l0 J
case '(':% w. X- u! ^5 R: l
if(!csym[1]){nLevel=0x100; nERR=1;}else
/ m0 V# F7 f" T1 E+ a( H0 e if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ X, ^, D9 x6 L else{nLevel=0x100; nERR=1;}6 G# I% l# K1 w0 s4 N4 B! F. D
break;5 r x# G' G. {3 Y
case ')':& K* y, |- W# \/ m
{nLevel = 0x100;}break;
2 U! l, W( A: L G4 P; ^' U case '+':case '-':case '*':case '/':
, g7 u6 x" p8 e2 `& [2 |4 k/ f& {: |5 C {csym[nLevel++] = csym[2];}break;
6 f9 X! R! p; U/ }0 S D% c& ` case ' ':case '\r':case '\n':case '\t':continue;- j) T2 W2 R4 T; p8 }' B
default:
; U" Q& o8 y( s {nLevel=0x100; nERR=1;}
9 H2 s$ E3 {$ U" X% t& j5 e& F }' b3 w ~, J p# K3 I6 Q
if(nLevel==0x100)break;3 q) S: G9 `0 c' {
if(nLevel&0x10 || istrin>>t[2]){
$ p3 C+ X. K4 D! \" d) L nLevel &= 0xF;
( W; {# Y6 `$ l0 @2 D/ K4 a/ C if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
+ W5 q5 ~4 h0 d0 W3 n' V* K if(csym[1]=='*'||csym[1]=='/'){
5 a) k+ E) q1 B) A7 a GetExpValue(t+1, csym[1]);9 G% g! U' O7 Q' e
}1 k) v: R& Y" H- z( ^' K
else{! d6 I5 `) ^, ?5 @ n; |' ?
GetExpValue(t, csym[0]);" J3 V v& K3 ^6 W9 g
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
% ^/ O. T- l3 b }
8 L7 i# V$ w' \" x7 s! E* m: ` nLevel = 1;
" K/ q! z+ J& P! w( q- N9 O/ v1 x }( o3 h% k' H& H0 z
else istrin.clear();
& Y( W/ Y. V* l) C5 }6 k2 i }
0 i" U; X% C9 h( a2 C8 D else{nERR = -1; break;}
: x4 q8 V' n8 n2 z( B }6 z& V1 x; z) e, K; y4 u
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 G6 I( X4 E' X6 [
else nReturn=GetExpValue(t, csym[0]);
. L5 h+ f' K9 C: B( n/ R8 U$ o' t return nERR==-1?1:0;- I, F D& a6 L: _
}}* J+ {1 D6 l2 q. x7 }0 [7 y
0 U- i9 m! T/ X ~
/ q9 @" R) B) n9 L* L$ k
" i1 U6 X& K# h1 V: j5 o4 c7 ?函数模板使用示例:7 @/ g8 Z- I+ \# u$ M" R& E
在以上那段代码的后面加上以下代码:
/ `( Y1 G0 c5 U
) @% q% M8 M! |: y- h . W; U; n9 \( c3 ] s! v8 z" y+ m
# C* O, C# Y) n+ ?程序代码:
$ c: a J1 w7 B
$ Z* C. }! K; v- a#include<strstream>
4 }( f/ o, m% H. Y#include<iostream>2 f+ q8 y, j. Z0 D5 Y
#include<string>6 z d2 H; U7 z
using namespace std;
' [" P) P% q$ E( j& }* o9 q; Gint main(void)9 O4 R; i8 ~" E! I
{+ | \8 z1 X6 D& C; S
string s1;
$ G6 ?, g) B8 ?: t! O/ ] while(cin>>s1)
2 G8 I0 ^0 _" k% v. N( R {' s$ I" c2 U7 E0 x- d
istrstream isin(s1.data());) N: t& d# K3 J$ a5 {9 e
double d;
, D. J4 [1 K% f/ R" _ if(fy_Exp::GetExpValue(isin, d))
8 ?) R0 ~' t/ k4 ?* Z, L {
9 a+ A- { L$ k! @2 ]6 q cout<<d<<endl;' [2 ?% H; o( k) B
}
6 L2 W; c3 H' O* j; y# @) h else) \- T' w( T; f2 H) s
{
6 v2 Z4 Z3 D: A8 p: Q cout<<"ERROR"<<endl;
5 O/ G. @# E! z, L# b2 y }( S, L9 r. [' A3 D4 U8 E) o9 Y
}( o9 I/ T% I, E! T
return 0;
" b# I& P. C, u5 _}* N4 R1 C% z& r+ I8 z7 t, a6 V
/ B& c* n* Z8 W+ f2 C& ~( g$ J) I) R
6 p9 `$ H2 C7 }( A: i然后编译执行就可以了(*^_^*)( g _$ Y+ e; h$ j
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( ?; Z( v+ E7 b 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|