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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,7 k% t; ?; Z' k$ T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 z# H; Y0 D3 M只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! U6 T4 n4 {% y; _ j参数解释: o! i# `0 Q: G, ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( ^# Y2 z3 r. u% S
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- \; L' l/ Y! A& ?+ Z返回值:' v7 |; I. `: l8 u; I( t: K
返回非0表示计算成功,0表示计算失败有错误0 ?1 w1 O1 ~9 X
2 d4 l# T i1 @ 7 n( x! ~3 w( b
% q$ c7 G, M" X/ X5 H4 Q t% t- r6 N程序代码: 6 w( O8 e5 V1 s% R5 \5 A
6 c3 `! R( k& M% c6 tnamespace fy_Exp{
, b' ]7 `- p. @0 K+ d$ T9 bnamespace {template <class _T>
. f( U( P/ X# w, H+ e [inline _T GetExpValue(_T t[], char& csym){, r, F! z. d+ ?; i
char c=csym; csym=0;+ P T; |, {" e8 h
switch(c){) r+ x! Z- ^7 s% B
case '+':return t[0] += t[1];5 f/ z2 Z: X/ ]& A4 Z
case '-':return t[0] -= t[1];9 }6 K. y5 E! R2 a
case '*':return t[0] *= t[1];
# }) p4 l4 L1 o. Z4 v default: return t[0] /= t[1];//case '/':
* M5 v5 ?2 W% i& ^# Y }' \ }
: r0 l! H+ P. J6 L }& s}} _) i+ D' w* Y! {& U( J
template <class _T, class _Tstream>
. \2 J: U) k6 M f* w2 m+ C7 ^/* _Tstream: inputstream, _T: get return value
0 {8 n- v2 m& Y+ p5 _* Return nonzero if get value successfully */
/ ` @( S7 [7 B) g4 Qint GetExpValue(_Tstream& istrin, _T& nReturn){
0 E% F3 N' E' J7 I7 o, }7 b _T t[3] = {0}; //雨中飞燕之作
6 q, P- D% U* h0 b% s' P" b( ^. m char csym[3] = "++";
! ]! B% `% D; O. x7 P" F int nLevel = 1, nERR = 0;- S4 d) E9 m& x" V5 P, \8 u$ K
if(!(istrin>>t[1]))istrin.clear(); t+ u4 q- K( r! j
for(;;){7 j* I+ j1 e! s$ _7 s
if(istrin>>csym[2]){
* F& U, j7 e3 `4 B5 X8 \+ W+ b switch(csym[2]){& \& l# ~' T! u6 h, p
case '(': S5 Y* j F: J; P0 p# ]/ V9 v8 b
if(!csym[1]){nLevel=0x100; nERR=1;}else
1 Z% J6 V9 I1 y0 e3 D if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 r8 I5 g, T' F; }* \# s) |5 p
else{nLevel=0x100; nERR=1;}
- e0 y6 ^ g4 D: { break;
# y5 W5 O: C8 b% b0 y+ y" Z case ')':
5 a$ k! o$ x% H* q- t" `' o2 x; j% H! t {nLevel = 0x100;}break;
2 d* J% _2 v+ H) ?8 `5 d) ~; o case '+':case '-':case '*':case '/':
$ u) y7 K Y% ~0 ~8 D6 G+ i ` {csym[nLevel++] = csym[2];}break;
/ q9 J! u- r- ?% q1 | W case ' ':case '\r':case '\n':case '\t':continue;
) V6 \0 n9 E1 c! ?7 v/ c default:3 ]& _0 I% P# ]2 ~! a+ S
{nLevel=0x100; nERR=1;}
/ o: ~& E' P4 o/ J( [6 d: }, P }
' U0 f- X! m+ ?' _$ |2 w if(nLevel==0x100)break;
' w3 ]( R: W) Q% F/ z if(nLevel&0x10 || istrin>>t[2]){% [ [& U- u' M) S, A% g6 e) P
nLevel &= 0xF;
6 y" I$ S* T( j5 j5 o5 W' j* E; q if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. f: q2 N7 G. v R W1 M( l1 y if(csym[1]=='*'||csym[1]=='/'){
& `! C3 s7 v& j9 s1 y GetExpValue(t+1, csym[1]);7 D) C/ j4 o) {) J/ x
}
0 x) m9 \- n: d2 n else{
' e& {% \8 l R: _5 n GetExpValue(t, csym[0]);
. Y! t0 D) R+ U5 P7 v; k6 O9 s t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 Y; K# _' b& _) q) K2 J
}% e% P- P4 r R5 f" r( C# X2 o M
nLevel = 1;
$ H) X, j, `: j) ~/ [ }( ~& Q) m3 w! D4 b" c- e' X
else istrin.clear();
; S4 u4 ~' ` t C }
9 {* @5 J$ F' t- f else{nERR = -1; break;}
( U$ d% ^) a2 l( s0 |: S$ c }0 r, A8 K" S9 G. ?8 C3 u
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);. p4 B; q" A) q+ a9 h0 u
else nReturn=GetExpValue(t, csym[0]);
$ D* V# n: m: q! l/ [4 X1 z return nERR==-1?1:0;+ X2 l( h" H5 A# {1 X) O& b
}}
2 ^6 Z9 Y& X3 x3 Y7 S; y( r
. Q& o( P1 Y3 W0 N; c% O* [" ^# z9 c+ R/ k {' m$ |" ^6 U( G2 x7 q4 r" j
8 T3 F$ n" `+ l! I* P. r: Z3 ?) b
函数模板使用示例:
# S- C6 |6 S4 H% h7 ], ]在以上那段代码的后面加上以下代码:, L$ s6 [. w$ i3 m# p6 `
: G1 ]! X( n& [! O
0 f) E# @$ y, x; s" ]( f9 q5 i. G
程序代码: ; j. j: s3 {( m$ ` n/ f
, u( }9 u# }5 X) `& u! L
#include<strstream>
% A* \* Q: [. A0 v" \ o#include<iostream>
4 K1 D. P4 F8 U) X5 I& ]4 z#include<string>
3 u# X: F' e: W! S- j! husing namespace std;
: H( g A- D" j5 T1 X9 J& s0 Tint main(void)2 ?+ V5 S* S |* f% O5 C
{" V- V$ f4 g9 L2 D* _6 o$ H
string s1;' c% X. }* _; {# V0 X
while(cin>>s1)/ v {* m5 r7 [% ~: ^& _8 o2 J
{ Z& U4 r+ W' z1 x/ j) p
istrstream isin(s1.data());/ N: J5 W% Z% ]) j. H' [" G) n
double d;8 I/ d& L7 M- n, S- `' N
if(fy_Exp::GetExpValue(isin, d))
$ s% B4 s% V) @! h2 V( O {
5 K* v4 s7 t) l& g4 y cout<<d<<endl;
! Z3 G& E3 I* U4 f7 J }, l. z: x3 G4 M2 X+ K3 E3 N
else( O# n0 p* y. q$ |0 c- \. J
{$ M, U( t. e. S ~% {
cout<<"ERROR"<<endl;
# o5 f& X+ q2 j/ b# c K. a# ? }2 l' k/ E6 [0 T
}+ Z. ]% Y8 d" V; f4 B( Q" \$ A
return 0;
. j+ n* A. H3 l/ r}
+ V- Z; D; Z3 j, c- ?' E+ W0 |9 m
( a9 t, n7 Z) k7 }
然后编译执行就可以了(*^_^*)9 m9 }7 k4 O9 G0 \, [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 N) c; o& M3 n9 R9 z7 q
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|