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

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

在9月8日那天我特意编写的,给大家分享的,! O$ `7 e1 X0 c- ~; ]6 U
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& A* s! J3 H0 h8 h4 x7 q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ {& M9 r! a. k( U! C; o4 u- X& g
参数解释:
, L7 V$ z  Y: z3 F$ Z7 p/ Gistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% v/ V( B- P- L0 K- KnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) n' @1 I8 v& ]/ y6 B. r返回值:. b0 G# k, H5 G# E0 r
返回非0表示计算成功,0表示计算失败有错误, A: o6 j0 C, n9 U0 ~
  a9 ^! t/ {/ ]4 E  s
( R7 C) e3 @8 H, i3 b% E9 ~- d+ s& I

$ l; s* p* g( x5 ]! V程序代码: . a0 s& k2 a( F. f* Y; q

/ x: o0 f3 E  g6 q+ c$ Rnamespace fy_Exp{, [6 \/ P1 N2 o) G) X
namespace {template <class _T>
$ p  k' x  p- A5 ^inline _T GetExpValue(_T t[], char& csym){  x9 [9 s: O/ J+ w, b+ d
    char c=csym; csym=0;
( p: P' N6 |. ~! b4 _, F7 r    switch(c){
2 {# `" i- y( l: ^    case '+':return t[0] += t[1];/ T7 B6 f) a4 `- o) o8 d
    case '-':return t[0] -= t[1];7 h: I# b. U. ~, s/ W
    case '*':return t[0] *= t[1];# {6 f% M$ g6 D4 g+ z
    default: return t[0] /= t[1];//case '/':% D4 f- \4 x0 h* p( h) T
    }
8 `  H8 v6 Z6 ]}}
5 S1 c% @6 ^, R: I4 Ttemplate <class _T, class _Tstream>' P4 V. Y, X( i+ v
/* _Tstream: inputstream, _T: get return value
# n' _- k  Z; u! Z6 {* Return nonzero if get value successfully */
. I  c% d$ r( @0 }! K( Zint GetExpValue(_Tstream& istrin, _T& nReturn){2 U3 B- }* O; z& g
    _T t[3] = {0}; //雨中飞燕之作
, a: H$ P" a6 s4 z# u    char csym[3] = "++";* ^8 ?( w# o9 \2 H" {
    int nLevel = 1, nERR = 0;
! r( w' N! h9 w    if(!(istrin>>t[1]))istrin.clear();; [/ Y9 n6 J  g( ]4 N
    for(;;){
* o8 O1 O6 h8 K        if(istrin>>csym[2]){7 ~+ w3 X$ ~* G" x5 b6 N
            switch(csym[2]){
7 L9 q+ o) n( D5 }2 ]' d, \            case '(':
) Y' s4 d8 D9 |; }- }% y% Z; x                if(!csym[1]){nLevel=0x100; nERR=1;}else) {/ J6 x& C1 i% w
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
  x0 M4 @, f$ i; [8 G  O  [                else{nLevel=0x100; nERR=1;}
5 p6 w! U( h# r: T5 H" u& L8 P* S3 y                break;
7 {, b( |3 m! x. h/ d            case ')':
  [! e: I4 A* |& ^5 i6 y1 A                {nLevel = 0x100;}break;
/ l/ O( V3 d1 _* j. B- ?6 C            case '+':case '-':case '*':case '/':9 Y# f' T0 S2 v1 O
                {csym[nLevel++] = csym[2];}break;' D/ k  o$ p0 i" {, c, H* `
            case ' ':case '\r':case '\n':case '\t':continue;
! v. h  V" e# Q! m1 w( o            default:. d4 l8 ~, a; Y- q$ C; d4 L
                {nLevel=0x100; nERR=1;}4 ?  C+ h6 a7 ?; g5 [
            }
