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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
0 I, J; q( D6 V一个很方便的函数模板,可以并且只可以计算含括号的四则表达式9 O6 | ^6 v( r
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* G+ g3 u; T* Y: }参数解释:
* I1 a4 X. Y* F- j _" R/ {, u' \9 uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 j5 Q( m; O8 S }
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 O- ^8 C! C4 {0 Z9 x
返回值:
/ X% c7 P& M1 L* z w/ F" o4 _返回非0表示计算成功,0表示计算失败有错误" ^7 O) E5 H# r$ _2 j4 l4 ?# S) @0 r
B; C# L3 g L7 ^+ k1 A% ?
- q. l( D6 F: `, m% c5 B$ H
* \4 K9 {- m/ i0 T2 g
程序代码: ) h* v% c4 [8 d/ c, M
; G6 U2 V9 f3 M' d, z& y' N/ o2 Inamespace fy_Exp{) y; I8 O* g0 r+ [4 R* e* d
namespace {template <class _T>
9 j* v& }2 t- Y2 ~inline _T GetExpValue(_T t[], char& csym){* ?0 S: ?+ t" B
char c=csym; csym=0;2 c% O0 o* }5 C9 C
switch(c){3 c( x( w# M7 r( O, P3 K# E( @
case '+':return t[0] += t[1];; `& Y: c# r- B$ ]: l
case '-':return t[0] -= t[1];5 @5 ~0 _& c" v" I
case '*':return t[0] *= t[1];! y) G2 r" N+ T' u
default: return t[0] /= t[1];//case '/':7 z9 W% @2 x* P" c
}- o. K' {( O$ D9 [8 _+ q
}} q5 K8 L6 r$ e! j; E$ p# ^
template <class _T, class _Tstream>
3 `* B" J$ t& u$ @5 v/* _Tstream: inputstream, _T: get return value
2 E# a1 x. K. q1 x( [8 A' X# m1 z- p* Return nonzero if get value successfully */
" _# D+ Z- n P, ?9 @int GetExpValue(_Tstream& istrin, _T& nReturn){
6 u; Q: |% g- u" L8 ` A( m5 k: F& @ _T t[3] = {0}; //雨中飞燕之作+ n7 J9 P0 z( j! ^$ I9 n
char csym[3] = "++";
9 K2 I! C- P% |- w' N1 n int nLevel = 1, nERR = 0;/ P" S! W( F) Z; y2 E) a3 q
if(!(istrin>>t[1]))istrin.clear();
( @! e7 n3 ? v$ [( s0 K" ^) I2 o for(;;){
% A2 E; @" K# B$ _, P* l if(istrin>>csym[2]){0 @' u/ |$ L2 |' C' u3 {2 s* U
switch(csym[2]){. }0 `4 r* j- A3 b. \7 Z2 E2 x
case '(':- m- G# S1 v7 X l/ T1 h% t/ k, n
if(!csym[1]){nLevel=0x100; nERR=1;}else- V$ p% K5 k" }7 ]3 L- ~0 t+ B
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 z+ h, m1 M2 t0 g4 ]
else{nLevel=0x100; nERR=1;}# Q, G+ `! I: m$ u& ~" |% w
break;! J/ o. R% d+ {, ^2 C5 t
case ')':
8 Q3 E s* L I6 [- D {nLevel = 0x100;}break;2 z) Q4 |0 S3 J* B) S! F1 R
case '+':case '-':case '*':case '/':
* O. l* b4 F. J9 j! I8 L) t1 [ {csym[nLevel++] = csym[2];}break;
+ H& J9 b# m" @5 [% C3 } _ case ' ':case '\r':case '\n':case '\t':continue;
- \/ [ J- C% p) ~ default:3 v7 T# F0 s! n% r, i; t* m
{nLevel=0x100; nERR=1;}4 ~0 Y4 @ Z8 _( h
}
$ `/ Q; c7 k' E9 h6 b% W) r if(nLevel==0x100)break;: e0 b) |/ R& s9 e1 ?! M1 G
if(nLevel&0x10 || istrin>>t[2]){8 c8 R% `/ D' O) ^
nLevel &= 0xF;
1 h3 e' ?; Y: E& V/ Q if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 n/ m0 J+ j: ~! J if(csym[1]=='*'||csym[1]=='/'){! m- \% F& N( J d+ X
GetExpValue(t+1, csym[1]);
! M* y. [7 e5 h1 k F }' n7 K; B; p# ]2 r; P3 v, i) k, _" w
else{
. Z: I' f' i o) g6 i T GetExpValue(t, csym[0]);
9 n& ^" _1 E* u9 f) l t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 a8 f3 x8 a: [7 t9 d }" \; D4 v% N" X$ `4 \
nLevel = 1;
6 [& s9 w7 T. |- D }& Q3 M/ A" m- n( {8 h
else istrin.clear();
- L0 y. t8 T3 t8 E* [* s }
) u/ w% `0 q/ F/ b# u else{nERR = -1; break;}
6 S6 T8 x: c/ D; x e. P) c }) l% i$ n( w' ? @5 b0 A# `9 t s
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: n& v9 \8 Q# \4 R else nReturn=GetExpValue(t, csym[0]);4 g' a% u. T- V( @ O" ~) c' m) G
return nERR==-1?1:0;
2 e9 N( n) {4 Z$ V3 s}}
( g7 Y3 |3 Y! r1 L2 s: l. E3 G5 X6 k( b* a5 d3 @+ Z2 c0 j
/ ~# _& a+ a0 b$ J% _
- F( M5 F/ B$ f2 Y% p函数模板使用示例:
# }7 H+ d% t% b: b& u: O在以上那段代码的后面加上以下代码:
) U: z3 n3 f4 y" E7 Y/ H
5 a6 e* M6 X" X4 Z % X; ?/ e# ?1 ]) c2 U/ H
& h- d' \& O3 }3 {, J程序代码:
6 o6 }. C/ I' @: p+ W
& G8 U, r" J6 w#include<strstream>
) g0 b# V0 G% @8 k#include<iostream>
& G# T, A! X" O7 s0 b1 {#include<string>
5 q$ W7 ~' e. ]5 Vusing namespace std;, u. G4 c! Q( q: `
int main(void). o# U5 j+ i9 `3 D \2 @
{
$ z3 i$ Z! |9 g- h2 C; G$ l string s1;$ m9 V0 C- h$ d M* |9 W' O6 m
while(cin>>s1)
2 U" H4 |: V T$ P+ z9 ~6 }; i. F' _ { o j3 z! a7 q
istrstream isin(s1.data());
% c& S+ v, ?9 a( @ double d;
5 ]* k% k( Q5 I1 d" X4 x! T8 x/ S$ l if(fy_Exp::GetExpValue(isin, d))) v/ Y H, D8 Q0 | |" [% ]2 I
{
& W: H1 Y2 B4 P cout<<d<<endl;' x- _. k3 ?/ t: V
}& a, i6 @% x0 Y$ J% E6 e
else0 Z& j% s9 |, j0 a
{
) {+ Z' k5 Z- X3 ^+ P' c cout<<"ERROR"<<endl;
n; q+ e8 x, K! T: q2 i }' p/ T7 m: }& S$ z
}$ G' e% X$ \, g/ A0 K
return 0;
! Y3 [. ^7 r6 |}
. O+ m. `7 p( g- d8 |' J4 O( l3 O4 f! n: P
8 B+ R& `* x# o$ J: u然后编译执行就可以了(*^_^*)& {9 R- z. | V& X* Q
其它:TC++上一定编译错误,不保证在VC6上也能通过编译* f1 a9 M8 l7 @) {4 [. |/ n
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|