返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的," a: e: ~" u5 R+ [
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ g* x' o2 ^2 v! x2 l6 Y1 \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. T6 W# p" {! n3 ?% u* s9 b参数解释:  ]( l2 G# F! i2 p
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; X- U3 e; Y: O1 {) ?# r4 F2 ~nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: ]* k" @7 A( {  |+ z9 X$ _返回值:8 `3 s5 l" P  u( y5 W; k( S
返回非0表示计算成功,0表示计算失败有错误  a0 d0 R$ n" y4 |  l. U% W
; h' L0 ^# u1 T0 n$ _

, [* o+ g% n6 G* u' p9 B$ P3 ^( u
程序代码: ! @$ E# L; q5 b! I5 @
% V+ W) `* e: Z. n# k
namespace fy_Exp{
$ P. ^0 Q- }  ^) v1 Rnamespace {template <class _T>
$ p  M8 C( j" hinline _T GetExpValue(_T t[], char& csym){
) m8 ^& ]' _& q    char c=csym; csym=0;
5 x/ m- H- y8 q# R    switch(c){
( @9 Y2 t6 |$ V# i& f2 [8 C    case '+':return t[0] += t[1];
  o1 B& x, ^8 I- |! n    case '-':return t[0] -= t[1];
; t2 W# W2 Y. s    case '*':return t[0] *= t[1];, n' W% ^0 I$ m5 g- F5 m. N
    default: return t[0] /= t[1];//case '/':
! h' Z) f0 X+ b0 w5 y# [    }0 x- x) r5 N+ f$ j/ s! {( ^
}}
5 A8 _- ]+ P7 K* T+ e; \* gtemplate <class _T, class _Tstream>
7 m4 @1 v" S; P# g# X, R4 m$ y/* _Tstream: inputstream, _T: get return value) G" Y8 ]" F& J1 ]6 |
* Return nonzero if get value successfully */- r, @. D1 w* S
int GetExpValue(_Tstream& istrin, _T& nReturn){! `+ V& P; y& ]; y+ m
    _T t[3] = {0}; //雨中飞燕之作6 y/ D; l5 M2 S! O; z: w8 d
    char csym[3] = "++";6 r8 W' V+ _) @2 s% a& g& U
    int nLevel = 1, nERR = 0;
: p% h, b- D3 u' z- C    if(!(istrin>>t[1]))istrin.clear();8 \' z, @8 \0 H2 c
    for(;;){& j% h) i) W& y9 u* p' }
        if(istrin>>csym[2]){0 Q+ }. s6 G5 t: Z
            switch(csym[2]){) W' E2 A# ~+ j% Y; H
            case '(':
