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

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

在9月8日那天我特意编写的,给大家分享的,
  V1 z% d3 W0 E8 f' `一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 Z0 j; ]; Y1 p9 P, L; i" q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ l" O8 Q8 J$ _/ P& q* U参数解释:) H: l9 w* @' V  ]6 n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流# ]% `. X& z. x0 C% t
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 |2 S  q$ W- ^% ~返回值:3 h9 Q* Z( \. w5 o8 V; E
返回非0表示计算成功,0表示计算失败有错误
! B2 e5 B  ~$ n9 O2 \3 K' x9 G  w: c$ S* N
, r$ d: D1 Z, q) G" T5 ~

: C4 f6 L& F8 Q# M# e. l程序代码:
7 |: F' f3 G& Y
- W- r* i1 d. E; ^" v5 Znamespace fy_Exp{8 l" g1 |6 l% J/ Z. h5 P, b
namespace {template <class _T>
6 l5 r  g2 b# G7 V: |9 Ninline _T GetExpValue(_T t[], char& csym){
, q# d2 @! u! v( [0 |    char c=csym; csym=0;
1 r, p) z. q. |    switch(c){; B! n5 h0 R: r( |) k5 X" g
    case '+':return t[0] += t[1];
$ ~4 a# ]4 v/ Q: T; [    case '-':return t[0] -= t[1];' D, p% A7 _$ |- \3 E  e
    case '*':return t[0] *= t[1];
. w' Q5 {4 N$ v1 |+ V. n" r8 p    default: return t[0] /= t[1];//case '/':
' p* A8 \1 Y" {3 C    }: Y2 _& }1 W8 [# u
}}0 L! X& U+ X* B5 _: s
template <class _T, class _Tstream>2 ?- k. g$ R, e
/* _Tstream: inputstream, _T: get return value0 U( W8 k! i9 M5 \- ?* Y: C
* Return nonzero if get value successfully */
' s9 [; K! n# n9 \9 Vint GetExpValue(_Tstream& istrin, _T& nReturn){
. M# R9 [7 }* x. s( y3 T    _T t[3] = {0}; //雨中飞燕之作
) V* m+ [$ n" Z5 q- x. e    char csym[3] = "++";" ?5 c, ], \# f, `2 r( R) S
    int nLevel = 1, nERR = 0;
( F' t* M. Y( X3 n    if(!(istrin>>t[1]))istrin.clear();, Z/ j& ]# f4 ]$ U# Y5 i
    for(;;){3 Z/ p/ m* n8 H' m
        if(istrin>>csym[2]){2 |, e: L9 M# |. O. c8 o. f
            switch(csym[2]){
4 N! c: J* x, u; {+ x$ r            case '(':3 R8 G8 R9 _, w, ~+ L* v
                if(!csym[1]){nLevel=0x100; nERR=1;}else
+ N1 d6 N, b$ h, Z" G                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 O( H3 \+ ^6 D, Y( W                else{nLevel=0x100; nERR=1;}. I8 X, R4 \2 N4 f/ j# t
                break;
- X' {" ?. Y' `" j) X* O5 E2 {. Q$ v            case ')':0 x% R% x, D& `' B" J$ f) c' u
                {nLevel = 0x100;}break;% H. J1 U" l5 R* ~/ P% h
            case '+':case '-':case '*':case '/':
5 L0 Q9 C; d/ I) A% t/ F0 _! ]                {csym[nLevel++] = csym[2];}break;# D, a1 g3 u# X( Q2 G- I
            case ' ':case '\r':case '\n':case '\t':continue;, N/ s' D) }! |9 I7 d
            default:
  B# R& {/ e8 \2 q& K! e. k                {nLevel=0x100; nERR=1;}
0 O, Z, Q1 b& O4 ]            }
- z5 \6 x& D. m( V9 X( a; }            if(nLevel==0x100)break;
/ s* x+ q- z- d2 ~# Q8 O" o6 M            if(nLevel&0x10 || istrin>>t[2]){
0 \- U- R. k6 E                nLevel &= 0xF;" C/ @" K9 ]# r% M; `9 a1 ^8 e" r& l
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
5 Z1 Q+ k: Y( L; _0 o; n' b: i                if(csym[1]=='*'||csym[1]=='/'){
8 G6 s) H- h% C. k                    GetExpValue(t+1, csym[1]);
0 J$ l$ A0 |) Y                }; ~- \0 {, b; g/ s1 ]
                else{$ i+ I! E9 J! d  E
                    GetExpValue(t, csym[0]);
: Y& ~1 \! O" |* o# R% J5 x! d5 Y                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# b  `# X0 P1 i                }
" n1 b1 F2 N3 P+ r$ F4 P                nLevel = 1;
: w! M/ u) v" I; R+ p, q- O            }
. W3 \2 S' I# ^" E3 ^9 ]3 n            else istrin.clear();" q% J, w' V9 i% p6 ~
        }1 Z! t: e7 Q( |' j
        else{nERR = -1; break;}
% ^4 V3 N3 I# R$ P$ G6 I- s) b    }
+ k% U/ ~0 ?* S- M% G    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 z, f6 e/ }& N# t    else nReturn=GetExpValue(t, csym[0]);" o3 f# v8 G  I* S0 M1 M8 u
    return nERR==-1?1:0;. S8 r2 o+ |: B1 f$ ?
}}8 |5 r7 A7 o6 E9 d

