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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,3 R# v3 G) h1 R
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
; ^& t* C0 D4 ~9 x! N& ^只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ c2 ^! {# G0 f. V3 g; q, E: p参数解释:) B" i2 Q- Y3 {$ R* t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 y: z1 v6 D! v
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: t1 g* }) T o7 n9 l( k( V4 r8 n; w返回值:
! M' ^2 [2 X) Z" k/ p返回非0表示计算成功,0表示计算失败有错误
3 z: y4 R2 `% M; A& X% {1 s4 l7 l) W1 ^& B
& g) n$ x9 Y' U8 s8 J) @
$ u' S: i9 G5 b1 ?) [程序代码: 9 y8 s5 {8 u! A/ }( s% ~
8 w' f# H; v" ]
namespace fy_Exp{6 s: ]6 C+ y: p( l; c1 I8 u1 p
namespace {template <class _T>
1 y5 c4 d3 ]1 q' W" ninline _T GetExpValue(_T t[], char& csym){
* l- K( n. w4 d. a; j char c=csym; csym=0;
! k" @ _" m' i& t s switch(c){
" C! J2 \2 q1 R$ T5 h case '+':return t[0] += t[1];" D2 L+ H2 @+ }( G0 t
case '-':return t[0] -= t[1];+ v# u+ u; F3 A$ r' E% E0 h
case '*':return t[0] *= t[1];) y( ]* z5 ]6 z6 q( j4 A" F- b
default: return t[0] /= t[1];//case '/':
6 ~- o3 {8 ]4 Y' `3 Y }9 K9 \7 Z! n* s6 J9 b3 o9 b
}}
. q! i; F! ~* P7 l' htemplate <class _T, class _Tstream>
2 D: ~# b* ~5 D l# m/* _Tstream: inputstream, _T: get return value6 y; }5 `0 u( S+ A3 B0 ?0 i
* Return nonzero if get value successfully */
( z" f' {$ o2 \" _& Wint GetExpValue(_Tstream& istrin, _T& nReturn){
4 G4 F ?2 g2 Z `0 Z; Y% R U _T t[3] = {0}; //雨中飞燕之作7 `" O X( S- F5 G
char csym[3] = "++";$ t2 W1 J/ b$ N5 K+ X
int nLevel = 1, nERR = 0;
* t- i" s+ o6 r5 o6 A if(!(istrin>>t[1]))istrin.clear();
: o# y# Z2 K V4 j for(;;){
& H R( C3 u( S7 e, b/ v if(istrin>>csym[2]){( ~% e$ f" N9 h4 q
switch(csym[2]){) u3 V2 h& H7 ]6 s1 O
case '(':0 [3 k: _" R0 _/ f: |$ o
if(!csym[1]){nLevel=0x100; nERR=1;}else; g3 M: |4 v' o9 Z* X( l
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, B/ t% b( t8 {7 _ else{nLevel=0x100; nERR=1;}
" R/ C9 t$ A+ X" z) O. U9 d8 A% ~ break;
4 g+ X4 k. Z3 ~, j case ')':
2 _( S% B1 w+ k- E {nLevel = 0x100;}break;
, b6 a8 K5 n% ~9 W% u8 b$ c! @# X case '+':case '-':case '*':case '/':
9 I! ?' e) n W3 H8 e4 J {csym[nLevel++] = csym[2];}break;8 z* t' I+ [" q/ e! |
case ' ':case '\r':case '\n':case '\t':continue;
' ?1 K/ q, f, `$ Y! T$ S1 J default:
& z+ X1 Q8 V g4 F) |2 S5 B5 ` {nLevel=0x100; nERR=1;}8 H+ x. h% I Y- Y% p
}
! b) C+ P6 G1 F1 H) A4 B3 T; a5 _3 [ if(nLevel==0x100)break;1 c+ b3 G, A: b( ^- H+ m
if(nLevel&0x10 || istrin>>t[2]){- K" z. k3 T" g H" o8 n$ M! ]( Q
nLevel &= 0xF;
9 [- X4 ~3 B# }" T0 z# ^5 w* a if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
+ d& Y2 G% F3 J, y& J if(csym[1]=='*'||csym[1]=='/'){
- j* O8 B) O4 d# M ` GetExpValue(t+1, csym[1]);
6 M) B" g2 D/ h& n$ d }& z3 [! E3 z; s" w8 |
else{/ _9 E- x+ V8 V7 y; j, B x% R
GetExpValue(t, csym[0]);$ w! C2 ]0 A+ o+ p/ B
t[1]=t[2];csym[0]=csym[1];csym[1]=0;: h. Y* \: y( @) U. E
}
6 ?: X V' ^! m0 c nLevel = 1;
M$ r/ R4 B6 g% x' ` }0 l5 j. N& Z U7 z: F
else istrin.clear();
s. K) Y D) ~! m) @ }
# \4 |( v. u+ l6 ^+ q4 c else{nERR = -1; break;}) j( b) Y* t; s& ^9 m& I0 Q9 W
}6 Z8 q8 D& N; f4 n0 S- g
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ H% S+ F+ q, G8 z `
else nReturn=GetExpValue(t, csym[0]);6 J* O% z/ y K
return nERR==-1?1:0;
% ]4 {2 `$ `: z% @- n}}
3 o( l( V, h% r( z; ^& U7 e* @% B7 b: |: v5 I
% R; s5 g3 Z. @7 y3 v2 j! d8 [
+ x' U: T. V" {( F函数模板使用示例:
) ?. [3 T7 t) \& M) V' q在以上那段代码的后面加上以下代码:9 p, o& A/ Y2 q
' d+ D( f, f& T i3 X
9 X' ^2 I: c2 y0 L8 R7 H) M% H1 P+ Y0 c, B4 p3 K4 X' Z
程序代码: & I7 _- l1 d% ?4 f1 d
! j5 T* p7 k) \, D% }, I% I# g! a
#include<strstream>
# V( v. D. |( R% E' ?6 T2 X) L#include<iostream>
% a9 F5 X% C. E% h7 Z3 l#include<string>( t) x9 Z# V) V( r& E
using namespace std;
9 H) d6 _" ]7 C4 U$ k6 a6 bint main(void)
O% I; l9 Z6 T8 f{
( J2 z2 @8 ^: l C# `, [! l0 a string s1;
, Y4 F6 ~, C8 N3 U# C* _ while(cin>>s1)" ^) r3 G3 m; F
{
/ l3 m# M j! ?. x% r istrstream isin(s1.data());& U* D: g6 U* f7 V M9 I$ i
double d;
# b# ]' I5 [5 D0 u$ J0 y: u, E7 b if(fy_Exp::GetExpValue(isin, d)): K! D$ ~+ Q! v& j l
{
" X6 k0 \2 t* f9 I9 }, P cout<<d<<endl;
i: l0 g! o W# [ }
# w5 ^3 y% L0 L! _' M else3 X. d- T) o% Y: g8 ~4 b& o
{
. |+ z6 }3 k/ z5 S cout<<"ERROR"<<endl;
1 N9 I$ S1 m( t; b0 t# E0 } }
* Q# i: [0 ?; I% G5 c; ~6 K }
$ ]: b& R9 f' c return 0;
( T/ Q2 P/ a6 v/ C2 c}( o/ t. c: S: |# t
5 ^. N* X. Q6 s* x7 f; ]
6 V; X% z: `% a) e( x, e然后编译执行就可以了(*^_^*)' X) I, I/ X( e1 g8 |+ R+ q
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; f& h6 m! N# g9 A 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|