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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,$ K" z5 E: \. X4 B- L& R3 Y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, I- T: U2 }" _) Z4 T只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 S% v5 o$ ^! Q
参数解释:& H% Q$ Z* G! @4 W% i! f1 A: U' `6 i
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流 \6 G i1 m' g) w+ F
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" s% f* W/ y' t; m
返回值:
2 K4 t9 e$ d/ }8 g* l: i6 P7 v. Y返回非0表示计算成功,0表示计算失败有错误/ {* M: [3 r* |2 A; i( U: q) @; x- ~7 \
, D3 S1 z5 }& W% m' ]9 c/ Y+ K7 b
: s$ G# B; L! S; `" b" B; @& u4 h E' s2 c8 I9 l( T# S6 p
程序代码: . A8 \* u. l$ \7 M* h5 O' L
4 z& I4 r# T( l6 ~ j% J5 |& }2 D
namespace fy_Exp{
. c. l8 ]& k9 k/ L2 r1 s* i6 Cnamespace {template <class _T>! T' {* l* s$ J3 ?! @# _7 J; z0 s
inline _T GetExpValue(_T t[], char& csym){( j5 E, u* S) _* M8 s
char c=csym; csym=0;
/ G0 i/ C& ?1 I. x6 j switch(c){
' q% h8 _2 L9 p, y case '+':return t[0] += t[1];
- W; Z( c# y% Y3 b. v0 W# Y, `1 v case '-':return t[0] -= t[1];1 e! i. [6 X7 p# n! E9 k+ J
case '*':return t[0] *= t[1];( t" t! e/ U( ]4 H. m6 q; k
default: return t[0] /= t[1];//case '/':
& E! |* L' l/ C( s- B9 K) S! X" O }
/ N0 s9 b; E0 q- ], j8 s) k}}
. }# ~$ F: [+ I; U$ Rtemplate <class _T, class _Tstream>
: c$ B+ N- J. U/* _Tstream: inputstream, _T: get return value$ _$ i- }% U9 g
* Return nonzero if get value successfully */
' A% i0 u$ [% [6 Z% Z. E- uint GetExpValue(_Tstream& istrin, _T& nReturn){! }, T0 E+ I$ G7 G3 Y2 C4 T
_T t[3] = {0}; //雨中飞燕之作7 i$ I' w" j6 F/ H' p: w' P* {
char csym[3] = "++";4 Q) P1 p4 @) B" a; ^ A
int nLevel = 1, nERR = 0;
3 B% |7 {3 _( u8 k T, G if(!(istrin>>t[1]))istrin.clear();4 K& g- g$ x* o% o
for(;;){
5 w) d1 t6 Q" a/ `% K x if(istrin>>csym[2]){
0 ^: {% K) z) S0 F K switch(csym[2]){
2 h2 ?' m* T9 Y4 a4 {0 R' j case '(':
( J3 ~+ b, B$ N: @ if(!csym[1]){nLevel=0x100; nERR=1;}else
/ ]0 R5 `8 u7 u if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 e& F+ D8 K1 [ else{nLevel=0x100; nERR=1;}
8 y* m* E0 \' j" g0 J( K break;1 s3 H9 i6 V( X6 S
case ')':) m& L n! o9 i" F! Z; ^/ u% d6 x
{nLevel = 0x100;}break;3 ?$ x" {% I% x
case '+':case '-':case '*':case '/':3 ]& d0 z* `; {* p+ U
{csym[nLevel++] = csym[2];}break;
1 E6 Z4 W( L( o3 f; F case ' ':case '\r':case '\n':case '\t':continue;
# l( ] ?: Z$ Y J default:' N( v/ Q2 B6 X# x8 ]2 |7 ^9 r8 w, _
{nLevel=0x100; nERR=1;}
9 T7 u! T b1 ?/ Z! _8 E8 o ?8 w }' I5 H5 n' v9 q+ B2 j8 t
if(nLevel==0x100)break; D# w. ~/ Z1 v/ _0 D, L* j
if(nLevel&0x10 || istrin>>t[2]){
* r3 I- T7 K" l5 k: S8 D/ h nLevel &= 0xF;
+ u: _5 n# b1 P& {5 d: b. T/ B# @ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 U( {6 j4 g$ D4 E% V if(csym[1]=='*'||csym[1]=='/'){) E3 L! x2 X4 @# ?
GetExpValue(t+1, csym[1]);# A3 l" \9 [ m- M& X" |
}$ w) r; w! X& c
else{/ E8 `' N, G) @# o9 }6 f' {
GetExpValue(t, csym[0]);
# b# ?& `2 ]4 l: U' ? t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ A0 P' y$ c) _0 Y* e# g( \0 ^
}6 e5 O& s$ l+ Z
nLevel = 1;2 Q" V8 N+ P9 V+ ^: S' F" p7 k
}
7 C# d$ X, A' t else istrin.clear();
& \5 v* i! i0 E# n }$ ~3 h; D) K3 q: P
else{nERR = -1; break;}8 ~8 [- @3 W# L2 y7 d
}
6 @, h" |- l- J& H% d* S) n& n5 X if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" t* r9 M( W# Z9 f2 k4 v) E" V else nReturn=GetExpValue(t, csym[0]);
& _: R8 j3 U8 E) \4 j return nERR==-1?1:0; k3 s; h$ W, p/ D/ n6 u+ }
}}( H, O- m$ _. X: ]
# Z% K \- Z' F" h% a7 F$ H: _
/ H) i; x+ S& i3 D
* S/ B3 K+ X2 m1 ~4 w+ `; X. Z5 D函数模板使用示例:
( \/ _0 L' O" X# a# ^在以上那段代码的后面加上以下代码:: u9 N/ @- X, l8 z. D$ M' H. v! y
$ c- j" R M8 L0 z, ~0 J$ D& \
/ w S- k6 ^% g1 ]# y$ T+ t
1 K6 _ O, I& H* @程序代码: ' O% }# ~, P6 v9 j. _, A: T& \1 X5 C" A
( f3 `9 X8 x) D7 g$ c
#include<strstream>
* d0 p. a9 c* J! N `) g8 O* L+ W#include<iostream>/ x8 o! B3 T% v9 ~
#include<string>' ]2 w4 \: ~2 V/ I
using namespace std;
+ s% n) L% p1 Q! D# _3 fint main(void)- l& L* D! q, |, w% |% f5 G
{- U6 }+ g# Y1 [ c, U6 ]; Q
string s1;
- C, u$ }. \9 S8 v: s5 D while(cin>>s1)
$ X; W7 U6 @# J, k8 a x {% s! |/ A- E/ q
istrstream isin(s1.data());& W/ C: I& B+ p
double d;
' f- m7 @9 a$ q% n+ p( d if(fy_Exp::GetExpValue(isin, d))- ^2 I, V' V' d
{
$ ?4 Q+ }7 q1 C \1 c cout<<d<<endl;
0 y3 X( f1 j* U; p( U }
) y; S% D5 k0 V( E5 } else [/ N7 M q' J% i7 ?
{$ T4 B: i/ G4 P0 q; R g
cout<<"ERROR"<<endl;
- X% t) O/ z' J' i' k! N }7 _8 o( w Q z9 X6 k, l
}. @) _; Z' `7 k5 T9 Y! Z$ l
return 0;* f( T7 j$ k/ n% ?( \
}9 j6 a; T% R/ q7 _: E) T
8 }6 ]2 A: f9 x* g) `
1 U& i4 n4 `# A
然后编译执行就可以了(*^_^*)* r) r% ]' v' {& l p
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ W* g0 Q8 D8 E' G1 s 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|