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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; q' u1 H9 b# Z$ p5 F, K7 I: n一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
7 P! w1 v5 O8 H/ N4 M$ C只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 V m% P# j& c( _参数解释:6 r: y: ?" m4 m0 Q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
0 x) d/ Y! ]: m9 Z! e7 \nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' \& s- V4 m- C9 W( R. l
返回值:
% H+ t; k* M7 }& Q5 W返回非0表示计算成功,0表示计算失败有错误
$ C0 r: u3 Z9 O; G `$ T/ h8 N! }
3 e) t7 J& d1 F- u3 ?# Q i7 U 4 L; ~; J8 a8 w- g5 X3 v9 X( h
- `' q% Z# ], [/ S1 F4 Z程序代码:
$ D# k" B3 o2 G9 c3 V# h( ^& e0 E" l" N% g' A: m4 L/ c' J% {
namespace fy_Exp{6 N1 I, M5 C0 {7 M1 V% ^
namespace {template <class _T>
9 g3 g6 R4 r7 { r2 m8 {) ?! Ginline _T GetExpValue(_T t[], char& csym){1 h3 U. T5 b4 c- M: s
char c=csym; csym=0;: j3 L8 I1 b( i6 F7 g
switch(c){
1 E; @; M; m+ m6 e* b5 a case '+':return t[0] += t[1];( ?# B' F% i/ G
case '-':return t[0] -= t[1];
" v! m V% F2 v1 r: w# {3 a e case '*':return t[0] *= t[1];/ V4 n' t$ c2 L' I4 U" y
default: return t[0] /= t[1];//case '/':3 @9 U$ e( A# d# ]
}% w: B+ D1 r( [( [, r- b) T
}}
: K- k$ b5 ]2 Q7 t/ ? xtemplate <class _T, class _Tstream>
# z3 G+ g; f L/* _Tstream: inputstream, _T: get return value
" p! O: G4 h/ G$ j" h4 ?* Return nonzero if get value successfully */
# }2 c: j n+ u8 Q) ~int GetExpValue(_Tstream& istrin, _T& nReturn){
6 O! _# O0 ?" j# _& W _T t[3] = {0}; //雨中飞燕之作" a$ @7 z/ X3 u; ^$ [8 K6 `/ i1 ~+ t
char csym[3] = "++";- A! N" [( Z6 B7 o! V6 c
int nLevel = 1, nERR = 0;
2 s& e8 F O5 R9 a2 H2 } if(!(istrin>>t[1]))istrin.clear();6 O$ o0 l) t7 g# l7 G0 ^
for(;;){
4 w& r3 {) }: B8 D* J9 m5 A& h+ K8 D if(istrin>>csym[2]){! `0 X3 ~8 f$ J/ l7 |% e
switch(csym[2]){: T( h, @/ n; z) j
case '(':. x* o, a0 y- ]1 e/ X- c
if(!csym[1]){nLevel=0x100; nERR=1;}else0 S r! {9 B" Z' q# |2 A
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, [: j. E% b _! U
else{nLevel=0x100; nERR=1;}( J5 C" q% R8 v
break;
/ ?3 Z" F$ `, N- W/ a case ')':
/ V% a( O: w5 ]& F {nLevel = 0x100;}break;
. p4 E$ Y9 C/ c case '+':case '-':case '*':case '/':- y2 Q' ?' D! U8 @
{csym[nLevel++] = csym[2];}break;
5 {+ Q4 b. O: ^* ]; z case ' ':case '\r':case '\n':case '\t':continue;( I' l7 a, V4 S
default:$ I+ ` v' l& V+ L& Q! z
{nLevel=0x100; nERR=1;}
i; u3 J) c ^2 |$ P! M }0 @! m# E+ g4 P7 Y/ b7 z* F
if(nLevel==0x100)break;
F# u* B! K7 L$ k/ F0 n if(nLevel&0x10 || istrin>>t[2]){
. s1 V5 G4 l1 t/ a/ d( F nLevel &= 0xF;! Y9 I, p0 j+ O% S
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 V# P7 O# R( Z6 s8 x
if(csym[1]=='*'||csym[1]=='/'){* S9 _$ S# R' k6 N5 v
GetExpValue(t+1, csym[1]);& k2 N9 z) a5 q1 K% w
}2 u# d* _& P$ m5 W$ S1 D, R
else{
# a1 n9 s4 x7 {& E/ e GetExpValue(t, csym[0]);
Z# U7 p+ b5 Y8 J. {& v% M$ R t[1]=t[2];csym[0]=csym[1];csym[1]=0;5 y( N. g8 ^' O- \" d: I1 n) q
}
& ?- ]- Z: h. ?) w nLevel = 1;
9 t8 I0 H' ^& |) e }9 Z* v8 F5 z* N& r1 _7 E
else istrin.clear();
b( h( r" w0 S6 b }, i0 j& P6 @; ~" V O: ~
else{nERR = -1; break;}" N$ F3 C M5 E5 s9 Z( I
}
4 A, J' _+ W( @5 V if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 o) o5 q! ?- p$ c/ w$ |% v) S else nReturn=GetExpValue(t, csym[0]);8 }$ U8 G1 f+ @' H( @
return nERR==-1?1:0;* B+ E% b. r& g; P
}}
! N& P# s0 Z; i1 A
( G7 T2 s0 z. L1 ~( w Q3 E
" C' G0 [# L3 P/ G E* c: q5 S. U9 B
函数模板使用示例:! K( ~7 y; {7 J: p# U* u
在以上那段代码的后面加上以下代码:
7 M2 F3 }* U+ q2 x" ?) y
" ?7 e1 u- @0 M1 s% E9 g
( |) U6 T1 U- n
% n) Q s2 Q/ b程序代码: ! L! T* N7 E+ B1 G
h1 D8 Z* i2 s% r8 Q#include<strstream>6 O$ ?9 q9 A7 B# H' M
#include<iostream>
) j; s P* c X% B$ S9 t" N1 {) N#include<string>
' Z8 _. N6 _" \( {& C0 `using namespace std;6 _1 f5 o% a% [
int main(void)9 D6 T6 z! m/ k4 n( \9 F) q- m
{
# |4 H( M6 _) K$ s. h string s1;8 Y1 Q5 T# P# a) G
while(cin>>s1)
+ o( I# Y/ Q5 ~$ C5 e6 a3 \ {
' {8 U3 u- F) m istrstream isin(s1.data());& G0 t. e/ O# r: {1 v- a( T! R X" ]
double d;: D: g: |$ J4 F8 R* V
if(fy_Exp::GetExpValue(isin, d))! _0 l0 `! V# ]' H5 I/ v
{9 k6 M; h& E6 t" o% @9 F! v
cout<<d<<endl;
7 x& y: o9 p( i9 e }. u. R$ I( w$ g
else
2 y1 `: `' F2 E6 } E/ K {6 s, w0 H$ M) Z z2 `
cout<<"ERROR"<<endl;
# X. o0 i, C, z9 x' O% N }
: o/ n# k4 b' m' }( C/ \; k }
, L* E; Z" @, d return 0;
5 r6 r) a' E, V( _; t}
& V1 m) @* Z0 c. P2 K0 B# \8 q3 t
) H' K+ o' v8 y% n6 Z2 A' B) {5 Q5 w+ X" t
然后编译执行就可以了(*^_^*)$ [+ U1 ^# F& q* w5 p
其它:TC++上一定编译错误,不保证在VC6上也能通过编译. p" M1 A r3 f# [
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|