返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,9 A* Q* c( W3 r$ U
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& o1 r2 s& p6 s( F; I只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ N( ]3 I" d- L4 ]! i5 S& I
参数解释:% ]* p4 n5 A" m: s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
+ B" H% G! f6 s! e8 YnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' ^- F6 v7 E& n- f8 H% H
返回值:
2 {, o- }8 ]* R$ }( D/ Q4 o返回非0表示计算成功,0表示计算失败有错误
' z* c9 N7 G. B# c0 D- n6 D5 X, H) @2 _4 D* f& R6 n, f+ q
- Z5 {# o4 \  f# r2 `
* }& A0 w6 r: i. P3 {
程序代码: ( \7 \& a" O( d8 {; r& G, Z) F

" P6 Z% ?; \0 w" @namespace fy_Exp{) |& u. m( M# n' T- f, s$ v! L
namespace {template <class _T>' ?2 M. q& f+ W0 S( Q/ g
inline _T GetExpValue(_T t[], char& csym){; A, O) _1 R" W) ~
    char c=csym; csym=0;
  ^( K& e9 B0 p6 j7 [' Q    switch(c){
0 v& B( d+ ]2 V& S0 f2 i1 e# s    case '+':return t[0] += t[1];7 b0 `1 L/ Y9 R4 n
    case '-':return t[0] -= t[1];
! `9 F, B& X8 J    case '*':return t[0] *= t[1];' q& ?4 F# K4 f) x8 @
    default: return t[0] /= t[1];//case '/':
4 {  L( z: q5 {, q& n    }
  @) q0 t5 v1 O" ?# L) ~  y! h}}
$ j2 C& q( o$ ]* qtemplate <class _T, class _Tstream>
* j! b5 ?1 r. x; k/* _Tstream: inputstream, _T: get return value
- p8 r/ S+ }  u0 P! |; [: ?- Z* Return nonzero if get value successfully *// K, ]& c& L7 B% _1 z
int GetExpValue(_Tstream& istrin, _T& nReturn){
) E; M7 k% x& \% l- w1 Q    _T t[3] = {0}; //雨中飞燕之作* {( T* H  U: `) ^
    char csym[3] = "++";
! G+ r- o. j7 Q    int nLevel = 1, nERR = 0;8 h% J, b( s1 m7 j# l' @% j
    if(!(istrin>>t[1]))istrin.clear();" B; o7 z1 }, Z  J. `
    for(;;){  V- ~( s2 n: ^, O' _
        if(istrin>>csym[2]){
, m5 A6 X6 _7 l! d1 Y0 L& a            switch(csym[2]){. u4 |$ H# J( d) Q
            case '(':, i8 Y# c$ t# H
                if(!csym[1]){nLevel=0x100; nERR=1;}else
# {- M6 A* u7 Y4 l- g9 G                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ j  ^6 K+ S1 e' M2 w                else{nLevel=0x100; nERR=1;}
- q8 m4 Z4 }0 N0 Q! l$ q* l* S                break;
8 X6 p* d8 K3 I2 X" M0 v- O            case ')':
9 G1 g! @+ h- c! H+ ]- e# A                {nLevel = 0x100;}break;5 @! p- D" V4 B
            case '+':case '-':case '*':case '/':+ Q( o  S3 G7 r* f
                {csym[nLevel++] = csym[2];}break;
; z# H. A7 q" S; j            case ' ':case '\r':case '\n':case '\t':continue;" x1 V& X7 m( y' {9 L9 i
            default:
8 \- P! S+ |0 E/ e. C4 x                {nLevel=0x100; nERR=1;}2 R* Y+ i# ~0 U" o& Y% N2 P2 j, o
            }
. x" }/ C/ e* \: e3 {8 D            if(nLevel==0x100)break;
  `/ m. a6 E! g( ^  b/ g7 Z; O            if(nLevel&0x10 || istrin>>t[2]){
3 N* j" ?. O) C1 \+ ^0 }& s) ~                nLevel &= 0xF;! G6 X0 T+ X. ]6 F
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, F& F  Y/ z; a' `% v* D
                if(csym[1]=='*'||csym[1]=='/'){; `, ~8 h9 o/ ~7 }* j3 Y+ J
                    GetExpValue(t+1, csym[1]);$ M% n; u7 J6 J1 ]; T! B2 _
                }
0 s2 x" B+ Z0 a( Z/ I9 d                else{  T& A) U- H" \8 T- t( k8 L( z
                    GetExpValue(t, csym[0]);: x" Q9 W2 N& z$ ]) J
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 a) l5 w0 {# c* x# f! c
                }, ~- @, o( H, y+ [+ x/ q1 V
                nLevel = 1;
, T9 u) ], G) E4 Y0 z& ?. ~            }6 V* V* ~5 m! \1 j4 V3 J4 F8 }
            else istrin.clear();
, L* ?; }& ?' b  Q: Q        }
0 R* M/ ~! |* W( B        else{nERR = -1; break;}
* N! \# s, F3 i, c0 D( @, Y. u' b    }
5 I- A; C$ z3 n7 j    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
3 p4 ]8 h/ `/ @% e    else nReturn=GetExpValue(t, csym[0]);; q" g2 y- \. ~( q% m5 Y: D) G
    return nERR==-1?1:0;8 F; n' e- O1 f. l8 X  H
}}/ A9 ]2 n" p' h6 I/ \% k: g
% v3 O/ p9 s5 A& @# X$ o5 u7 e

* J, ^  l: a" g# H4 V6 x& P
4 L) O5 h) c2 D% ?5 c" w函数模板使用示例:! [: X% e7 `; X4 m2 ?
在以上那段代码的后面加上以下代码:
- H; s2 }4 {) o& ~/ G- F) R$ H6 L+ P2 R" L7 B

' c4 A( B- B# t% h: N; T
$ F5 o2 a2 V8 R% H! B- z* q9 w  u6 z程序代码: & d4 E3 W! f, d

" z: F, T' d& |+ Z$ z: q#include<strstream>! P  ~8 B3 N2 o" p& V
#include<iostream>
! ^# \  ^( n4 ~; v#include<string>: z5 y/ z0 N$ X; ?9 _8 {" C
using namespace std;
; c! X5 y. @# h: Jint main(void)
0 O1 v. y: K3 b{
$ O0 D$ W: n/ _    string s1;
' X; e; i7 Q. p/ a7 \    while(cin>>s1)
1 m6 |9 I5 B" U4 P    {# u+ }: ^( B. [& l& w5 Z
        istrstream isin(s1.data());
2 V% z( f, N" ~# G        double d;
: H0 y  S* C& y# l* z( u+ H        if(fy_Exp::GetExpValue(isin, d))
1 C; C* O" v6 T4 _! Y& ?        {* l4 E6 A- p. T( W' |6 W
            cout<<d<<endl;7 a0 L3 B  F- y8 p! Z" P
        }
6 e2 Q6 \' H, {        else
* X# F! M2 _3 l% i- n3 f* y7 X0 D        {
# o: k6 U. o0 R            cout<<"ERROR"<<endl;
; P4 [7 \- G; R9 k9 W  ~7 O) `9 `        }
5 ^- j) j6 H/ }    }/ M+ s* K: l2 s( C
    return 0;
. x+ l3 w/ }. A3 f  c}
) r$ F5 G, A" t# q; c# s/ u( U7 A& N# x

: ^! {" {  Z8 Y然后编译执行就可以了(*^_^*)" H; q4 e1 G* {  W
其它:TC++上一定编译错误,不保证在VC6上也能通过编译( m3 {( \& {, a, G% ~
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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