! g3 c( M8 m# c; n5 X9 c* U( q5 v                if(!csym[1]){nLevel=0x100; nERR=1;}else4 e% {* p" L2 t/ e
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ v+ z& d5 G* V2 ^- q                else{nLevel=0x100; nERR=1;}
, [  z, s2 ?- w1 F7 B                break;
+ K6 a) @0 A0 V7 T& f            case ')':6 N* x1 g( J  l# s3 Z( |4 Z/ R4 _/ \
                {nLevel = 0x100;}break;+ p/ _: k; F! ]$ V* g" q
            case '+':case '-':case '*':case '/':
( g" j4 o$ J% H                {csym[nLevel++] = csym[2];}break;
7 w( H, {# z0 @* p* {: O" e& e            case ' ':case '\r':case '\n':case '\t':continue;0 \% Z. ^' q. v6 g
            default:* q5 J, C* _! F, j5 Z; U
                {nLevel=0x100; nERR=1;}
( X& I$ J9 Y1 w+ i" n+ e! x+ S            }: w7 n7 E8 o0 [2 x$ v2 t: v) T2 Y* x
            if(nLevel==0x100)break;' V9 R+ K, B, m" Q2 ^( }
            if(nLevel&0x10 || istrin>>t[2]){6 ~  M6 m$ T! H" u4 U
                nLevel &= 0xF;' e7 {( N. K" v$ C& y$ O' A2 P
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# j+ i8 v& d9 @6 g' Q                if(csym[1]=='*'||csym[1]=='/'){
$ X. t! I! p* Q$ W% H                    GetExpValue(t+1, csym[1]);
/ v4 ~! c: i5 P" x: B0 g0 L! b* c                }
7 k% n7 s- t/ \6 ~- C7 s, x5 E& J& n                else{
* [$ @. y, U5 a% t# _! s                    GetExpValue(t, csym[0]);
1 ]/ C; D$ @# q: n+ V/ w" [# ~. A9 W4 u                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;! t" G9 y* `( c4 r. ?$ k1 U; N
                }
( x: ~% w; q3 T2 {  I  t9 V2 |                nLevel = 1;
. v/ H. A# t- b, z5 H            }! ]( M$ J0 @. e% R) j. N6 h
            else istrin.clear();
# y7 x1 `: W' P, M9 C        }
' |1 |; {, d& D+ ^$ \& ^6 H% t) Q) M        else{nERR = -1; break;}
9 b% W" Y* H! M" c# i; ~% p    }
; B4 D, R8 w& Y! R    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" ~$ {, {7 r1 v2 i    else nReturn=GetExpValue(t, csym[0]);+ J" u$ j3 p" Q, }8 [: E
    return nERR==-1?1:0;
% W1 D' \1 ?. ^}}
) o% y7 L& X# m" Z
  X1 W0 c1 E* j: n+ t/ m( x+ h
; w! G/ @) g" i5 I1 M
, v5 a- B" R4 {% b9 }4 X函数模板使用示例:4 F8 b% g) v9 i
在以上那段代码的后面加上以下代码:
# Y) h! w4 B4 @* _# @
! z9 {2 X6 p) m- ^* w
9 z# o7 {8 B& J! e
: |, K( ^5 Q" U: ?- W程序代码:
+ w5 h& ]; _& i0 a& J+ H3 @' X' M. b4 P% Q
#include<strstream>$ a# J: S$ ?- ^1 t) J1 U; ?/ C
#include<iostream>2 B+ l) y+ F+ _# t; J4 _
#include<string>" Q. P) D, T# `& r
using namespace std;8 }3 N2 t& M! u* P1 x
int main(void)% K8 U& J2 K& E, d
{" }& Z' Z. n; R- Y; R! w, {8 v
    string s1;
$ Z" L! d. Q; ^- ^    while(cin>>s1)
# Q4 r9 Y+ T4 Q    {
# J& d4 s1 R1 v% [        istrstream isin(s1.data());& j" i( c, T7 N4 ~
        double d;
( O$ _/ e7 w9 t. G# e        if(fy_Exp::GetExpValue(isin, d))' q" l/ e* B* X
        {
! ?6 y$ H, S+ A            cout<<d<<endl;
5 X' u9 _: P% K) ~( K# w        }: @* F1 h* M, g) E2 O* t
        else
4 X. L- F3 r; c. O2 x: m        {2 w# g# f/ E: U3 T: o: x
            cout<<"ERROR"<<endl;
" U, o- j/ J3 {* N1 |        }
# M9 l. e0 m' c7 O' Y0 }6 p; d6 U. A, y    }
- Y5 L2 v; P; U- Q, Z0 r    return 0;+ C# `  d; [9 o* r3 J5 O
}
6 V. F% ^4 H- D8 Z4 N4 t
: W' e( [7 [( T6 W; Q$ u+ A. M3 r6 @, B0 u+ O
然后编译执行就可以了(*^_^*)( o! u5 B- ~9 ~0 R6 d7 Q" F5 X$ X( B& W" G
其它:TC++上一定编译错误,不保证在VC6上也能通过编译) g9 u4 {9 ?" g
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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