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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
9 S' y! t+ y( T3 Z& b; r! r一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ u' G( q5 t$ _2 j- a8 n' |只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' y+ v8 M& g$ t. F; w
参数解释:
6 t$ o* K) @) g; Nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
5 l' C) J- y0 a9 h/ k. d% KnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; \% Z U- g5 @8 v4 n- R
返回值:, ^4 _# `9 d* {7 ?
返回非0表示计算成功,0表示计算失败有错误
: @2 z$ L f# x I/ n/ k& A' i% }4 C2 `
, p. m! N2 Q5 u6 |
, G' X% M8 J. b
程序代码:
5 L: N/ d+ M1 h2 t3 s' H! e8 g* X; k' g
namespace fy_Exp{# d2 `2 h0 K' q8 z; ~/ @. j
namespace {template <class _T>; r y# `' n# I; V, |' A1 P
inline _T GetExpValue(_T t[], char& csym){
/ ]9 |) P& h/ g char c=csym; csym=0;' r& i2 \& C2 |
switch(c){
/ ^6 V p5 ^' s) o# E, F case '+':return t[0] += t[1];
, G% _8 ^7 Z, s case '-':return t[0] -= t[1];. B" |9 Y$ V+ y& t
case '*':return t[0] *= t[1];
3 d4 z9 s" `% w; l7 t2 f! n; ^- x default: return t[0] /= t[1];//case '/':# F* i8 S% B2 R1 ?- e
}- ]5 k) Z: D9 o$ h
}}0 _' Y5 G' i, Y" \, K6 ?3 d/ L
template <class _T, class _Tstream>. B" e% r/ Q" o
/* _Tstream: inputstream, _T: get return value0 N" X1 f( z& X, g# [$ M' D1 c
* Return nonzero if get value successfully */
& u! [$ P+ h! N- a" @" T: q2 P/ {) |int GetExpValue(_Tstream& istrin, _T& nReturn){6 k8 _, G3 _& s" o
_T t[3] = {0}; //雨中飞燕之作5 J1 e+ J+ F) b
char csym[3] = "++";' m* ~; }5 v9 K. @* n- i
int nLevel = 1, nERR = 0;2 g% P8 ?% \% g' z0 T
if(!(istrin>>t[1]))istrin.clear();
3 ]2 l+ K. M1 m for(;;){
/ R% h( A0 A3 b if(istrin>>csym[2]){
9 z+ T! y2 a3 V4 S4 z switch(csym[2]){2 e) F. z7 P( L* v) d& e5 [3 M' H/ `+ `: v
case '(':
: A9 P+ z; y1 f0 G- S if(!csym[1]){nLevel=0x100; nERR=1;}else+ e. S |9 G) d: }4 B X5 t
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 K7 _4 h( y, Y; R* w. e8 n. ]
else{nLevel=0x100; nERR=1;}& P, r; M+ L) o2 U2 m
break;$ G6 K+ p2 p8 s+ j7 b% y* g( |
case ')':2 n9 n, M& F+ c, i# S
{nLevel = 0x100;}break;6 m. v$ v7 C3 O0 d4 Q v" H: \
case '+':case '-':case '*':case '/':
! s4 O6 z/ @# M: [ {csym[nLevel++] = csym[2];}break;$ w- ]0 e2 L1 q
case ' ':case '\r':case '\n':case '\t':continue;
) [# \$ S; |6 A( c" O6 p default:
t+ ~% a/ X( P! j) n: s! J {nLevel=0x100; nERR=1;}
6 v/ w1 ~! v M" F0 t }" ^. _, c; Q$ i. E) w
if(nLevel==0x100)break;
! s. J0 b6 g x- q' c' } if(nLevel&0x10 || istrin>>t[2]){4 S$ m( Q$ n" S, b
nLevel &= 0xF;
, u- m' x- }0 l if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 x G: c L6 u' I9 f; a if(csym[1]=='*'||csym[1]=='/'){
# o V i! Z7 \2 q5 A2 D GetExpValue(t+1, csym[1]);
9 l9 ]9 B- q4 k* R9 a/ ^ }8 c3 R5 ^6 a! U! Q( i- ]
else{
# B% P1 G: C6 w3 |% S( V6 j- a* b GetExpValue(t, csym[0]);
7 f( b8 Z% \9 p t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- o. e0 A2 U+ R, M8 ]( P1 @( [ }
4 u; y. X; O6 \9 W nLevel = 1;
j0 `3 j: I# J) L) T0 {$ ^! _ }
) m; l3 V1 T( u* {9 ]8 w else istrin.clear();5 r4 O M' G! Q5 p: ~; t, D1 X" q
}
2 {% k# Y1 U( p' v' n4 S: z else{nERR = -1; break;}
& k8 D3 m* _# M9 ~. b }8 v/ O' I K! y! ]8 M$ H
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);# w7 T {$ \! z! b
else nReturn=GetExpValue(t, csym[0]);# @- f9 }+ x: a3 k/ a# E+ x
return nERR==-1?1:0;
+ }( T9 E3 j G0 g- c' V}}3 |9 k2 p# M7 @$ ?
4 @5 q8 x- @0 o7 [* y# Y1 s
$ t: o* [ r. `. N" S# f
; k" _6 [( t4 b8 M; w% m4 V. }
函数模板使用示例:* n# m6 |- X! t* }5 ^
在以上那段代码的后面加上以下代码:
$ b' y* C# V# E: l e3 A+ {7 ^
# p% E7 R) w; M' Z: ^( p * Z4 e9 o* E0 M3 D
6 h0 m. P- O Z$ c
程序代码:
( H2 j& [6 ^) U6 U
) Q$ q( U8 u6 M#include<strstream>
& p- r" z' C! c#include<iostream>$ {/ q" M& `* \! I3 Z
#include<string>5 {/ c$ Z8 ~* \8 v# z# J
using namespace std;# @1 h s# n( j
int main(void)
+ E `2 R8 ?9 _4 |8 V3 ]' n{. Q9 b. s, k P( T; P9 ?- ]
string s1;! b4 f" C9 R0 r# K( T4 c
while(cin>>s1)3 s* J5 h8 B( n* T# v. s1 e
{
4 d; k: A# V! {% H istrstream isin(s1.data());6 W5 G8 L6 H6 ?, I! I \
double d;, ~* L6 S( @( D: m) R
if(fy_Exp::GetExpValue(isin, d))! _/ ~) R c: D# K
{
+ z/ u3 M2 z# B cout<<d<<endl;" q% F: o k$ p0 H& n5 c9 u
}
$ U2 Y, c: @' Y else3 p3 ?7 Q* h3 N" r# ~+ L
{( x- k0 G' }: ?8 V; F( \+ t
cout<<"ERROR"<<endl;; @ b9 Q1 f) r0 B) b# e7 a
}' x4 W2 O; M# A9 \6 @
}$ ?' z2 a( u4 E% o
return 0;
4 Z$ B1 M6 Q$ w1 H$ b}2 Y; Y# l8 ~* c7 o# Q0 O, Q
7 ^( h0 m! P' b8 b
Q6 F# q" u' X. [* h8 e' B然后编译执行就可以了(*^_^*)
$ G' o* C/ ~! O0 u( {# }其它:TC++上一定编译错误,不保证在VC6上也能通过编译
6 \( [' J. g5 {$ W 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|