返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的," s3 m. u9 X7 Q1 y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! F! x7 k  X, S4 X& s只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 x; T; S- A) [7 e! A  \4 y
参数解释:2 h% h9 M1 V' {
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- Y/ I7 m+ {0 ]  [nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
; w8 D+ @  a; {* y: I- A$ q& a返回值:
3 }% [8 G- I3 c" X' O- r# O! Q; R返回非0表示计算成功,0表示计算失败有错误0 g/ w3 D: ^* W+ }0 `' N" S

6 F5 t' ^3 E' P" ]9 F6 ~. u6 C$ t , |; a# z. ?' k) ^1 s. b: e7 z

: F/ t, t- y# p8 c4 ]$ u& S程序代码: 8 f1 Y. N; F& ^0 S; i$ j

5 |3 m2 W; [. r+ @/ n9 m- w- ^namespace fy_Exp{
' M+ a' j6 q0 u2 `3 b1 _( ?# R% I- ]9 wnamespace {template <class _T>5 x* w4 }9 F% ^7 Z
inline _T GetExpValue(_T t[], char& csym){- @3 p+ e: P8 Z) D, ?& E
    char c=csym; csym=0;% L5 K# `* F9 V' r! P* l! _
    switch(c){
2 G) N$ t) K9 b+ E; T3 j    case '+':return t[0] += t[1];
7 B; V: P8 u7 `    case '-':return t[0] -= t[1];
9 [$ `0 p* |! x2 o    case '*':return t[0] *= t[1];
5 T1 A2 z6 v$ D6 v: Q# T! @    default: return t[0] /= t[1];//case '/':5 u: V$ [% V) e& P! Z9 K7 K
    }' F1 C9 z4 Y" X2 b
}}
) q+ |8 t: A- mtemplate <class _T, class _Tstream># p+ L1 b  h1 _
/* _Tstream: inputstream, _T: get return value" P3 b. r" E' r- u" R- W9 B/ F
* Return nonzero if get value successfully */
4 V) q% J/ u! A9 u. g' qint GetExpValue(_Tstream& istrin, _T& nReturn){: x1 K# W/ ~4 N2 Q0 e0 s+ B: u6 r3 d
    _T t[3] = {0}; //雨中飞燕之作
: P& p' |7 M/ ]; [, k    char csym[3] = "++";7 d& F, P3 k/ r7 {
    int nLevel = 1, nERR = 0;
$ Z/ K. W4 C9 o1 O0 d; `+ h* ?    if(!(istrin>>t[1]))istrin.clear();
6 p& [7 G! I( ?2 S: K" F6 B* W  T    for(;;){8 v/ N, z' j: V1 X" O
        if(istrin>>csym[2]){
# L9 q( J5 \  J; |" u" Q9 M6 P$ i, E            switch(csym[2]){
6 S$ W# @( `1 G8 I            case '(':
; s% M% r% |- {2 m. \! W' n                if(!csym[1]){nLevel=0x100; nERR=1;}else3 i' _  Q% \7 o0 K- c9 C
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 c5 v) A. r6 Q7 {$ N7 A
                else{nLevel=0x100; nERR=1;}/ j) L$ B) N! ]* W
                break;
" q; {1 j: Z0 u5 I            case ')':6 \5 b3 B. A9 q9 q" |0 s1 ^3 }
                {nLevel = 0x100;}break;% V5 @+ I+ S% H" I' T, C
            case '+':case '-':case '*':case '/':9 t0 k2 _" r7 E! W) m+ ]2 {& {
                {csym[nLevel++] = csym[2];}break;* O) z. N$ j) p; k6 ?
            case ' ':case '\r':case '\n':case '\t':continue;
