返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,2 V% q) ~7 T: |0 K# z  e1 k
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式. ?( B7 }+ Q4 M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& ^, t- [- x" ]4 Y参数解释:
2 B0 G. _+ e/ Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
, F* K# P+ z6 V2 L; x: j# ?nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 T/ V" I8 }. G3 f
返回值:( n" O0 V9 f; R9 _. v# p
返回非0表示计算成功,0表示计算失败有错误1 E6 [6 `- e1 F
( o2 E8 C2 u2 n# u) Q1 g/ R" ?# r- N$ Z
" u3 q# v5 l, Z) r4 L! y  ]

* u* j1 g: F+ W% B3 ~% k程序代码:
' t* }3 O( O4 G5 h; p7 T- i! ?  S; K3 b1 v2 a5 U: d* w+ [( q
namespace fy_Exp{
9 _5 a% m5 |2 o" S5 cnamespace {template <class _T>* O' d* ^- M" I) P6 T% R1 w; d
inline _T GetExpValue(_T t[], char& csym){
) c; r9 p. H( Y% M+ ^    char c=csym; csym=0;
1 F8 n, H+ x5 X2 I- ~# ]- w  Q, N9 @    switch(c){
; p" w; `1 g( U# F$ a    case '+':return t[0] += t[1];
$ ]6 q1 Q# g* `+ M4 D* b    case '-':return t[0] -= t[1];
& r4 z6 [2 f* t    case '*':return t[0] *= t[1];
. g! N/ Z  ~' K3 t    default: return t[0] /= t[1];//case '/':" _2 H' j+ g( H5 e- l" x
    }
' b% O$ o0 W/ I7 o3 o* f; C) A}}; P* G2 i- p1 k0 k+ c# m
template <class _T, class _Tstream>3 F: O. K* F, e/ \" D1 N
/* _Tstream: inputstream, _T: get return value! {  W( C8 g3 I. k" u
* Return nonzero if get value successfully */
5 W: r( l1 P8 Y* u6 o- fint GetExpValue(_Tstream& istrin, _T& nReturn){
+ G- _" M; q, d" Q, G2 D    _T t[3] = {0}; //雨中飞燕之作7 E& ?0 W" H4 U% ~
    char csym[3] = "++";; a* p7 X, x) S0 `5 }; Q
    int nLevel = 1, nERR = 0;
6 v2 n# \8 N$ u3 ]: Z    if(!(istrin>>t[1]))istrin.clear();4 O( [6 ^! O7 d
    for(;;){
" E& Q# ]9 d4 d& G+ A3 ?/ O& e& S        if(istrin>>csym[2]){! a, o# F/ _  F8 }5 j. D
            switch(csym[2]){8 b  k7 j4 t/ P2 K- ]7 ^6 W
            case '(':
- W: O: F" T2 D- V  V6 S                if(!csym[1]){nLevel=0x100; nERR=1;}else+ p/ H: d8 c, R2 ?9 Q- `% l8 ?
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
4 Y5 s4 f# @+ l+ ~8 i                else{nLevel=0x100; nERR=1;}
# Q6 L! ]. C. s5 T8 G  j) B3 `                break;
, ~8 x* @+ d7 c& q. G* e            case ')':1 Z* ?2 m0 S: S
                {nLevel = 0x100;}break;, C1 s5 G, X0 k9 M; w4 I8 b/ ?
            case '+':case '-':case '*':case '/':" D4 `1 L' |; O/ E* t
                {csym[nLevel++] = csym[2];}break;; F4 J0 n) t+ L3 Z7 h7 U
            case ' ':case '\r':case '\n':case '\t':continue;
3 V# M/ t1 j9 q; U$ P            default:8 {9 n% \9 M$ @: ~1 D2 p
                {nLevel=0x100; nERR=1;}: t8 N2 a4 H( E6 [7 T
            }
2 [* m) y" ?9 p! Q: ]# D            if(nLevel==0x100)break;* i3 D8 [. D& d4 O* I1 C9 j; J- v! u5 i
            if(nLevel&0x10 || istrin>>t[2]){
6 t8 L, z" |" V9 {! [' F6 H                nLevel &= 0xF;3 ^3 r' ^# S4 V) s8 D7 B8 T
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}2 N# V- X7 r) B, p, o$ [
                if(csym[1]=='*'||csym[1]=='/'){( m  n) H7 H( O; u: ]
                    GetExpValue(t+1, csym[1]);
- d- y6 u* g1 X( s0 r                }
3 {' H1 g) `1 C& f+ G                else{6 R6 b7 C1 e# c9 h4 E( D+ \7 f$ b
                    GetExpValue(t, csym[0]);
; [# H- {" W( z2 ~3 O/ G                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ C: Y% \6 o4 x4 \( f                }
$ @9 p% `& R6 k( w5 a                nLevel = 1;2 X" @( A% E; l3 L
            }
" x: _8 L1 g+ o& |# C& @            else istrin.clear();: p  X, E3 i1 M
        }7 H2 L* ~# |( O: t3 \
        else{nERR = -1; break;}; p1 i1 a7 V% B9 t* n% n, o+ H
    }
! Z' u. s  L( h8 r' ^0 n, f    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 W# O* Y9 Q( ]# g. ~0 q1 a" e
    else nReturn=GetExpValue(t, csym[0]);8 \( H2 W4 W0 J  H* }
    return nERR==-1?1:0;+ n- s* ]* ~; Q$ Y
}}: B/ s1 @5 q( o* h
& c6 i+ ~4 t6 N$ |

/ K1 M5 w9 Y8 u4 h# R2 K' ~/ z; I
" c! R7 j2 |% m% m: X) ]# V函数模板使用示例:" B& Q2 X4 H/ |7 |
在以上那段代码的后面加上以下代码:$ w3 _6 [3 d# S
: z/ d) i- T" U, O
% `* a$ f) ^- r  `

: w) }: E1 ^1 C5 Z程序代码:
0 {; }7 M$ P0 l
: I$ K* F  j" i#include<strstream>3 }- `  I& c' m, i  R! `
#include<iostream>! q4 q0 f! T/ b/ @! N, h9 ~# g9 d. J
#include<string>: X0 f! j5 m& x* d
using namespace std;7 h# U1 {- w( j8 n0 I6 N
int main(void)
0 w/ A' h! l/ w: l, K" o{2 |/ O1 o7 H; R) J
    string s1;
% M* ~8 V, |* q; r/ \- }, h+ H    while(cin>>s1); \5 A: P  P  Z+ ]
    {2 x7 l3 W, H2 u, H# d1 s
        istrstream isin(s1.data());' s: h. {7 k. q& o  {) C4 [
        double d;0 p" |( r& o' P6 n
        if(fy_Exp::GetExpValue(isin, d))
1 w- r$ b: t2 j        {2 j' l7 u+ [" d
            cout<<d<<endl;
8 k' e3 ?7 k. D# B2 h) }        }) n9 p) G5 f1 m! W
        else" t2 j+ L& Z. I# A& [
        {+ x/ Z& v2 ?5 E( D
            cout<<"ERROR"<<endl;7 T' v9 x9 @4 {5 _6 v3 ~
        }
3 N5 g6 ?) Z1 x' a    }
7 l  f' |+ g8 f' W( m    return 0;
) _: t( Y6 N" a( X9 q# M/ v}
5 r( i4 g$ r# A- t9 o- w* q! _; s" s2 U$ ?& h$ x' L$ j
2 a% m3 d" u$ [. V
然后编译执行就可以了(*^_^*)
/ E  C& M' ?% k  r0 Z! Y其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! ]$ h# ~* F, t2 g8 W      建议使用VC7或VC更高版本,或者使用GNU C++编译

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