返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( X0 I0 t5 A6 H9 p! V' t
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" v) X0 @: O2 v) U3 N5 `
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. Z$ Q  _% W7 L/ a参数解释:
/ M: J4 `) n9 Aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
0 r" g/ W9 x4 Z) v5 a% V+ R  RnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
( _5 U* b) p7 W$ d9 C1 R9 H返回值:
' o) D. B# S5 d- T  t返回非0表示计算成功,0表示计算失败有错误
9 Y- U( w* }; Y& B  S* {& v4 Q% ]6 [- n  K) L2 ]0 G" {

% S' o% F# P9 e0 b$ K( c  k0 a7 D0 l! r
程序代码: ; |; h: J) x' A2 C7 D$ y

- k% t! o; Q/ ^6 `, [4 lnamespace fy_Exp{
: t; x' e' c3 xnamespace {template <class _T>
9 e2 |! z" e# o. N) [# ?9 minline _T GetExpValue(_T t[], char& csym){7 u. |5 X: K0 U: s  v( }2 }
    char c=csym; csym=0;3 [; r9 D4 o% x: X0 N- A' w* O
    switch(c){
/ D2 v* h" W* a& k5 g    case '+':return t[0] += t[1];
/ H$ A3 P7 l7 S( y4 k* y1 _    case '-':return t[0] -= t[1];
) ~' X/ ?* A5 s# p. G    case '*':return t[0] *= t[1];
# H3 U  A- w" F" w    default: return t[0] /= t[1];//case '/':
6 e$ e+ M; U+ }* y% c1 V: c6 |    }
$ b& G# h" ?2 d, Y; C" P}}. B/ i& h6 \: X  K
template <class _T, class _Tstream>: g  N9 ?3 A% r  i# J4 U
/* _Tstream: inputstream, _T: get return value* I/ ]1 C% E+ ]' @& l* f( ~
* Return nonzero if get value successfully */
+ H/ F1 u( N! |  U/ K+ Uint GetExpValue(_Tstream& istrin, _T& nReturn){, M' ^+ [/ n: K+ n6 J
    _T t[3] = {0}; //雨中飞燕之作: s% h" M. P; R" g: u
    char csym[3] = "++";
" O) i3 R7 v: ^0 f    int nLevel = 1, nERR = 0;8 l0 Y: S' r, p; S# N- Y. c
    if(!(istrin>>t[1]))istrin.clear();2 t3 G6 z% Y) u, y! S9 U: ^
    for(;;){
& E) O3 j" n4 r" K3 S* n        if(istrin>>csym[2]){* I3 M1 Q7 L  m2 d. \  Q
            switch(csym[2]){
$ D# [" x% p, }' _, t3 D            case '(':# E7 U; u% ~9 }  D, w# F
                if(!csym[1]){nLevel=0x100; nERR=1;}else  y+ W6 ~0 a, E  ?1 c
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
; L4 O) b& ~: q! v  \" u5 W* v                else{nLevel=0x100; nERR=1;}/ l, [6 I, ~: u/ [* Y% }
                break;
% E* K9 E' F6 K3 V( G, X& L3 \) V            case ')':7 O! d/ X: t6 G8 ~0 |/ c+ j. Z
                {nLevel = 0x100;}break;
6 v; S6 |5 p2 q( r            case '+':case '-':case '*':case '/':) n* q/ w, V5 ~% `1 C
                {csym[nLevel++] = csym[2];}break;
- ], c. C! d  @! u7 }            case ' ':case '\r':case '\n':case '\t':continue;
9 u3 E1 f! R( Z- M: L# d            default:
$ N5 r; Q2 t% G9 f; w3 ~                {nLevel=0x100; nERR=1;}- ?5 R+ V  x% S6 x3 M- [# t) v$ _& w
            }
: M( T5 L" c# V# _# y# W; X% u            if(nLevel==0x100)break;' W5 d* m1 }  l! ?% X/ q0 J
            if(nLevel&0x10 || istrin>>t[2]){' h. g+ O& e0 ]/ d0 \) `  ]
                nLevel &= 0xF;
. J: {4 a3 B  Z$ I: V1 W                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
5 u2 r+ ?- _9 }0 g" p' V+ ^9 |                if(csym[1]=='*'||csym[1]=='/'){9 X7 \' k: u: u
                    GetExpValue(t+1, csym[1]);( c. Z3 v7 \6 H" ]" l, O  y
                }
( K; I4 w0 E: B  N; x0 Q) H                else{
- L" x" ^6 Z( T' Y+ T% B                    GetExpValue(t, csym[0]);* R! B# g3 Z3 s2 H6 M' W
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 U% @% v/ W; h/ y
                }
5 V/ v* k7 [* ^& O                nLevel = 1;) Z. N4 E$ K/ b  `; Z
            }
! J) E: x! c- K4 [            else istrin.clear();* X; d1 a- Q. I7 R, J
        }% P* T6 B( Q" O/ N( {, X
        else{nERR = -1; break;}3 Q$ Z4 D5 d7 a" ~. x* C: |" Z8 i
    }
2 d2 N7 x" }7 c& p+ W! M    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ P( K2 F8 I8 L6 L" U; C+ U    else nReturn=GetExpValue(t, csym[0]);
. O: z5 ~2 |7 g, o0 D    return nERR==-1?1:0;
# _0 l2 g6 e0 `7 i; N  v* v$ X}}6 s* d6 m( T) U9 \0 l4 u, |
* B5 O( O3 ]5 p# q

9 R) I9 w1 G% L' W. E- D3 M; I( j$ f0 L' |
函数模板使用示例:6 m+ ?' |) d9 |& ^6 Z* p! z; U8 q
在以上那段代码的后面加上以下代码:+ ]7 l4 s# s4 u) f9 \8 W8 G; b
8 F5 U2 [) X/ R  `' t1 t

' }, n* C6 d& }" p, k* u& x6 A
# _& L1 a: {) m: R6 L6 Z程序代码: - S; [" v9 K. }- e$ M

% t7 }4 O' f8 `8 g#include<strstream>" G' c( P- z, Q
#include<iostream>; O" J  v4 ~& ^/ _
#include<string>; D, g: N. ]4 F6 _3 a+ X( d
using namespace std;, u/ Z# s  X* c& S
int main(void)
+ {9 f* z: B5 u4 x) X7 U$ j{4 _3 [: ^& m% M$ T0 Z2 Y
    string s1;
8 K6 E+ S. _/ o, o    while(cin>>s1)
) W/ X& l* \/ B" }/ S" e    {+ ~" f; p6 ]4 l5 ?- j) ~
        istrstream isin(s1.data());
0 y& H# {2 ^3 o        double d;, x5 z5 Y0 l3 R5 X& s
        if(fy_Exp::GetExpValue(isin, d))
/ b: E- X0 @2 k7 t( [1 |  T$ c        {4 u" O3 ^2 B: ]5 l3 M! S/ E- z( P# n
            cout<<d<<endl;/ s5 V( x# B3 z0 z8 p' p% |
        }
) Z5 M' k# x6 R- ^* x        else, B/ A! f: s7 L7 i0 h
        {
1 {$ V2 t. T6 y- H. i) [            cout<<"ERROR"<<endl;1 h0 s4 k. R+ s4 o+ f1 w* o" ?' K+ D
        }0 @$ L7 x% c4 r3 a+ q0 H
    }: \5 h' o' O8 W7 i( [4 u; g
    return 0;5 U9 B. S4 C* E- Q. ]& [
}- p2 J+ D1 o- b# O( {

! L+ M8 r# q' R2 E6 z3 y5 I$ W3 b) ?
% p4 J4 C- I1 Y4 v然后编译执行就可以了(*^_^*)% S" r3 m, R  e  r# `
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! b7 j8 @7 c- l/ a  [; _5 u      建议使用VC7或VC更高版本,或者使用GNU C++编译

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