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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
2 \! ?3 y* b- `2 |# @ }& i& q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- W+ Y: G+ a. z% B! k
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% [, h1 i/ a! [8 Q1 f: x) y) ?/ V
参数解释:
9 `# U2 O, k4 o& Sistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# o5 K$ }1 O& m5 r! S4 ?2 }nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 i) I3 n m. x$ y
返回值:
- M6 ^( I. o+ Y1 j3 `返回非0表示计算成功,0表示计算失败有错误
2 {; W7 ~# p2 K/ l+ S* K4 g g8 ?- r# S0 J" ^
/ m" E2 u0 T1 X% M* G
$ w. b }# O% a程序代码:
; i4 M, v. l& i* Y, U I/ E- S: F" L: _) J$ m# p' Z
namespace fy_Exp{' P$ @# \4 f+ L* s
namespace {template <class _T>
& T1 B* T3 u5 ~( }1 g7 ?# u5 }inline _T GetExpValue(_T t[], char& csym){
6 m8 \7 Y' l9 w% [ char c=csym; csym=0;
D E% D6 \, f3 g( Z: f7 n switch(c){: ^* J1 M! T9 S3 E/ W
case '+':return t[0] += t[1];
M7 g! H) x" ~3 U1 @; g# I case '-':return t[0] -= t[1];9 u# Q# ^7 b% A. A* D
case '*':return t[0] *= t[1];- q# Q- F3 e+ }: c& x
default: return t[0] /= t[1];//case '/':0 n. `- d [& k* V
}/ U2 w' F0 C7 M' a) V1 i6 F
}}
7 N' X5 {2 n$ Q; P$ a) a' G7 ptemplate <class _T, class _Tstream>0 s2 j1 u! W' e" b/ g5 h
/* _Tstream: inputstream, _T: get return value4 D- m- l/ K [% o- F0 N0 f
* Return nonzero if get value successfully */# Q! S2 k) |) G# b& N
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 \2 W/ _; m: u3 Q# p+ {: V, H _T t[3] = {0}; //雨中飞燕之作# W' o) D! ]! q) `# ?4 a) k
char csym[3] = "++";
" k5 Y9 Q @0 x2 r; a int nLevel = 1, nERR = 0;
2 u7 v* j6 k% a2 A- d6 t if(!(istrin>>t[1]))istrin.clear();
& e7 m% {" {; l" M for(;;){: a5 Y8 k' N& ?7 ~
if(istrin>>csym[2]){
4 G& d- O1 [) N" o switch(csym[2]){
5 k2 d0 w) C9 q1 L; |: m8 ^ A case '(':2 I; i1 w9 Q2 B# b/ Q9 C
if(!csym[1]){nLevel=0x100; nERR=1;}else8 j* G1 ^2 Y) x+ C$ g
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 }/ @+ \3 J! G3 u else{nLevel=0x100; nERR=1;}7 }( S" ^0 y# }
break;7 c! c1 ?) k! ?. |5 L. m. x
case ')':
\ v6 y/ G- U8 |; J9 F {nLevel = 0x100;}break;, G1 X( _/ |0 q/ X' X' R
case '+':case '-':case '*':case '/':2 d5 T1 r' }2 p9 ]# f
{csym[nLevel++] = csym[2];}break;& w. H7 _9 `# F0 Q
case ' ':case '\r':case '\n':case '\t':continue;2 ?2 [$ _1 R, _) G3 p- y
default:/ ~+ y i0 T7 e! K/ S! }/ K
{nLevel=0x100; nERR=1;}$ [4 p5 G: {) }2 z* d
}# b5 g' X& M L3 O; o
if(nLevel==0x100)break;
6 h% _ @% W5 p! v& v! s if(nLevel&0x10 || istrin>>t[2]){
' ~% f" J: \ p, x# ^; c/ ] nLevel &= 0xF;2 N; P$ \/ u$ F
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 {5 X" S% f& K+ |8 ?
if(csym[1]=='*'||csym[1]=='/'){
3 h. W" m& c6 N( K GetExpValue(t+1, csym[1]);! `; o* g2 Y' Z, l7 N+ w
}
" |1 m- s4 w1 t else{9 z6 @- i) }" l9 B
GetExpValue(t, csym[0]);
) S N/ P& C$ B# g1 @% D3 @ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 l$ W4 B2 o- E" \5 z# x: |3 g3 c! d }4 z1 T- C3 A* o% @3 Y
nLevel = 1;
2 i8 A6 _- t0 k1 _2 r }
8 v1 Y3 h0 q5 m+ o8 d2 e; {+ u+ L1 K else istrin.clear();( K" F0 h8 a! S/ Y
}
! Q: P5 k, t2 o, c& l else{nERR = -1; break;}: R7 `2 `3 A+ X i: y( n( M
}7 E: {! k# f1 ~0 G$ B: N% d
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, h" }2 J. _" |& Z* E else nReturn=GetExpValue(t, csym[0]);$ c/ a* p( S& Z; b: P
return nERR==-1?1:0;1 p& |/ A; n' f( s) [) w
}}
t' @: r5 s0 u$ M: O) K: T6 m
& f* a/ ]. ?8 C, o9 o% R% o
6 G$ i) {8 g' K/ p3 {$ H# L# x5 i1 e7 k% R
函数模板使用示例:
: x& \$ J9 j+ U3 `( ^- U& Z6 M在以上那段代码的后面加上以下代码:$ b- ?) F3 C# E+ ^! G+ {
W) k3 d2 h/ y4 @( x6 p " |+ ~+ }7 l6 }* \4 m0 V, P
, {0 }6 }$ @, |! S( c+ R
程序代码:
}! p5 N9 F0 l9 Y1 k4 }8 ?% Q: _# O; I$ o! E( r2 L! U
#include<strstream>
) c& U. d+ ~: Q2 l#include<iostream>
$ c: h+ d7 L3 o' d; N. x#include<string>$ U& b u' s- e2 e7 R" b o( B
using namespace std;
" \ ^( U7 p- V) Sint main(void)% J# }& ]" l3 \% I8 m) W
{
, x9 |$ `# H- j3 V1 ?' ^ string s1;( z4 j" N5 O3 e! V
while(cin>>s1)
- } s' y9 k5 J+ H6 N2 w! l$ a {2 @, m% l9 f9 v
istrstream isin(s1.data());; ?( X, M/ _# G e
double d;. H; s- F# v8 B# ]# K
if(fy_Exp::GetExpValue(isin, d))
: h1 N0 G' d7 p9 j/ m) D1 d {
: l/ y* u5 `% s C9 K! J cout<<d<<endl;7 I2 j9 |- {% |
}+ S6 g/ ]0 c3 w. N1 e# z
else
6 s" W" y6 ^- @- w) A6 T: _ {! Q- }. t0 N7 J5 B* f
cout<<"ERROR"<<endl;, r$ D! Q$ L1 l) w6 g3 m! d* ~
}
8 O5 f$ S! ^, i- m4 a( k }
. q& J/ D. T! S2 s5 J return 0;- |& k& W8 t* P, o. G3 g6 q, }
}
0 T: o0 J7 E9 e- `1 F- [! M' d7 N% _, B& f! O2 s
) o$ g8 T& ^* E; O- D$ f然后编译执行就可以了(*^_^*)' i" A! U( f3 a/ |, z# L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译! U+ ^3 P5 b% ~* u% p1 l7 r
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|