返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,3 U+ ?$ I) K) ^6 Q  O
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 H. ^2 @/ D+ Y9 p9 J" h) |只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)  J" r  X4 F$ K! K( \
参数解释:$ z% G# x8 p+ O9 B+ z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( `; P6 T& |4 V" N  z% `! fnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定/ P4 E3 c+ n5 y% B
返回值:7 e! A; [2 D7 N7 ?( C
返回非0表示计算成功,0表示计算失败有错误; \% E5 Q' w' E9 E+ s% `2 p, \* I$ Y

# k/ a# z5 o& P7 ^+ ^+ O8 }0 Y/ v ( n* d6 m9 B, M* h8 e! ~

9 E- \6 K" r" K0 |程序代码:
9 L$ E0 K% w+ x! L- _: i4 O3 ^" ]! |% }" Z7 e3 H3 v
namespace fy_Exp{
1 a2 F. ^3 c' N( Znamespace {template <class _T>
2 K! J: ^" g2 o+ W2 z' o6 Jinline _T GetExpValue(_T t[], char& csym){
4 c! E7 X& ?, b+ m  m    char c=csym; csym=0;
9 ~8 \! l4 v) A- E0 @. u7 L    switch(c){7 I  f  b6 ^1 Z7 v( s# c  I" |* t7 V
    case '+':return t[0] += t[1];
1 @, K7 ]* j" O- W- J    case '-':return t[0] -= t[1];
3 F2 A3 Q2 _8 x: e! `8 |    case '*':return t[0] *= t[1];
7 d' m& }! o* C( h/ [6 A/ w* |    default: return t[0] /= t[1];//case '/':
) k: p/ h" k4 U    }
% Y$ n- Z, k' l4 I+ Y}}
% O: D& m, L5 @5 E& {0 T) Wtemplate <class _T, class _Tstream>; a. N) ?8 Z# ~" |2 Z$ [0 h. [
/* _Tstream: inputstream, _T: get return value
' J. g' l- P9 J: t* Return nonzero if get value successfully */
! t' W9 M: Q' Q* q! cint GetExpValue(_Tstream& istrin, _T& nReturn){
. ^9 Q5 ]4 w& {) o2 p. E) |    _T t[3] = {0}; //雨中飞燕之作9 C5 f6 C" F! c% Z3 k5 H
    char csym[3] = "++";
! y5 ~5 i0 E+ u4 G% t    int nLevel = 1, nERR = 0;2 S1 y0 d( B* G3 q+ a
    if(!(istrin>>t[1]))istrin.clear();
' S: ^( s# D% x) p) n    for(;;){
1 Z* a& X. J4 Y        if(istrin>>csym[2]){8 D# W( u" f2 E/ |; R: Y6 |1 u
            switch(csym[2]){
3 R; a( U- e8 u; s            case '(':# E. j6 f# F2 g( a1 p2 B& |
                if(!csym[1]){nLevel=0x100; nERR=1;}else/ o  B/ {* b: C1 [" P7 N& ?" I' c
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- p( N! Z/ G) T                else{nLevel=0x100; nERR=1;}
) W* j2 L0 r( O0 C" Y                break;) X; f' d5 P, f: w6 Z5 z+ T
            case ')':
9 a( u1 C) z! m' {# d3 O, Y                {nLevel = 0x100;}break;" `$ ?' @4 h2 C: f. F
            case '+':case '-':case '*':case '/':
6 E# E# u, f8 D- e1 X* c                {csym[nLevel++] = csym[2];}break;
* {5 ]4 z# A; T+ ^. M) F, d            case ' ':case '\r':case '\n':case '\t':continue;
; X0 n8 a  J: c$ k) @9 J# ^$ J# k            default:
2 w/ |& o* `2 `/ E  n" K" f                {nLevel=0x100; nERR=1;}5 ]7 M; W4 K: U* l+ o, h  z
            }
: G6 \6 _* Q" u- I2 i! O$ F: K            if(nLevel==0x100)break;
8 K# _: G& w+ |9 j8 j) S- M; l8 s            if(nLevel&0x10 || istrin>>t[2]){
# j7 A3 p' j2 v$ [                nLevel &= 0xF;) N" y- I7 d6 A6 y5 k4 G
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ f& P8 H6 E. O/ N" ^( h
                if(csym[1]=='*'||csym[1]=='/'){# P( `- t5 H  w6 R$ l6 V) H8 u
                    GetExpValue(t+1, csym[1]);. V" o' J2 k, y' I2 M
                }& d" e; N8 W4 u2 O2 v
                else{
, t+ d5 \: q# N/ f& G, m3 x                    GetExpValue(t, csym[0]);
" |! V- \1 a" R% B( J) g7 g* L                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# J5 p& b: T- e+ M8 J( m                }
3 X. M4 R4 \6 |. g# r, u% y                nLevel = 1;( K  D0 s* Q0 T7 o
            }
5 e* m) h/ \- u& ^# S) K8 ]& l            else istrin.clear();6 w2 _3 `  o2 X. M
        }7 ~( b0 f9 C! ]! b/ J- m; e& c
        else{nERR = -1; break;}
  K) n; _2 M8 q; R    }
