返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
+ @- \1 V3 g& M* v% e1 a一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( X7 h6 G, l" h9 [6 J
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ v4 u; P3 V) h6 A" u! b
参数解释:
# G5 S9 a  F3 pistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% N) k4 @4 o  z. }" h% jnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定6 ~( S. Q* g. e+ B- F0 b2 a
返回值:
. r9 l  \' J6 e8 O. e返回非0表示计算成功,0表示计算失败有错误
9 W! @; Y- Q$ R3 R1 s  }( ^! i9 }$ }% `3 P& {" y& O7 W* ~
- V* E. ]2 X: F" \* u1 P- y6 t

3 y5 e- z: ]" i) S" @, M程序代码:
1 t3 t! P. c  X
4 J( U" `: Q: A# b. x/ ^namespace fy_Exp{
! ~/ C8 f! y: h' T5 ~, Hnamespace {template <class _T>
" t5 n: l( X4 G& ]) jinline _T GetExpValue(_T t[], char& csym){
, ^9 R' P! v3 }& b    char c=csym; csym=0;
" b3 @2 _, J( |) U9 R# E    switch(c){
( l7 W7 w' Z% H( y; Q    case '+':return t[0] += t[1];
: T& ^! l: P. \0 X. F% D    case '-':return t[0] -= t[1];
# i/ e3 R% u5 a2 z. @    case '*':return t[0] *= t[1];
. l" X# l" y3 F: A2 x6 E    default: return t[0] /= t[1];//case '/':
. s# p1 y' l* z    }# v( X& `8 V9 f0 U; _$ n
}}
) N; T% Q# w( Z: {% D( x# Ktemplate <class _T, class _Tstream>
0 Y# h( o; R' J* V- k/* _Tstream: inputstream, _T: get return value
8 n. q! j1 K/ @5 m* ~$ i* Return nonzero if get value successfully */
- \, k# ]$ s% Iint GetExpValue(_Tstream& istrin, _T& nReturn){# W$ D) S: V- M# E) H) r
    _T t[3] = {0}; //雨中飞燕之作
4 o; O$ i: F# i    char csym[3] = "++";/ A/ W- I. ]7 t/ X0 z- K: N/ ^
    int nLevel = 1, nERR = 0;
$ e* v  e* l+ g- ?& o/ A) M    if(!(istrin>>t[1]))istrin.clear();; i% q6 x5 _2 k/ A/ ~
    for(;;){- X; [5 S' a, a5 J( X1 n# A
        if(istrin>>csym[2]){; d7 f. I/ z! B; \: i% X5 p1 _( P
            switch(csym[2]){$ l  J/ h: z, j3 B, h
            case '(':
; Q9 f: {1 x8 t. V                if(!csym[1]){nLevel=0x100; nERR=1;}else- M) ^; X" `! O! j8 l
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; g( Q- b9 w8 k0 ]: X' M
                else{nLevel=0x100; nERR=1;}# m3 p+ _. v1 b" h  y1 U* s" s3 t
                break;
9 Z# b  ^8 d1 [1 ~. J            case ')':
  L; `3 l4 n9 x; V                {nLevel = 0x100;}break;
) ?1 u4 M- F2 x            case '+':case '-':case '*':case '/':
0 `+ k% F2 v( B) O. |                {csym[nLevel++] = csym[2];}break;6 J6 ^* w2 e; I% [4 \
            case ' ':case '\r':case '\n':case '\t':continue;
0 T3 o9 h! l! v            default:* G) W4 s! j. t
                {nLevel=0x100; nERR=1;}  _( o( W( h7 ~5 G
            }# n* |9 w1 H- Z! e" ?% [! @
            if(nLevel==0x100)break;
2 G3 O# S7 z# Y$ ]            if(nLevel&0x10 || istrin>>t[2]){7 x6 ~/ l8 Q8 w; J) l: z
                nLevel &= 0xF;  e" D. ?4 r* Y: v- f1 j
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* t# i! P6 `4 ^5 F
                if(csym[1]=='*'||csym[1]=='/'){
" r4 }) k+ r6 ~/ k$ b" m; _, K                    GetExpValue(t+1, csym[1]);2 [3 h0 ^7 ^& r  G: D
                }
" U' X& \8 ^7 V$ E( H                else{$ r( a/ C$ s/ E2 F  M3 o
                    GetExpValue(t, csym[0]);) ~$ W! W$ `( G& W" a. G/ K
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;. U8 Q" W& C1 P& }- K
                }. u8 ~5 V& \3 j: G- D* q4 `
                nLevel = 1;
, [2 ]* ^+ V- k& K: F            }
$ C* S2 M0 ]4 a8 ~8 J            else istrin.clear();6 l3 T% e7 F' S
        }
0 j7 D0 \5 o& b# P+ T5 F        else{nERR = -1; break;}) a  u8 Z  c; C8 Y8 T+ Q1 q* ^
    }) A+ S" ]. v& N+ l
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 F" ^# |  p( ^2 {    else nReturn=GetExpValue(t, csym[0]);
2 ?( ?0 E0 _# J& J+ w6 r% }    return nERR==-1?1:0;
- F' B3 q5 @) `$ @}}6 ^2 \& g: }1 V8 B; D6 }: L
& ^7 x8 M: B  D; B
- }# W+ ^6 M$ k' L# m% X" V) _

% w6 ^- K& ^- e- Q6 F: S: P函数模板使用示例:
4 x' R5 k' ]+ m. a$ b% }, ]8 q在以上那段代码的后面加上以下代码:/ I" _3 k3 m1 `9 _2 W

8 L) @9 D0 \: G0 |! v* `+ J2 ? 1 x/ z7 t, U8 d" b5 j

  X" l* j5 ~# N程序代码: $ d5 l8 I5 }  h& i
$ v+ S. ?0 C9 q7 R. B2 U. P  p
#include<strstream>
0 _" ?' Q$ {$ k5 k% s% ]9 T#include<iostream>
8 h- k9 V& E/ E! W#include<string>, ~. J) I( @6 N6 ]9 h' ~9 S
using namespace std;
% F- V2 s7 m# @. w/ Kint main(void)
( u1 S" v$ |6 O& d, l2 a- I{
  s6 `6 ?* o0 i! }; E    string s1;" B% G/ H  ?0 S
    while(cin>>s1)5 Y2 u) K  @4 \! {
    {% l% t  D- _4 ^- Y4 T
        istrstream isin(s1.data());8 R" P; ~3 T4 b1 n1 ]5 N* Z& k! |
        double d;: N1 t2 M: m3 x1 V
        if(fy_Exp::GetExpValue(isin, d))- |, r2 N8 E1 L3 q# `! N: S4 [3 \
        {' Q8 N! h, g* r; i+ V  c
            cout<<d<<endl;5 I% p$ b: [% t  l2 H% z
        }. S7 E1 t4 i. g* m' c4 n
        else
: x& {& S* p1 ?9 o        {9 V& X0 n3 r7 _; v7 _+ u
            cout<<"ERROR"<<endl;
8 \8 h' f' j. T9 f( j        }" i4 S1 h, k/ _
    }
2 A9 ^* U0 ]% L. p0 {$ b( U    return 0;! T# Q* O" f3 i: J& E# e- B0 h
}( }7 b( {$ s: @

. J& U9 B$ s  M. {
  T# D9 O7 D# |+ H) W# c2 Y然后编译执行就可以了(*^_^*)2 B( S" n1 b0 z  u2 B
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) h8 `' Q  x) w3 y4 `: ]* N! N1 O      建议使用VC7或VC更高版本,或者使用GNU C++编译

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