返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
; X2 ~' @. F1 n% o4 f+ ~' e) q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 f. m# g& d) E+ H& r3 q/ j' z
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& A6 R' |6 N) l0 z+ y参数解释:( E  g: b# U6 I; |
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
9 }! v( ?; b% w- @3 O* JnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 w5 V9 K$ v6 I
返回值:
9 }4 `; ~3 m6 y( V9 j* E! H, n6 `返回非0表示计算成功,0表示计算失败有错误
" A2 o3 n) p$ l/ J6 V
! `8 ~, M& d% r. N0 H " q# k+ [0 X9 F& i; ]2 Y5 r

7 B( {2 m2 \7 k/ h% I程序代码:
# E, N. v" [7 p/ Z+ P$ k( d6 r) C0 n: U; x7 Z$ z
namespace fy_Exp{" z2 G' Q- t2 ^8 d( \) L
namespace {template <class _T>% ?- s/ w7 m" e, B7 X
inline _T GetExpValue(_T t[], char& csym){2 D; |  ^; ]. O1 X: k5 _9 F
    char c=csym; csym=0;+ l' ]2 d9 @5 B7 L5 {
    switch(c){
4 l6 [9 K0 X( g5 s9 r9 V. T: J+ ~    case '+':return t[0] += t[1];1 ~" W/ g2 f& T4 q0 [8 c8 b
    case '-':return t[0] -= t[1];
1 i* {6 e9 E2 V    case '*':return t[0] *= t[1];* s7 u: ?# l4 Y0 r1 y; F
    default: return t[0] /= t[1];//case '/':
$ @$ r" N# |+ z" z& Q7 A    }
; H3 h5 Y1 s& D$ G1 k}}
" G5 ^* u' M' m, Q" R: n# \/ a1 Dtemplate <class _T, class _Tstream>" x4 E1 E; S5 A% P& g: L7 Q1 @
/* _Tstream: inputstream, _T: get return value
, R% n6 O1 w& u* Return nonzero if get value successfully */
) }3 F4 L" d' M$ l$ f, b7 uint GetExpValue(_Tstream& istrin, _T& nReturn){
% K  j4 f% b" j+ Z- i( a% Z# H6 _    _T t[3] = {0}; //雨中飞燕之作( B) f' Y: J7 @
    char csym[3] = "++";0 a2 G/ j# w+ X. _3 B( @3 N, M
    int nLevel = 1, nERR = 0;
" \0 E* H7 Z# H; k3 R# Q    if(!(istrin>>t[1]))istrin.clear();$ I9 a$ z" ^, N6 z
    for(;;){
  U7 b5 n: C9 S1 V7 P+ f8 b5 }5 l        if(istrin>>csym[2]){" R! i. @, F8 V' H+ t) [
            switch(csym[2]){5 m6 P1 [+ J  q) v
            case '(':
7 S; u- s' w/ E9 j                if(!csym[1]){nLevel=0x100; nERR=1;}else
( Q- `% n' s3 q, y& f  W/ c                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# N: e/ e9 `4 i
                else{nLevel=0x100; nERR=1;}1 V$ i: N! t  S$ v
                break;# I* C6 {4 ]+ ^6 A' P* `
            case ')':
! G& \" x. }' X                {nLevel = 0x100;}break;
, N% f# P1 x- w/ j            case '+':case '-':case '*':case '/':  q# f$ o/ P: E/ v, p! T
                {csym[nLevel++] = csym[2];}break;
) u# y1 |, ^* S, L& c            case ' ':case '\r':case '\n':case '\t':continue;
# d2 H* F/ ^; w+ m% `6 a' p            default:
$ w3 S" b; a6 K, e2 X# T. ~                {nLevel=0x100; nERR=1;}
/ B- I8 t: x, A+ o- t4 D2 [2 r            }8 `/ {& R6 {9 v
            if(nLevel==0x100)break;
, `) d; _1 f% O8 t/ ~5 S) h            if(nLevel&0x10 || istrin>>t[2]){) G8 b* ^) v5 o8 \0 \; J6 \
                nLevel &= 0xF;
