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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,: m3 ^" N. @$ H! I% v# r, d1 X3 D9 X
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
; J9 B" [$ B3 y3 m只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 B3 P8 \/ O+ c7 \参数解释:
/ B' n* L, B" g% m( R2 bistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* }3 B! V9 y7 C- F# N [2 |, B/ j' U; c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 l) Z% C# k* F6 P9 e5 L+ c' R. v返回值:
5 G5 v0 A2 i( \$ e5 @! b4 ]- O返回非0表示计算成功,0表示计算失败有错误5 q- M2 D ^7 d5 e
+ j* V) |% {& l" R0 J# `
( N8 M6 o* `/ G1 g% j# }9 F! G7 f
程序代码:
: c. J$ _0 a$ h% b) Z2 T1 z3 T: a. T3 X6 ~" e% y" Z% o' J
namespace fy_Exp{( U6 t: p# g3 }9 _
namespace {template <class _T>
" ?% N$ V/ n' d9 `inline _T GetExpValue(_T t[], char& csym){
8 K0 p8 p2 l4 g/ U3 m char c=csym; csym=0;
4 d2 ~& j' e9 f) n1 b, N switch(c){3 M$ o2 B1 Z$ G
case '+':return t[0] += t[1];
; K8 T1 ^7 `4 P; W2 d' Z case '-':return t[0] -= t[1];
* o" K+ t/ U; B9 V, l) ~2 X case '*':return t[0] *= t[1];
2 T, R8 {: d r. t default: return t[0] /= t[1];//case '/':
; e* ?* e" K s3 I( L. g }6 |' C1 G# u% h1 B
}}
3 z, L u6 u5 A7 ]* { e$ B; {template <class _T, class _Tstream>
% g# S6 p% b$ ~9 I/* _Tstream: inputstream, _T: get return value
) |4 Q& q* h Q1 z$ n& i- b* Return nonzero if get value successfully */: _9 H! Z; Q' W5 [* ~5 l* h9 z
int GetExpValue(_Tstream& istrin, _T& nReturn){8 P1 E9 j/ o1 W
_T t[3] = {0}; //雨中飞燕之作( l6 E: j, U+ v) ]& Y
char csym[3] = "++";5 _6 C; ~- K' d, R1 `
int nLevel = 1, nERR = 0;
- V/ V' \. j$ T if(!(istrin>>t[1]))istrin.clear();
" d$ m7 u# g i8 ]( o9 F" C for(;;){: e3 u# d, s# E+ @
if(istrin>>csym[2]){
( c0 _. Q0 T( s# f3 U switch(csym[2]){$ _! A' p3 `9 ?# x% ]
case '(':
6 m5 r, W |& | I: g: U7 N if(!csym[1]){nLevel=0x100; nERR=1;}else
9 K1 t/ n" X9 D1 m9 q: N8 `4 ]& b# T if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: k H- G6 L' w+ h- I1 f& W
else{nLevel=0x100; nERR=1;}; a3 n) s6 D3 X1 x6 v- u
break;2 F, E3 p2 W+ \
case ')':) Y* V4 p/ ]" E' z7 P: j; v
{nLevel = 0x100;}break;- _# X9 W5 T4 V1 s7 Z8 s' l* v' u
case '+':case '-':case '*':case '/':( v# ?+ ?& s0 Y; _, [4 a
{csym[nLevel++] = csym[2];}break;
# ^! A9 c* [4 ?- K8 Q case ' ':case '\r':case '\n':case '\t':continue;" G4 r+ G7 B& {, C4 G0 M
default:
; e5 h8 Y4 Q& R% |) w {nLevel=0x100; nERR=1;}) z7 v* ~" I c; L9 v$ F
}! g; u6 S/ {& b7 \5 p- s% J+ a
if(nLevel==0x100)break; K9 r) c0 z8 \
if(nLevel&0x10 || istrin>>t[2]){( S- m/ ?3 n* e0 u% L& |
nLevel &= 0xF;
5 R" S: a" X& K( H" P4 L if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* R! K* e6 d) S' E3 q4 i" I
if(csym[1]=='*'||csym[1]=='/'){
& P3 N( G) u- H8 r& v, r' A GetExpValue(t+1, csym[1]);
1 {$ ~/ Y) I: `; d% s- | }) A, k0 b% ^+ P {
else{
8 N! J' I/ ~, g GetExpValue(t, csym[0]);
6 j+ ~- X) O& Q) g- v! y( h t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, r {, u7 f* _* A1 B( G, X$ G }' t2 [% _) M, ^( a0 |9 E% a
nLevel = 1;
! ^6 |2 M J' n6 J6 w1 { l7 B8 j }
$ J" i2 w- {& F3 Q- [& \2 A1 n else istrin.clear();7 h7 F$ i5 b' K4 K
}3 L+ ?# n* {: _- k* x
else{nERR = -1; break;}- Y. Y; i( N5 h5 s. e, T
}6 U+ t' g* D1 v; [2 x
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 j$ i, t+ b% i2 ^
else nReturn=GetExpValue(t, csym[0]);; A/ d0 F8 H. r" t& E1 {+ ?" f
return nERR==-1?1:0;
6 O0 C. D5 c2 L$ v* P3 J+ K}}
8 p! r+ K+ }- T8 j
$ u7 Y. e4 l9 o& j- o) e
) h& K. a5 |; S8 h6 I8 N) A2 ^. k* Y& R0 {2 \3 H8 b
函数模板使用示例:
. f$ V1 u4 W* @! K) _% G在以上那段代码的后面加上以下代码:
) `- H% G- x# i t$ ]1 M8 [: I' O
3 l; W6 M2 C% D1 q5 l$ D' ]$ V % q K5 r, z x, a! |) R% `) G
?0 X: Q% [8 t
程序代码: h8 @& e& ]% ]
2 U8 K& ]0 y5 I% e9 g#include<strstream>8 ~: U" p8 n. K! B4 W# u
#include<iostream>
p3 @8 V1 \7 |7 S/ L5 \#include<string>
7 M5 a3 ~" y- s0 \using namespace std;
; P# }- k! y5 Z" c/ [" N* Uint main(void)) v: L# I' W3 b0 X; u
{
7 @9 f' z- A0 X! p# O& v3 B9 u& @ string s1;$ o! K D! V1 N1 c; T
while(cin>>s1)% L/ N/ e c9 r Z- W1 \- y" I
{
$ _/ a2 w# v W0 Z: D9 b+ E istrstream isin(s1.data());
1 ]8 e" `! x* m4 D/ B double d; k) I* R5 ]8 ^/ E, s, Z9 L
if(fy_Exp::GetExpValue(isin, d))! ]0 [' s8 a( d$ B& t1 l
{- `9 s$ W3 |$ \8 |8 E0 Y7 K: }
cout<<d<<endl;
o1 M# B! I- s }
9 t, y+ Z4 v! a" O else( f, A/ A# h* }/ y0 I
{
; a8 {& N8 u0 w1 V% Z) T1 y" k2 ~ cout<<"ERROR"<<endl;' I( f) p: K3 C. `' o
}7 O$ j4 _3 E/ o8 e- R* @& t% W
} i7 G( \* g" D$ p
return 0;" K9 j5 l2 l4 A0 W8 G/ e K
}
& c7 F5 x) n; C! N: ]! G6 \
- I% [: |& c/ ?9 P& _- z" c
5 f: F4 M+ ?3 ~9 p# M) S+ a6 o! p, @然后编译执行就可以了(*^_^*)
; T. e8 T; z$ j其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 p. l' I0 z Z* ~5 G
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|