获得本站免费赞助空间请点这里
返回列表 发帖

一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,
2 |8 W: q9 C- z2 u2 t- i5 G一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: r" {4 R0 I* A' n' P" e9 C9 u# C  F只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ |* Q/ Z& T6 h$ S2 p. O0 `' k# z9 h
参数解释:
% |! S. y: X+ U3 F! J3 Jistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流1 W4 s' s8 F' L( J+ k6 I
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. o" d% @( g" U  s+ \3 C
返回值:) x/ W, k" d  U$ ~+ q
返回非0表示计算成功,0表示计算失败有错误4 l0 N0 }2 b( m5 f3 g

! y! o. Y( W! J$ L3 ^8 C4 I6 M ( D' s8 y* i! l' b
. {2 i8 {* A' i. ~
程序代码: $ e. t" ^' u+ s% q7 x9 t

1 R4 B" f5 s5 W' r2 S. q( c# m+ Wnamespace fy_Exp{
# A6 A7 \5 D/ Dnamespace {template <class _T>
9 _% ^. s. ?3 a+ ]* Oinline _T GetExpValue(_T t[], char& csym){
4 u# `/ b0 B6 e7 O, r8 m1 L2 K& E    char c=csym; csym=0;: u2 t. a0 m( @+ F" U: `" T" I/ I
    switch(c){
" i% I/ }5 `4 f1 _/ ~+ M0 Q    case '+':return t[0] += t[1];
# F8 |) z( b  K( M) ]" D    case '-':return t[0] -= t[1];
1 B$ [# F% M: [- f0 G    case '*':return t[0] *= t[1];
$ P6 _) k3 ~. n! h7 I    default: return t[0] /= t[1];//case '/':
' l. U& E3 C0 X( c# u% Z    }% b% F; _" Z8 h% b8 m
}}! g+ P1 J" C3 ]# {# @; ?7 Q
template <class _T, class _Tstream>6 y* y  j' G/ l; x. M
/* _Tstream: inputstream, _T: get return value# L0 s2 w% V2 |" N8 m- V  K
* Return nonzero if get value successfully */, C; S) B6 E- s/ \& ^  [
int GetExpValue(_Tstream& istrin, _T& nReturn){( C, w  M+ _* g( @/ g
    _T t[3] = {0}; //雨中飞燕之作" t& v0 r$ b% b, b1 d
    char csym[3] = "++";
2 x' F$ R9 _; B    int nLevel = 1, nERR = 0;
$ {3 @9 p8 ^* r" A/ h7 j" ^    if(!(istrin>>t[1]))istrin.clear();
9 [" @- v" U5 X2 M$ D    for(;;){* n# S" X; ?. U
        if(istrin>>csym[2]){
7 u/ B% Y' ~; D7 n            switch(csym[2]){
5 u0 U/ m; B. c+ D" \            case '(':  g9 u* r8 E/ F+ x) S
                if(!csym[1]){nLevel=0x100; nERR=1;}else
+ q0 t( w) ?5 i# s! a                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 Q' t% p  N9 ^0 |1 B8 z
                else{nLevel=0x100; nERR=1;}
3 N$ n7 ^7 N' n* s# L' s                break;# f9 A1 Q: a! q1 w# \2 a
            case ')':( T# |) o7 P5 L) i
                {nLevel = 0x100;}break;5 q, {' y) e7 E& v* `% T( V8 t
            case '+':case '-':case '*':case '/':9 p. @0 q: D- N9 W8 F! v2 C$ {+ G9 f
                {csym[nLevel++] = csym[2];}break;8 \  L" a$ k8 d7 U
            case ' ':case '\r':case '\n':case '\t':continue;
$ j4 z* ?: h9 V1 D. L: T; d7 ?            default:5 w% X. N2 g; T6 A0 R, ]! ^; F1 M
                {nLevel=0x100; nERR=1;}- }/ O! R' U) v/ k) r" E" h
            }# L: d) v" o. \- p$ I
            if(nLevel==0x100)break;
% ?" Q8 o; n% B/ A3 u            if(nLevel&0x10 || istrin>>t[2]){
4 t1 C) K+ w& P0 Q% n/ R! n1 V                nLevel &= 0xF;( e( o& x6 f1 D# ^
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# t. G1 j1 z7 K                if(csym[1]=='*'||csym[1]=='/'){
% G4 R- i$ r& N; M                    GetExpValue(t+1, csym[1]);
6 M! _+ E  Q+ P4 c' @( p                }
6 X; `3 x, N' y* [: |1 S8 q                else{1 U3 T7 _* P. O) a0 K7 H
                    GetExpValue(t, csym[0]);
" j2 E! A- ^+ Q/ D, h  I0 i                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 O. ?( L$ |$ V0 ?
                }9 k# z  z* ~$ v0 o$ y3 U6 b
                nLevel = 1;+ P/ D0 `' [+ `' L
            }9 c4 h& D' K" i: |3 [8 Z1 z# ~
            else istrin.clear();" Y, H0 o$ e1 [
        }
4 r3 k9 G. J6 x2 C% I1 b. r4 v. l        else{nERR = -1; break;}- n9 U4 ]; ^- g1 l' x: x2 G( G
    }
# m, x" w& T( v# {  v    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 ^# x7 ]. c2 F  a" K) o    else nReturn=GetExpValue(t, csym[0]);; g' `$ F+ Q* s2 ?( W
    return nERR==-1?1:0;
, M9 P6 C! b5 T7 }) {* B8 q}}
( G5 I1 x5 T- y' D" D& [& r; k; z4 ]! ^5 \

2 D, d: b7 q* p) m$ p3 m$ b" c2 z: |- j/ ^  {& q5 ~& e
函数模板使用示例:
# X  `7 m# N3 n: e( |0 @+ M, h在以上那段代码的后面加上以下代码:
" ]$ u! O+ T  r2 E5 k+ u& h" y
) E' @9 O/ L  R9 x
& [2 i! i* S( F$ ^* E
1 p& P* H/ q9 c  v. i& ?: K程序代码: 1 q- o5 W- s2 d# K7 h

/ x" }7 k1 q; k" i#include<strstream>: u  z  @# ~  h, A
#include<iostream>
! V" f7 n0 u! a, L#include<string>) Z( r. U7 p2 c9 `) q9 Q
using namespace std;
9 O' n  H3 F* x0 sint main(void)0 r' f2 F# V' n  ]3 c: W  ?  P
{
6 H+ a6 J$ N6 k1 ]" {    string s1;
! |7 u3 j8 |" b7 s- W' F; ?    while(cin>>s1)' O3 W3 S( V- u* _5 B  i
    {
$ t& v+ i  E' [0 D5 |8 L        istrstream isin(s1.data());1 L8 P4 w4 |' b( Q5 c$ P, J+ a
        double d;
, j+ F1 r6 C$ C" L  N$ l" L; G" ^        if(fy_Exp::GetExpValue(isin, d))5 s' ~4 \; L1 I9 l( D8 H  x9 \
        {7 p$ w9 G, ~$ V. k
            cout<<d<<endl;# @% D, J& w5 u% `- m6 C4 ]
        }
0 |  f$ A% `9 @" g        else2 Y. u5 @1 l% O9 c" s* H- P. m
        {+ H2 ?* |, a- D) g6 m
            cout<<"ERROR"<<endl;
* e# v8 i5 }+ n# X" x8 @        }
& A+ e0 U4 m) J2 f: a    }+ p' u& f# O1 M* W% p! M$ ?
    return 0;- \) x" O- H! z3 \7 b* l
}7 n, O. C( H. u( J6 m

5 J% \2 P! \) w7 j; N, B# p2 [7 r& Y- e- x  g1 j0 ~
然后编译执行就可以了(*^_^*)! ?( S/ {" g2 D& a% w$ t+ {
其它:TC++上一定编译错误,不保证在VC6上也能通过编译) u- A4 i9 G6 m7 m* v8 `/ i5 H" f
      建议使用VC7或VC更高版本,或者使用GNU C++编译

返回列表
【捌玖网络】已经运行: