返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,' ]8 \' t' K  _& {3 M3 E
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" ^. `8 U9 q9 p! `5 k4 }- `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! Z) R$ l; O& U. C0 |  n0 m
参数解释:
  S$ |6 V7 P  t5 Y4 C, ^/ @3 t8 v, Listrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ w( a0 A- l+ @9 H9 RnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ B2 O; j  i& o3 E# j返回值:0 l! G0 `  A; p! v# }) s- v
返回非0表示计算成功,0表示计算失败有错误
. F! j6 S" i, v; u% ^9 m8 n
4 t) \, I5 O) `0 d8 f
! j! `$ ~8 f# J  W
6 k  e8 u: W& d) X! t) w' w# t2 q2 I% u程序代码: 6 t+ B- X+ T) o% u3 u: ?7 ?7 @6 c
) q" N- E. {, `: l7 w& J5 B2 H
namespace fy_Exp{
1 h* q9 h6 m6 x' }% _2 I' w% ]6 bnamespace {template <class _T>
' m4 n1 ~$ Z& P" j# Linline _T GetExpValue(_T t[], char& csym){
9 B# @0 N0 @9 @% o5 F    char c=csym; csym=0;
/ v' I4 Y7 k6 t0 K: |    switch(c){
' R( Y) Q* Y9 s$ z    case '+':return t[0] += t[1];# s8 U( z' B* I0 ?3 X
    case '-':return t[0] -= t[1];" S! K) V( t% L) b, B
    case '*':return t[0] *= t[1];9 a3 j# |0 k: v
    default: return t[0] /= t[1];//case '/':
7 {9 _7 N# ?/ J) K7 x, |    }
) a! H2 M$ [2 M6 J- c}}* Y4 m; l0 y1 s& {( e
template <class _T, class _Tstream>
$ h0 B/ I  y- C. F9 M$ o: w/* _Tstream: inputstream, _T: get return value* h, a5 n3 c- B) B# @  r
* Return nonzero if get value successfully */
) E- Y: d$ Y: Mint GetExpValue(_Tstream& istrin, _T& nReturn){1 K: Y+ ?0 b/ x* }! Y
    _T t[3] = {0}; //雨中飞燕之作: h* z% s* ?9 D
    char csym[3] = "++";- h% W! S* Y  ~0 D) H9 u3 G
    int nLevel = 1, nERR = 0;
