返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,8 |- \0 R( ~: p- D* C, M
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ ~# s: x6 k! i/ d6 K/ C
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
6 q0 I) }6 O7 N6 i! R! d6 P参数解释:
; I; C, H9 O3 \  Bistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
  d  q& G) s  W) k* xnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定9 H% R4 C: A" M
返回值:
. |1 k/ s. V8 p返回非0表示计算成功,0表示计算失败有错误! j9 w/ A4 B* a8 U' U% ?7 M

+ S" x" N- J- E* ^: ]5 c
9 I3 {# U9 q, N0 H3 }" }  m0 G3 w! N. x6 E$ Q' F; `
程序代码: , O3 A6 c7 r8 o  ?5 E
! `5 Y; _; |. \. p6 m
namespace fy_Exp{
$ e5 w! z( q; n" [1 Anamespace {template <class _T>
: H! E/ D* e$ T. n4 m  Z9 x3 iinline _T GetExpValue(_T t[], char& csym){" T8 ~3 e  T7 q
    char c=csym; csym=0;
) ~1 `" h7 K/ v& v* F" u( b9 P    switch(c){! A7 W; {1 _5 J' \* A
    case '+':return t[0] += t[1];
' l# p9 [. \# E+ W! J    case '-':return t[0] -= t[1];
$ r/ Q$ \5 v5 M    case '*':return t[0] *= t[1];3 e' f( ^& j* _
    default: return t[0] /= t[1];//case '/':2 {6 e; M- O7 ?% h! s
    }! u6 E& C' r- W2 ^  ?
}}+ T% D+ p/ j& Y+ ?: f: T) a5 x
template <class _T, class _Tstream>9 l# z! s  d& x
/* _Tstream: inputstream, _T: get return value+ j% q1 |& U, x- v0 z0 F& F& ^
* Return nonzero if get value successfully */3 r' ]' S+ t4 {2 D/ e8 _. T. L
int GetExpValue(_Tstream& istrin, _T& nReturn){
2 q- C$ F% A, F1 S) c2 D    _T t[3] = {0}; //雨中飞燕之作
3 a% F& E3 H8 T+ `; ^! B: |    char csym[3] = "++";
% v4 {$ t9 l7 J. u3 t* r  ?    int nLevel = 1, nERR = 0;
$ e) @1 H4 W% S$ M    if(!(istrin>>t[1]))istrin.clear();
) _  t6 Z! I2 ~' D+ W    for(;;){
  g. c) J7 ^) k1 }, X. G        if(istrin>>csym[2]){
  g7 w1 q' \3 |0 n: i1 ]8 q+ A            switch(csym[2]){1 A& x5 `( z$ u+ w4 m- }4 v
            case '(':% G" Y( s" _8 d6 t+ ^: [
                if(!csym[1]){nLevel=0x100; nERR=1;}else
1 z- `4 X& |0 m( H                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 M% @; b- a& @# D1 q
                else{nLevel=0x100; nERR=1;}
1 ~2 i) ^( m: D2 z                break;
7 c6 r* j, X( R" i2 ^            case ')':
* M( ^/ d. {. f- y; I: N/ p* c                {nLevel = 0x100;}break;
' _* s' N. [6 ?0 I' q% w            case '+':case '-':case '*':case '/':5 r/ i- C1 N7 Q% q; \, s1 l# g. Q
                {csym[nLevel++] = csym[2];}break;
7 d2 R; M% n3 S8 \8 s" {6 ^% ^0 Q6 _            case ' ':case '\r':case '\n':case '\t':continue;
% R( M/ [; L, t' t9 i: O8 W$ M            default:7 C) w( K* o, t( ?
                {nLevel=0x100; nERR=1;}2 q2 y, ~: l$ E! C' T$ i' h
            }
  c1 Z: k# n. e1 i% \& M            if(nLevel==0x100)break;& T1 M: E9 }3 ?0 d8 D" _4 T1 Y
            if(nLevel&0x10 || istrin>>t[2]){
# ~1 Y+ P" _" [8 B* [+ ~, _                nLevel &= 0xF;5 B% L& [: N* C$ |( I8 D* e
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
* l; h( d: H. X) J% `1 N$ W* j4 X                if(csym[1]=='*'||csym[1]=='/'){
- V3 p& v8 k  D0 J- f                    GetExpValue(t+1, csym[1]);8 {9 N' g! i" H
                }
- E7 Z* ]9 Z4 t, q% S! v                else{: `4 c: n+ _8 x( p; f* }9 q* x& g
                    GetExpValue(t, csym[0]);5 ]9 ]4 R3 a. m( r
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;* I. H6 `$ v' {, U0 l9 U! W
                }5 e* g5 ?7 z# w! P8 u% {+ F! i% V
                nLevel = 1;# J1 q0 L5 P9 B8 r7 X. q: y
            }
, j) J! g4 v- C" G4 \            else istrin.clear();
+ Q* y$ f, B% I        }
, J- X, i* v( |6 f( k        else{nERR = -1; break;}/ y* {8 ]9 ~! ?* \* v# C
    }/ Z) v& l2 ~5 ~% Z0 E# |
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 \* v: N4 S1 ?( D
    else nReturn=GetExpValue(t, csym[0]);
8 n! ]4 S5 f& L8 S! U7 i$ T    return nERR==-1?1:0;! q; I( B/ I8 e, a) g6 N9 f
}}
) M/ S# M. F# g$ N( H$ W& u7 z& [2 J: q+ B; V