2 y' z4 x4 C& @                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 |- s. {: \, K% ?2 w
                if(csym[1]=='*'||csym[1]=='/'){6 ]0 b7 _+ H- i; u1 s2 ]( C0 V: G
                    GetExpValue(t+1, csym[1]);
" _+ g5 B" |6 C& R) ]) j                }7 Z8 {( I5 B& M# t4 B8 ^5 X3 [7 t
                else{* N$ A- P: H1 T/ x7 ?
                    GetExpValue(t, csym[0]);+ u8 u) T* @. ]6 j2 F  h, D# O" w
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 d. }# S; J% `- j2 c                }
5 v; s4 t2 z7 d3 p/ }! U6 F                nLevel = 1;1 y8 z( b  A5 `
            }# A7 w3 _  u8 }2 b; U* w
            else istrin.clear();
, P" T7 L9 E& `3 X& e: w" u        }
. a  i3 U1 x. @: S% i. P7 Z% N9 H& W        else{nERR = -1; break;}% m8 k1 `4 t  t+ B, t0 }& \' Q
    }, U, j2 i( m7 P
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) m" @% J5 c: U: V8 c# A
    else nReturn=GetExpValue(t, csym[0]);; y/ ]+ v- f2 J
    return nERR==-1?1:0;
3 A& e' @$ G/ ~' a1 m}}( I0 R: a7 g. e( w7 P& R! J' D9 H( _

& M, g3 c/ q' j* `  z- y  Z
' Y! W+ G1 M. Q4 _( |9 R& n% I
& G. c( u6 O9 P# r" H函数模板使用示例:
; l' {9 j& f; j" \# R5 G在以上那段代码的后面加上以下代码:# g: m5 X6 N7 H  t, p6 I! v
# r$ \5 n- i/ C" m! A6 Y7 a

7 K. e: Q: b/ n/ ~; Z) k
+ C# A* }% J5 M. U( i6 e" d/ @& P程序代码: . _, u6 v8 _2 Z# \. |; ~4 C
4 e6 g  L2 L% I& h& J6 c' \! a
#include<strstream>
8 ]* u+ O2 H8 d5 _#include<iostream>: t( \+ l* `& y- O- T2 }* f
#include<string>& g- g9 S% s/ p
using namespace std;  N* z: q5 E4 W" M4 B
int main(void)
* A  F1 {; a$ }3 h" _, W% v+ ]{: n* E! w8 V* W9 }: G3 T
    string s1;
/ L- v9 C  J8 r( _    while(cin>>s1)
" U  C8 k0 d( J; h" [    {* p* `6 f3 Q1 N; [6 ?
        istrstream isin(s1.data());
  h- i  p0 D3 X$ i( W        double d;: {: a" s) e4 H
        if(fy_Exp::GetExpValue(isin, d))
5 y1 S0 ?) Z% {! g9 ~7 i# h9 r; d        {0 d* S" \+ ]! a1 F" P
            cout<<d<<endl;/ H+ i+ D1 [; r2 k$ `
        }! l% ]6 ^# A. f8 E
        else1 e  q& s- L- q* a
        {
- c' c( d* J: C) p0 T! z; r- c            cout<<"ERROR"<<endl;0 i8 O5 ?5 W: U0 b, y) G+ f* q
        }
( V& Y/ R/ m: n' p. k    }8 |% X/ V/ Y- @9 R- f. a' Q
    return 0;6 m# j6 g, o2 T+ d1 D" W( V* \
}: m% F- [/ R: T) O) ?* k# X

9 u; u2 L  [9 P- \6 b% V- B+ W& V6 ~9 _& r2 \! ]1 Q- }
然后编译执行就可以了(*^_^*)
9 H# y; w: s/ `; `其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 Z4 `- J; Z1 d- M. C7 Z      建议使用VC7或VC更高版本,或者使用GNU C++编译

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