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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,% K, p6 v# m9 H y: `
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! p: @# f7 [/ G' a4 Q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! Q- v9 }3 l2 R) m0 @参数解释:
+ N3 Y* u* }# Q9 B: fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 h0 f& C# \- M4 R5 TnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" i$ {4 T3 r- f9 d) _$ r
返回值:1 b6 G0 i& D* E: K" w/ O/ D1 K- E7 L
返回非0表示计算成功,0表示计算失败有错误
3 f6 L% H0 l5 O# L( ?! i- g) b4 F7 t7 w+ }) d
) ]; |1 J+ b$ Z2 w
* E+ `9 U& y g7 S
程序代码:
. L; ] I* R! Q$ S1 v" S
% R. B1 L S" A7 j+ Qnamespace fy_Exp{% H, a+ b" }0 q
namespace {template <class _T>
3 W9 ?: u2 j8 b: h6 m4 d+ Y7 Xinline _T GetExpValue(_T t[], char& csym){4 a) I$ h6 K/ F0 y- n5 k1 k
char c=csym; csym=0;
2 {- A& ~1 n0 V switch(c){0 `( S. k [' z% z$ q& Y9 u
case '+':return t[0] += t[1];$ H6 w3 ?" o, x; P: @. p2 l
case '-':return t[0] -= t[1];" X: U# ]' i* U$ l! b. n4 f2 x
case '*':return t[0] *= t[1]; S, D: e; M h! c
default: return t[0] /= t[1];//case '/':
_. i4 _. d ^; L& r% w3 ^& t }* y0 H& V: b1 b
}}- Q5 w" q7 Z* A/ E- ^# c \2 f+ E+ F
template <class _T, class _Tstream>; e' ]8 n+ w6 _* w Y" J: D
/* _Tstream: inputstream, _T: get return value
: N: P! g7 _4 @1 ]* k8 e* Return nonzero if get value successfully */
0 Y& ^* w9 A+ M; F7 f: _0 h# i3 uint GetExpValue(_Tstream& istrin, _T& nReturn){) p/ t/ p* e1 |1 E3 F' h! H0 {
_T t[3] = {0}; //雨中飞燕之作5 h( F$ |; [2 o+ w
char csym[3] = "++";
/ `& i9 S9 ~9 J( X int nLevel = 1, nERR = 0;+ C* R# Z, K) _
if(!(istrin>>t[1]))istrin.clear();, F+ L& J2 k) k5 ~: j
for(;;){
, t2 ]5 f$ b; g- s+ N if(istrin>>csym[2]){
2 j* d, H: _9 n" `& s6 r( d switch(csym[2]){+ E$ d. ~# G4 B
case '(':
4 K/ j% j, S( ^2 Y. |: L if(!csym[1]){nLevel=0x100; nERR=1;}else6 i, D. h- Q( |( g8 d: p7 w% U- |
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, j' [+ \7 R% c. h. A# V! b else{nLevel=0x100; nERR=1;}
* p9 D1 d: ]$ Z) p O# m break;" w/ K. {6 I% N# ]
case ')':
( F# F# Y; W! W- U! P3 w {nLevel = 0x100;}break;
% k0 |0 p" S2 L }/ R* \ case '+':case '-':case '*':case '/':
8 v4 f+ J( p4 y5 m, f {csym[nLevel++] = csym[2];}break;
( K3 P9 ]0 z8 R$ H. E$ N: W case ' ':case '\r':case '\n':case '\t':continue;
7 r2 \+ P) G4 s) y' V default:
# D" I! u2 r; w" c, i {nLevel=0x100; nERR=1;}
+ l, I8 x' f1 C" \. M }
# r J' {% Z5 x r4 D if(nLevel==0x100)break;
/ x# F- ?& e q O! } if(nLevel&0x10 || istrin>>t[2]){7 s' h! ?, k2 B9 ~5 j7 n2 |
nLevel &= 0xF;
$ E2 O9 ]1 K* L if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 {9 F9 E4 I( I: k# h) K
if(csym[1]=='*'||csym[1]=='/'){ f Q. A* G* E4 q9 X: O
GetExpValue(t+1, csym[1]);
2 f- s* V8 G1 o }
# {* r0 Z2 p1 V, y' W/ c5 X else{% q4 u1 b/ D; E. b! Q& d+ ?
GetExpValue(t, csym[0]);0 C. I) z" @. \6 `) L5 |4 H9 P& ]
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ X) T+ ]" F' ^7 d+ z' m" G7 } }- k" G1 H; z; J# ~
nLevel = 1;: p+ c z/ a1 {& o. E
}$ O, r& e- p: k! d# E' ~, I
else istrin.clear();
9 H S$ i1 Y* o( L; T3 U2 d }
& A4 t$ ^1 J" B' N1 V. s! y2 x* ^ else{nERR = -1; break;}* R' y+ M, H& _/ n
}
- r* ?% z$ B% j( E if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) l$ c9 z+ }! Q' p
else nReturn=GetExpValue(t, csym[0]);
; }3 z4 a1 L& N8 g0 o1 C8 T return nERR==-1?1:0;. n Z# r: E, R% h
}}! {. P0 D; g2 p1 x
' d7 t; G# v7 Q3 d6 {) M
' x# O& g+ \; l; u! }3 p+ V
, _4 k9 m; B+ b3 B* U0 z/ ^函数模板使用示例:
/ K! d @/ _& W* F$ K7 n1 {# n" j在以上那段代码的后面加上以下代码:
! N+ l5 b8 g% z9 U
3 B: \. S: N0 k# z
( ?4 w" ^# S! }. {
9 \4 D- b5 ^4 G程序代码: , N5 j' s' I2 y) w1 F0 a4 e/ b0 C
; e d( z6 n8 b- f
#include<strstream>) G1 t3 }( F" T
#include<iostream>
* m5 d+ k& V; g" n; k4 l#include<string>
, Y6 K6 R+ { T& K4 d( }4 Z; @using namespace std;
( M9 B5 u8 x9 Y5 G! N+ X4 kint main(void)
6 [* c+ b9 b( S; y{
, h. @7 v6 C, I/ l9 B string s1;
: \* X- T' K! I1 y a, V while(cin>>s1)
2 m3 p" o6 H2 q8 W' X1 R/ j. ]" A {
( ?8 e5 N5 N+ k9 A) V7 ? istrstream isin(s1.data());
! s$ _7 K7 O- H9 n/ ~ double d;
* @: f/ y ]& ~* J, ` if(fy_Exp::GetExpValue(isin, d)). G+ E2 [$ m1 L; O" J6 ?! G
{
; [- D2 l" v) i, t3 U* j, |+ V cout<<d<<endl;5 C4 ~& A3 f4 a2 s) s5 V2 p9 v
}' i8 V, }8 w) |3 E
else; L! C7 j1 n- L
{9 y( W* ?& i3 A: e* h& |
cout<<"ERROR"<<endl;/ _5 }+ f% v* L$ p/ ~" R
}
$ F% a! [1 i" h, A }
" q+ d: b2 ]% e, f' j1 l2 i return 0;! J% T- o) H$ @1 p2 Z S
}( f# h! t( @1 d. X+ N8 u0 p
( M( \" a) \1 `$ v3 U0 z: G! v8 q
1 D9 k& w: d9 K7 ]+ C7 \# M+ B& }
然后编译执行就可以了(*^_^*): `& W7 U+ W6 ?2 Z5 L0 N5 _- N
其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 w4 I! J( ^/ |- E+ z
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|