返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,, ^$ h; L( e9 z& `: b; f
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式  T5 r; F+ H$ {* j% m0 O! C
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
; t8 E$ f. B' E' X参数解释:. g3 P2 z' q8 A& l# Q3 @
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* [" d: |7 q: e* i, q1 ]$ D- w
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 n" x# G6 L; e9 D" f4 J0 i$ a
返回值:0 w" l$ {. L. a
返回非0表示计算成功,0表示计算失败有错误
  }! {7 i( h3 C2 n
6 q- m+ \; y7 h- U! R% {3 _9 _ 4 t$ o( h7 M3 g& h! C5 }3 a- n
' A0 S) c2 T# q# A0 G
程序代码:
3 {. m. I, m+ ~0 ~, V& \1 z9 i2 }
namespace fy_Exp{
7 b% N9 t. G0 w3 enamespace {template <class _T># Z4 e0 i2 |0 A! h0 ?
inline _T GetExpValue(_T t[], char& csym){
* O0 Z+ E) M% `3 I, Y    char c=csym; csym=0;+ N4 {2 z* ^& m$ J
    switch(c){
. u4 w3 W( t  Z5 Q  E7 C1 y) S0 M7 ^9 g    case '+':return t[0] += t[1];* O) ]/ b' X' O, }, G" n5 K
    case '-':return t[0] -= t[1];) K6 c2 o% j  _. e+ ?; Z+ v
    case '*':return t[0] *= t[1];( h8 a* S3 Y) y# g4 O, ^
    default: return t[0] /= t[1];//case '/':
+ K, n. I3 Z) y2 R' E1 F% B    }
6 `* z" T( ?: V% [2 G8 O}}  |2 t1 [/ W; C  R  m
template <class _T, class _Tstream>
9 I- G3 A( b, \$ |# D/ [0 [/* _Tstream: inputstream, _T: get return value+ Q9 ?; T- j7 R9 z
* Return nonzero if get value successfully */; Q, m" h* g0 v* x
int GetExpValue(_Tstream& istrin, _T& nReturn){7 s) p/ K' Y! l! U
    _T t[3] = {0}; //雨中飞燕之作
) d7 [7 j, e0 n: U* S# ^* n    char csym[3] = "++";
; f5 T4 ~1 ~& S! x9 E. v; x. O    int nLevel = 1, nERR = 0;; ^- e. N8 p! E
    if(!(istrin>>t[1]))istrin.clear();  E# w- C! v( k
    for(;;){1 d  z2 A/ x+ \* y
        if(istrin>>csym[2]){* X" g* g# v3 c6 G! ~
            switch(csym[2]){/ d$ E; A, D( C/ ]7 [" ]
            case '(':
0 n& `. k+ O; r" f                if(!csym[1]){nLevel=0x100; nERR=1;}else3 j; T7 \0 m1 Z  y
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, D) Q7 W' W: z# ?" K                else{nLevel=0x100; nERR=1;}3 y& D8 A5 G7 h& f- ?9 n5 b: l
                break;
7 Z7 A' ~& n" Z" n) B2 y$ J- {            case ')':/ Q1 P, J# }2 }7 h# v' Y
                {nLevel = 0x100;}break;
6 q& r$ `, @. T6 a; J! ?/ B            case '+':case '-':case '*':case '/':
; ~2 l3 u6 \# [2 Z                {csym[nLevel++] = csym[2];}break;$ ?+ w' \6 h' s; V+ r. n! k7 s8 y
            case ' ':case '\r':case '\n':case '\t':continue;
1 B# n  ~2 n% y( `5 [- q            default:
( r; f8 e- O+ c/ ]4 l/ Y# A                {nLevel=0x100; nERR=1;}
# ~) b" {( W, d5 G1 C            }
7 x% {2 B5 j6 o# `& B; V; A' G            if(nLevel==0x100)break;
$ p& b# g3 `* _! }5 H, [            if(nLevel&0x10 || istrin>>t[2]){
+ r7 b2 e1 E3 F! h4 E' g* g" N' {                nLevel &= 0xF;
8 }. f9 h# a) H                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}+ c6 f* c- D( T7 v# F
                if(csym[1]=='*'||csym[1]=='/'){
  z% j) C  @$ m                    GetExpValue(t+1, csym[1]);
0 S- ~, E! X- i% g+ n) w# W                }
4 Q0 |! U; U/ [+ k# V                else{
6 L) n& ^9 Y# T0 e- j# t                    GetExpValue(t, csym[0]);
5 f" T- a% G; H7 s                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 H$ g* r$ X( _  p! I
                }/ l6 x& O" w5 S$ a
                nLevel = 1;
* V, }0 W; ?( w9 T" S5 R            }# T8 K% l1 m1 X. Z2 F. ?
            else istrin.clear();- M6 C9 N* X2 k7 ?# n  T# V4 c% J5 X
        }
3 i; k3 n) k% T% S        else{nERR = -1; break;}
( t# r/ M  l% A8 G% R7 Y    }
& u$ c1 L+ `. `. q    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) Z7 D3 b/ J' K- Y- B( E' Y
    else nReturn=GetExpValue(t, csym[0]);& p& ^& E" I. n4 C# e. p
    return nERR==-1?1:0;7 T- S  A6 I3 R; R. [
}}
7 a* x1 W  h' H- ?( g0 z$ T/ Y$ f. e+ h, r. _

! |" J# C3 ?" s/ T
, N) G3 t/ V* X5 z( Q* p1 }函数模板使用示例:
5 ^# |: N- B6 M; J  W在以上那段代码的后面加上以下代码:6 N9 t. G6 U* f* u

# i" @5 y7 h3 h
8 n; C$ }+ S& _3 K" R% x8 c) B9 e8 q) N4 y& R5 n
程序代码: ( x. n7 T9 K$ J; C5 ^3 R) U
2 \) d* O' w' v
#include<strstream>
; N* g& s9 K/ A) t+ r#include<iostream>
; l+ e5 n! E$ F#include<string>
; Y$ J) |$ ]9 j7 Q4 D5 ^8 n( Wusing namespace std;" @0 H% w! w" Y0 X
int main(void). m; h6 k" J* |- p- [- |
{% B5 Y; ^0 |  [
    string s1;
& Y" N" n3 f. i; d    while(cin>>s1)( ], u( p4 I  ^$ _1 R3 ]4 V
    {8 h# S: m+ s# J5 k3 Y" ?
        istrstream isin(s1.data());
' x6 @/ b. t, F. c/ G$ @" ^: j- f        double d;/ G3 B/ i& V5 i1 ^; ]9 o/ |* C, S4 N
        if(fy_Exp::GetExpValue(isin, d))
3 g1 p; d4 P$ l        {
' J  Z+ T2 D+ w7 @            cout<<d<<endl;( Q7 |) [' Y9 {0 h; a& X( D$ d
        }
( @, ?. H3 I) a        else% a5 \/ b0 Z! E, x
        {. w& F+ [# \9 K: m. T0 e2 e$ ?
            cout<<"ERROR"<<endl;! }2 ^8 R6 B$ M5 u( L
        }
( o8 T- [3 _; |; L5 L    }
6 z3 E* @7 S5 G) m    return 0;
% \: g- k/ j: k$ c: Q}* d9 E# @) G0 r- S3 O. t

4 C& A/ S/ J) a2 U; ?- [) P: ]* T3 m% ^3 ^
然后编译执行就可以了(*^_^*)
( K) l- _/ c1 d; I7 M* J其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ \) Z8 n3 O/ B+ S# F# X      建议使用VC7或VC更高版本,或者使用GNU C++编译

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