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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
% w' U1 l" p$ W3 ~: T5 C9 V3 e一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' X& Q: F, f( B: A+ o, v0 x* n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 v3 n& ]/ v( G& _4 f ~! Q
参数解释:$ j7 B( F6 l g6 T( w- G# `
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
5 n7 q' r$ x& R* CnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* A/ `) q1 q" q F G4 u7 i返回值:. L5 F0 M. j9 z) W
返回非0表示计算成功,0表示计算失败有错误+ q4 P3 a! k- v3 Y0 k8 \
; O& `# ] x. X# L- Z" r5 @
& x) ?' ? C# c' \& i2 I v
: v0 X1 k6 H1 m0 t& }7 U( @* c; m程序代码: / U; w3 j# T* D0 U. v
+ Z3 w, {+ h! |( b$ J
namespace fy_Exp{! M% r8 f+ u. Z' ~
namespace {template <class _T>4 s' X: Y" r4 ^( N0 @; J6 @
inline _T GetExpValue(_T t[], char& csym){
9 w; f) X0 [4 N2 H/ l) X# g+ r8 ? char c=csym; csym=0;
5 F4 E J& m" B+ B# p switch(c){# v8 y" k2 `5 e
case '+':return t[0] += t[1];1 |0 q& b" _: \( X0 J0 |
case '-':return t[0] -= t[1];# _5 ^ }+ u- O) e9 g
case '*':return t[0] *= t[1];
6 Z! T& t. Z6 Y3 o1 ~: A: Q6 k3 z default: return t[0] /= t[1];//case '/':
% D' y$ ]7 S" I2 w. h; X }& q1 _7 r$ `( m% E
}}
' I5 ^& L. L$ d8 Q% }4 \template <class _T, class _Tstream>
- K- Z/ W7 `3 C5 {, |/* _Tstream: inputstream, _T: get return value
7 H6 B. E% h( q. g5 w2 G% P! j0 P* Return nonzero if get value successfully */0 Z+ h9 C+ v8 y" M+ u
int GetExpValue(_Tstream& istrin, _T& nReturn){
- J% D+ S# i. Z% z) o _T t[3] = {0}; //雨中飞燕之作3 O& G* ]9 D4 W9 u$ M. f
char csym[3] = "++";9 Y, J* ?& W4 p
int nLevel = 1, nERR = 0;
6 `# k) @% Q f" B, P( g M if(!(istrin>>t[1]))istrin.clear();0 l( J( r% J1 P. v
for(;;){
/ z+ o. O3 D4 x8 { ]: R0 y% w if(istrin>>csym[2]){# u' m4 l( |8 N. Y3 i5 t4 n" m* t1 w
switch(csym[2]){" p% i; i$ w, S& k
case '(': K. R/ z) h' l& ? C- s- \
if(!csym[1]){nLevel=0x100; nERR=1;}else
$ E5 A5 A( l1 F3 C) E- ~9 o if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- @7 }/ q, L# T# s
else{nLevel=0x100; nERR=1;}
& ^# M0 ]* R* m, U. t$ i break;. I, D+ W, |4 e3 e3 q( T' b$ ?
case ')':. q) M9 X4 T: l4 V5 O2 H5 M" h
{nLevel = 0x100;}break;1 d P$ Z9 O' r
case '+':case '-':case '*':case '/':. G- P/ H% O8 \7 C8 ^. Y( [8 e
{csym[nLevel++] = csym[2];}break;
& Y( V" R3 Y* r3 n4 T( {# _ case ' ':case '\r':case '\n':case '\t':continue;0 T% @3 d6 \9 o9 b Q9 c' W; E
default:8 o' a7 }, t0 W% N8 }1 i6 G* v/ C
{nLevel=0x100; nERR=1;}1 V; i Z$ ~& \3 J5 r
}
0 I G3 s6 w; n- p4 q) Z7 \$ \, A if(nLevel==0x100)break;
6 k$ z; F" E: ] if(nLevel&0x10 || istrin>>t[2]){- ~0 u3 Q& ]) d- W0 s/ F9 d) A/ b
nLevel &= 0xF;
' C+ G/ z$ }7 F) a, | if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. a; `% I3 g$ L6 ^5 y if(csym[1]=='*'||csym[1]=='/'){( n/ @: \( B8 {
GetExpValue(t+1, csym[1]);+ T, {9 g3 d9 o1 l6 @! [
}+ T4 s" z' A0 ~) ^
else{
* M/ R& ~- s. I: G( [/ X. ? GetExpValue(t, csym[0]);
. Y7 H; B0 K7 t8 \, V1 x t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ V% \; w6 I! P% {2 }6 ]+ U$ [' F* c }
* ^- ~% i( B- J2 m' ^: ] nLevel = 1;
, M' ?9 B# q5 r }
6 K4 ~8 \( I' R f( { else istrin.clear();
% ]' a( J# p$ L }
3 S+ s; }, S- d* c! I5 J else{nERR = -1; break;}
& H& k/ k+ y Z' k }
3 |- _5 m% |' C9 g if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; d1 \( \) u. e6 X2 g, E else nReturn=GetExpValue(t, csym[0]);8 @3 {$ |/ i" E' B% y2 O5 ?
return nERR==-1?1:0;/ x f A4 y$ a x$ I' y5 Z
}}
: r2 w. a% P6 U
6 Z( f$ z. Y: w8 h7 ]% @& w' n9 d3 P: d. H& |
/ B6 m# ?& k# }+ G; J. m8 L+ M( H函数模板使用示例:
" C4 h1 Y0 l3 u$ u% m9 E在以上那段代码的后面加上以下代码:
5 K: m1 P) q/ l3 z7 @+ _( m, o) \( F4 [5 Y. |6 F5 O
7 ~7 @9 g9 G/ j9 _: }# U' H0 g' [9 t( Y9 D4 _& a* n: `2 v
程序代码:
, Y5 q: U0 x, e# I/ K- [$ q, Y. Q. a' }7 R
#include<strstream> A6 _/ Y% u( I( W2 [( l( o. E7 S
#include<iostream>
: h# h, w0 L# a; P3 r+ f J) O#include<string>
; w& L4 |, N; E0 ^# P7 L0 g# ^using namespace std;
$ o. p o U8 Y8 `: J) xint main(void)
, ?8 }$ l; x8 C# P" U8 D{
, I: V: D, M+ w# F5 ?/ `, T/ ` string s1;
: U5 | E2 d& ^; S! D while(cin>>s1)5 \% y5 }& o% H; K% [9 @$ H! m
{
) q8 [2 n3 s( W1 u6 X# h" l! l istrstream isin(s1.data()); Y5 Y/ [/ Z% Q+ l" F. X5 o6 K% k
double d;, l) U: r6 D. R& a
if(fy_Exp::GetExpValue(isin, d)), i j( l3 i$ R: F* p
{
" y- e0 e4 q9 T/ Q1 m# a cout<<d<<endl;4 D' Q$ u$ t$ }# _( R7 I3 C2 x6 Z
}/ P" @. G3 d1 A7 c! B8 n
else+ K" n; D( h" v
{3 K, Q) S- y# f+ N. t& d
cout<<"ERROR"<<endl;
% c# b* H. a/ P3 s8 N) Y% b) O9 l }+ r, r. G8 r, p! Y7 ?6 X
}
7 W7 c Y/ D) d3 S/ a$ i# i; `, P5 k return 0;
0 R2 q- f; J2 \- }}
8 |# R0 ~' L5 R2 |( a \% D* K" I0 U9 c4 t* J/ V( V* ^3 y
& M. U5 \7 C! j$ o5 m/ `4 w
然后编译执行就可以了(*^_^*)
, {$ N4 v9 `+ T" x( X. x/ s1 E" ~其它:TC++上一定编译错误,不保证在VC6上也能通过编译
- x7 o8 I s2 e. z; M; S 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|