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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
o6 d5 Z. C% H一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. w5 A$ V# y8 D" S, i# t只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 i3 U- l9 }. \/ N
参数解释:9 k8 f6 d) r# G" |7 M" m
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( _) J# p- K. i0 |nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ J; W2 B& ?7 U! {
返回值:7 X0 k; J% I$ x7 F( z' Z& e# g( J. e
返回非0表示计算成功,0表示计算失败有错误
% z3 `* U0 ~. E6 G3 N* O$ l2 w
8 p# F- G- A( Y; r* t. [
$ ~9 W) F6 n/ U/ J* h. p9 u程序代码: 8 x0 v, i0 X; e5 a0 i7 K% Q
6 Y# A3 I9 d3 q5 o
namespace fy_Exp{
5 G% l% \" |7 h1 v& Znamespace {template <class _T>
' n5 M( i+ z, z8 H) ~6 tinline _T GetExpValue(_T t[], char& csym){
3 |0 k% D" P- f, `6 I. A char c=csym; csym=0;
! }; H% u$ \# B, f; d switch(c){# W8 ~1 v7 f1 C% I% ]' h5 i
case '+':return t[0] += t[1];, B, N- `( I+ c$ ]! \
case '-':return t[0] -= t[1];: M8 Y- D' \3 ~/ O/ S5 D2 }
case '*':return t[0] *= t[1];
# ? u+ i6 H5 }( |' s& ? default: return t[0] /= t[1];//case '/':
9 j: @- I9 h" n! g0 I }
+ u: [/ _ I) c! T}}6 I& L, _3 j* V, T& m/ e
template <class _T, class _Tstream>
/ S9 _0 F; z( ?+ ~/* _Tstream: inputstream, _T: get return value1 }1 I- x1 N; G( \' j
* Return nonzero if get value successfully */$ F8 ~0 u: G( X! W
int GetExpValue(_Tstream& istrin, _T& nReturn){
9 t p' f. p" m- B6 S _T t[3] = {0}; //雨中飞燕之作
- K, w6 |- j: d. ]& _ char csym[3] = "++";
. ]# J! M+ |2 N& a' s int nLevel = 1, nERR = 0;( b- u" M& @7 b; P8 ^
if(!(istrin>>t[1]))istrin.clear();: q6 L& b; h3 v: c/ b8 T, F2 u6 B
for(;;){
" M. q3 Z3 w) c: C if(istrin>>csym[2]){- p" S2 x' H. N i
switch(csym[2]){9 J* W4 G8 ~7 O* y* p( d
case '(':# G* i1 e( y7 K/ }' y! g( z
if(!csym[1]){nLevel=0x100; nERR=1;}else4 E. y9 f1 f/ B5 G+ d4 {8 u- p
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' b, Q0 ^8 f" n
else{nLevel=0x100; nERR=1;}
5 T4 |2 |' \6 k break;- e3 w% d7 s9 }8 J' L* \: [
case ')':
7 C) a7 T+ ]/ }! G$ @ {nLevel = 0x100;}break;0 C- g6 R+ q' t+ t
case '+':case '-':case '*':case '/':. h+ o/ }6 a* g
{csym[nLevel++] = csym[2];}break;
# f, F- O# `! x. N+ i. Z: m case ' ':case '\r':case '\n':case '\t':continue;* j* v* k' c+ Y9 p! ?" z5 s& U
default:
' a$ x: o& z$ `- s3 q {nLevel=0x100; nERR=1;}
* d' ^! k' B- Q) T+ ^1 N! F* m }
1 g- L5 ^! K* o/ U" h if(nLevel==0x100)break;
9 r8 [! _8 }* X" }$ {$ Q0 I6 _ if(nLevel&0x10 || istrin>>t[2]){
# I/ i2 I% P7 q, h# O2 Y nLevel &= 0xF;
M+ L. y9 m# a g9 X6 ]: r' i1 [9 L if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- T, P% m( T9 ~! Q0 k( ?
if(csym[1]=='*'||csym[1]=='/'){& i( J! n* _ k( g1 Q; |! y
GetExpValue(t+1, csym[1]);! u* R* ?) [3 L8 N8 `! z
}' r0 P4 x$ p2 {1 a4 d7 u
else{1 J( R" y% |. d
GetExpValue(t, csym[0]);; X3 X8 b$ f* M
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' g2 ~' D$ U0 F }
' g3 p2 B' n# C" Q1 J, z nLevel = 1;6 q* I' o6 B2 V. Y, z) W
}
! I/ h7 q/ d: w9 |8 s7 c i8 y else istrin.clear();
: P6 T2 R/ V- R1 Q2 T1 M" O/ Z }
* B( v; `3 I# p5 |; W, S, G else{nERR = -1; break;}
; Z9 O8 e0 n7 w+ F; _# _ }
* d; m+ [+ r% x' ?1 @ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ ` o0 Q: s$ `# @0 t; S! w
else nReturn=GetExpValue(t, csym[0]);
M% a: O; j) I3 k1 g$ P return nERR==-1?1:0;
8 V8 f2 C. D9 E- P+ R$ p8 g+ f}} ?' S" n, r% n$ v/ l( P; F
1 @3 g- R6 u$ Z `+ q; Y8 @9 c6 v* C6 o- R% x5 j" w* ~
: e# B3 Z2 `0 v函数模板使用示例:
" k5 c; R& Z5 W4 q$ Y/ K* W在以上那段代码的后面加上以下代码:
/ N% m8 O D$ }1 A3 M: Q& F7 |$ J3 {; Z+ f( l3 q' o
. N9 T5 l+ X, T. F) S' X5 y
2 p& D3 r% X6 k$ s2 F/ |% H6 B- \4 f7 S程序代码: / A; A1 K& B k0 }' ]$ Q) a* q( r
2 _) T# b: [/ Y9 r) c) }#include<strstream>
6 c( \3 s! y8 Z' B$ M' \#include<iostream>
/ @& U, f6 Q1 A: @5 ~; a1 {#include<string>
: k$ k: Z/ G* H; wusing namespace std;( W# x) W3 D" ~2 Y0 K9 V% O6 G% @" ^
int main(void)
% g8 y, r& D' W4 u) l0 P9 @6 K! P{# q8 H! o, t" y6 }' I7 g
string s1; ` s7 d+ d# s7 |2 s' ~+ E; a
while(cin>>s1)! L% m# k+ K) u2 e& U0 R
{8 V' b3 q# j- Y3 |7 D% k
istrstream isin(s1.data());6 U! A! m4 _9 e( L; r
double d;
/ h4 M2 f& E5 Y+ j1 M if(fy_Exp::GetExpValue(isin, d))6 E2 Q' |+ |7 x3 S
{
" L6 V8 F* C* ^6 H5 t8 j" W" n! K1 D cout<<d<<endl;* e1 Y; i% k; @% r% W
}! A3 [3 b7 ]! C" P8 Z2 ?6 \) ^
else+ k5 `$ ]1 ` u/ K9 [5 t
{
4 @6 ]( O8 s5 k: U- ]: a cout<<"ERROR"<<endl;
" x$ }. U* }# B5 R6 J/ P* h/ W+ J( E3 }7 ]7 } }* u0 R) F) b& R* E6 G
}
# j, V7 ?: {1 L return 0;+ ^; }6 |. g' y5 O3 I/ I7 j3 T
}9 x: }7 v( D5 s) i6 c! P( W
- ?* {/ ]" a6 y8 b
$ d: Z# J/ d- u1 p
然后编译执行就可以了(*^_^*)
- z$ z3 o* I2 F: ^* r+ j* B其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( o3 @3 J! D4 Y9 ? 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|