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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,3 ?6 G5 v8 f' _( p1 S" \/ G0 K
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ l/ V% \& \, M; J6 i3 {' J只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 Q$ P4 e9 [! I$ b8 ^- H; a参数解释:
* o0 \1 k% M. xistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
/ |- V3 q0 c; ]5 p @( ?# u' unReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 e8 G4 Y% v! B r
返回值:% a& j) S* V- H) P, Z# w
返回非0表示计算成功,0表示计算失败有错误
7 L* Y* c+ w2 C/ s4 l
]7 }: w- A! ]# y9 @' M& n# c) {- A
1 ?* K2 J: e0 U6 r% Z1 d# j, ^9 C& {0 P3 U& c! n; `8 {$ V w% o
程序代码: 7 h9 }; i f$ O% d0 B) W: x
8 T2 {. N$ j# U" ^; z9 |namespace fy_Exp{* V* B7 \ E- }+ u: C
namespace {template <class _T>
1 J* W4 P' r& Z5 p1 A- u6 Winline _T GetExpValue(_T t[], char& csym){7 M3 ?! j" v+ W( z
char c=csym; csym=0;5 W" y+ Y5 r3 K* I0 x
switch(c){
& @0 W& |5 I5 t: z* r2 K, \, @9 H case '+':return t[0] += t[1];
1 N5 b: [7 e; e case '-':return t[0] -= t[1];
8 _; C! f0 w: M) a2 I/ k case '*':return t[0] *= t[1];+ B& a9 C8 Y G, Y0 E
default: return t[0] /= t[1];//case '/':- ?" `1 y7 N2 y
}$ p a6 e* w1 k! D
}}2 n" _4 A) S% `! |: p5 w: k. P$ w
template <class _T, class _Tstream>
$ d' z% M, j9 o, E7 A0 l5 \9 _- C/ f/* _Tstream: inputstream, _T: get return value
1 o) J: X0 T& l$ s* Return nonzero if get value successfully */
! h) Q% o' H3 x8 E% ^- x2 Wint GetExpValue(_Tstream& istrin, _T& nReturn){
) }; }% R- G4 K! \9 S% `. \8 Q _T t[3] = {0}; //雨中飞燕之作
3 ], T- j+ l: C/ M" P8 ^ char csym[3] = "++";
( @5 Q: C: A2 ] int nLevel = 1, nERR = 0;
M) Q* D+ k k7 Z0 _ X, v$ n if(!(istrin>>t[1]))istrin.clear();
" v$ }6 z' ]: T- Z, H for(;;){
& b) s( c' d3 p! w' G2 ~3 d if(istrin>>csym[2]){* Q1 Y" o* A0 z! Z# L3 O* d. g4 u6 }
switch(csym[2]){
, Q9 a1 o+ I0 S: {& O: x case '(':
; z4 {' J; G: w) X if(!csym[1]){nLevel=0x100; nERR=1;}else; B4 X5 \; O8 ^7 t4 ?5 L, l$ l& ^
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
( `& [2 X6 [! r& O else{nLevel=0x100; nERR=1;}2 a; v# y7 Z0 K0 t
break;
$ q0 x) o- V& _0 R case ')':8 W6 I( _7 g4 j9 ]! r: i' B
{nLevel = 0x100;}break; x6 ]5 v; j7 L+ Q$ ]0 @- ~
case '+':case '-':case '*':case '/':
# r5 s7 [! D6 p% j& A {csym[nLevel++] = csym[2];}break;* {; }' Q5 z2 z$ ?; _
case ' ':case '\r':case '\n':case '\t':continue;* F, {6 | J$ M+ s
default:
' O; o, o4 m; b- x7 a4 u, n2 W& E {nLevel=0x100; nERR=1;}
: {9 S; m# B1 T3 A R }+ E' C8 o) L/ k% Z) g, Z4 j
if(nLevel==0x100)break;
* j. S" k, W! M* c% U5 { if(nLevel&0x10 || istrin>>t[2]){
# x7 R; C5 d9 A* l4 u nLevel &= 0xF;( q5 b, }5 W* l' o
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, i. ?% `2 c; T1 k- k
if(csym[1]=='*'||csym[1]=='/'){
6 e9 n; K z$ q. C; ~3 a1 I GetExpValue(t+1, csym[1]);# E7 R' D, T, v ~3 H/ I1 k+ ]. r) _ e
}& t* T+ u: K9 w6 N' f
else{, x6 X4 _/ E: P3 m4 q k# P& s
GetExpValue(t, csym[0]);
2 O: i9 c- B$ J+ m9 Q t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ p9 m5 R+ V# D5 P& f$ t9 u( R
}; H0 I4 t0 R# N' {$ K$ [
nLevel = 1;! d r1 C. ?* G% P- H8 y
}' f" s5 q9 p3 B, X/ ?8 f
else istrin.clear();$ q6 P: }4 G) k0 ]
}* d3 h5 i7 d# R7 U" N& A* |
else{nERR = -1; break;}: l4 J: }' C: |, V
}! r+ L+ Y2 m& W
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; W. L7 W6 j) t
else nReturn=GetExpValue(t, csym[0]);
) e7 S" R' ~6 J: q: I+ G return nERR==-1?1:0;: {( C: Z" x1 P
}}# T! x! W( d1 ^/ ^" _2 a2 Y
4 Q2 ]6 B; Y' ]9 j/ h& g$ ?. k! A) v& m- Z1 b& |
- V; O/ G! M8 I* H函数模板使用示例:
+ P N2 r! V H* T& [. f8 o在以上那段代码的后面加上以下代码:
/ @9 b8 D6 w5 c) l, P& u: R; P
" M/ K- E9 W' P( I
- h6 E/ {- w) n5 ~
, J2 H: A+ X/ k- p3 t) E3 `1 i程序代码:
" J4 [$ S( ^7 R E
/ G$ w+ e" \% {, I! r( l#include<strstream>
6 u0 q& G/ J& F6 Q8 c4 G#include<iostream>5 {8 H! D* F2 Y; ^9 t
#include<string>7 k5 u# o* d5 \
using namespace std;" P7 Z% i$ r* Y* V' Y& E
int main(void)) F% v. m0 m- w9 ^1 x: z6 v
{
; k9 E$ {% h9 \- E* m5 R6 t string s1;7 N v/ m0 B. V" @ W& A
while(cin>>s1)* N% j2 W& U7 z* U8 `) e
{
" w! Q: J) m5 Q. d5 W istrstream isin(s1.data());
4 G9 Q' W" p6 y# s: o double d;) s0 f) u. i/ i8 u
if(fy_Exp::GetExpValue(isin, d))" R8 x/ N9 F7 Y7 ]4 k
{) v! X7 C J5 m* f' k& a
cout<<d<<endl;
0 t' b" `4 U% @* l1 \ O }
& c E5 G5 [: B- t( } else! G, B9 ~, q( o/ _8 D1 ?% X
{
G% |* I- K* Q; t, H, h+ j cout<<"ERROR"<<endl;
& r! H! m8 y, y. a }
4 R: o. }3 r* f8 Y }& ~/ m# l+ S9 A% p: ~0 t. h, i
return 0;
1 A& ^9 S0 U+ I' u) O}9 y4 f9 _" \' U; }1 M
6 r8 W" A" d* J9 b) Y) Y
8 ~1 P7 X- S( y' C然后编译执行就可以了(*^_^*)
O9 I" o1 M$ |& @! z其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; I3 L& j, _( I* ` 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|