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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
/ o% U8 U* T" o一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
7 k$ ^2 a) S7 U, [( J4 v/ P只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ z8 v" ^: ^3 v( c# W参数解释:1 v5 J0 x7 d9 Q* r' q/ u4 q# j
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; p W/ }6 s/ ^& J. j ?; O6 X: E" JnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. M' r0 w; L& B" u9 } B3 z
返回值:
. @; e3 Z% X$ R m返回非0表示计算成功,0表示计算失败有错误
! |( ~7 @9 @9 X& d7 O. u: C7 y! a3 x' x9 K: w& O0 Y- o
* I9 B9 {2 [+ ^; F0 Y5 P) c; P
* x8 Y) \) P n1 L$ A+ f程序代码: 9 M: V. j5 `1 n7 u; j: `
" J0 h! A$ I* X& R$ T
namespace fy_Exp{2 L5 |3 q7 E$ `7 @! q
namespace {template <class _T>
: ~; m! {/ M zinline _T GetExpValue(_T t[], char& csym){. r+ S$ ^% O) S a4 H6 ]% f
char c=csym; csym=0;
! x4 y5 w% k3 e switch(c){
' z% q2 H5 v" x+ @ case '+':return t[0] += t[1];
8 _9 }" a1 S# J, N9 l1 x% S0 J case '-':return t[0] -= t[1];" D# m4 c/ O" @( P8 }
case '*':return t[0] *= t[1];
9 _8 B( J7 A$ Q2 l0 Y* T default: return t[0] /= t[1];//case '/':9 J" U3 L: N( J Z# h+ H
}
) i" t1 W7 V* p) U}}4 ~. ]; y y2 h. X G
template <class _T, class _Tstream>
& h3 L T: a, @: Y ?9 g' l/* _Tstream: inputstream, _T: get return value1 x0 J3 j! w- r# s) v1 ^# @
* Return nonzero if get value successfully */3 R( O' {! N4 S: b" f
int GetExpValue(_Tstream& istrin, _T& nReturn){
( z- C6 u( ^. ?& m4 H$ E9 { _T t[3] = {0}; //雨中飞燕之作
9 |: L" _- ]; _+ O; h } char csym[3] = "++";
/ e* s. U n* O4 T int nLevel = 1, nERR = 0;
! E- M% d( P6 ~4 @4 g8 | if(!(istrin>>t[1]))istrin.clear();1 w; x% ^, m6 }& d3 g/ d
for(;;){
7 Q2 h, K; O( L/ }! y$ ^ if(istrin>>csym[2]){
: P5 ^. F+ k# \( T switch(csym[2]){/ [6 _9 @$ `8 P
case '(':5 N. c$ w9 j- g( x- a) V
if(!csym[1]){nLevel=0x100; nERR=1;}else3 T4 }* u+ z- _3 N, H& P. y$ g9 ]& L
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) B# { N6 I5 l9 J7 z# G, Q else{nLevel=0x100; nERR=1;}" ]3 O6 | F' ^- W e; j. a
break;
! |; F! h6 B' ?( M3 P; ^# ~ case ')':
. N; d; z% p8 F6 M {nLevel = 0x100;}break;3 L' U) I4 U. p+ f+ E5 m, {9 C3 C4 C' Q
case '+':case '-':case '*':case '/':8 w7 a! r5 E3 h. O; Z3 N
{csym[nLevel++] = csym[2];}break;* t, W! A) G+ n) x
case ' ':case '\r':case '\n':case '\t':continue;( j, H9 d3 V5 V
default:# |" R3 R3 a5 g; N$ ]$ t$ e4 A
{nLevel=0x100; nERR=1;}
3 F y& }' j U7 Z. x( W. X }+ o n3 ^. }, y! M2 x
if(nLevel==0x100)break;
& i& N' t8 H/ [7 M6 p/ g1 R, \6 r if(nLevel&0x10 || istrin>>t[2]){
% p4 `: R' b9 I5 S' f& O7 \/ S nLevel &= 0xF;3 x" G3 P0 R+ N# {/ l. t- k1 A# a
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}4 s8 L% u5 d3 ?
if(csym[1]=='*'||csym[1]=='/'){3 c' S6 m- N) y/ k
GetExpValue(t+1, csym[1]);6 |4 R4 G: u/ t$ i% a$ r7 d Z
}
0 [/ a) t+ ]$ b2 s, v else{" e. L" N" [" J+ G# D k! ?
GetExpValue(t, csym[0]);. L- |; ?: w o. H" A: d6 [3 s
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ Z% X5 L- ~6 a# p V* g1 I }: u( N8 n. T3 O- h* `
nLevel = 1;6 E. {/ {2 u/ K; [1 p% O* p" l" }
}
- i9 n; c. Q! a+ ]/ C else istrin.clear();
, b1 ?; ^; G: p- c6 ^& ? }8 Z) f4 s! Q, M* t! ~
else{nERR = -1; break;}
3 u. y1 S' t8 _. q/ t4 o2 A }: V l3 o, ]- A1 L% u/ [
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( N' c. r: b! E" x6 S% c8 e else nReturn=GetExpValue(t, csym[0]);
4 o+ [2 F5 U! N- A; `" N6 U return nERR==-1?1:0;
0 s6 H8 N% b# A2 n4 |5 _}}
1 K0 { |3 p& ]# d* X" n# a6 H- k N: ^, n/ {' k/ V; B
% V/ _2 I+ E N; T3 ?3 W9 Y+ ^# V4 o7 G
函数模板使用示例:
% h: M: q, _. D/ n( ?, x8 |在以上那段代码的后面加上以下代码:
* N$ b$ o% o6 Y+ T: D! Z" ^
0 L! E& U+ |7 X/ Y+ E: R
% Y6 o7 C, \. j. {& m. c% t, l7 ]- Z5 l' t7 z/ i2 X* i/ h% x" R
程序代码:
0 C+ a. {" \" Y, j- s; \9 _0 i4 G, e9 |$ q! a
#include<strstream>
+ ^' A, o6 l0 q9 U# t#include<iostream>
# h# j j. `: D' C5 p% V/ }+ b#include<string>
]' R! b+ s& x) e* Tusing namespace std;' g8 A: F% y, E+ e7 g: ~; J$ q7 J" S
int main(void)4 H" z" s7 p6 A' N# E' ?3 Y
{
) i+ P# {3 ?- ^8 D( D string s1;- F) o& [# N4 H& \7 p
while(cin>>s1)2 @" I/ ?6 h, \" }" C
{
4 M# O! l- I5 ]7 C4 Z% x* e istrstream isin(s1.data());
+ y: I" }. Y* C$ r double d;( h5 W/ b8 R/ Q% E
if(fy_Exp::GetExpValue(isin, d))
6 E; R6 m; e# S, P- j# v {) C/ G: R% w$ Z, Q- a- n
cout<<d<<endl;( o; m* u A: q# ?
}
- c/ W) k4 d3 N. s' w else
) n+ M8 {" V( ]% P+ Y: ]. i( s4 E7 N2 w { R! ]- d* `! J' b6 g
cout<<"ERROR"<<endl;
V2 H4 B+ v& b6 u! k6 X4 t }
$ {9 S4 f) \+ p2 d9 T! n }
: \9 m! D" ?4 I1 @9 R return 0;4 S4 V4 u u- `* g/ {6 f" i$ Y
}
% J; T" N' Q+ S. n/ |$ ~
) Z' ?; J- H8 `5 Q5 ]
7 [1 v( T" c7 z. z然后编译执行就可以了(*^_^*)
% M' K5 J. r7 o+ x其它:TC++上一定编译错误,不保证在VC6上也能通过编译, F7 w, ]# J6 H! U- F
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|