返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,$ e8 ?5 N, i+ R0 M' [
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式8 b9 \& z, ^& D
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); B; D+ d/ ~3 A, ?8 O$ y% {
参数解释:8 \" m" g8 s, T. S% l( Y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. W+ C$ H* f8 inReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 w/ S+ Y* w; N2 H5 x) N返回值:
& W' J' f5 v- ]2 G1 n: k6 u返回非0表示计算成功,0表示计算失败有错误/ a* U; E9 T. i) T( `7 ?+ U

+ Q0 ~5 \/ X- ~ : i, u2 A/ C- @! h2 x+ Z
$ r  t/ ^# g) a$ X1 V! i
程序代码: ' |  [, Y: n. B5 ~3 O
* W# k( v9 |& h
namespace fy_Exp{* V5 w2 A7 F7 |8 b3 e8 v
namespace {template <class _T>2 o; b+ [. M! r1 T, @9 j& ]. a
inline _T GetExpValue(_T t[], char& csym){4 U* S1 E6 T% s9 c
    char c=csym; csym=0;
- k3 ], P1 f' r& F% N$ h7 |6 f8 v    switch(c){: C! ]! _$ W) S
    case '+':return t[0] += t[1];, m" o1 D0 w, J- {* F2 Y! W) P
    case '-':return t[0] -= t[1];
7 O2 h( ~% `4 z    case '*':return t[0] *= t[1];
/ S* _) T* N% L3 B. X+ M    default: return t[0] /= t[1];//case '/':
& l' K# C2 Z% h& e) ?8 P6 s    }9 l; a0 a! ]1 R/ W& V$ e- s
}}
) N4 n2 T  G+ s: _& r& btemplate <class _T, class _Tstream>" ~0 L$ j3 g" T* e1 o" y. E
/* _Tstream: inputstream, _T: get return value
4 w" \' r* n5 X  K* Return nonzero if get value successfully */
, P  l3 [0 a" f; ?/ b8 Uint GetExpValue(_Tstream& istrin, _T& nReturn){
$ L2 N, x* D7 i+ q7 q  {( y6 Y    _T t[3] = {0}; //雨中飞燕之作
+ O6 R  T  d7 G/ X    char csym[3] = "++";* B8 x$ l3 F" G% @5 K
    int nLevel = 1, nERR = 0;
. F1 o" v5 b/ \  t6 {7 t    if(!(istrin>>t[1]))istrin.clear();9 V) U* `  R, M% O" _& R
    for(;;){: t* x  U3 \( a3 `3 |; b" s- D
        if(istrin>>csym[2]){7 f! c4 \% N# @' _  ]6 t
            switch(csym[2]){
- q- U# [/ d% b9 R8 r            case '(':8 c: ^8 `  d+ q# \: @7 ^
                if(!csym[1]){nLevel=0x100; nERR=1;}else
8 A7 e3 y! P) |' B- L, Q                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. v) d2 c, P( B
                else{nLevel=0x100; nERR=1;}
; ^$ s0 l+ E$ d; M; Q                break;
; }# N/ |- K$ g% c. t0 W            case ')':  p9 r( g9 X0 ]- A# v3 B
                {nLevel = 0x100;}break;+ ?( @% \8 f8 A
            case '+':case '-':case '*':case '/':
) h+ O. J0 w8 p  ~                {csym[nLevel++] = csym[2];}break;
. Q2 z7 P$ _8 R1 Y& u0 j: F            case ' ':case '\r':case '\n':case '\t':continue;5 q0 T( t/ M( W: z
            default:
9 O6 Q: P. _5 j. O+ b/ t+ x/ u( a                {nLevel=0x100; nERR=1;}
) ?. T( e) S) e& y9 N2 m( {            }
$ d# b, w- S! Y7 d- n& v            if(nLevel==0x100)break;0 \0 Z' W9 z7 m! o0 z
            if(nLevel&0x10 || istrin>>t[2]){* k6 O. C8 w" Y9 L
                nLevel &= 0xF;0 O- ]  e! h5 e3 ~( s8 b
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. X# ^# ~8 j( w8 N0 ^
                if(csym[1]=='*'||csym[1]=='/'){
3 ?1 P: {4 O& G( g* |- N* D. V+ f1 s, v                    GetExpValue(t+1, csym[1]);# K; E1 F$ |5 t0 v1 F: w4 i
                }
2 E" C' I, d  I# x. c                else{6 R7 e( t* [( Z- e
                    GetExpValue(t, csym[0]);
- q6 F" @- o5 U4 Z                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
) |6 N) e0 R' i% s, Q4 {                }
7 R  H) }# O) w5 j* D                nLevel = 1;' `" ^' ~8 z0 C+ m8 w/ B' h
            }
2 W$ q" F' I$ N/ ]0 [' @            else istrin.clear();' s- \3 V) G: }2 v3 [- w
        }7 x7 H9 \% h/ v) L% G) v
        else{nERR = -1; break;}- C* z6 w" |' J) {
    }2 q3 `: `' o7 ~0 s0 x
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 F3 Q& b# D: |- W3 h    else nReturn=GetExpValue(t, csym[0]);0 P% x3 w3 w# Q% D1 T' Z6 v
    return nERR==-1?1:0;
