返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
% w' U1 l" p$ W3 ~: T5 C9 V3 e一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' X& Q: F, f( B: A+ o, v0 x* n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 v3 n& ]/ v( G& _4 f  ~! Q
参数解释:$ j7 B( F6 l  g6 T( w- G# `
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
5 n7 q' r$ x& R* CnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* A/ `) q1 q" q  F  G4 u7 i返回值:. L5 F0 M. j9 z) W
返回非0表示计算成功,0表示计算失败有错误+ q4 P3 a! k- v3 Y0 k8 \
; O& `# ]  x. X# L- Z" r5 @

& x) ?' ?  C# c' \& i2 I  v
: v0 X1 k6 H1 m0 t& }7 U( @* c; m程序代码: / U; w3 j# T* D0 U. v
+ Z3 w, {+ h! |( b$ J
namespace fy_Exp{! M% r8 f+ u. Z' ~
namespace {template <class _T>4 s' X: Y" r4 ^( N0 @; J6 @
inline _T GetExpValue(_T t[], char& csym){
9 w; f) X0 [4 N2 H/ l) X# g+ r8 ?    char c=csym; csym=0;
5 F4 E  J& m" B+ B# p    switch(c){# v8 y" k2 `5 e
    case '+':return t[0] += t[1];1 |0 q& b" _: \( X0 J0 |
    case '-':return t[0] -= t[1];# _5 ^  }+ u- O) e9 g
    case '*':return t[0] *= t[1];
6 Z! T& t. Z6 Y3 o1 ~: A: Q6 k3 z    default: return t[0] /= t[1];//case '/':
% D' y$ ]7 S" I2 w. h; X    }& q1 _7 r$ `( m% E
}}
' I5 ^& L. L$ d8 Q% }4 \template <class _T, class _Tstream>
- K- Z/ W7 `3 C5 {, |/* _Tstream: inputstream, _T: get return value
7 H6 B. E% h( q. g5 w2 G% P! j0 P* Return nonzero if get value successfully */0 Z+ h9 C+ v8 y" M+ u
int GetExpValue(_Tstream& istrin, _T& nReturn){
- J% D+ S# i. Z% z) o    _T t[3] = {0}; //雨中飞燕之作3 O& G* ]9 D4 W9 u$ M. f
    char csym[3] = "++";9 Y, J* ?& W4 p
    int nLevel = 1, nERR = 0;
6 `# k) @% Q  f" B, P( g  M    if(!(istrin>>t[1]))istrin.clear();0 l( J( r% J1 P. v
    for(;;){
/ z+ o. O3 D4 x8 {  ]: R0 y% w        if(istrin>>csym[2]){# u' m4 l( |8 N. Y3 i5 t4 n" m* t1 w
            switch(csym[2]){" p% i; i$ w, S& k
            case '(':  K. R/ z) h' l& ?  C- s- \
                if(!csym[1]){nLevel=0x100; nERR=1;}else
$ E5 A5 A( l1 F3 C) E- ~9 o                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- @7 }/ q, L# T# s
                else{nLevel=0x100; nERR=1;}
& ^# M0 ]* R* m, U. t$ i                break;. I, D+ W, |4 e3 e3 q( T' b$ ?
            case ')':. q) M9 X4 T: l4 V5 O2 H5 M" h
                {nLevel = 0x100;}break;1 d  P$ Z9 O' r
            case '+':case '-':case '*':case '/':. G- P/ H% O8 \7 C8 ^. Y( [8 e
                {csym[nLevel++] = csym[2];}break;
& Y( V" R3 Y* r3 n4 T( {# _            case ' ':case '\r':case '\n':case '\t':continue;0 T% @3 d6 \9 o9 b  Q9 c' W; E
            default:8 o' a7 }, t0 W% N8 }1 i6 G* v/ C
                {nLevel=0x100; nERR=1;}1 V; i  Z$ ~& \3 J5 r
            }
0 I  G3 s6 w; n- p4 q) Z7 \$ \, A            if(nLevel==0x100)break;
6 k$ z; F" E: ]            if(nLevel&0x10 || istrin>>t[2]){- ~0 u3 Q& ]) d- W0 s/ F9 d) A/ b
                nLevel &= 0xF;
' C+ G/ z$ }7 F) a, |                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. a; `% I3 g$ L6 ^5 y                if(csym[1]=='*'||csym[1]=='/'){( n/ @: \( B8 {
                    GetExpValue(t+1, csym[1]);+ T, {9 g3 d9 o1 l6 @! [
                }+ T4 s" z' A0 ~) ^
                else{
* M/ R& ~- s. I: G( [/ X. ?                    GetExpValue(t, csym[0]);
. Y7 H; B0 K7 t8 \, V1 x                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ V% \; w6 I! P% {2 }6 ]+ U$ [' F* c                }
* ^- ~% i( B- J2 m' ^: ]                nLevel = 1;
, M' ?9 B# q5 r            }
6 K4 ~8 \( I' R  f( {            else istrin.clear();
% ]' a( J# p$ L        }
3 S+ s; }, S- d* c! I5 J        else{nERR = -1; break;}
& H& k/ k+ y  Z' k    }
3 |- _5 m% |' C9 g    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; d1 \( \) u. e6 X2 g, E    else nReturn=GetExpValue(t, csym[0]);8 @3 {$ |/ i" E' B% y2 O5 ?
    return nERR==-1?1:0;/ x  f  A4 y$ a  x$ I' y5 Z
}}
: r2 w. a% P6 U
6 Z( f$ z. Y: w8 h7 ]% @& w' n9 d3 P: d. H& |

/ B6 m# ?& k# }+ G; J. m8 L+ M( H函数模板使用示例:
" C4 h1 Y0 l3 u$ u% m9 E在以上那段代码的后面加上以下代码:
5 K: m1 P) q/ l3 z7 @+ _( m, o) \( F4 [5 Y. |6 F5 O

7 ~7 @9 g9 G/ j9 _: }# U' H0 g' [9 t( Y9 D4 _& a* n: `2 v
程序代码:
, Y5 q: U0 x, e# I/ K- [$ q, Y. Q. a' }7 R
#include<strstream>  A6 _/ Y% u( I( W2 [( l( o. E7 S
#include<iostream>
: h# h, w0 L# a; P3 r+ f  J) O#include<string>
; w& L4 |, N; E0 ^# P7 L0 g# ^using namespace std;
$ o. p  o  U8 Y8 `: J) xint main(void)
, ?8 }$ l; x8 C# P" U8 D{
, I: V: D, M+ w# F5 ?/ `, T/ `    string s1;
: U5 |  E2 d& ^; S! D    while(cin>>s1)5 \% y5 }& o% H; K% [9 @$ H! m
    {
) q8 [2 n3 s( W1 u6 X# h" l! l        istrstream isin(s1.data());  Y5 Y/ [/ Z% Q+ l" F. X5 o6 K% k
        double d;, l) U: r6 D. R& a
        if(fy_Exp::GetExpValue(isin, d)), i  j( l3 i$ R: F* p
        {
" y- e0 e4 q9 T/ Q1 m# a            cout<<d<<endl;4 D' Q$ u$ t$ }# _( R7 I3 C2 x6 Z
        }/ P" @. G3 d1 A7 c! B8 n
        else+ K" n; D( h" v
        {3 K, Q) S- y# f+ N. t& d
            cout<<"ERROR"<<endl;
% c# b* H. a/ P3 s8 N) Y% b) O9 l        }+ r, r. G8 r, p! Y7 ?6 X
    }
7 W7 c  Y/ D) d3 S/ a$ i# i; `, P5 k    return 0;
0 R2 q- f; J2 \- }}
8 |# R0 ~' L5 R2 |( a  \% D* K" I0 U9 c4 t* J/ V( V* ^3 y
& M. U5 \7 C! j$ o5 m/ `4 w
然后编译执行就可以了(*^_^*)
, {$ N4 v9 `+ T" x( X. x/ s1 E" ~其它:TC++上一定编译错误,不保证在VC6上也能通过编译
- x7 o8 I  s2 e. z; M; S      建议使用VC7或VC更高版本,或者使用GNU C++编译

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