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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 v [0 l5 [3 {9 M( d+ e8 L一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ Q4 \: k$ M; i; B只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' c+ V: e( j2 [参数解释:
# O, {" M2 Q8 |+ \# d8 R; Aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( C* Y' j( `8 K" w. UnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# z; ~9 R* [. }6 C" y* v0 B返回值:
+ V+ _' w/ @: I9 @2 K4 z返回非0表示计算成功,0表示计算失败有错误
/ H( M( o, ]6 a$ T: Z7 v. J4 Y, R( N6 L% V) Z9 D B' s8 g
) O& Q E" k7 w7 r, Y! F; [! F1 |) z8 B
程序代码: 1 g8 w* O' B" e. [
1 M6 X, c) }, { f
namespace fy_Exp{) J# x P- P7 |+ U
namespace {template <class _T>7 q3 A c# r; @1 Q. f
inline _T GetExpValue(_T t[], char& csym){
! a2 c' B1 ?8 I; s4 x2 N: B4 z char c=csym; csym=0;
% s, J% Z: f% l, T, f6 A N switch(c){
/ [9 Y5 L" Q3 z3 S* o; k case '+':return t[0] += t[1];. x2 R2 E% Z" ~4 z( ^; R
case '-':return t[0] -= t[1];
2 n0 c' i4 w5 t" Y: a7 s; ] case '*':return t[0] *= t[1];
5 v9 j; q6 Y/ ?+ T default: return t[0] /= t[1];//case '/':# I7 W- ]% ]3 o
}8 M4 t/ K5 W. K m9 z# R0 F
}}
8 J8 S5 b, R. X K9 W" M3 dtemplate <class _T, class _Tstream>
5 n, n# P- Z8 f9 a/* _Tstream: inputstream, _T: get return value- `* r* M) K8 v. U# }4 b8 m% y B
* Return nonzero if get value successfully */
1 h% n J. b7 O5 b% _2 S0 M4 lint GetExpValue(_Tstream& istrin, _T& nReturn){2 S# W# y* T) n
_T t[3] = {0}; //雨中飞燕之作8 M& d, ~$ t( x3 p/ c
char csym[3] = "++";
! i% [* D$ L! W0 ?$ K- I6 ~ int nLevel = 1, nERR = 0;
$ G/ u4 k) f1 N5 B! ^ if(!(istrin>>t[1]))istrin.clear();
% x% H9 ?- n8 A$ {3 [2 S& v for(;;){! @* c# y2 |5 ^& l" Q
if(istrin>>csym[2]){4 |0 i4 A, |$ @% q% ]5 c# w/ `
switch(csym[2]){* S0 N2 K7 U8 @6 K- C# s; N
case '(':$ x. b7 o/ D( q8 i
if(!csym[1]){nLevel=0x100; nERR=1;}else/ Z! ~. U8 ~ R% |+ z* L
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;/ B: j8 o: ]5 X* ? k8 r ?9 M, C3 O
else{nLevel=0x100; nERR=1;}
( G6 g u3 R2 h4 X5 x break;
# q( k9 A+ R4 k) z" S case ')':' K. }7 z% @* y& J8 G
{nLevel = 0x100;}break;
+ H8 S1 e! A1 h. ^$ s; e case '+':case '-':case '*':case '/':
% k: A5 ]2 R) k7 c6 \1 M {csym[nLevel++] = csym[2];}break;
6 ~8 n! O2 i; E% b7 \# A( C case ' ':case '\r':case '\n':case '\t':continue;6 z7 n, b1 \, P. w0 W
default:' D; P0 l( e: J* B) w
{nLevel=0x100; nERR=1;}0 i, R( W0 x1 w& f6 X* U# H$ |% m* g
}
, z9 u' D2 C5 {$ a7 r; g1 Y if(nLevel==0x100)break;
% o3 B: C" _! n: ~# m4 V if(nLevel&0x10 || istrin>>t[2]){* t- l& P' D$ `+ m0 X/ g- s
nLevel &= 0xF;0 A# k3 E- `( ^
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! D3 C. T" ]1 u* h2 |( B# Q' U
if(csym[1]=='*'||csym[1]=='/'){! B7 R+ Z- X5 H5 }) A0 N
GetExpValue(t+1, csym[1]);
+ w( }; _) W$ G% l }
2 Z% O3 B8 h9 k t$ L0 [1 m else{
% H, S* L$ b | GetExpValue(t, csym[0]);
4 X) H" E! n \2 R% C8 `3 ] t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" ?6 y% C7 U' f6 J; [, r. m, L }
8 Z( j' i' Q- I, j nLevel = 1;8 v. d9 y+ q. ^. M b s: t
}/ W5 e: B9 ?* g* Y# u
else istrin.clear();
3 P+ c8 M, W4 a. S2 z) a0 D }
" H- N6 [6 n7 b: z5 G+ M- D' t else{nERR = -1; break;}. a$ `$ W% l5 j- h3 ~3 B
}: ?+ Z& Y# Q7 u- x- t
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 n4 [# o) k3 y" f+ Q" z, R: J+ L else nReturn=GetExpValue(t, csym[0]);
0 ^- E+ N+ R$ ?1 w return nERR==-1?1:0;
% c5 e5 ]9 | X; y. Q0 Q2 C. C' ^}}
) Y! G8 l1 {+ ]# T8 v% E7 B( Q% a* ~& l, |" i ~5 y/ ^
7 e% b: e. _6 }
) L/ p' M4 P- R6 X, w, \函数模板使用示例:% n# ?1 l. D$ z+ K4 l* X
在以上那段代码的后面加上以下代码:
, b( C7 _- } O1 C- V: n2 f: {) W* o
- w9 i& m6 H- S! `5 d$ f( z+ i$ d) ~/ P! S" U) u- ?7 W; V' `( z
程序代码: ( u- k$ t- D) q
9 j7 n4 g+ k1 K* t/ w3 f7 U
#include<strstream>
8 a$ D/ T2 y; m. @' W#include<iostream>
: U) {5 i, O+ H; L#include<string>3 C6 D e8 A) G o
using namespace std;
; a. J$ E' z7 kint main(void)
2 g1 R8 R6 ~8 K8 K6 B{
9 B, c2 X: L9 a) I- S/ _ string s1;
- ]4 w2 b2 {8 `7 P/ s' X/ m3 X while(cin>>s1)
5 I; a, m! r6 P9 z {2 B" R( d: t1 {6 l7 }. D
istrstream isin(s1.data());. _" `( a; Q$ w ]* f% n6 l6 T
double d;
k" }- Q' T& U! f' W2 ? if(fy_Exp::GetExpValue(isin, d))- Q7 ?5 M4 v5 Q; V( M3 h
{4 ?4 A$ C2 V8 r6 X1 J0 Q
cout<<d<<endl;/ L& z+ V9 e0 d) _
}+ U3 \4 ^& t* f
else
9 g2 g8 J5 b `! |/ g3 s& V: o: W {
3 V) N$ g3 J, u1 I( Q2 N cout<<"ERROR"<<endl; w9 q7 G/ Y& I+ F
}! i) m2 V) e: @9 U3 P
}8 W- h3 _1 [7 \# s
return 0;
, X2 b1 G' n) l' e# k}* R) t+ M" l2 y: l3 D z
9 x; z- o; I# R$ p5 l3 U5 ^
& H! R) q) V$ r+ f) s然后编译执行就可以了(*^_^*)1 _/ R9 v- }0 p4 H
其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ N2 G" v) K% v; t0 w% O
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|