返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
4 t5 b8 Y/ P, ^5 ~2 b9 c8 u! B一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( {2 G5 k/ E: p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn). N9 b- x  d# m( \. R6 n: g4 Q" u1 n
参数解释:0 n) I# W3 w# a8 P; a5 H0 `) L- I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 W5 C  A$ ~, @% ~3 X7 \nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ Z# n$ P, N/ i$ X返回值:4 x* m; O1 ^1 w  T/ l5 Y" Y$ U
返回非0表示计算成功,0表示计算失败有错误
! R. X: g4 m& d' I9 `' t1 b  d# R# A1 }/ ], g5 d
. o* p8 D1 Q' u- h$ h1 P/ j& T

4 N- V% R; F# e+ b: T程序代码:
' {+ _* K5 J1 m0 l
9 h( b3 I5 ~( a/ `0 Znamespace fy_Exp{
. }& ?6 p3 ]& ]/ A0 {4 Y+ \namespace {template <class _T>
: O" K/ q4 x# H- `; Einline _T GetExpValue(_T t[], char& csym){1 I- c7 ]$ h" l' f" \" V2 A
    char c=csym; csym=0;
1 _) E0 o. N$ q/ ?    switch(c){7 b( @0 w2 M) p  M
    case '+':return t[0] += t[1];
* c; O. E# m" U8 k# j    case '-':return t[0] -= t[1];
1 q; X. i; A( ]# a1 D6 l; P    case '*':return t[0] *= t[1];2 e3 {; _3 D. H1 \' d/ w
    default: return t[0] /= t[1];//case '/':' b7 C  c9 U, R
    }
; P2 e9 n  P- [+ t# W+ [}}
  @8 T2 v/ Q: @0 Q/ F5 Jtemplate <class _T, class _Tstream>
- ]7 K! c5 w; D$ }; G6 n( ]/* _Tstream: inputstream, _T: get return value2 G3 t- T9 J7 x  `: U& I2 ~/ A6 M
* Return nonzero if get value successfully */3 M% ~1 c4 ?7 g, |
int GetExpValue(_Tstream& istrin, _T& nReturn){1 h2 h. V1 z# L( P( w) L( r# @
    _T t[3] = {0}; //雨中飞燕之作
$ z: _' i* ]& I; q7 n) B6 h+ Y9 c    char csym[3] = "++";, A9 k* n- `+ L' u- J
    int nLevel = 1, nERR = 0;
6 b( `- n8 ]: u+ f3 ?. z. _# w    if(!(istrin>>t[1]))istrin.clear();
3 g- x" p% Y2 n# E- {( G    for(;;){, G7 H3 i0 z: S" o+ g
        if(istrin>>csym[2]){
% o( V5 z# o4 W) L6 ^            switch(csym[2]){
5 ^5 l5 f/ i  m' V- I            case '(':
  N# y. |9 f" F; B                if(!csym[1]){nLevel=0x100; nERR=1;}else/ y: Y8 m0 m/ ^% j
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 m  F% V' z4 ~# i# c                else{nLevel=0x100; nERR=1;}
6 r) n% V: Y& V! m$ _8 F& u                break;( ?# ?6 s  A) d6 X! f- p" q. S
            case ')':
& V, a9 ]! y7 F* ^5 D6 ~                {nLevel = 0x100;}break;2 Q& v' [. l. a4 A8 k9 Q
            case '+':case '-':case '*':case '/':1 c, |- M3 v( J) G
                {csym[nLevel++] = csym[2];}break;
5 ?+ K0 C  R7 n& i1 ^            case ' ':case '\r':case '\n':case '\t':continue;
; p" a" j) H& G% g/ _% Q6 F            default:: a& ]$ u$ w2 s% R7 D
                {nLevel=0x100; nERR=1;}
, |5 N2 t- j) O3 y; |) v            }1 l( p- S  x# V
            if(nLevel==0x100)break;' r: n$ @; o7 K) O
            if(nLevel&0x10 || istrin>>t[2]){
( Z1 u- W  Q8 k/ g                nLevel &= 0xF;
' Q: v$ i& r& _                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% W/ K0 q  D* A7 _1 B# M                if(csym[1]=='*'||csym[1]=='/'){) d' k: d7 @* E. `) j
                    GetExpValue(t+1, csym[1]);
' E- n& _+ \3 V3 [, [                }. x- ]5 r! j$ X, w( E+ w$ g) O, i
                else{; Q. e2 B4 ?9 S& ]# s/ y
                    GetExpValue(t, csym[0]);
3 `7 m0 G7 \# t                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ N3 y1 F5 N4 x, |- E4 t                }
% N  D) c; W! k6 C  Y+ Y6 B                nLevel = 1;8 E+ H. w$ \* I
            }
' r% @! D& D, D) m+ H) N7 Z            else istrin.clear();
1 }: ^1 @' n3 i6 `, D1 ^! T        }
# p. j/ J+ [" V9 Y9 P; e% h1 B% q        else{nERR = -1; break;}
, S/ c0 l- m0 Z6 Q9 h5 r& s  F    }$ O, P2 @2 i  H5 s& O  d/ a
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' u0 g/ B5 K. A    else nReturn=GetExpValue(t, csym[0]);
# U  p0 Z+ D& r- N    return nERR==-1?1:0;" F3 Z2 ?& Y8 B( C* ~% D2 }5 u
}}0 {  X( O& G: B2 H

0 C" K7 d4 m1 P5 K1 S+ f$ m: c# R6 C5 ~
0 g0 N! d3 F2 V- z. p- d
函数模板使用示例:6 n% F( W, P! @% m% r% [5 S1 O5 F
在以上那段代码的后面加上以下代码:$ W0 s) C) q  C# N3 h7 z2 S1 h4 m
7 q/ ^9 u2 a# W: Y( y& ~
% m9 N) \. s' g' }