/ Z: z7 Q/ F- K9 Q
7 p9 A, t$ M2 A5 A. y函数模板使用示例:
+ B: A1 A* w/ d$ Q1 f7 E在以上那段代码的后面加上以下代码:2 ]4 v4 F& V3 m& D7 W% [% n6 {6 P
* D* a. t$ X- C5 T2 J$ F

8 M2 C  z2 w. b  o1 A* A" o9 Y- V, L% h& y
程序代码:
. |4 |: X  ^" C/ J* j& P. R" z' s; W2 b6 p0 E- A* _7 x
#include<strstream>
4 W3 E; A+ U/ A8 E% d#include<iostream>
/ S. h& {* E6 M2 @0 ~& u#include<string>
0 A' {! B5 ~5 T9 w7 x$ {( W6 b0 yusing namespace std;* h6 f5 V1 H5 F; O8 p
int main(void)
3 N8 h+ ]% i$ R6 }9 R{
# d6 I$ U4 h( L; D; r1 z    string s1;
, M% E6 _+ F7 ~    while(cin>>s1)
& t. f  U! T  R1 Q) q3 l    {
3 P* @4 i/ d' K6 Z( B! [        istrstream isin(s1.data());
0 D9 h6 q7 m& V4 Z$ r0 T, B$ O        double d;6 y0 p' h5 n, J' G  U
        if(fy_Exp::GetExpValue(isin, d))
8 W" L/ x. m: F: t        {, R. B" t& Q1 O" V( `  k
            cout<<d<<endl;
4 E; i- I- q+ g5 j3 q1 A& p        }
7 E5 Q( [+ ]+ X; D        else3 i# c8 x8 O+ ]- p5 n
        {" A9 K0 M1 R5 X1 r6 m- Z
            cout<<"ERROR"<<endl;
7 r1 A8 T4 k7 \4 v3 ?        }* ?; O9 k4 B! U- O
    }6 R( Z" c% b; L6 s8 B) x
    return 0;
& o4 U5 r6 N# j0 o8 N- v}
; @) A+ \2 H$ k6 E) S8 t6 E" C. \0 |$ B; ^" N: J2 I9 r

( @1 k/ W5 L9 k2 e; F然后编译执行就可以了(*^_^*)
+ g& R6 b! g* c4 G其它:TC++上一定编译错误,不保证在VC6上也能通过编译! g0 P6 d9 H, s; S& {" V
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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