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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,9 u( i& {: z1 `
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 j5 `+ ^$ P* c0 l/ h
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! ^" h) v m/ ^3 L参数解释:% t( m0 S4 L/ b( t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
4 U% n% s' C3 j" BnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 j" c# [- C& h& `返回值:# ~! w' ~2 u2 [( K/ X4 k
返回非0表示计算成功,0表示计算失败有错误; i9 P& T! h, i; j, c% q+ a
5 T2 O3 O. x- ~9 x; A1 h$ L& }0 j
# B! H2 j! P; B' T. U# a/ I
% p X* {3 ^1 n$ m* F& _程序代码: ( i0 n0 `# w: |* R3 A9 M
+ L+ B. z3 g. Q+ K( `' C+ |' F7 nnamespace fy_Exp{% f2 G- A, l% F5 C" @
namespace {template <class _T>2 S$ m1 x& g8 N1 y. `
inline _T GetExpValue(_T t[], char& csym){
$ O# X/ a1 P' `: D/ M char c=csym; csym=0;1 f A) a8 l0 o( q. R
switch(c){
: [& m3 V1 p6 V: x: J7 C- w case '+':return t[0] += t[1];
- v3 V0 t+ {: j9 ]8 O% ^. v, i$ ^ case '-':return t[0] -= t[1];: e5 f, m2 F2 e, p! Z3 z
case '*':return t[0] *= t[1];" L# `* [- J G# h
default: return t[0] /= t[1];//case '/':
9 _! k0 L' K6 I, p, E) ^) d }
3 N3 \3 O; P5 S; S}}
! F' D* Q7 h' l& ?5 K/ Gtemplate <class _T, class _Tstream>
5 M* F# C9 S: a: c/ j* B" x: ~/* _Tstream: inputstream, _T: get return value# Y! v5 G! j% X" W, l s$ O
* Return nonzero if get value successfully */
`% i- @7 P7 Bint GetExpValue(_Tstream& istrin, _T& nReturn){; M. A6 j2 r3 ~* m5 o
_T t[3] = {0}; //雨中飞燕之作
7 m% y" W3 k+ ~! Y char csym[3] = "++";
. v. f; Q, X' j2 j int nLevel = 1, nERR = 0;
' m$ q: k% ~- S; Y E% b if(!(istrin>>t[1]))istrin.clear();
@4 ^ ?8 G, A7 n0 f8 a for(;;){
% k1 [1 t# {7 L2 O) y: x6 k if(istrin>>csym[2]){; \& B: R! w+ y% t$ k- E& W) P" o" n
switch(csym[2]){
0 D) j+ C2 n2 n; Z: Z case '(':# F. Z) S( `7 ]( `% X$ Q
if(!csym[1]){nLevel=0x100; nERR=1;}else
) V6 Q( q3 B4 j0 @ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- Z) Q) y( C7 H. T3 x
else{nLevel=0x100; nERR=1;}" j! A# m8 I K+ p/ ^0 Q
break;
. C7 g) C0 Z, }& b0 {6 X4 k* ~- Z case ')':
& ^4 a/ E# M6 X2 g& N1 P {nLevel = 0x100;}break;' b' F+ U$ Y' Q/ c$ [) g
case '+':case '-':case '*':case '/':
' P% [) }' @- P6 B {csym[nLevel++] = csym[2];}break;
' x: A: u1 }- i: M! L+ g case ' ':case '\r':case '\n':case '\t':continue;
& k' L( t8 @ ^! N7 j8 n/ b' ^& r default:7 ]5 D+ j0 g6 U# @9 {
{nLevel=0x100; nERR=1;}
! U* Z: {, w" [# T }, f6 W/ J, U+ p2 u6 K* C6 [5 j
if(nLevel==0x100)break;5 H9 L Y8 s7 O8 ]7 j! s( r
if(nLevel&0x10 || istrin>>t[2]){0 l5 P8 }: L" P. h/ k4 z
nLevel &= 0xF;8 s! T7 A/ H7 \9 X( ]( C- Y* q
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# r' [+ o9 X, u4 }
if(csym[1]=='*'||csym[1]=='/'){0 N, o0 v7 V/ S2 l9 \5 _2 B) {
GetExpValue(t+1, csym[1]);
! O8 ?. _- C/ V: \" w7 V }. e. M% Q. |3 {! Y: I* k
else{
& O$ x, s$ m. ~% p/ p9 q% @ GetExpValue(t, csym[0]);
3 u0 Z; u. y; K! x+ D$ C) d t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 ?" N- H6 T& a9 ?8 g {2 f
}
( O) `+ J4 ~/ D& ?4 Z nLevel = 1;2 i1 v: A; d. r- p- m& P6 E8 r
}5 ?" o% q7 u: O, L' {1 Q! P
else istrin.clear();8 S4 D/ o8 I4 r" e3 v: u8 X
}9 T; M5 z& W# l
else{nERR = -1; break;}
8 X0 T( v4 r5 k( x' ~# x% R/ \ }
9 ]2 X9 f' Y3 n; g2 [1 O if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( q4 t7 V; ^4 X, b
else nReturn=GetExpValue(t, csym[0]);
* o6 g* O7 s- L L0 s return nERR==-1?1:0;
" W4 f6 S3 K* J. W% k) j; N$ O$ }5 L}}
& j' o' C: p z' D/ y9 ~( }; L1 w! F9 X1 x; _9 g- A9 k
" R+ ^# E+ F# P& W9 ?# L5 ^1 e
; \0 ~: E" r: u函数模板使用示例:% I( \% v3 ?. x$ V3 x% l# y
在以上那段代码的后面加上以下代码:
" z* \# Z. K# C% _3 u6 i5 x/ i( K0 V4 {0 F6 S# g
9 \0 ?( Q. u3 Z% i! @) N4 M- C
5 `7 n2 {9 z! A( u
程序代码: 1 Y' a: @' L5 Y4 {" [; q% D
& g; @" Q5 j" s. U: ?2 w5 c#include<strstream>
. p* V- b; N% X% l3 j2 U#include<iostream>
, v0 Z c* ~0 [2 B6 l#include<string>- P' u! F' @5 Y0 y
using namespace std;
! U1 _2 d( W. g, M6 @' ^int main(void)! W6 W G' ~7 l% j# Z9 G
{- T( F+ n# E: |% ^
string s1;% ]+ \! ^8 _/ l) M) e+ |
while(cin>>s1): r2 W( m) q! v: Y7 O$ X" x7 q
{$ |) [" q. W& H& |" u1 D+ M) I! ?
istrstream isin(s1.data());
4 h! p6 ^8 @; T+ d* ~3 @ double d;' B3 w+ Y6 n/ s/ W
if(fy_Exp::GetExpValue(isin, d))
8 t3 M+ b! A# f8 O { h* X: w3 A& x
cout<<d<<endl;
" b3 P& f3 ~# k& s }8 |) S) d0 e+ {
else& H [# t( v1 g9 v q; |* t
{
4 d/ _8 n b' v3 K: l; H* z/ X; I cout<<"ERROR"<<endl;
% ] i- {8 H1 s }
# C: w9 ?: \. y% G, c5 c }
- N$ y4 k/ N2 H& J0 Q' ?$ v return 0;
5 D' E3 V2 I& S( E5 I' x5 Z1 G$ Y0 B}1 ?3 [7 b8 I+ y( L
) I& j9 L1 H( E- [6 n
$ D8 @7 z% v* P
然后编译执行就可以了(*^_^*)7 R! i) |% [" h8 K+ r6 N2 i
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: E4 G5 t4 x1 G5 z9 J 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|