! s- f2 R2 g, @3 q            default:
6 }( `0 O8 [$ \3 b" ^                {nLevel=0x100; nERR=1;}6 I5 V  y) w: v! \  H+ C
            }. n& s/ R8 ?; O2 ~
            if(nLevel==0x100)break;/ d' ]  b  h" _, ?( M  e* D- h+ J
            if(nLevel&0x10 || istrin>>t[2]){
" G3 j) [. L! W2 B- ?                nLevel &= 0xF;( h# J5 P  y3 N7 C& v1 B
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# `  S+ ^& T, C: w4 V9 C/ n# {
                if(csym[1]=='*'||csym[1]=='/'){2 C0 Z5 U: j$ ^, Y) L
                    GetExpValue(t+1, csym[1]);
4 l6 y* z, l% n                }
' x0 ~4 B2 K" ?* s' u/ u                else{
: F( ^1 C5 z) F; z5 @3 j* L( O- O                    GetExpValue(t, csym[0]);9 O9 |2 u4 _; E1 K& U( ^
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& ~4 T% F  e2 [( {( g& E' f                }+ \6 E/ {2 A8 `5 f$ K
                nLevel = 1;
& Y) U3 z2 |/ w" t4 B4 v            }. F3 U+ P/ A' L6 N% o0 r
            else istrin.clear();
0 S7 g8 M, g# @. X  W4 C9 q7 Q3 `8 Q        }
9 e5 d7 H& Y" J, e7 j        else{nERR = -1; break;}$ j& I' E' z! i- t6 `
    }
: m" B. J% H2 I    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, |  p& `* @& H2 `- {  U    else nReturn=GetExpValue(t, csym[0]);) a1 x) _2 [( F9 H# P; }
    return nERR==-1?1:0;
2 F9 y5 i/ o8 h$ ^: c}}
' U1 ?' ^8 |9 {# }6 b! c# A2 D( Z
7 R( O/ w- v5 n, W# F( ~, n; p+ N5 h* C; v1 I2 z
( Q, h% V' G1 S, _7 q2 ~
函数模板使用示例:6 P: t+ ~( z$ F9 ?( h/ b4 r
在以上那段代码的后面加上以下代码:) V! ]6 Z" F: \% f" H# W

9 @+ z' I5 Z- U* {- a
& x# v* @& w( _4 G! V3 Q- o+ ]$ t+ l0 c" ~6 L1 E+ G
程序代码:
3 M, H& t4 M* v) A) g  ~  Q  w/ z# i& `- n
#include<strstream>
* z6 M; \) O* m#include<iostream>
  ]) g9 k" Z4 b#include<string>- h- c3 Y2 V0 f& d. Q
using namespace std;, q2 A- ^( F0 X) v
int main(void)9 f! ?, ^' I$ s# C/ I
{. P- D# X/ X. C3 L
    string s1;
/ ]) ^% k" Y, d/ k7 W    while(cin>>s1)6 @5 d* A% l2 A6 D' ]1 w7 x! T
    {1 R: I, G6 F+ ?- ]  }" j' X0 @
        istrstream isin(s1.data());8 {7 G: Q1 i; D- l* h3 ?
        double d;
% F8 B% D5 b, v3 \- v. D        if(fy_Exp::GetExpValue(isin, d))* M& F  e# y% T+ g+ D& O& m
        {4 m+ ]7 U" u7 k+ K& A9 v# D0 L& H
            cout<<d<<endl;6 \: F+ f% e4 h, _+ s
        }0 K9 W& q* I! s3 c1 A! H
        else! o; n/ S/ Q2 Z1 z$ B; y; R
        {
2 ]$ L" U0 k. S3 f! w; m            cout<<"ERROR"<<endl;
5 y+ `& K) N7 K; X$ P! `) K$ p        }2 A7 k' L( h, G4 @- z
    }
% ?6 h9 \5 x1 l9 Z( s    return 0;
9 k/ y: s2 ~; u  g+ I6 P}1 F+ A/ g9 }- s* ~

# e' D9 @9 P2 S1 \' i
* b5 m0 }1 d  `: m' C# x2 p然后编译执行就可以了(*^_^*)
2 V% u8 H$ x: x其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& k0 R  _3 o0 d8 p: ?6 L( H      建议使用VC7或VC更高版本,或者使用GNU C++编译

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