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

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

在9月8日那天我特意编写的,给大家分享的,
$ @3 |' p) o. g( a+ z一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! H$ r; h8 |4 B' f" m. @, \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, Y  w' s8 T1 h参数解释:0 X: q1 z! m2 U3 M4 G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 ?4 s$ M' U2 p6 [# W0 }9 `
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# j) D2 N. I$ G" E: N$ O  o3 K返回值:
5 ?8 Z0 h+ t" X- \& J返回非0表示计算成功,0表示计算失败有错误5 i' h4 i' F# M$ @& V- m

6 g# [/ S; D, h+ O% }7 s) u   n4 f& f+ P3 [3 ?1 I$ A
; A/ D6 D6 b9 B3 e# o2 a% w! X2 z
程序代码: ) B& n: ~$ R& v! i# h; v8 G) }
: W$ B  k& `0 S% J
namespace fy_Exp{
  w' _5 Z2 C" A* N/ W! _- ynamespace {template <class _T>! t; c: G6 f- m# q9 A8 T
inline _T GetExpValue(_T t[], char& csym){" d( f% U* C7 e3 y/ F5 d
    char c=csym; csym=0;
( K) l: ]. g3 k& d. Z1 J    switch(c){% R* s+ Y; C" H8 ~
    case '+':return t[0] += t[1];
: p+ T+ I9 b' N    case '-':return t[0] -= t[1];' e6 s6 L: v! Z* [% r- X' H
    case '*':return t[0] *= t[1];' `- Z: t! _* m: {3 E/ {
    default: return t[0] /= t[1];//case '/':' t) n8 f/ }% L3 Q+ @3 a. t
    }: |+ `0 B* d7 ~) \5 E! v
}}
1 x& f/ J* H0 T6 }- Q2 W7 Ltemplate <class _T, class _Tstream># ^$ A% u! U9 m; \
/* _Tstream: inputstream, _T: get return value
9 H* G8 _, l8 @3 B9 X6 ^* Return nonzero if get value successfully */+ T! n7 B2 Q7 w$ P2 }# Z
int GetExpValue(_Tstream& istrin, _T& nReturn){
. s% f5 F! M9 [: j    _T t[3] = {0}; //雨中飞燕之作8 ^7 ?- `7 T' ~* u( X) q+ n
    char csym[3] = "++";4 l( k( M+ |5 a) Z
    int nLevel = 1, nERR = 0;9 M7 B$ [; W/ V$ \
    if(!(istrin>>t[1]))istrin.clear();
# n; Y8 x/ B, c' B7 V    for(;;){
0 |& J' }$ D& R( q6 n, J7 m        if(istrin>>csym[2]){* |. K, w9 K% @+ R6 @
            switch(csym[2]){- |+ U3 r' v4 g; M6 _
            case '(':
- g8 o6 S6 \; k$ q7 T! y                if(!csym[1]){nLevel=0x100; nERR=1;}else
6 C# n1 c. o/ X$ [, L2 }                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 ^8 L  D' Z2 p4 e8 I$ ^! Z: S                else{nLevel=0x100; nERR=1;}
, [' |' s, j6 `' c8 t                break;
3 h0 p, g, e6 N, Q8 D+ `            case ')':0 e9 `+ c! _# v
                {nLevel = 0x100;}break;
! T" g& H0 I4 p2 I% i( E2 p            case '+':case '-':case '*':case '/':
% k; |: m5 }' q5 d1 I+ x  Y- ~& Y                {csym[nLevel++] = csym[2];}break;; R2 ]& \1 c! V2 J: k
            case ' ':case '\r':case '\n':case '\t':continue;
. X1 E5 a  u% t) ]* v0 {            default:
" V/ c1 V# Q4 o% |4 F: G! P3 _                {nLevel=0x100; nERR=1;}
% j! _% ~$ R: u- V3 D4 e" Z7 B. b            }! {. F0 h7 ?% e6 \; q
            if(nLevel==0x100)break;
  x; Q* I# g/ [7 i1 p+ A            if(nLevel&0x10 || istrin>>t[2]){8 U' \' X* i9 H, }; D  f' r
                nLevel &= 0xF;
# s# ^' y! B, m& e$ ?) s                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, |% s7 H) v% d6 i  F
                if(csym[1]=='*'||csym[1]=='/'){
7 b; C) `* K: p                    GetExpValue(t+1, csym[1]);
) g) |' M3 e* f2 A( ~                }
0 S! P: c1 E) R4 H8 X! g6 Z, E                else{, x6 s& j6 e7 z% i) k
                    GetExpValue(t, csym[0]);- c1 @2 V/ H, E; Q( g( w4 f+ g
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" `6 ?+ k9 I2 ~; l& h                }% U4 d* J! Q( p. y
                nLevel = 1;
* z: @- z  [- y+ H3 S, z6 Z9 B/ x            }6 L0 L4 q; I# w0 |5 l. E) y* ?
            else istrin.clear();; r! R" y$ ]& Y+ Q1 E8 S$ U1 q
        }: L! ?; _! m0 \; O+ n7 [! A9 \
        else{nERR = -1; break;}; [' U8 C# j) y2 d7 ^$ N0 |: M
    }
( ~* V- s, m9 [7 H8 j    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 S# P9 m+ w# f4 X
    else nReturn=GetExpValue(t, csym[0]);
3 Y+ }% R9 R5 K! ?    return nERR==-1?1:0;5 F1 ~% {7 V3 P4 z8 }% I1 r3 s
}}
, y7 X% l4 u* @) R9 W6 `
3 L5 r: h- P* f) x! }+ r6 W5 B$ L1 v4 C

/ \7 I- {& s6 O! ~  D, L7 u函数模板使用示例:) T' C+ ?4 J. U7 W) k3 S3 y
在以上那段代码的后面加上以下代码:. e  c' ]* E1 l
" m, L2 x, y5 |' W+ D
  {2 v8 |. |% s) |4 F& V/ m

4 s1 Y0 K# Z- V' w程序代码:
$ f! b/ ^, `4 N  f0 a
; @9 q$ [) v( a$ c6 |8 Y#include<strstream>$ E( @, v, ^4 F6 [/ L
#include<iostream>: v! K4 h& b( r4 ?: o
#include<string>
  f' G  S  v3 S' pusing namespace std;
/ d  k+ O* H8 G8 o% u! @% ]3 C. Pint main(void)" P; ~' A* i  s# C4 t' Q' i1 j# O; a
{& a, e% [, `. p5 H  u
    string s1;
, h/ k( y( E6 O# s    while(cin>>s1)
! ~, H' D4 g7 g7 i    {
9 i) l, }9 ?0 T6 O- Y, J4 ]3 h  y. ?        istrstream isin(s1.data());
6 T% Y& X! ?3 Y6 g" D5 {9 ?        double d;
5 q$ d) [2 O: d3 A# @        if(fy_Exp::GetExpValue(isin, d))
( J1 q4 n# e) j2 A        {9 B9 u; S( T% c& B* E
            cout<<d<<endl;
7 M. Z3 z. T2 B% O5 r        }
& F3 G, N4 U3 @" O' W        else! u  X9 C5 L( Z6 ]0 y- A. [
        {$ r! T9 c' H9 i& l* ~+ X5 N) C! \
            cout<<"ERROR"<<endl;
% L- Y0 t7 c3 w- H$ |1 C. u& B        }
# `1 N: d' l+ G' V% P" B  Z* \    }' F2 y" N7 N7 @8 {4 B6 i) B: ?
    return 0;
% z6 P* G! B( J+ [6 i}
% T, g) ~; A: A% q" x
# s. r3 F, a6 D* k- @# f9 [  s3 ]1 k+ t8 b6 j: C/ i' ^
然后编译执行就可以了(*^_^*)
2 b; N! y7 X0 F- P2 \/ @其它:TC++上一定编译错误,不保证在VC6上也能通过编译
9 ~0 V- G- |, [- J7 J      建议使用VC7或VC更高版本,或者使用GNU C++编译

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