返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
6 H4 G$ _2 @) R! m3 d% S0 `一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 ]/ A: _) M9 `( h
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, h, P( [( P$ d6 [4 h& ]参数解释:7 @( k# w, ?) z1 k1 n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 M" S& z! |1 k- m. }1 B9 \nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! m5 Y/ n' u+ ~: |* F/ b
返回值:" `( L1 g( g$ D9 w8 |1 |. m
返回非0表示计算成功,0表示计算失败有错误
6 K3 T8 b% g) S7 h. ~6 B9 {/ L/ Q/ h) A6 T" C: I

, V% ^. [/ k0 w
& [% ]4 |; X: h9 [4 ~程序代码: - m2 K" G. R, c* {# ?; [
# ?+ _6 b4 R: W' d
namespace fy_Exp{
& A& P, T4 J. @4 j' ]namespace {template <class _T>: Y" K* i  Y# n1 [6 k
inline _T GetExpValue(_T t[], char& csym){0 z/ L5 v  t& j; i& b# K
    char c=csym; csym=0;
* `) d* F% {: m# t. f8 w* O    switch(c){
8 Y) i& ~0 m3 w+ j* x    case '+':return t[0] += t[1];) a9 c9 ?) |  ~4 j
    case '-':return t[0] -= t[1];
: s# _7 m* `% e9 U- t3 V8 c6 V    case '*':return t[0] *= t[1];
) s- c; o( S+ S    default: return t[0] /= t[1];//case '/':, V5 {; ^& \7 V+ ~/ k8 A
    }
' d" \" a& q: l5 n" b' M: R( l: @}}8 P. J5 O9 q! K
template <class _T, class _Tstream>
4 }3 }' W6 C6 s# D6 ^; O6 T% ]/* _Tstream: inputstream, _T: get return value
8 A/ x% U. \$ {) z8 c* Return nonzero if get value successfully */
5 O/ T2 p) }: {5 L- gint GetExpValue(_Tstream& istrin, _T& nReturn){
  ^) W5 ?5 W+ v) E; I    _T t[3] = {0}; //雨中飞燕之作
1 m7 V4 y& p3 q2 j    char csym[3] = "++";
' z" B, o- [" t0 L' d    int nLevel = 1, nERR = 0;
9 z: @7 B' `6 V8 B& ^, E    if(!(istrin>>t[1]))istrin.clear();
8 k* l. ~( L' P5 u    for(;;){1 t/ k5 j( i" b2 [* E) @/ D
        if(istrin>>csym[2]){/ p4 O" E5 f/ V# b1 t3 d2 C* W
            switch(csym[2]){
* _" i8 {5 N3 H- D0 V# t            case '(':2 ?- T8 G% p6 p& s) `
                if(!csym[1]){nLevel=0x100; nERR=1;}else( b  z( o. I6 A4 ~) D
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' O8 B: Z3 p1 V                else{nLevel=0x100; nERR=1;}
$ o  O' b. \. u1 Y                break;
. e4 N9 Z. ^, G0 {( S            case ')':4 k, H0 l0 c5 u, F3 u$ m- T
                {nLevel = 0x100;}break;) ]7 K- E. e6 d5 P
            case '+':case '-':case '*':case '/':* B( K1 o( U5 v4 X
                {csym[nLevel++] = csym[2];}break;$ C/ K& G2 \; @
            case ' ':case '\r':case '\n':case '\t':continue;7 _& w% N1 `( g# g* R, D
            default:- R5 X4 O- M: ~+ d) i2 B5 p0 Z; x- H
                {nLevel=0x100; nERR=1;}
4 o  b6 W( F$ I1 j% Z( ~$ Y5 L4 [            }, L: H' w6 z% D. q$ J# `
            if(nLevel==0x100)break;  y+ Y" C5 \* I- ?3 ?# p
            if(nLevel&0x10 || istrin>>t[2]){
( S% h6 |: @( i8 s( \: u                nLevel &= 0xF;1 e1 i% K* s  [' P
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" ]) e5 Z* G2 @                if(csym[1]=='*'||csym[1]=='/'){% q- p" i: X/ V8 d0 P
                    GetExpValue(t+1, csym[1]);
5 b& X( d! }6 v                }
( |5 a, I* W+ D# a. ~, E                else{
9 U9 f, l) R/ B9 Z+ Q- V$ o                    GetExpValue(t, csym[0]);
1 Z# h2 V$ [9 t/ {2 V, i                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;2 F8 k, d) [% }- l& R) V
                }
; c8 i! l% z! R# e: J                nLevel = 1;
0 b: I5 f  `$ z- L7 a! R            }& ?. d) w& d, n% B5 ?3 V# X
            else istrin.clear();5 d4 [# D( A. [- `
        }0 `6 q/ k. k( k, h$ {& v% i
        else{nERR = -1; break;}
- T: q6 l3 x$ n0 v4 k6 R; O    }
9 V& z$ ]+ v: i    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ k/ \' I1 ]# S5 E5 m4 z% d5 X' w4 W
    else nReturn=GetExpValue(t, csym[0]);
$ ^+ r0 |1 q$ n, f$ C" ~    return nERR==-1?1:0;
/ `3 h, K  a% ^' ]2 z( ~; C0 U}}& ]- J) A% x  a* P! r2 t
$ N. C6 W! E8 b
4 A- H& {" Y8 q
- z8 @3 L: \, |; d
函数模板使用示例:
/ a# q0 H  x5 m* r在以上那段代码的后面加上以下代码:& B& k" `& N& v" c+ ?/ T

; C; V. s1 x# ^9 c0 d( p
4 h& U. L8 G1 |) L% H6 k
- P& c" `9 j/ p' v程序代码:
/ b* l+ u; [0 I# Z2 \# i
+ @- R3 i5 Y% `) R" O# k# }" z  X0 y#include<strstream>; M0 V) e: E6 e9 ^2 ~2 a$ |* A
#include<iostream>
9 ^6 p. ^+ A, f8 }. h' c#include<string>
+ M3 t3 {/ ^6 m+ f, @7 {using namespace std;
: R$ {) F# u, e3 ^0 r5 k4 T, [int main(void)/ P' _6 z* w3 L' y  Z7 h: c
{/ m8 C7 G( E- `! s; S5 s8 p
    string s1;2 M% f$ w9 P/ X; Q  v
    while(cin>>s1)4 `* |* u# A2 H" {" s: Y6 r
    {( B8 s, b2 W1 v4 I$ ?
        istrstream isin(s1.data());. U& c( y* v, l/ b7 ~* p: _3 @2 g
        double d;
& V9 ]7 U8 t5 e- R* w6 @" Z        if(fy_Exp::GetExpValue(isin, d)); Z3 ^: Y4 M" Z7 G# \$ N
        {
+ m7 k, k, C# d0 K! s            cout<<d<<endl;; d6 B4 i' ~( t) C1 k- c; U
        }) F0 v' H/ ~& Y
        else
: E) j% L$ [- |+ n        {
0 ~% n7 e! r# d            cout<<"ERROR"<<endl;: K& ~- J8 |8 l1 ?0 K
        }- q; C$ ^& @2 S  z# b
    }
3 [; _- w1 K2 u1 L( W7 k1 i6 G    return 0;8 o0 P- B3 M$ s/ B  V
}+ r7 Y/ N* ]% _% B
' w( r& I9 {" a) C  k" z$ D

( t6 r9 T0 o# w9 j& A5 b) P: H然后编译执行就可以了(*^_^*)
- Y( H/ B8 \. V& g2 N. D6 m( L0 L其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 M7 d$ U" t* a$ }
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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