. L5 m' I4 |# O; @2 J}}
" j/ i4 S2 o4 P: f
  P. k0 M8 F  Y) ~- ~+ P  U* ^1 }. M% y- R6 H6 L
5 {# X! D, `; ?9 K  ^- o% A$ v
函数模板使用示例:, s9 W. ?: N# D7 C4 t
在以上那段代码的后面加上以下代码:
8 H3 R4 u% G5 ]3 T# ^2 r; r
8 V$ B! Y1 Q0 U* | & J0 n/ H5 i' n

% Q* e7 S, T+ |7 E& [& |程序代码: , v+ Y+ q& |+ T

" b. v! q1 x) M0 P/ c#include<strstream>8 Q4 T' C8 A' m0 r
#include<iostream>
; [9 y% c; A% D% c#include<string>
# H9 N0 q; ^% m0 Y- Jusing namespace std;
6 {8 x: ]7 q8 Z/ V( m7 `int main(void)' r- `0 j8 m9 k$ ^
{
% I0 a# x5 X) x    string s1;' X" M: D) f  [
    while(cin>>s1)% M% K! v" l: t( v
    {
" L6 V: `  z, e0 ?% s$ g4 Z6 `        istrstream isin(s1.data());
0 l0 l+ D' `. |" j        double d;, |" f$ j) {0 D7 j* i: s2 X
        if(fy_Exp::GetExpValue(isin, d))  F8 r5 G4 j6 L5 ^8 V, P9 ]
        {  O+ t5 q4 H& e1 T. x
            cout<<d<<endl;' ]8 I; K- }6 J6 ]0 v: i) k0 Q
        }8 R  C/ [2 s1 w4 Q( g% T9 g9 M3 m
        else
. h: O# W0 x" k: W( K4 [. f        {
+ W& n. G* v, t) A5 v0 [! P            cout<<"ERROR"<<endl;
7 I3 X+ [' v# n        }+ I1 V2 M# e, F+ M$ d
    }
; [# A/ K; p! G+ Y2 a    return 0;! b+ ~- `# ]6 e4 n1 R9 K9 ]& E
}6 ~( ]) Z. t; H( U9 v. A
" [5 c0 T* J$ B5 X
$ r' D2 S# {8 ~4 r; \- n0 o9 M, O- R
然后编译执行就可以了(*^_^*)( h$ ^6 [9 s+ B5 K5 e& U* ?0 P
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
0 z0 C. Y/ o  I5 c9 j) p+ G6 ?5 h% x      建议使用VC7或VC更高版本,或者使用GNU C++编译

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