% ^; D$ N3 N; z2 }2 o            if(nLevel==0x100)break;
8 n5 S8 H& [& k* b: }5 d            if(nLevel&0x10 || istrin>>t[2]){
; ~+ _* B, b% {                nLevel &= 0xF;
, L4 d# o; {2 L                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, V6 Z; p. M$ z6 B: K& A6 }                if(csym[1]=='*'||csym[1]=='/'){
# R0 h) T$ S( ]2 m9 @7 q  u                    GetExpValue(t+1, csym[1]);
& y' T& E1 G- q                }9 V" s6 [: ~8 i* e- y: i
                else{
/ S+ Y1 u! M% `* P  S: \* P/ W                    GetExpValue(t, csym[0]);
6 |0 `( m' X( k- g0 |                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
0 M$ Q6 H# q- C7 M0 F                }
' ~- @$ V( r, N% _, Y+ M' h                nLevel = 1;7 G, |/ }3 Q2 R1 x6 a0 o
            }
" i, g7 L1 C5 B6 U  o+ |$ p            else istrin.clear();
. i. V/ k! L& }7 }( K        }
. c, d4 x* N. J' k7 G0 k, r        else{nERR = -1; break;}+ S% p- ~9 o7 V+ R
    }
9 N5 @9 D& s- E4 _. _# u    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' `9 E1 N$ W9 D6 Q/ R    else nReturn=GetExpValue(t, csym[0]);
- s  y4 l( B1 D    return nERR==-1?1:0;
9 \# r% C; y  T9 ?. q, w1 o}}
  w( f& @' [4 T0 R8 Z% m
. u5 b( ?3 `- Q0 x( G4 m# E* a* c/ a# b

9 m& `1 g. |! y8 i- {函数模板使用示例:2 G  S0 E# X7 t8 ?; p5 |
在以上那段代码的后面加上以下代码:
) V/ u( b  i) s& k# r9 k% z4 Q( m# F  d6 h+ k6 p6 S

+ j* ^: w! A+ y& o5 }% k/ a% q; B6 ^
程序代码:
7 Q, _" O4 q3 r7 b3 {- x2 n+ E% u- g4 n* i4 u+ J
#include<strstream>
# T, x2 Q" Y: b3 u#include<iostream>
; @9 b3 s; S3 M$ ?( X* N+ `) N#include<string>
7 q- Y2 U4 Y3 Busing namespace std;
# j2 Y  C/ H- @3 Tint main(void)
) |6 B& _* }& |5 r' E0 g{
% F1 u- }  |6 L& U    string s1;
5 ?2 I6 i9 N2 p9 L4 e6 O6 I    while(cin>>s1)" ~1 c- Z- e- j+ T" q/ k
    {$ X: ?! l2 c  a+ l4 E$ g& K& ^  `
        istrstream isin(s1.data());7 f5 i8 R& K' U* x( g
        double d;
" i9 h3 q9 D$ e5 n7 m+ O        if(fy_Exp::GetExpValue(isin, d))/ X( A4 ^: w6 p0 e6 u) @4 |
        {
3 K; }% G: j! h& i            cout<<d<<endl;
5 l. a2 |  E7 d- j* I: G% v" ?        }
- u" j. @0 r7 g0 ]8 B7 N        else
$ c/ `! t! m* ^* ~9 e) w9 z' O% a' D        {8 ^6 m! e  d$ ^, b$ e! m
            cout<<"ERROR"<<endl;
3 N" p- z; e5 ^2 g+ w( E        }
( Q5 D1 @2 z; j* i$ B    }
. J* @( i$ _# y. f    return 0;" f# O' \" b# J7 D
}
2 h/ ?7 `9 p6 h6 Y+ L
) l9 o& ]; \' H1 y+ c# Y" U: h% o9 Y8 z5 D: \) s( p
然后编译执行就可以了(*^_^*)- D0 |4 \& p5 Z# h; N9 a$ Q+ L- y
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% w: d9 k" f# L& A( {8 D      建议使用VC7或VC更高版本,或者使用GNU C++编译

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