返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,9 u( i& {: z1 `
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 j5 `+ ^$ P* c0 l/ h
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! ^" h) v  m/ ^3 L参数解释:% t( m0 S4 L/ b( t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
4 U% n% s' C3 j" BnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 j" c# [- C& h& `返回值:# ~! w' ~2 u2 [( K/ X4 k
返回非0表示计算成功,0表示计算失败有错误; i9 P& T! h, i; j, c% q+ a

5 T2 O3 O. x- ~9 x; A1 h$ L& }0 j
# B! H2 j! P; B' T. U# a/ I
% p  X* {3 ^1 n$ m* F& _程序代码: ( i0 n0 `# w: |* R3 A9 M

+ L+ B. z3 g. Q+ K( `' C+ |' F7 nnamespace fy_Exp{% f2 G- A, l% F5 C" @
namespace {template <class _T>2 S$ m1 x& g8 N1 y. `
inline _T GetExpValue(_T t[], char& csym){
$ O# X/ a1 P' `: D/ M    char c=csym; csym=0;1 f  A) a8 l0 o( q. R
    switch(c){
: [& m3 V1 p6 V: x: J7 C- w    case '+':return t[0] += t[1];
- v3 V0 t+ {: j9 ]8 O% ^. v, i$ ^    case '-':return t[0] -= t[1];: e5 f, m2 F2 e, p! Z3 z
    case '*':return t[0] *= t[1];" L# `* [- J  G# h
    default: return t[0] /= t[1];//case '/':
9 _! k0 L' K6 I, p, E) ^) d    }
3 N3 \3 O; P5 S; S}}
! F' D* Q7 h' l& ?5 K/ Gtemplate <class _T, class _Tstream>
5 M* F# C9 S: a: c/ j* B" x: ~/* _Tstream: inputstream, _T: get return value# Y! v5 G! j% X" W, l  s$ O
* Return nonzero if get value successfully */
  `% i- @7 P7 Bint GetExpValue(_Tstream& istrin, _T& nReturn){; M. A6 j2 r3 ~* m5 o
    _T t[3] = {0}; //雨中飞燕之作
7 m% y" W3 k+ ~! Y    char csym[3] = "++";
. v. f; Q, X' j2 j    int nLevel = 1, nERR = 0;
' m$ q: k% ~- S; Y  E% b    if(!(istrin>>t[1]))istrin.clear();
  @4 ^  ?8 G, A7 n0 f8 a    for(;;){
% k1 [1 t# {7 L2 O) y: x6 k        if(istrin>>csym[2]){; \& B: R! w+ y% t$ k- E& W) P" o" n
            switch(csym[2]){
0 D) j+ C2 n2 n; Z: Z            case '(':# F. Z) S( `7 ]( `% X$ Q
                if(!csym[1]){nLevel=0x100; nERR=1;}else
) V6 Q( q3 B4 j0 @                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- Z) Q) y( C7 H. T3 x
                else{nLevel=0x100; nERR=1;}" j! A# m8 I  K+ p/ ^0 Q
                break;
. C7 g) C0 Z, }& b0 {6 X4 k* ~- Z            case ')':
& ^4 a/ E# M6 X2 g& N1 P                {nLevel = 0x100;}break;' b' F+ U$ Y' Q/ c$ [) g
            case '+':case '-':case '*':case '/':
' P% [) }' @- P6 B                {csym[nLevel++] = csym[2];}break;
' x: A: u1 }- i: M! L+ g            case ' ':case '\r':case '\n':case '\t':continue;
& k' L( t8 @  ^! N7 j8 n/ b' ^& r            default:7 ]5 D+ j0 g6 U# @9 {
                {nLevel=0x100; nERR=1;}
! U* Z: {, w" [# T            }, f6 W/ J, U+ p2 u6 K* C6 [5 j
            if(nLevel==0x100)break;5 H9 L  Y8 s7 O8 ]7 j! s( r
            if(nLevel&0x10 || istrin>>t[2]){0 l5 P8 }: L" P. h/ k4 z
                nLevel &= 0xF;8 s! T7 A/ H7 \9 X( ]( C- Y* q
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# r' [+ o9 X, u4 }
                if(csym[1]=='*'||csym[1]=='/'){0 N, o0 v7 V/ S2 l9 \5 _2 B) {
                    GetExpValue(t+1, csym[1]);
! O8 ?. _- C/ V: \" w7 V                }. e. M% Q. |3 {! Y: I* k
                else{
& O$ x, s$ m. ~% p/ p9 q% @                    GetExpValue(t, csym[0]);
3 u0 Z; u. y; K! x+ D$ C) d                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 ?" N- H6 T& a9 ?8 g  {2 f
                }
( O) `+ J4 ~/ D& ?4 Z                nLevel = 1;2 i1 v: A; d. r- p- m& P6 E8 r
            }5 ?" o% q7 u: O, L' {1 Q! P
            else istrin.clear();8 S4 D/ o8 I4 r" e3 v: u8 X
        }9 T; M5 z& W# l
        else{nERR = -1; break;}
8 X0 T( v4 r5 k( x' ~# x% R/ \    }
9 ]2 X9 f' Y3 n; g2 [1 O    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( q4 t7 V; ^4 X, b
    else nReturn=GetExpValue(t, csym[0]);
* o6 g* O7 s- L  L0 s    return nERR==-1?1:0;
" W4 f6 S3 K* J. W% k) j; N$ O$ }5 L}}
& j' o' C: p  z' D/ y9 ~( }; L1 w! F9 X1 x; _9 g- A9 k

" R+ ^# E+ F# P& W9 ?# L5 ^1 e
; \0 ~: E" r: u函数模板使用示例:% I( \% v3 ?. x$ V3 x% l# y
在以上那段代码的后面加上以下代码:
" z* \# Z. K# C% _3 u6 i5 x/ i( K0 V4 {0 F6 S# g
9 \0 ?( Q. u3 Z% i! @) N4 M- C
5 `7 n2 {9 z! A( u
程序代码: 1 Y' a: @' L5 Y4 {" [; q% D

& g; @" Q5 j" s. U: ?2 w5 c#include<strstream>
. p* V- b; N% X% l3 j2 U#include<iostream>
, v0 Z  c* ~0 [2 B6 l#include<string>- P' u! F' @5 Y0 y
using namespace std;
! U1 _2 d( W. g, M6 @' ^int main(void)! W6 W  G' ~7 l% j# Z9 G
{- T( F+ n# E: |% ^
    string s1;% ]+ \! ^8 _/ l) M) e+ |
    while(cin>>s1): r2 W( m) q! v: Y7 O$ X" x7 q
    {$ |) [" q. W& H& |" u1 D+ M) I! ?
        istrstream isin(s1.data());
4 h! p6 ^8 @; T+ d* ~3 @        double d;' B3 w+ Y6 n/ s/ W
        if(fy_Exp::GetExpValue(isin, d))
8 t3 M+ b! A# f8 O        {  h* X: w3 A& x
            cout<<d<<endl;
" b3 P& f3 ~# k& s        }8 |) S) d0 e+ {
        else& H  [# t( v1 g9 v  q; |* t
        {
4 d/ _8 n  b' v3 K: l; H* z/ X; I            cout<<"ERROR"<<endl;
% ]  i- {8 H1 s        }
# C: w9 ?: \. y% G, c5 c    }
- N$ y4 k/ N2 H& J0 Q' ?$ v    return 0;
5 D' E3 V2 I& S( E5 I' x5 Z1 G$ Y0 B}1 ?3 [7 b8 I+ y( L
) I& j9 L1 H( E- [6 n
$ D8 @7 z% v* P
然后编译执行就可以了(*^_^*)7 R! i) |% [" h8 K+ r6 N2 i
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: E4 G5 t4 x1 G5 z9 J      建议使用VC7或VC更高版本,或者使用GNU C++编译

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