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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
2 |" B) P0 T6 t9 [) ~, B8 J" V M0 b8 W' G一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
; {5 H: Q [1 \7 O2 p: e) [只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
8 D5 y/ x0 }9 m3 h, z' o6 I* v参数解释:9 t& M+ `# A1 w, V! q$ t+ o
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) k7 A9 F$ T/ K& f/ ?. n
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定/ d, F9 Q$ n& i3 \: R4 F: n
返回值:0 J1 H& h9 O8 S$ ^6 P2 D1 g
返回非0表示计算成功,0表示计算失败有错误
2 J I. p9 O4 Z" Q/ `0 @+ B+ M" O$ i
; O; [, ^, W; e
7 {: Y1 F7 y- P程序代码:
4 v: V4 a3 ?3 N. O4 e3 P4 Y! v( t9 }2 K# u, F+ t% {$ a
namespace fy_Exp{
* j# d1 l. X) {0 z3 I9 F/ Onamespace {template <class _T>8 Q( w" j/ _0 l7 X' f
inline _T GetExpValue(_T t[], char& csym){- i Q- z0 U5 `( w' E
char c=csym; csym=0;
& k. \8 d9 ~$ N6 S% N$ n% J/ p" N switch(c){
" w ^' S6 r5 e6 K6 _ case '+':return t[0] += t[1];
1 E! C- j5 Q( g: ~# g' P9 B case '-':return t[0] -= t[1];
" j! s# ] ?: s case '*':return t[0] *= t[1];
5 U. p6 U u) }9 b U default: return t[0] /= t[1];//case '/':
4 A5 ^5 S) F1 K. w! W: { }
: M* h1 I" X" ? D. n: W. `4 X. p}}7 `: r( v) ^' l* j
template <class _T, class _Tstream>
V6 z# a! q) ?" {* G% k% C; S/* _Tstream: inputstream, _T: get return value
+ \% e1 C3 y6 q/ a7 C, R5 k* Return nonzero if get value successfully */# l( C! S4 y& R. D' Z; [& O
int GetExpValue(_Tstream& istrin, _T& nReturn){) q2 _. Y5 A4 q* ~3 f
_T t[3] = {0}; //雨中飞燕之作
' R7 o7 \) p: }# @8 O char csym[3] = "++";
3 w' E7 U& _1 s+ Z: U5 {2 I int nLevel = 1, nERR = 0;
: Y% r+ ?+ I: }" S; e if(!(istrin>>t[1]))istrin.clear();
+ F0 |" [( Z& j for(;;){
& Y/ j N1 I! d/ q) B if(istrin>>csym[2]){( d% o) A# l+ w$ F5 I$ g
switch(csym[2]){
4 Y& y+ q) x0 ?4 y' S case '(':
3 Q% p, U9 e- P8 ?; a) ? if(!csym[1]){nLevel=0x100; nERR=1;}else% x6 Z8 f, ^* m8 }
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 A/ W+ {3 _3 a8 q2 z3 |1 N+ T5 F else{nLevel=0x100; nERR=1;}
5 e0 p3 u! P/ ~3 G. u break;: z2 Z' m% c% k4 Y2 p
case ')':/ l/ e: K% a3 H: ?' {
{nLevel = 0x100;}break;, |4 q! w9 ?$ `' C1 P
case '+':case '-':case '*':case '/':
/ ^ l4 H4 |1 O! O+ m {csym[nLevel++] = csym[2];}break;4 K1 _( V+ B* n# ^: k# l1 _
case ' ':case '\r':case '\n':case '\t':continue;% M; H" I1 q$ B- V' \
default:( O8 }; @1 C2 {( I4 K# ^4 E7 g/ g
{nLevel=0x100; nERR=1;}* [7 n' l+ z! Y
}5 E6 V( \( W& K B5 h0 f- p
if(nLevel==0x100)break;. E5 {! f& _. S3 T3 _3 M
if(nLevel&0x10 || istrin>>t[2]){! s6 W1 k( `( `2 }; ^! g2 j/ \5 l
nLevel &= 0xF;
9 ?& V! t7 s. Q3 H a" {9 F if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! H2 [6 r* i) h* w" r; r if(csym[1]=='*'||csym[1]=='/'){' c2 v0 L5 a( N) M" ~6 v
GetExpValue(t+1, csym[1]);
; q4 R7 p: `9 t& u- f' d+ s5 g }" u; C* F# U9 Y. c6 l
else{: W2 M2 S1 K) K& }
GetExpValue(t, csym[0]);& c1 v! I; w1 Y% A' L- d! C1 j
t[1]=t[2];csym[0]=csym[1];csym[1]=0;& \! F; F5 S7 ?4 X
}" Y( ]/ r; ]! @# d
nLevel = 1;
! m3 k* x* @( s3 Z- l3 r }
2 |1 b5 d3 q+ w: `9 G else istrin.clear();7 T! e Q. @( D8 N$ j' p5 |+ X8 n0 j
}- o2 B K& \' G% V9 T
else{nERR = -1; break;}
/ x ]* j' t; y2 L0 y }# c( c( N5 S/ l( e, _
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; u# g1 }4 Q* R' D9 ~8 z else nReturn=GetExpValue(t, csym[0]);
( w7 P0 t' x, U9 }2 o2 |6 A! X return nERR==-1?1:0;8 j/ g. K$ ]5 V' e6 M1 o K
}}" _/ n; H' z& z T% U
' ]$ Z* U" W6 k
3 E+ G4 K9 h# _( O: {, f1 {0 |% l, M8 h0 K8 I7 b
函数模板使用示例:
: F& F( V" ?7 U在以上那段代码的后面加上以下代码:4 `- W- ?- h! Q3 |1 x/ u' k
/ i4 Y6 x5 s7 L& m
2 G6 w5 Y. q/ |4 Z! S
2 P( j4 R4 n5 n9 ?3 Z程序代码: 2 Z: g- i. ~( V8 W, ?7 S* X2 n
: h Y& [9 ?/ I9 v
#include<strstream>" I; p# d# k5 L! }3 L* H
#include<iostream>
3 V. C* v! N' h/ S8 c#include<string>+ i; u6 c. y2 O5 N: Q
using namespace std;1 D& c0 a" H i ~/ a6 C
int main(void)
1 n1 D2 _% R6 L9 D0 }{+ e9 S& M4 `3 r! F9 c
string s1;
6 l) y- l! n3 s" E while(cin>>s1)
1 _3 |5 g2 S4 M1 k7 j! Z {9 I/ l/ L6 ?! |) w( E& R' F
istrstream isin(s1.data());
- [/ Q; |6 @7 l o# q7 Z i double d;3 Y; {: Z, a0 ]8 Y
if(fy_Exp::GetExpValue(isin, d))
( o/ d* u$ u3 s {
( Y d! U1 S" k( U; N cout<<d<<endl; }6 W9 {* M( y, s" W
}7 w$ [- T$ Q3 D+ Z$ O* O+ c7 K
else
$ m% ]" H7 w; B$ ]) X: ^ {
$ p9 \0 d( z" R4 r cout<<"ERROR"<<endl;
/ e; n! O* t2 O" m }8 p5 o& p' g9 l2 s0 U
}4 d' N2 u. u# e. {
return 0;9 u1 h# W7 B- g( x5 U& E* z7 U1 @
}
$ X) s2 z. O% x- }2 L( t# ~0 T$ U
2 h- n9 R1 i5 D/ `& c) g3 z6 G% ?- o0 _/ z# m" ~/ L- S
然后编译执行就可以了(*^_^*)
& ~5 n6 V) |9 y2 c其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( t% o) P( s, J. b 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|