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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,# f }( N6 h' `" V0 J
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 |% y; g7 ?7 C( n5 w3 v! O9 T7 V
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, y$ p: s+ ]' w9 V参数解释:, G$ v- a/ f9 S' x O
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& E. _8 s; @) X* n; u! n9 AnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: @% u7 z$ ~2 W6 T6 K
返回值:
8 @2 T& N# w+ e9 ?( y返回非0表示计算成功,0表示计算失败有错误
' B N$ T& \7 o
0 K! v$ B ?1 v: c1 v" q6 S1 [, ? / B' I# m _" u0 |
0 g/ o0 k6 O3 i
程序代码: - }0 A) e7 l5 c/ P" s3 P
9 N9 K9 |0 \8 t8 r
namespace fy_Exp{
7 e- L7 O4 z! N7 ?; ~namespace {template <class _T>- c* o( [& P; e& s9 L! ~. E
inline _T GetExpValue(_T t[], char& csym){
: \- |5 q7 b3 a char c=csym; csym=0;
8 T$ p2 w& Z( K( k switch(c){& H( W8 {0 Y4 ~$ i. P
case '+':return t[0] += t[1];
2 Y, H7 e% e3 M) g; ~& Y$ M case '-':return t[0] -= t[1];; z9 c" f7 Q0 p/ ~; w/ u' @
case '*':return t[0] *= t[1];
, u# Z, W+ \) Y default: return t[0] /= t[1];//case '/':' d/ K# j$ I! v, H# r$ I6 C7 ^
}7 @, |" q) L4 `% E" M* Q
}}
* }1 Z+ ~5 ^* p5 s5 i/ Ktemplate <class _T, class _Tstream>
* P7 P/ F D& `( @0 R. w/* _Tstream: inputstream, _T: get return value8 z, J1 L( F5 r3 _7 m* W/ ]
* Return nonzero if get value successfully */8 N& |' K. _2 u3 ?3 a( ~
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 Y7 a; U+ q7 W _T t[3] = {0}; //雨中飞燕之作
) h4 S; s; Z# m# T, U0 F$ p char csym[3] = "++";& b0 T& N# W+ y9 c! t% W
int nLevel = 1, nERR = 0;
4 _' ]# b1 h* r- F' Y" u if(!(istrin>>t[1]))istrin.clear();
8 d& z9 r# i3 W( s& Z p1 l" K* H2 V for(;;){
5 w# ]) k& J# e if(istrin>>csym[2]){: P2 s& o9 w/ s# l8 s5 F
switch(csym[2]){8 ]' Z3 l: T% l& L) U
case '(':6 [3 I4 I2 K0 G o" K0 R
if(!csym[1]){nLevel=0x100; nERR=1;}else( i) h' @. n j, u2 q0 u9 {! Z0 s
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% k* d3 c2 ^$ W# p4 r( ~
else{nLevel=0x100; nERR=1;}
% l- J0 k! z+ K8 r9 a break;
" f1 S3 S1 p$ ~" L+ o% F" z( R case ')':. t5 C B" ~" b6 a5 l
{nLevel = 0x100;}break;
3 A4 ~0 F' H% T8 Y case '+':case '-':case '*':case '/': e" Z9 c, K9 g. `* G
{csym[nLevel++] = csym[2];}break;4 ]7 [; X0 t8 f1 x* I, `6 D; ~
case ' ':case '\r':case '\n':case '\t':continue;2 X, V2 u2 @/ t4 V7 [( f
default:- @+ b" o* `( Q: B3 W9 S. |
{nLevel=0x100; nERR=1;}) Y# x* o: l9 j2 f) W7 W6 O
}
. ]) ]7 A4 v, A0 A) C+ y- y0 c, @ if(nLevel==0x100)break;" T$ E; W7 z9 _; ?( I+ z: F
if(nLevel&0x10 || istrin>>t[2]){
3 D' q0 Z3 R) H nLevel &= 0xF;
# S1 @+ p7 z2 v8 Z* x5 |$ I) i; i+ `& x: K if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 u, @, b& J6 Z/ B' v if(csym[1]=='*'||csym[1]=='/'){( W% v0 o9 v$ h: H0 @
GetExpValue(t+1, csym[1]);
1 B8 b3 G' q1 k$ d }
- ?: M4 y/ p# A4 ] else{
7 @" \; F9 A8 W2 ` GetExpValue(t, csym[0]);
( i! I3 t' [! |2 z t[1]=t[2];csym[0]=csym[1];csym[1]=0;
6 z- u# D( W l! T }
8 `) T' M, U% T$ _ nLevel = 1;
0 H+ f( b, J" ]) X7 f% [ }
; G* V; y6 ~: r$ C1 o* [; @7 X/ A$ ] else istrin.clear();' q2 {1 F5 X, o0 f
}
" u7 d0 I- F: m4 z# K# N8 E0 s else{nERR = -1; break;}
3 M/ n9 r0 d- q6 S9 [ e/ Y0 H* _ }
6 `* D0 H. w$ t, Y if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 {! i2 Y0 B6 l& C A+ r, o else nReturn=GetExpValue(t, csym[0]);' w; ~' X, \% r% r) h, i1 [( r [
return nERR==-1?1:0;
y, v/ G0 c6 J( q}}
, y+ y+ X {* e2 [1 B0 I2 t- q5 }. U' n4 C7 u9 I3 l0 C
( w8 J: O* _. |: u4 V1 B0 X0 Y) F
( f: t Y7 H( a- f$ k* J
函数模板使用示例:
2 U& C; p, f& t! L, T3 Z( a4 K在以上那段代码的后面加上以下代码:) z5 \; S C0 d- \: Y" c8 h: T
$ D; a2 \% R% u% U8 ~# m
' l. Y, f) {% K* y8 m3 n1 i
1 @0 a7 s# D& l7 j6 Y: ~, K$ O
程序代码:
. A) d! x1 t9 `/ p3 d% \
, R w8 K( a) A5 a#include<strstream>
R$ R3 A7 e% T# S( {#include<iostream>
$ v$ G3 m0 w0 Z! I4 }6 [( l#include<string>
+ S y% _4 n& }3 L* tusing namespace std;
/ ]' f4 y9 c# ]7 P) Eint main(void)" }! Y- v5 w4 R* u$ A$ g, V3 r
{
1 V& F+ {" }9 `$ Y6 s S string s1;
3 k) i, w# j0 n' M7 z- ] while(cin>>s1)
7 L( \. h4 S+ X( O/ n1 W% {" d4 Y {2 ^* w8 k3 I& ?9 M2 o5 q, x) I
istrstream isin(s1.data());
$ z* q# W# }1 j$ g double d;% Y& I! ~/ t/ {
if(fy_Exp::GetExpValue(isin, d))
7 C4 F5 p; F; b( Q* f3 c {
8 t( B% c& v/ t# s9 e cout<<d<<endl; C, ~+ ~, t8 g% B
}! b3 Z. D6 P6 G: `
else, N1 u) L5 w5 F, v; n* i
{+ @7 \/ z* [4 s; ~
cout<<"ERROR"<<endl;1 R' N! V9 J6 L9 \; r4 a! z
}# H6 K0 C2 V) r* ^5 R
}
6 M$ [8 ~3 C# a$ T return 0;1 j$ Z/ u* r5 n% y1 c: m
}3 G1 T/ I& P! i+ I( o3 e2 c
5 m4 M6 V/ T* F1 _; U
+ S' ]- `6 [7 a( @然后编译执行就可以了(*^_^*)
3 w6 @6 Y& h6 k& b/ H其它:TC++上一定编译错误,不保证在VC6上也能通过编译 W/ n+ g! p6 `! S; P& A1 x
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|