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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
% E. T% U; x2 \一个很方便的函数模板,可以并且只可以计算含括号的四则表达式5 C3 y0 L5 I+ J8 P" c
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 r9 v# V1 f( r参数解释:
5 N5 R) j; c7 i8 ]- G( [/ `istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ h) ~9 J# @& c N8 E# DnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ E5 c& g* u P9 _' M/ q4 f1 z返回值:
5 d8 w3 b. H h* s' o' _返回非0表示计算成功,0表示计算失败有错误
) `5 v+ Z1 y" f* X/ h$ F# l
' A. W/ o9 x* @2 {
c1 v2 C1 Q( L9 j. D7 l: v8 @2 ~* K7 u& v3 m
程序代码:
( \. E4 d, c4 H. r
6 L- @9 ~8 j7 v$ Mnamespace fy_Exp{$ ~5 j+ Z+ y3 Z+ R7 \; k2 E
namespace {template <class _T>8 P0 K- d' o$ C9 z) Y+ B
inline _T GetExpValue(_T t[], char& csym){/ _0 n9 Y1 m& P( P/ M) w0 p. I+ b
char c=csym; csym=0;" D, A6 S1 \- E i! `
switch(c){5 |" {, M: t- d: D7 F
case '+':return t[0] += t[1];+ M! A: T* m4 ?5 b( }/ H
case '-':return t[0] -= t[1];
z3 q- v, m/ b+ K/ a case '*':return t[0] *= t[1];
& x9 O) |4 S9 a- Y) a default: return t[0] /= t[1];//case '/':/ H9 Y6 ?; J+ ~# v
}
. A A2 H) X" S}}
( }$ ~4 ^0 K2 w: L' A8 S0 _template <class _T, class _Tstream>/ M4 o7 P. e7 G6 ?% [% A# v6 l
/* _Tstream: inputstream, _T: get return value) r5 {" T5 D2 T
* Return nonzero if get value successfully */
- z3 E: j1 A( x1 V& {int GetExpValue(_Tstream& istrin, _T& nReturn){
4 ?: K) q$ z0 G% s9 Q5 ^* P1 l' i _T t[3] = {0}; //雨中飞燕之作0 s& N: M6 x8 [" u
char csym[3] = "++";
1 u- Z1 }- u, J int nLevel = 1, nERR = 0;
1 _- u ~- @$ O9 r8 |6 K if(!(istrin>>t[1]))istrin.clear();( Y/ F9 o3 e) j, D* o$ k
for(;;){
6 I8 @1 `4 V- i4 S0 e$ g+ A. U if(istrin>>csym[2]){) X/ X% M" X& W( o
switch(csym[2]){
3 Z4 n4 L2 @# G A& v. I8 }+ m case '(':
/ F( F$ J/ V! p ` if(!csym[1]){nLevel=0x100; nERR=1;}else
6 n! b" `- }. Z4 n if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. S2 H {3 n1 S6 r' m0 y1 r
else{nLevel=0x100; nERR=1;}) l5 U- M& E7 M8 I8 p- |" N2 g
break;1 Q2 {8 A6 }3 U
case ')':1 x. H! t9 _& S
{nLevel = 0x100;}break;: N5 o% K6 K% \6 z
case '+':case '-':case '*':case '/':
3 O5 ?' ^# V* V" {5 m3 } {csym[nLevel++] = csym[2];}break;2 I' B$ n7 ?0 q$ |, b3 Z) q
case ' ':case '\r':case '\n':case '\t':continue;9 U; N- E: p7 q: P% p& r. `3 \
default:
& O8 b* f9 C, x8 b {nLevel=0x100; nERR=1;}
4 d. f9 g$ y; }( G }
- m+ }+ r8 ^! E' z$ }! p2 H* [( _ if(nLevel==0x100)break;
/ g# M2 F0 a) B, E' C if(nLevel&0x10 || istrin>>t[2]){
2 u& E+ W9 i, k6 Z nLevel &= 0xF;+ I" d, f# P& m
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, _( P# `9 q: x) M* `/ q7 | if(csym[1]=='*'||csym[1]=='/'){
% ^5 z) `4 Z3 @1 n GetExpValue(t+1, csym[1]);
4 q" a+ i8 U! x# z- n }4 J, M2 C, }9 M( x4 c- H9 N
else{* t% m7 V0 h" J: n' p$ P
GetExpValue(t, csym[0]);$ J" O( l6 v# T. m# @- I! I
t[1]=t[2];csym[0]=csym[1];csym[1]=0;) \; B& u W7 y9 d
}. w7 c8 e, e- A, _
nLevel = 1;
% m% U& a" F. x) R* ^7 F }- P1 T( r0 y# Q' B; k' r& D. h
else istrin.clear();
$ E" I9 W3 ^ v* S }
* ?3 c# [/ T4 y1 u* j+ y1 b else{nERR = -1; break;}
- N3 k" D0 q5 w }
( r/ q* E$ w( U if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 b0 i; M, ?$ v8 b9 t" f
else nReturn=GetExpValue(t, csym[0]);
- t: Z* n; D4 ] return nERR==-1?1:0;
7 w2 t$ s8 ?: O) E l4 V: c) ?- Q}}
" T# M1 d- E' ^7 _. X% T9 v4 t2 w+ W+ z
k( h! `* V0 ?8 h! L3 s
; T# b, @: O8 X' j9 S" b' O$ P函数模板使用示例:
1 R' ]) { O* X6 O2 m3 q+ U在以上那段代码的后面加上以下代码:4 P1 @9 P5 ?5 R' o4 d
3 d. B5 X# [' F% D; i& f( Q$ P6 j6 ` , b9 S5 ^/ ?. S7 |$ h" C
, U/ Q% z4 A! E! E* @. i6 f6 N- x
程序代码: 4 i2 g0 x2 D# Y( A
' u# J5 H. C) H
#include<strstream>
- V5 a" @& v8 R# t1 X( D8 R( m- g$ k#include<iostream>$ x% @6 j. D, P
#include<string>- D* c' o1 `) P# i9 R% d& k
using namespace std;
: q, t! r9 n9 u* b9 Gint main(void)1 r& u+ o6 ]- J/ O
{
3 f ?2 n# i7 F& y' C3 X0 a0 u string s1;( e6 j7 Q; ^& k7 g2 @5 K& X8 @
while(cin>>s1)+ P& |* B$ Y3 c" ^
{
9 Y# G$ E3 B6 b, m' W$ C$ _+ Q% w istrstream isin(s1.data());( A0 E' s0 N( [' J! I0 I& r
double d;
. p2 C* v5 B! K2 ^ if(fy_Exp::GetExpValue(isin, d))- l) M j2 h' D
{- I$ L' P* K0 n5 e. Q3 x" X
cout<<d<<endl;( i8 R, Y; w( T- [& y8 M; C9 Q
}
- C2 t! d# M5 [9 `7 q else" x, L+ w- v9 E1 G! R- V; M
{+ t9 C4 _( t/ h$ s
cout<<"ERROR"<<endl;
! }& r! @% }2 w$ l# T }
: C+ _4 ^' q& X8 u( U }
) U' x9 N( c0 g7 }; j( ~ return 0;
" n1 q, I& u* @}2 [; E3 N& @# M) p2 P, O" C2 Q
) p6 r. w# Z7 A+ i6 s$ h l
' E$ T" m. l- a$ h然后编译执行就可以了(*^_^*)8 x! x) y& K, C7 N
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 A: n7 i c) k* \) u: d+ s 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|