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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
* }( s6 N* [$ Q+ k: C一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! \, w9 `- ~% P2 V3 d
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& O1 Y% v' Y- G' S( `参数解释:2 j/ C, W7 O$ t5 C" e
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 a$ U! c! v9 _& K1 mnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( h/ A) @7 B+ Q( F R5 C
返回值:! Y) Z. x% y3 f* Z
返回非0表示计算成功,0表示计算失败有错误
0 I# ~8 Y2 ?# c0 {7 u. w( h. @) [
' R5 v" {1 h' P2 ?! _, t
1 m% _# A9 r# v1 D4 z0 n- Y, M+ b t* h' k程序代码: ! x9 c( [- r: p1 h* Q
$ n# ~% m* W' I/ V- I7 r' Anamespace fy_Exp{% U2 _: U& E# j+ O3 E/ F3 B D
namespace {template <class _T>3 K9 B; o) M6 d+ K; T( ?2 H+ x$ d
inline _T GetExpValue(_T t[], char& csym){
P: h4 f w3 K+ e, D3 w char c=csym; csym=0;+ c8 }- ?) @- ~: Z
switch(c){/ D/ a9 r, ]1 a H( Z
case '+':return t[0] += t[1];
8 y; s% L7 p* @/ m, D case '-':return t[0] -= t[1];
0 h4 p; _2 S( a0 g- q5 { case '*':return t[0] *= t[1];, {+ f: `9 k' y G3 S$ H5 _8 U
default: return t[0] /= t[1];//case '/':; o- _1 u/ S* V( s5 j2 H6 _
}! [ z& t3 I2 h& C' n
}}9 R( r) |- ~! o6 `& C
template <class _T, class _Tstream>
8 x/ L5 d+ ]; a S# n# d/* _Tstream: inputstream, _T: get return value
2 X0 I* P7 {" Z6 n0 _* Return nonzero if get value successfully */
( O Q. J9 n& S& \- ^1 b. [0 aint GetExpValue(_Tstream& istrin, _T& nReturn){
! @" S5 m# Z- c3 ?) m _T t[3] = {0}; //雨中飞燕之作
; q C$ @; K1 M6 m( ]6 S" Z char csym[3] = "++";0 e) @: C8 |, T7 F
int nLevel = 1, nERR = 0;
# b( m+ _$ A, D" I4 Y/ a/ r if(!(istrin>>t[1]))istrin.clear();0 \7 \ r$ ^. Q, ?( G, q! q
for(;;){
, t- E* E# o3 v3 _# Z+ { s% Z4 P if(istrin>>csym[2]){
% a0 g! p2 q, T: y- L' z switch(csym[2]){
! \- F8 `4 R, F! ?' }6 z2 w case '(':
. g5 ~0 v/ G3 m if(!csym[1]){nLevel=0x100; nERR=1;}else
4 \" i+ o2 X, f2 M: n& X0 N7 R if(!GetExpValue(istrin, t[2]))nLevel|=0x10;) a: I7 S, f8 k6 _/ K/ x
else{nLevel=0x100; nERR=1;}
" V9 w: B# A- E" ]: P+ Y7 o- D break;
' m" D" h* l. W8 w9 t case ')':
; T, C! L5 {. u {nLevel = 0x100;}break;
, C% ~7 W7 y9 R" ?! e case '+':case '-':case '*':case '/':! x1 [0 t0 k* b% f7 H
{csym[nLevel++] = csym[2];}break;* s! b* w, K* d2 U, O/ X5 D
case ' ':case '\r':case '\n':case '\t':continue;
7 x$ y6 j! ~$ x4 P default:
9 y2 l6 f' [- I0 g8 ?+ ^ {nLevel=0x100; nERR=1;}
2 T& g" h1 @2 U8 f- E4 Q$ \ }
1 p5 v' V3 p5 t: i if(nLevel==0x100)break;- d7 |. a% h! O
if(nLevel&0x10 || istrin>>t[2]){
8 ?2 V6 \8 D- U W; ?% @. c nLevel &= 0xF;
! R! r+ ^ Q: H3 b; N# B if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 ]+ S9 n7 Z9 b* B! ]4 s1 x) k
if(csym[1]=='*'||csym[1]=='/'){" I6 z' L$ O+ V4 m- S8 `) B
GetExpValue(t+1, csym[1]);
: [- j7 [( K7 V }( Q2 I% R, l7 R k( A& o1 ^
else{
' {8 f" }3 ^5 U9 b GetExpValue(t, csym[0]); w, _, ^& q+ D8 Y! Y2 w7 s# a; {
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
5 @. D, z3 B- V9 k& E4 M f. ] }$ [. p* Y$ }5 _" Y7 N2 R
nLevel = 1;0 u6 d1 q9 U6 k8 }0 ^
}
2 ~3 Z! G- w3 ^4 O" ] else istrin.clear();, }8 h( L; V2 X4 {% n6 w
}& j4 u8 y* H& f) n
else{nERR = -1; break;}0 z8 L9 _+ n1 ?" r
}+ Z, R- z/ S/ e% M0 e
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);. E1 u0 n/ u) W* i2 w
else nReturn=GetExpValue(t, csym[0]);
0 Z8 c; S7 K0 K6 H) D return nERR==-1?1:0;# b1 s1 e d8 l! i# E A8 j+ Z
}}: `1 C, J! ?( ?3 |* V3 s
* C# M2 m/ E5 j( G1 H
$ [. i3 F8 U6 ~3 u6 G7 x. C6 O- J9 W
函数模板使用示例:9 [+ u' k% z* p: |& Z5 Z8 N/ h. @/ O8 M
在以上那段代码的后面加上以下代码:( K" Z# Y4 p; V: z: a6 o
/ |/ y9 I; s, u" C# @5 a. I
; K/ d! ?: `+ r5 U; s/ ~7 w
1 R! P6 w" \* G* V0 N程序代码: 3 ^- J9 ~. G' U4 X' v
/ s# f9 | V) i
#include<strstream>8 o& q1 Q$ O8 S5 V6 _- `
#include<iostream>
" D2 `7 b ]5 x. y8 N* V4 x" }! `7 g+ F. u {#include<string>
* e% ~: O' d; gusing namespace std;
2 R4 w- n6 w. u' A3 xint main(void)) ]0 B1 T7 F9 T8 I/ n3 E8 w
{, j1 B* l- n: i: [" V9 d
string s1;+ a. Q; @. \' N. z+ H. f+ [
while(cin>>s1)& K4 p4 @; l m
{5 V! o3 ~$ w+ t
istrstream isin(s1.data());! S+ i$ @! w7 D
double d;1 e6 T& ]9 u; C6 x2 {
if(fy_Exp::GetExpValue(isin, d))% b B. ]; ]2 w2 k
{8 d T1 y5 b$ i* r( c& C
cout<<d<<endl;
- q. N2 ]- W. ^2 z- B; [ }
# P- W# i1 I8 w3 z: x; x: r$ R/ I% g- j else
& a P1 s: X6 p' B {
3 ^ m. H& {# E/ c, \7 }" x5 o cout<<"ERROR"<<endl;8 N' `$ P' b z( y1 } `
}
' a6 Z3 x4 w9 o) A$ N+ X& c }
& W7 v" f _/ G' A$ p! S return 0;
& ]3 e6 |) J T7 w4 W6 L}
- b0 `* y0 `! B8 w: ] i. m: G) l+ M0 K
% C' r. Z( `6 O s然后编译执行就可以了(*^_^*)3 q% F) v: U5 ^) r% C6 T' F
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 A7 t4 v: {3 H4 m 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|