返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
' D; |, F5 V, Z6 ^一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 C6 x# f1 m( J2 R" d只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! a/ E2 q+ i9 W参数解释:
3 F* {. u$ z6 o' S5 sistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! d$ @4 b* A/ q" T$ i7 q/ tnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定4 B8 I7 V& w5 v4 M" s
返回值:
4 K, x- ~' Q* M4 r; E* h返回非0表示计算成功,0表示计算失败有错误
3 I+ E. l4 I- d5 n/ X; G' R5 q1 ?9 _2 K1 |4 W3 R9 [

* F. v; F" M6 H2 F0 E
5 T  L" A5 `8 f! m* |程序代码: 8 h  O& D# \' X( t  o
( A; s, @; Y" j, f, v
namespace fy_Exp{) w: K2 s# \+ o6 j( N) w1 M/ b2 M
namespace {template <class _T>
! T9 z' T# L. H) F! Finline _T GetExpValue(_T t[], char& csym){& J* H6 R! v6 z, g+ U; ?
    char c=csym; csym=0;
: f3 K: Z) s/ ~0 U, k; O    switch(c){  o6 o" q' _; Z! P  P
    case '+':return t[0] += t[1];, {3 s2 c3 |/ c) z
    case '-':return t[0] -= t[1];
' N  L4 L5 U9 ~: e; i    case '*':return t[0] *= t[1];
8 {( Q& R* h1 L+ ]6 G5 C    default: return t[0] /= t[1];//case '/':2 E( s0 L3 ]8 K) s# n- U8 L+ M
    }# Z" q+ N( W. p# R1 a
}}# k( Q1 @8 ]" {( J; N9 ?2 D4 `
template <class _T, class _Tstream>" U) ]2 A& U$ x0 F8 F! d
/* _Tstream: inputstream, _T: get return value$ A. x8 _( o) F6 B- A* b
* Return nonzero if get value successfully */
: ?3 |) R2 \1 g! j8 w. B* S" C( r! _int GetExpValue(_Tstream& istrin, _T& nReturn){
7 D$ G: v# c6 {0 U5 Q    _T t[3] = {0}; //雨中飞燕之作- B0 z* X( ^; u2 T; w! R/ q, N( A
    char csym[3] = "++";
1 f- U7 J3 R, ~9 a    int nLevel = 1, nERR = 0;
9 ~. K0 _' M2 O0 B    if(!(istrin>>t[1]))istrin.clear();& V& G# F& w- b
    for(;;){
- i, g0 N0 F' ?" _: I* o$ m        if(istrin>>csym[2]){) q2 K5 ~) i! e2 F1 \& p- m
            switch(csym[2]){3 N1 `3 N7 H, n: |
            case '(':
* N: G! q% {, f                if(!csym[1]){nLevel=0x100; nERR=1;}else
; ~& X1 s( s/ E) u0 Y( r                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 b0 d: f; x% P2 L0 |* m                else{nLevel=0x100; nERR=1;}
6 K5 f) v: N* F: z6 e9 A# K- V3 {                break;( T' D# v! F6 p) }' w- U/ ~# Z
            case ')':
/ j9 ^2 v& v* q8 A                {nLevel = 0x100;}break;# ~6 b- h' J' h6 p, y/ \9 ^" h
            case '+':case '-':case '*':case '/':
- `/ U2 u9 ]( H0 d; s7 p& A                {csym[nLevel++] = csym[2];}break;$ l' ~9 n7 N- s6 l& q7 F
            case ' ':case '\r':case '\n':case '\t':continue;
  h" ~. }9 _" h& ?7 {2 e2 X; c            default:
: N8 o& I# w; Y3 P& p                {nLevel=0x100; nERR=1;}$ ^5 r. t5 b! l
            }
, q/ Y7 s, ?0 ~* F# `            if(nLevel==0x100)break;
% K0 p2 [4 X8 w% n8 ~- Y5 L            if(nLevel&0x10 || istrin>>t[2]){
3 D: U! t( v7 f) R% e: H0 W. _                nLevel &= 0xF;
, g% y- i# I5 l& ~                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}5 F. K. M5 Q+ t' D
                if(csym[1]=='*'||csym[1]=='/'){
. i: ^* Q4 b/ ~) z6 t                    GetExpValue(t+1, csym[1]);
. B4 x' J1 R0 J+ Y" d$ }                }; I, t$ v! V) W* O* g
                else{5 [9 g9 E$ X5 z/ Y! j; T
                    GetExpValue(t, csym[0]);
+ B. T) n% l/ D3 q5 s0 X" T                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
9 X4 j6 x" V. _* b# @- D( O  \* b                }" Q8 I% N. K0 z: X8 |4 J! v
                nLevel = 1;* ^- I# W* O' q* _
            }% v  v9 J! f( c) T
            else istrin.clear();/ _( }% D* q$ C7 k
        }
9 Z* j1 U4 M- [7 N6 b        else{nERR = -1; break;}
2 i- i  a1 N; R+ Q" W    }! ]7 }7 w2 F; `8 v
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. ^* o0 R7 H& x0 w2 D    else nReturn=GetExpValue(t, csym[0]);
) d# N8 u8 t% L    return nERR==-1?1:0;6 C- l" I! t* _  C6 k: ~9 L
}}
$ E0 d+ S0 P9 v
" i$ [+ h* Y+ k% J* E) W: A( K" V6 Y

8 k; ?; h% \$ l8 t% k函数模板使用示例:, ]4 O/ n1 i4 w& v
在以上那段代码的后面加上以下代码:
" G. h1 _8 c: D2 L" Y9 i
" }6 i5 {6 h! R! s& ~
. i8 O$ _1 i* X2 S9 I1 w, K
( d6 o/ Y7 z! z5 a; y8 X程序代码:
: ]% a: _6 b; g; r$ A; I- }- d5 n" E! z3 `3 N4 x) Z9 D
#include<strstream>
9 ^- e$ c$ J7 E% A1 g#include<iostream>! x6 [  D7 t2 t* v
#include<string>
/ E. a; \# I6 D4 e; _- A; n8 lusing namespace std;. U! `+ J1 B' v6 o8 B, R
int main(void)* A/ i1 [3 C9 n+ W( w
{8 R6 }5 d2 A) A4 u
    string s1;
3 z+ @$ q5 i$ w( m    while(cin>>s1)
& j+ M2 ~+ [- v3 _5 ~0 [" L    {
9 U4 i) g- ^4 [$ o        istrstream isin(s1.data());
8 l" s& Y' o: e$ N3 |        double d;4 }% P" a+ C- u4 B
        if(fy_Exp::GetExpValue(isin, d)), z  G- H! m5 M% e% _6 ]
        {8 n! g4 @# f- J1 Q) B& F
            cout<<d<<endl;
' f8 c. e2 l) l        }: f, V0 |0 f7 A/ G( _9 k
        else
' @- B& x4 K5 q: \% T# j        {2 ?, o1 P+ G$ f' h" Z' j
            cout<<"ERROR"<<endl;
8 R6 T! r8 r+ q! ~* b/ L        }. b3 ?& D1 \0 I. r7 D- h3 m, i
    }+ x: r6 X4 Q: }
    return 0;1 c! i* ?1 p+ l; @; u
}
- i9 q3 `# N, N( l( W/ n% n2 D
: A  L( d7 s' d2 }! Q. X. V) [# c- R0 m3 U# w/ M6 x* p" W" _0 o
然后编译执行就可以了(*^_^*)2 h" F, u# S% S$ V
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& ]; N* `, Z# _. \, B/ Y6 h      建议使用VC7或VC更高版本,或者使用GNU C++编译

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