: N- R% g4 g1 y程序代码:
% H9 R: O/ L& W- _4 S! w' a, _2 ?: H" J4 t" b
#include<strstream>
0 s4 m  d5 {6 @' f; @2 \! x: p$ Q* U#include<iostream>
7 j  W1 y2 [  I/ ]( [#include<string>) G7 _6 P  y4 j1 w5 R* I. I! I
using namespace std;' J, I2 B: B9 R7 |& T1 T* `
int main(void)
5 ~' h% w) a4 D{. K+ `$ A$ M# f' ]* _7 ~3 H
    string s1;1 n; ~. P' k& E4 F! j* X9 D. K4 W
    while(cin>>s1)) J6 Y" ~! P4 Y4 G9 p. Z& S& }8 ~/ N
    {
( K& w2 j2 A! t0 F        istrstream isin(s1.data());2 G/ ~  c% S3 a) l5 J4 Y  c
        double d;; Y) Y  M3 T2 m* Y& K: e
        if(fy_Exp::GetExpValue(isin, d))
' b% O; ?$ B. t$ b        {" V+ _% S* Q) v( O% Q
            cout<<d<<endl;; c: M+ A8 I) S# q" z* ]' \, Q4 i
        }
, @' s0 w% N' z9 ^        else
/ K; D" j6 D1 Z5 @0 c2 ?3 B5 ?( u        {
8 M# J0 |) g: p            cout<<"ERROR"<<endl;
1 n$ z" L9 H) h! j& \+ j: p7 H        }
0 }, z2 @9 S+ ~+ ]* n$ F  g    }& _2 M# r+ b* I
    return 0;
, \) d4 T2 O, a' q5 J2 c}- ?2 N+ Y" i. ^* C
" P- j$ _7 A4 H0 w5 H) h4 r
+ S4 s6 s, S( o* J
然后编译执行就可以了(*^_^*)2 a' f6 b  U$ k; u9 `% z
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( a! a1 }- p& u  O5 }* k$ ^      建议使用VC7或VC更高版本,或者使用GNU C++编译

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