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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,8 q" ]4 U5 l9 j7 {. P
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, p' |8 s3 p; W- _$ J. `* }! D4 H
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
5 R! Z/ a% q+ y x参数解释:0 {% \; y# ?4 o& c8 d, }$ ~0 T
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流- n+ s8 z( M& l I% r( W* S
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! ^& ~, @, ^0 M Y% W
返回值:! Y/ Z6 f+ \3 g/ x5 Q
返回非0表示计算成功,0表示计算失败有错误" a+ L" V! X3 F& J2 ?
; `" E1 E; ?! X3 N% ^ $ N% K, X2 c2 s+ T/ W/ I0 G" g& `
; F, W0 b! @( V& Z程序代码: 1 G5 [0 C6 Y% q- s
9 n( x% r4 |' ?7 _0 Ynamespace fy_Exp{, M& N1 h1 {3 w# Y* l: |
namespace {template <class _T>8 ~2 j+ }5 w9 K. S" h; F
inline _T GetExpValue(_T t[], char& csym){# ~! T- w; p+ H3 R/ c: V) x
char c=csym; csym=0;" Q( P$ ~# A. O2 g, T
switch(c){
0 b7 u# ]2 R6 ~8 W' f4 J case '+':return t[0] += t[1];% F1 k9 I8 g! ?* D2 B& a& @$ b
case '-':return t[0] -= t[1];
( ~6 V( ?6 d: E7 r case '*':return t[0] *= t[1];
7 [! `1 |% ^* _" [6 u3 q default: return t[0] /= t[1];//case '/': ~+ n: t3 \4 D6 C
}
G& R7 I' u/ F# B$ h `}}4 {5 R+ ^: e* j3 c2 v- `6 g# v; W
template <class _T, class _Tstream>7 D3 H) f g5 q: _( ?$ T, T) [6 z! e
/* _Tstream: inputstream, _T: get return value
7 P1 I4 r" d% P1 y* Return nonzero if get value successfully */
8 I& N' P0 W) v' e" W1 Y$ Wint GetExpValue(_Tstream& istrin, _T& nReturn){
4 O& b( d) v. c& X7 ~ _T t[3] = {0}; //雨中飞燕之作0 x) k$ U6 S& o
char csym[3] = "++";
+ s! ?: W- t \9 D int nLevel = 1, nERR = 0;$ b( l7 r2 ~0 g" U
if(!(istrin>>t[1]))istrin.clear();. r0 Z& G) D/ _, \$ e* q u
for(;;){
h7 }! O V6 e0 {1 Z$ L if(istrin>>csym[2]){
( y2 ~& w% ^" j: H0 L9 Z& k switch(csym[2]){
+ D/ M8 ]9 o1 T) ^' F1 ~3 } case '(':9 e8 y) W8 k: @3 F& } C" g
if(!csym[1]){nLevel=0x100; nERR=1;}else
5 X; X, M4 a% L% @$ k if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; A# Q% B7 W% e. {7 ~
else{nLevel=0x100; nERR=1;}! }. a! y9 c: A' S9 n3 `
break;
% F! D+ C# _5 s/ l& I- S2 L' q case ')':' v* u% {; S& M+ M- d! f
{nLevel = 0x100;}break;
q% c3 u* Z' [2 P case '+':case '-':case '*':case '/':2 w* `( c+ G" ]7 ]
{csym[nLevel++] = csym[2];}break;
8 W; {. G$ `" b, e. j2 R* s0 \ case ' ':case '\r':case '\n':case '\t':continue;
7 z$ O7 r4 M. [ default:
+ ?0 ^1 h* t8 W8 C6 q" o7 p {nLevel=0x100; nERR=1;}
- C6 E% J, `0 \. T) z; Y }2 u0 b$ H/ U% s3 j+ p
if(nLevel==0x100)break;
; d5 z2 e2 |0 ?5 _3 h. r if(nLevel&0x10 || istrin>>t[2]){3 H' C2 ~0 H2 ?& u
nLevel &= 0xF;
% B7 w5 t1 ]" ], e if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! h; x) ^# ]5 l# m3 l" z9 w
if(csym[1]=='*'||csym[1]=='/'){
5 p6 E# F' T+ N6 l0 |9 p4 r GetExpValue(t+1, csym[1]);) l3 e* F; }$ x% G+ A
}$ R4 V4 q2 ^9 b
else{
; _( E* g- G' |( _- h8 _ GetExpValue(t, csym[0]);8 z% V$ E+ L; P/ F/ h4 X3 s. _3 L
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ B/ ~% L. _+ z }! [- V- t. b" z6 [8 K/ p1 D
nLevel = 1;7 Q# D0 ?7 b, y6 A( x9 K% a
}! u* N- @: c W) t% C
else istrin.clear();
" s* Y- ?. K" \/ b' b& p/ c' H: _6 \2 w }
$ u$ G: @1 m9 Z" r* Y: A else{nERR = -1; break;}" g" f% z1 w! \( g" P) P2 S5 I
}
2 [2 `" O+ E9 S7 T8 ` if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 D. ]' y5 `* T1 l: x6 G0 ~
else nReturn=GetExpValue(t, csym[0]);
% }! [: u5 a! U9 O5 D C( P return nERR==-1?1:0;
" ^" _2 R* ~! I0 N- |4 a}}7 l8 l7 V3 `, \: M1 C! A
+ D, F3 i% D: h% S$ F' ?% m, k/ V# X
7 c" ]- ]! A2 o9 s, T+ d
函数模板使用示例:# f5 h! N% r' e3 ~
在以上那段代码的后面加上以下代码:. J! z" l2 s3 H& @0 P) A
$ j; z/ e! Z" T: U5 d# ]
9 r/ I/ `! l) B; @& `
' M+ D' e" [, C/ O! _
程序代码: , u% o8 S- N7 x$ i( s
7 e4 d/ @8 y1 h4 O" H5 a
#include<strstream>
6 Z( A: w8 E* e#include<iostream>
9 ^; q' h( F$ e, i#include<string>
' r/ h4 x4 d5 b; w& Xusing namespace std;( d/ u: C0 @) n. V
int main(void). F q4 z: v4 L/ a; B" t
{( `- E! ]$ _7 j3 U0 a( U, V: Y
string s1;
# q' F0 w' ]3 ?- n& U+ @ while(cin>>s1)
+ ?/ t9 _: C2 R a S! e {* C; E9 H5 U( D$ ?4 x2 }- T
istrstream isin(s1.data());3 b5 U" u5 ?6 ?# R) V) E, `, \
double d;
' T( V) K+ X r/ F) z% H2 L* E if(fy_Exp::GetExpValue(isin, d))
- X+ g! g* @: A {3 H, \7 M- Z9 ?) ]
cout<<d<<endl;) u" C' B; X: z0 M8 u% K) `2 i& P
}2 n n4 M D" e# `9 J b G
else8 C# ^7 l& {1 m* n u! f
{; T4 d: _! Z! m; k) h8 O2 h2 l
cout<<"ERROR"<<endl;2 G2 r5 W f. x, [* W9 H
}0 S0 r K! h$ v; G! B
}
0 H& s& x3 g% q: n, Q return 0;
* A4 m' }! P9 A) r}
2 ^! Z# W" d9 }# c1 F. L
/ ]8 _$ U( Z) c0 B! s+ M' e% z& \3 W1 i9 `
然后编译执行就可以了(*^_^*)
8 w1 Q: {# w4 T* p其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* d4 Z' N0 J6 m4 ^( m 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|