; N5 `1 @4 y. Y! W/ L    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);* [" M* i  A) y, v
    else nReturn=GetExpValue(t, csym[0]);0 s* Z8 j8 f1 E# W5 l
    return nERR==-1?1:0;% y$ b% Q& v. p* l" [6 S' ?: J
}}
) a1 ^, w9 e$ X8 V2 P7 F( g+ t
! }# W2 U6 r; i& H/ m$ X: j7 f7 H  ?7 ~
" m+ d( p9 F$ |" ]4 d. ]
函数模板使用示例:
3 o) |4 Y' Q; c  [7 V0 D在以上那段代码的后面加上以下代码:: N% |7 u- [* w/ m  S, K

. ]% _+ y& I# p6 |% O0 z
! ~' p8 C" w, Z, w% v- C' @/ f* L$ o
程序代码: - _- t, {; T- Y/ y6 R' c2 f

0 l) |& e! ]" c& ?9 \#include<strstream>
& @) w! [2 c/ A! F0 U3 V& _#include<iostream>
& I9 X$ v+ O, r+ W$ ~#include<string>" `! d' I8 |9 o/ z) r4 R. l
using namespace std;5 T; D, t* s" N& G3 _# c% f# J5 V
int main(void)" t8 q  T, I/ m1 O! H# z
{4 b$ R1 E1 L4 Z0 j3 ?; `' Z/ J% ~
    string s1;
- T6 O  S5 W5 D3 P' k2 p    while(cin>>s1)8 \- t/ e. A, e2 a
    {
. T& F. t; ^7 W5 `        istrstream isin(s1.data());0 K  Z" G- T) O
        double d;5 U9 I1 u3 {; z- M# F  n
        if(fy_Exp::GetExpValue(isin, d))# k# Q: J& a5 q1 X
        {
, E" a( z9 N6 b- o            cout<<d<<endl;
7 e/ _2 N+ U+ r$ f: z7 j        }
( a. N/ b. S* Z' }, j        else
3 a9 B+ i( g6 F& F        {
4 n3 k. K0 U( \9 u6 K! q            cout<<"ERROR"<<endl;( N6 _. e( D7 ?' l6 v
        }; m# R4 g/ \+ h# k: T
    }3 F, F8 b% Q- Y' w
    return 0;
& V" Z: o- V3 N1 \8 d/ P  n- j/ V}+ b9 Z  \* \/ ]+ C/ x/ N) e: g

3 V0 G8 m6 r# P3 q1 u0 f% j( x# v6 C8 o( @; U  E
然后编译执行就可以了(*^_^*): J9 x; |# U. P3 }' F, W' _# u1 x/ R
其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 g6 d0 K* h/ |  B
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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