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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 G* [2 E$ X, h" u一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ e, y$ o7 [. ?. R) R5 h' C9 q" w# ?7 J只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' C4 P& e e* F& u& K
参数解释:! h7 q! \4 w& {2 k9 ~
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 G# N5 C+ b0 T
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; k T2 C* M; r, f
返回值:
% G Z& f! ^8 r; P0 _, [返回非0表示计算成功,0表示计算失败有错误
, P( D0 h& i6 C+ I; W; V8 A+ x b8 g4 y1 ]$ G+ q4 F9 |- `! ~" X& b
8 R' g$ Z0 Z5 A, I R7 ?
$ F4 @ `0 |0 a
程序代码:
' \1 c/ w# A$ J$ y' R
( i# n" {- O i. E/ n: V; J8 A6 Z9 Y) ynamespace fy_Exp{
: b2 ?" }7 c" e! nnamespace {template <class _T>
8 ~5 }0 Q( k0 x( P6 o8 Q; oinline _T GetExpValue(_T t[], char& csym){: W8 G6 G4 m$ p. Y
char c=csym; csym=0;
9 {( _0 h7 t9 c! X; G switch(c){
1 W3 {0 A6 b# V* ]8 F case '+':return t[0] += t[1];% y8 l( Z! \' u' w- r/ P
case '-':return t[0] -= t[1];
1 ^2 u5 d, n# v6 I8 |3 y case '*':return t[0] *= t[1];
) e, K2 p0 g& i6 U2 d \* R0 F7 @/ q default: return t[0] /= t[1];//case '/':
, Z5 y& S5 v. ?6 q1 x6 G }
$ R7 Z+ l* C+ }% F3 ]- J/ p/ g; ^9 y}}! D/ I; ^* C/ b
template <class _T, class _Tstream>
$ b: l! O: ] _" u( e/* _Tstream: inputstream, _T: get return value% w( e) B1 g/ j- A
* Return nonzero if get value successfully */ v+ b) F2 y8 W; x. Q* A3 A
int GetExpValue(_Tstream& istrin, _T& nReturn){2 g, b W+ G7 n7 I9 [0 J6 P
_T t[3] = {0}; //雨中飞燕之作3 k# @) O! K' z. C s8 k/ V
char csym[3] = "++";
+ F8 i2 H: x6 N int nLevel = 1, nERR = 0;$ B( J& D3 F# p% M+ Z8 e/ M
if(!(istrin>>t[1]))istrin.clear();
& N$ I* F2 c& b+ w for(;;){5 ~$ L5 i( X6 P8 j: X
if(istrin>>csym[2]){% l# y9 [3 Z5 l2 m/ g+ J, B, l
switch(csym[2]){
0 Z' p+ N u- L: ~' j case '(':7 a8 G8 g$ d( J! s
if(!csym[1]){nLevel=0x100; nERR=1;}else
6 B3 l8 s! q' }# B+ `7 D5 D- k if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 k) w$ g0 p8 s- y else{nLevel=0x100; nERR=1;}
9 C" L2 v0 Z0 A3 v7 b- s5 U; F3 D break;' ~$ C) W9 p' G
case ')': v1 \0 w6 w- O d! B) Y8 W
{nLevel = 0x100;}break;' w# E. U9 Z7 Z. e5 `
case '+':case '-':case '*':case '/':! G- M7 G# e+ k& e$ n: @9 _* ]
{csym[nLevel++] = csym[2];}break;
O/ i5 s" G+ K7 ? case ' ':case '\r':case '\n':case '\t':continue;
% h ]% G; @ L7 E) t default:' \4 S! `: Q% R4 \3 P# i; p3 p, |
{nLevel=0x100; nERR=1;}
2 N! y, H2 f- I8 S9 H9 r. G }) K+ G9 m5 J5 [6 |
if(nLevel==0x100)break;3 @* C- s+ z9 H* z/ R3 W
if(nLevel&0x10 || istrin>>t[2]){
" ~' A( \# k {0 i# @( D/ o nLevel &= 0xF;
. M) m% ~- u' O: ~' t if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* _2 j/ P( F/ t
if(csym[1]=='*'||csym[1]=='/'){
: A- |- T- A& M& V X# F2 { GetExpValue(t+1, csym[1]);8 v$ q+ R* u7 a- t# |" P z
}
- `% V0 W% O+ g$ C- T1 y, a3 ~ else{
' ?# I1 V! `* A2 K3 Q2 K GetExpValue(t, csym[0]);8 @- o/ G4 g* x5 r5 H
t[1]=t[2];csym[0]=csym[1];csym[1]=0;' A! I% a/ c* t6 q! O
}
5 _# a [8 I1 _! o% s nLevel = 1;3 M" }/ ~, Y7 x5 O1 y
}+ h# a% t- m" z! l9 n
else istrin.clear();
. r1 m* I) f: `1 H5 u8 ?8 M# M/ n }1 ^5 ?. X5 y+ ^
else{nERR = -1; break;}
8 d1 @- \) d7 P4 K+ Y! e }. a5 \ u" k. S$ |( S( w
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 q3 ?' I: l& t& W R1 b
else nReturn=GetExpValue(t, csym[0]);
/ P+ l9 h8 [; g% t* |/ f return nERR==-1?1:0;
( T" C3 t' J1 g7 B}}# }# Z" W# O0 ]) V2 `/ M5 |
5 |* a C! [$ e% P# Q
4 Q1 h7 Y2 B2 B: M1 r! x1 `
* Z9 v' B. k6 V4 M函数模板使用示例:
, @0 D$ ]( l6 f. x0 C0 D8 H在以上那段代码的后面加上以下代码:1 ^ x: Z4 i# a
8 H e8 O% w$ ~$ H, b. _' S4 P0 K
9 w$ x) W6 c# u) W' r; N# ?8 I* N6 ~7 {/ z, x
程序代码: 8 H- m- m/ W5 w
3 m% i1 u3 G" w#include<strstream>
0 k R& _' j5 l- ~, u! `+ ^#include<iostream>
' U$ m$ o5 Q) B7 L* ?#include<string>5 a) q' F4 T- d3 U) Y8 j4 f" N9 E
using namespace std;
E7 I4 C; M0 z7 j. ?int main(void)
1 J) L2 |) Q) ~' R5 k3 b' [0 ?; H{
9 D, g; E* }4 N& c, I3 \ string s1;
6 o; h, h6 q5 v i while(cin>>s1)
$ R0 Z# f2 O* [0 V {" J) e4 ` w- J+ C/ U
istrstream isin(s1.data());
V" k4 U% x4 @* _' r9 p double d;! Q; v' X& D/ w! O9 V# B. ?
if(fy_Exp::GetExpValue(isin, d))( p3 ?3 [* K) q% @4 z/ N5 `3 y8 R3 A! y
{/ ?0 Z0 z) {3 d+ K% X% U% D: ?# _/ b
cout<<d<<endl;4 @! f% o5 D9 \+ A: ^5 R% w% h
}
9 @) y* S$ P, Z# m$ x: j else
+ v+ W1 Y, f2 p* m5 J {4 p6 Z3 S' _5 U7 p& d
cout<<"ERROR"<<endl;$ S4 f+ X: B1 ]
}; O! W% y# m" \+ Y
}
3 @$ m+ s% p- Y' \ return 0;
5 V4 z- s* \6 w}" k6 b7 j3 Y) T: N4 M, G+ J6 t
5 _$ Y+ w6 O$ R3 R. |6 N/ ]
4 s* I( t/ a) |
然后编译执行就可以了(*^_^*)
0 o O8 a% L. t; T# B) d( A其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 W# B* R9 x1 ^# t' H# m+ ~
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|