返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,. I% m$ T, a# I* m( t. }+ Y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" b) S: [0 a: T3 q0 u; y/ [+ M# l
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 \1 Z) b2 a/ v  [) Q
参数解释:) N7 x5 a, ?) X+ T! J$ S- ?8 z; C
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( _. {7 p2 N3 T! b( l) s2 nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- a$ f* C/ R$ \' }1 q  Y
返回值:
4 i' D: \4 p3 o2 |返回非0表示计算成功,0表示计算失败有错误0 k, m$ O6 I# K8 E4 A( V! B1 |

: T. |* o) T1 N# o3 Z& M6 ] ( k* _9 B& K! A: s' s
, d3 G8 v2 Q5 T4 R/ e: L
程序代码: % ^# }/ W% V3 D

8 g8 r/ ~+ @* k$ y$ ynamespace fy_Exp{: h8 M. g. R/ F% g
namespace {template <class _T>
2 h$ ]# {# C3 Cinline _T GetExpValue(_T t[], char& csym){" p) E2 Y" d+ ?( Q' [
    char c=csym; csym=0;9 M3 S$ |. W& t! @3 o
    switch(c){0 U. ]+ h( T* ~3 ?7 W
    case '+':return t[0] += t[1];! H0 u2 ?/ J" E0 v# `/ O4 L
    case '-':return t[0] -= t[1];
, F; N7 |3 {% c& y; W' P: x    case '*':return t[0] *= t[1];( z' {0 l8 f7 Q& A
    default: return t[0] /= t[1];//case '/':8 \( x$ A3 I9 {3 l: [
    }( h' F2 n* [7 E& G9 A
}}
  J: p, g& C$ Otemplate <class _T, class _Tstream>
% k5 A7 v0 v- A, E4 W; c/* _Tstream: inputstream, _T: get return value
& v4 s6 O' B5 N/ t7 c* Return nonzero if get value successfully */% v7 `7 A- Q+ u: I" I3 J7 @1 ~* ~' @
int GetExpValue(_Tstream& istrin, _T& nReturn){
9 ]; N$ x: w1 ]; K& @8 i7 D    _T t[3] = {0}; //雨中飞燕之作
6 Z- P: W5 S7 s    char csym[3] = "++";
5 k3 C1 c# B" v7 I    int nLevel = 1, nERR = 0;
; |# p& _6 r% _0 K7 |2 D    if(!(istrin>>t[1]))istrin.clear();( x# U' @2 C+ E) h9 ?) `3 e
    for(;;){. v% k% G( _5 t/ U+ ]- i
        if(istrin>>csym[2]){, Z' `  T6 a6 k3 m! n
            switch(csym[2]){
! }; K: J  x' Q& f' e; W; ?            case '(':
8 d0 a" _4 C6 }4 b# ?                if(!csym[1]){nLevel=0x100; nERR=1;}else0 v& s- R) `7 b
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) V0 D/ ?9 G: n# i" h( |/ C. ^% F                else{nLevel=0x100; nERR=1;}
9 z/ t) [" D' `2 S                break;" T$ g1 \- ~7 S( B6 B! _, Q% z
            case ')':
! ?7 d! O4 L" g8 ]' ^9 z# l( m                {nLevel = 0x100;}break;
2 r6 x+ n/ t6 t$ F$ X            case '+':case '-':case '*':case '/':
7 C3 s9 `. y8 k8 z                {csym[nLevel++] = csym[2];}break;8 s3 Q3 M& H5 Z. K* t- t# E
            case ' ':case '\r':case '\n':case '\t':continue;
& G. ]+ Q& j* R( w+ u3 S            default:
+ T! Q. {/ M$ c8 f0 d! W% t; w0 r3 v                {nLevel=0x100; nERR=1;}4 `, [) g: x4 }$ c  U. [/ R
            }
. z/ O: ~2 r6 d            if(nLevel==0x100)break;/ s* E1 K" Z$ u, {2 X
            if(nLevel&0x10 || istrin>>t[2]){
9 b( }8 Q3 {$ ]3 R                nLevel &= 0xF;0 H9 d& J# e' }
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
$ e# r  Q' w3 S5 q8 O, ~0 w                if(csym[1]=='*'||csym[1]=='/'){5 d4 F" a- v  w+ Z4 J; M1 m
                    GetExpValue(t+1, csym[1]);/ I* T: x/ I$ j6 K2 A' F0 V, [5 k
                }: E8 H  U; ?% o: y) h4 @; Z$ V
                else{! p) q& E  c( F1 ~0 x
                    GetExpValue(t, csym[0]);- u! s  b2 P& f8 y- F2 U$ [. R
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# R+ t$ ^9 }8 \/ t( A0 V$ \/ h% w* j                }
8 t- a" J! T/ L7 ?                nLevel = 1;
, |0 ?* g% ^0 Q* v) ^7 h6 r7 j            }/ }2 R( K( N$ p- U+ ]
            else istrin.clear();
1 g( _, P" }* u1 a        }' g- x! W: M( ~' s
        else{nERR = -1; break;}" T0 d8 k( r) a5 |  a
    }
' y4 @! i$ O: C1 {9 Q6 C    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: h' Q- p6 U0 j8 f  q    else nReturn=GetExpValue(t, csym[0]);
! }* l8 e! b, x5 {    return nERR==-1?1:0;3 {) N: l- D3 Y. n
}}/ y6 y7 s+ X" N- k6 m
( j; i2 H6 z7 k" n6 }" X
: `8 `/ y4 @5 a/ w3 c

. H8 ]$ a# w9 E& {+ |1 }7 ?$ |# k; M函数模板使用示例:
" q8 o! ~* G: z6 @& \# d: T9 s在以上那段代码的后面加上以下代码:
% E3 A, n( V& ?% w* I0 M5 G; a7 S
, g! V$ ^% W/ m% A! h! A! S6 `: g / U/ z) |! V: ~1 p! V7 ~$ g
$ w2 M& J7 x$ q, l  R+ ?
程序代码: : J& `7 }4 R5 T9 i5 i
  N' b+ Y2 {& o5 Q$ `4 Z
#include<strstream>
& f) h' O  Y) o% I. |#include<iostream>% s9 D( H4 g4 w' y4 ^6 W5 H
#include<string>8 V/ C3 y& T7 e
using namespace std;
+ m& Z2 @8 m: Yint main(void): N% j1 x' d! K
{
% Z/ o! o5 h. T, ~& X3 i    string s1;
0 ^- D( v; x; s' ^( P    while(cin>>s1)
7 d% U+ u4 g( r8 S  |    {
( `% m6 i4 B% e2 b" b8 S- `) n9 f' S        istrstream isin(s1.data());: J# n; Y- n6 R6 |
        double d;+ ~9 a2 y& E0 `# H% A* [
        if(fy_Exp::GetExpValue(isin, d))8 [3 M) ?5 t7 w: X
        {2 U7 E+ H- H: C3 U" q6 i/ `
            cout<<d<<endl;+ F4 U9 Z9 I8 r: c
        }  \  t+ A1 ^# \; G
        else& h" P: m, Z+ J4 x' j  x7 e
        {
1 O2 d* K9 x9 i            cout<<"ERROR"<<endl;
0 N5 X4 x, W$ Z5 ]& M# N        }  v  i! q8 u( h) X. B' d" h  t$ Y7 T
    }* t( I& g8 ?- U# S" X& X1 ~6 l
    return 0;
" J- d6 G% r. s9 u8 O8 @}0 w+ u: p3 i$ A. v+ h4 ?
7 {+ j8 C  O; K: H$ B

4 N8 S' N, b' ~+ e/ _, ^然后编译执行就可以了(*^_^*)
/ \; @# s8 z/ S3 u  C6 ?其它:TC++上一定编译错误,不保证在VC6上也能通过编译# e! |: S' U/ N+ e% U
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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