获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
' b1 q- Y  z4 _3 \$ }0 }一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) }% _" ^- q' ]5 {& w
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); q& S; d5 T2 O* j9 W3 T) ]+ d
参数解释:2 Y' C; I9 M. w9 ^, V! Z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 L* G. h* f: K' _. P. I2 r9 w7 |
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 b9 u5 {$ j# v4 W! N返回值:
, n3 V/ x" s; b2 C  W5 N( B返回非0表示计算成功,0表示计算失败有错误. k9 {! c; E! R. x( i2 @  |8 q& \

9 c' E+ {1 L: \5 j & e8 b- z$ I0 ]1 C: {( {

/ K# z; T% I8 }1 \" m* \程序代码: 4 o5 f. s) @, x6 C, A7 O" Y9 b  C
, [+ z8 Z& e& p
namespace fy_Exp{
& ^- _* }& |' _namespace {template <class _T>
  x: r9 S' d& ^/ @- t1 d7 H4 yinline _T GetExpValue(_T t[], char& csym){
/ o1 Y( I/ m8 N( V    char c=csym; csym=0;4 M/ ?8 J% G: _* e% ^& O$ q( x
    switch(c){
( r% B2 \! [; R7 w7 U' n5 y    case '+':return t[0] += t[1];4 P8 {. g/ T. V. a1 `6 v  o
    case '-':return t[0] -= t[1];0 @4 J0 n+ {* l) Y+ h/ K
    case '*':return t[0] *= t[1];5 X" b% i6 ~& e+ |) K4 T6 V
    default: return t[0] /= t[1];//case '/':- Z' s- l  O3 U
    }
: {) d/ p3 V+ y1 c; f}}
% G" |# m& M- Z# [template <class _T, class _Tstream>
/ N0 d& H2 \2 R* V) [3 j2 q+ C/* _Tstream: inputstream, _T: get return value
4 }4 n8 S  H; t& U6 A. K" q* Return nonzero if get value successfully */
' ^% w$ L; [# _; uint GetExpValue(_Tstream& istrin, _T& nReturn){' j/ l' r, \5 |2 s( x- F/ y
    _T t[3] = {0}; //雨中飞燕之作8 f, e; h- Q, v1 x% n( m: l1 F) l
    char csym[3] = "++";* A# Q  }* P7 c( `
    int nLevel = 1, nERR = 0;
1 R5 U, T* ]# [6 p    if(!(istrin>>t[1]))istrin.clear();8 s& w) t3 w4 b6 O
    for(;;){- V/ n5 @2 y) |' ~. ?9 t
        if(istrin>>csym[2]){+ f2 n' F8 t* J0 b1 ?( s6 G2 U; t: N
            switch(csym[2]){# R; w& |' v0 I) X; D5 T
            case '(':
4 H( A, a% f7 R4 f                if(!csym[1]){nLevel=0x100; nERR=1;}else
: N* z) l# c  L. I% x/ _6 O5 v$ @                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
1 c- g6 W. E+ m9 n& K                else{nLevel=0x100; nERR=1;}
; {' |- O1 j% s, s" ?7 M                break;
& I, R# M: @+ ?* y            case ')':# p  H4 n" e" R% O# d5 \" s
                {nLevel = 0x100;}break;
- G. w0 A" E7 U4 _            case '+':case '-':case '*':case '/':
- @  T( s+ g7 y) [- [( P) z                {csym[nLevel++] = csym[2];}break;
8 g7 A# M+ j# l  @9 n" Q            case ' ':case '\r':case '\n':case '\t':continue;" G* j6 [3 m; J( l7 P
            default:3 n: Y8 h  ^2 r
                {nLevel=0x100; nERR=1;}% u# I' @; \, @0 w3 B; V
            }" B  D; F" q% ]7 B6 x* W2 w0 E
            if(nLevel==0x100)break;
3 m8 H% q! d+ E5 l3 s' W            if(nLevel&0x10 || istrin>>t[2]){
  W( E" t+ B0 z; I7 X7 r! F* M                nLevel &= 0xF;
' d+ g' [, [' P' i! h' d                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: j5 `2 M3 u/ U  d; I. `
                if(csym[1]=='*'||csym[1]=='/'){
+ j7 z6 j7 Z: P                    GetExpValue(t+1, csym[1]);2 v3 t* ~3 U5 y' j5 n" _' ?
                }
9 T; e  d  g8 y+ f. G- ]( m8 b! O% L. ~                else{
) `4 [) V% m( c; }2 C8 A                    GetExpValue(t, csym[0]);
; D& W% f; v' k. o# K3 S' C$ Z0 R/ L                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 L5 V/ \; }4 J0 n3 c9 z* g
                }$ n8 v( `3 O0 E  ~, H
                nLevel = 1;8 u; Y- U) F: z: D" L, M* ?" h
            }; Q3 E. E. T/ h2 z" s& X; J
            else istrin.clear();( t2 ]# {* r/ j, l
        }. c3 a. N3 L/ w  _
        else{nERR = -1; break;}
* G: [( d7 k4 F! D/ Y5 B    }2 j9 k8 H7 J  y( i2 D0 F
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 ]) @' R0 I# D  q
    else nReturn=GetExpValue(t, csym[0]);) n+ _1 @7 Q1 g- j3 Y0 P& k& n
    return nERR==-1?1:0;
) d6 A1 w: k# p5 z* \  F}}" `% l' ~' c) n* ~; o: t# `
* d* z! o" z% M* K8 L% {" R

1 c' S5 Q; {: d4 B2 z
# ]4 c& N+ j1 v* @函数模板使用示例:
0 k5 W- m4 m" m在以上那段代码的后面加上以下代码:0 Q; @  d/ g; R. D

. r  f! K, N$ @4 @2 x/ @
1 m& P3 H/ \$ K4 C; z
7 |6 k" B3 [4 A6 h3 J, {# h程序代码: 2 @3 i- W: J: T/ ~/ ?* h) G

. m9 u+ N4 Y' L#include<strstream>
; o5 W8 E3 ?/ R+ |& ~9 o4 s#include<iostream>2 \, I- K! s! y# L+ e/ O7 A
#include<string>1 D  W, n# T# I! X2 x* m
using namespace std;
. i7 H  Y3 ^2 \& Y8 Q, Uint main(void)
( ]6 q2 }  B7 z) K" A{) D; O4 A9 S; J7 G7 Q5 d$ K; v
    string s1;3 C# s2 `, w  F% C# s# z) W
    while(cin>>s1)/ ~2 L8 A# @  Z7 ^: C# V0 F
    {; A5 l8 m0 p, e* G
        istrstream isin(s1.data());$ e- ^- @, T9 n
        double d;1 H& g2 y. g* C% |) J3 t5 E
        if(fy_Exp::GetExpValue(isin, d)): |$ B0 \# G! z; D2 y
        {1 e6 X/ q7 N8 w! `; [  n) u
            cout<<d<<endl;
# `3 D+ s  i: t- E- T        }2 o6 o7 x7 L& ^" W: R4 }4 h; i. ?6 l
        else
3 o6 X$ e- U- k: B1 Z2 l5 S        {$ {0 c6 a, x% O# l. q0 k* y; @0 W
            cout<<"ERROR"<<endl;
9 `- c3 s1 C3 F1 t8 v& M0 E        }
) t- \7 m2 G9 g) P1 y% t. o    }
6 \9 f2 T' B& y8 Y    return 0;
- [3 w% D& C% v7 }4 g* ^}8 `' d! l$ ]4 r% h2 _
: @. P( [, W: M3 \

& O  F+ I  N3 l5 C1 E. s然后编译执行就可以了(*^_^*)
% ~* M7 J; k; P3 R5 G其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 J: w' @/ p1 w9 ^* h      建议使用VC7或VC更高版本,或者使用GNU C++编译

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