返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
3 S$ b; T0 m( g) s, D; e一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! h- x2 ?" [% o( G# i
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- }/ M  ^2 j9 J5 t( [' e% O; s参数解释:
2 T" q4 [6 x/ tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
' ?" m  i  n' V' K& vnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
2 ?4 J# E6 i+ |4 z& d- w- j返回值:
) J; C5 r4 F# [+ T6 l4 [0 A5 n返回非0表示计算成功,0表示计算失败有错误& J9 Y+ u5 \4 f$ e3 j

* j  B# P1 l$ z' h4 q
! q! y; I7 I( y0 T$ p6 k* r& c0 k! O! K5 a
程序代码:
# V4 k, o+ w$ n' A5 @& V  I, M% ?% r( T- u9 {$ ]. }
namespace fy_Exp{
3 I+ Y  v# d. O% E9 Snamespace {template <class _T>
1 E5 W8 C; y' ]: E% Ninline _T GetExpValue(_T t[], char& csym){
7 i* r6 f% z( d, ^: o4 y% z    char c=csym; csym=0;
# D" z+ e" i' B2 K    switch(c){7 f, U  D7 I' m4 A' e7 t
    case '+':return t[0] += t[1];
; v3 z1 ]; d7 ~4 T2 R; d* k    case '-':return t[0] -= t[1];
" b5 ]: S" U# l( k6 G8 o    case '*':return t[0] *= t[1];* Z- N$ ?, u, i/ E
    default: return t[0] /= t[1];//case '/':$ p/ Y# y8 I6 _' s9 c+ u
    }
  Z" ]1 g; A( ?: y1 K3 p* s( n}}& L, q2 g! X9 R+ f( ]2 X0 i
template <class _T, class _Tstream>
7 x7 W9 }' F1 X/* _Tstream: inputstream, _T: get return value
2 s0 T+ G  w+ _, M* Return nonzero if get value successfully */
8 D' O" h* b  Q& M% Tint GetExpValue(_Tstream& istrin, _T& nReturn){
- u; Z# x7 A$ j- `# j  h# Q. m    _T t[3] = {0}; //雨中飞燕之作( K7 A: f; h6 W; q
    char csym[3] = "++";( V8 J. d& Z1 M
    int nLevel = 1, nERR = 0;; g" _' m$ X# \; T3 b0 \! M- ]5 q5 _
    if(!(istrin>>t[1]))istrin.clear();8 q% V9 C  Y* d' P* J( l- e! m
    for(;;){& |( }1 i, t0 T0 T
        if(istrin>>csym[2]){
3 q0 `  `; ]7 h$ Q9 S  O            switch(csym[2]){) E* R+ i& J' B6 b8 t
            case '(':6 o3 x" g+ P& e2 l" q
                if(!csym[1]){nLevel=0x100; nERR=1;}else& c( P; g9 z# q  W% d$ ^8 @
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
6 o4 J2 A9 `- }                else{nLevel=0x100; nERR=1;}
1 ^! q- u6 e4 U                break;4 z5 `# {" E0 c# A- g0 M* `7 ~1 l
            case ')':
' X% W4 E: t, O( n% h                {nLevel = 0x100;}break;" j4 ]0 H& U3 J4 d- d( _6 A0 D
            case '+':case '-':case '*':case '/':3 M( u/ E9 h* U: l2 D
                {csym[nLevel++] = csym[2];}break;
* s9 b' O3 C, Q2 t+ }            case ' ':case '\r':case '\n':case '\t':continue;# Y) O! f) a$ a
            default:2 V( F2 N# _* {. f8 P7 E
                {nLevel=0x100; nERR=1;}# K, p/ X8 T6 e8 |
            }' \7 W+ Y$ d* Z) i
            if(nLevel==0x100)break;( F2 L; W$ E9 a6 W4 [/ b- d
            if(nLevel&0x10 || istrin>>t[2]){
' d# X4 j" p" u# a) P# Q                nLevel &= 0xF;
5 G% w5 t% m) ^0 C% L( e. w6 [                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! m( Q/ G- R' G1 u6 T5 \0 o
                if(csym[1]=='*'||csym[1]=='/'){1 b" Z+ i1 _  R) u. ~
                    GetExpValue(t+1, csym[1]);
" Z- c* H: _& w3 _  r                }( l8 D. m, i" ~+ t9 P. W
                else{9 }6 c0 H6 U4 w3 L/ q* X& h
                    GetExpValue(t, csym[0]);" A; M7 Z, z( G$ j% j, Z
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
6 V$ a2 C0 k) b# [8 l6 p                }+ A( x; h* \  u* K2 h3 m5 t2 J! j
                nLevel = 1;3 n) N3 s3 F: @0 `: l# H) V# o
            }
5 ^& A5 l3 H% ?- `0 E, V* k( y' y            else istrin.clear();
* h2 ?+ T! {9 o        }; t3 F  U( q& i8 ], N3 V2 b) b
        else{nERR = -1; break;}& J, V  X& R" ]( ]% w  A) c
    }7 Z1 L) c3 e6 T
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ q( X+ x3 T& Q' L& t8 _+ D    else nReturn=GetExpValue(t, csym[0]);, P3 O. [, Y, E1 W
    return nERR==-1?1:0;1 t2 D* ^9 Z1 l0 S" y) j/ P4 _. K8 q. N
}}
: x% `# P) K! v& {7 r" ^* P% F- a8 J/ Q' d3 Z: P( w* ^

& [- H& T, W( L, d
9 s8 s8 b7 X' `4 I4 F5 P; J函数模板使用示例:. j& l4 _- }# x+ H  t* }9 q
在以上那段代码的后面加上以下代码:5 o! n' d& ?  V; e1 I9 C. R4 z# F

7 Z0 t& c# \6 z8 ?# O
6 O" o6 j1 C1 P8 y6 p4 z) }6 l7 P9 @, D0 Z3 V' z% ?4 H9 Y
程序代码:
. c' `$ |7 R7 j7 ^2 i3 u; `* D
) k5 I5 O: _: C# |6 a% u* `#include<strstream>0 I7 v2 O: O) R
#include<iostream>
* p& b& m: R# P* T- S7 v#include<string>
$ T- l! a8 p9 i; l. l% u& Z, w; Ausing namespace std;+ f; G0 V4 }2 r: d
int main(void)
: s  T# |2 w8 u+ P: w& s{
# W6 I: ~, R: _% I, k    string s1;: B5 Y. G, b, d: Q( @
    while(cin>>s1)
- t3 K% I( F) f6 w4 t! [8 ~8 u: \    {, p0 ?8 }2 v% ?& |
        istrstream isin(s1.data());& \. K; k$ m) F* v( n/ }* J
        double d;; d! n- Q4 j. m: G$ \* I
        if(fy_Exp::GetExpValue(isin, d))
. D: e  s3 }# f$ t; c        {/ Z: H5 H+ Y( n0 v% g! X/ Q9 j
            cout<<d<<endl;
( o" m% \- @. L: V+ W4 w; F5 S        }* u+ [6 W8 o% p
        else
+ f0 T- y* M4 d9 r, @        {
. I( E$ @% S8 o, P& u            cout<<"ERROR"<<endl;
7 O4 G& A/ u- h9 U( W        }
3 |$ j* K/ T/ ?! r    }0 N1 A+ K' ^# N% T$ U5 ?( R  k5 m
    return 0;2 ?0 J. p9 g+ L/ [6 k% U
}& Q; k% s# b2 y% c, M1 [5 p

. R# b$ q+ d& \( n) S* z3 d2 \
8 d& n0 t5 F; v然后编译执行就可以了(*^_^*)0 I% G' {. {8 n8 q/ K
其它:TC++上一定编译错误,不保证在VC6上也能通过编译0 h5 M( \& f' I  Y5 d* y) ~, ~
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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