9 t7 K+ P, T4 r8 K- g! r( q$ M) v" C- e% h
# ?1 b9 p  u- {! D8 z
函数模板使用示例:, R$ @" U, O2 m5 y; Z0 k
在以上那段代码的后面加上以下代码:5 h" A* J& W& y% M. v

( n6 J9 j6 E" C/ L   X4 q1 o2 {3 ]' V

; Q: V) }8 O" O* o1 U程序代码: 9 T/ y6 d# V& w: v' j* e

* e1 Y/ v. G' e- X7 f2 y( q1 a#include<strstream>2 f0 d, Y9 u, D0 C0 `
#include<iostream>3 _/ s; d8 X: b; ^0 t3 j. o% E
#include<string>
/ Y5 g. v- X& f  x% U; D0 m& _using namespace std;
; g/ X* e; B! y, o; J% F" qint main(void)
+ _$ _) d; h4 ?- ~, T* b4 C{
) c- |; d6 Y% B: a. L4 D) t    string s1;
) L. D# i- T) F0 y. ^    while(cin>>s1)
9 k3 S2 v3 d/ ^& @; w  o& C    {' G; J& y) _  X) s% v4 Y+ [
        istrstream isin(s1.data());
% n" O: F( u5 D* ^$ i        double d;9 D5 ~9 B# t& d  y
        if(fy_Exp::GetExpValue(isin, d))
) b( `6 \: o7 Q  Z6 v4 P4 s        {
2 t1 B5 L# j- G# h; O( D            cout<<d<<endl;
& s0 O- F0 H! P; |  M        }
( _5 {8 p5 p( b& ^2 j        else6 p# {) s# O' W$ W: C# R* F
        {$ q7 u; U. o5 F  y4 V& k, e
            cout<<"ERROR"<<endl;* p( ]4 S6 y' p1 c% `9 a- f6 ?
        }/ U( L. n. P& O8 k8 w7 \
    }
- e  N3 D6 u! U% {, r4 t$ f    return 0;" L# C  k1 \: F$ U* R% T( b
}
! S! H$ E  ^5 Y" q  d* n" p7 h) k5 U2 `

" L( z& i/ l. j8 Y3 m6 ~% y! _9 D然后编译执行就可以了(*^_^*)' ?! h9 i) T" |& @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ E- p% @/ V5 w0 H% }      建议使用VC7或VC更高版本,或者使用GNU C++编译

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