- Q9 V  u6 e8 {$ e7 i4 h' F    if(!(istrin>>t[1]))istrin.clear();( v% ^& T5 z# U7 w* {$ `' x7 j- ?
    for(;;){2 s; [) J, E; U. Y1 A
        if(istrin>>csym[2]){: Q# T5 ]2 B6 l1 G$ }
            switch(csym[2]){
. l2 M0 B3 S; A            case '(':
$ o1 E) c" E; [6 f9 y2 `                if(!csym[1]){nLevel=0x100; nERR=1;}else
; t$ R4 r8 n( l) e' o8 G( [. d9 H                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;* J, N. g: d: C& \9 M+ r" d+ r+ Y
                else{nLevel=0x100; nERR=1;}
* q, w0 r  J& v1 O8 J: R                break;# h" s! x/ T% H9 W
            case ')':
: N$ ^: V9 j. Y0 @  F# d( H                {nLevel = 0x100;}break;
" r; j4 O6 K9 f' ~            case '+':case '-':case '*':case '/':' g! p9 k  T. ]8 R  N) K3 Y
                {csym[nLevel++] = csym[2];}break;
! R  c- }" h# K- E4 w  m            case ' ':case '\r':case '\n':case '\t':continue;
- v) O; n% F7 N( i3 U            default:
( `0 `$ i4 y/ P5 \- N                {nLevel=0x100; nERR=1;}7 u) O* N* o9 o$ S4 v
            }& U% @4 t' Z( c. T
            if(nLevel==0x100)break;& N  _# K' q9 k* r! z
            if(nLevel&0x10 || istrin>>t[2]){1 `% E) f' c( A/ i
                nLevel &= 0xF;
. l6 e" b4 Q6 e                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! _  ~) i9 H, j3 n( M
                if(csym[1]=='*'||csym[1]=='/'){
6 O* P4 M2 z# c; {! [0 b, w" d                    GetExpValue(t+1, csym[1]);" x: G1 N1 c' d; M% v( h
                }
, b& Y6 h9 L. D6 m$ Y8 ]! f                else{! \2 o1 t$ K. e! P1 v9 ^
                    GetExpValue(t, csym[0]);
# }7 C$ u5 `5 y+ T: f* u2 W* t8 p. {                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;( W; I; |8 N! u, F0 o
                }
+ P4 Y  e' f8 L2 O                nLevel = 1;+ ?- d! ~/ U/ X5 ]) k
            }
' a4 _: `( \3 M- Z9 ^7 h" V' P0 C            else istrin.clear();
* U& R( l. z1 C  c4 j3 `        }8 M' }) T6 x$ r) r& }6 l
        else{nERR = -1; break;}  B6 d2 H2 T9 ^+ T+ ^2 H
    }
$ V: k; I) F8 U/ C6 K! @! q- G0 M    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
! ?3 O. c! Z* y! U( F% `    else nReturn=GetExpValue(t, csym[0]);: a4 ~4 `% ~2 M' y* S
    return nERR==-1?1:0;
1 O- S" f; T4 O$ U}}
9 \" M! g5 A1 ]% U; s7 K! `. `  @' X5 V; e' `+ O. u5 r- J

7 u, j1 }7 y6 j' G& }  M4 `( h: @, R& Y, C. f0 {( p
函数模板使用示例:
) U/ W* ?+ E9 R0 d4 u+ Y在以上那段代码的后面加上以下代码:
) ]0 N% D% F! F1 O2 z- c" N$ k7 E& ^2 ~1 [. U+ r1 @  I

/ |/ C* Y$ M4 O1 Z" e6 P
6 s! l" T9 W6 N& u5 Z0 X4 e程序代码:
& A. y1 u' T4 J
1 j$ @  ~3 `5 T: d; M1 c5 a#include<strstream>
# P% a& `& F, m4 n! Y" i#include<iostream>
0 w/ F: }) p) S. l5 F8 O#include<string>) @0 k; J6 P0 D$ W5 }) j
using namespace std;4 y" M- C1 J" V0 H& k
int main(void)
# ^5 _/ I' w, K{
/ A2 o" E- A' r2 D+ E6 W% ?    string s1;
! z2 [" ]: ^# \% S8 N    while(cin>>s1)2 \8 @7 Y" q  i# R, t" P
    {  s  ~2 G4 Z2 m
        istrstream isin(s1.data());
  ~, @* [5 T( e* d# d+ r        double d;3 n5 T- [* Q5 l' v1 I8 c& R  ^; N
        if(fy_Exp::GetExpValue(isin, d)), Z+ C. N/ m; i4 p" l
        {" S" j4 q  ?& F; X8 G6 ]" d0 H
            cout<<d<<endl;
0 s9 z4 j8 `- T* d+ i6 U        }
0 M% Q( P% k8 K$ S        else$ a, n# y# `4 I! i1 Y
        {) a& U6 ?! F" Q2 G1 w! C  j5 w0 {: u& T
            cout<<"ERROR"<<endl;
/ _1 U) T5 i3 c3 }/ T, g5 q/ Y        }- s  c* [, j+ ]; B6 e/ h9 k
    }+ ^/ D7 v& z' Y3 r& q
    return 0;
+ Q  v" Y: d% a& G; Z8 H$ C}/ o8 W( S: D6 @( h) K3 l1 z
/ m+ X3 k; K6 h. a/ O
! P# {' U: i0 V2 {1 c
然后编译执行就可以了(*^_^*)
  }) W: c8 h# C$ V  p其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 Z& q1 E- e! ]6 q4 H# x' x      建议使用VC7或VC更高版本,或者使用GNU C++编译

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