返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
( _# {6 o3 F7 J一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
  @% O, f- M. L6 Q* z: Y1 R# t只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ N& n4 q3 e$ h参数解释:
. V# |, H- H* e; m( c" ^istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" n0 D$ R4 q5 @$ ynReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定$ e( h% n4 v' i4 Q% }! P: X* `4 n
返回值:
) G- ~$ _, q' h$ A/ W: B1 v; l返回非0表示计算成功,0表示计算失败有错误! c7 U& [1 K0 w! u

) S$ q9 u0 ^& V# \7 L$ k $ s8 X  x! X2 I" [9 @. |

+ D4 l2 [- r' V1 b& D/ a程序代码:
( o/ _9 T5 f5 q+ G: P" d$ B5 m% d# j. G$ V
namespace fy_Exp{
5 r6 W, s: c" @+ w0 vnamespace {template <class _T>
4 t. X2 K8 V7 P! R# n. c$ ainline _T GetExpValue(_T t[], char& csym){
/ S& H. V. V, V4 }/ O6 Q6 R    char c=csym; csym=0;' @9 `3 S4 ^* ?, Y% D  k& N
    switch(c){
' b4 p9 o3 ]0 }/ M5 p$ |    case '+':return t[0] += t[1];/ a2 R3 q% v" }8 j
    case '-':return t[0] -= t[1];# E2 O# {: \4 |; X7 o" }
    case '*':return t[0] *= t[1];6 R' `0 ?  Y5 N+ x9 O( D+ |
    default: return t[0] /= t[1];//case '/':/ A1 ?* h6 o9 D. [2 D% X4 K
    }0 v* C( _& B2 r; E8 f
}}; O6 o( S* ?2 C9 w  t! W0 j
template <class _T, class _Tstream>' K8 h+ D2 s( b6 v: K/ Q2 Z
/* _Tstream: inputstream, _T: get return value
8 ]" g* U: b/ P- o8 j$ q* Return nonzero if get value successfully */, w2 ?; R* w  m7 i
int GetExpValue(_Tstream& istrin, _T& nReturn){2 a8 Q! L# ^! C' Y+ i, s% g5 M7 {
    _T t[3] = {0}; //雨中飞燕之作1 }0 B8 q5 f  [4 _+ P, ~2 S
    char csym[3] = "++";
; ]  X" f7 E- A. m% f4 G    int nLevel = 1, nERR = 0;
! ?; y- @2 b# \/ r& n    if(!(istrin>>t[1]))istrin.clear();* B! s# G3 Z5 u) L0 @
    for(;;){
5 C: J" W0 T  V2 n) Z; r        if(istrin>>csym[2]){
$ E: D) O& u/ A; i            switch(csym[2]){5 k/ m9 _2 c3 S( n3 M
            case '(':
3 R5 X/ E$ B1 `9 }0 A( r                if(!csym[1]){nLevel=0x100; nERR=1;}else
# W6 c+ z# m/ o- H; i* n$ H8 e) f                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% ?  V8 p6 ~+ V4 T
                else{nLevel=0x100; nERR=1;}
4 i& {( u" i; f                break;3 R2 ]$ C5 f, n, T8 a
            case ')':+ v7 \) J4 q& o( H
                {nLevel = 0x100;}break;
5 p0 y% G/ E/ e0 _- \, p$ ]            case '+':case '-':case '*':case '/':/ l! v# W: j& y5 J, J) i
                {csym[nLevel++] = csym[2];}break;
1 D4 J+ {) }. a7 X: l3 n            case ' ':case '\r':case '\n':case '\t':continue;" `% m, x2 J* N- N" V2 l% b
            default:
3 h; S! W( @6 D9 d; D                {nLevel=0x100; nERR=1;}
0 _! `& V/ u5 U7 U            }, ?0 L5 ~$ a3 w# p- t. ]' N: z
            if(nLevel==0x100)break;
! b' H7 V/ n" Q5 U0 F( {5 Z# W            if(nLevel&0x10 || istrin>>t[2]){" f6 E2 b: x3 Q
                nLevel &= 0xF;
2 b6 r% o0 }' V, N1 J, n$ z& n8 ?                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}" d* [. W8 W$ R9 M
                if(csym[1]=='*'||csym[1]=='/'){# I/ U& y7 \  i+ }+ a/ S+ F/ x
                    GetExpValue(t+1, csym[1]);
( I4 [8 A( Q& T( e6 T  q4 s9 C0 `                }
' k. N7 M. x3 z7 f                else{7 I- J' F  R) `$ ?. a6 D$ e
                    GetExpValue(t, csym[0]);
/ I% j0 H9 F: P# l7 |+ A/ U" n. f                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
. J& k$ u8 B- Y5 v; }                }8 K0 u; y) R& f9 p, B( Z1 r7 B
                nLevel = 1;
5 \* m& b* Y5 `; D, @            }
# `; O4 ~& x: ~, P) R            else istrin.clear();: B' \- N+ @  O6 O0 ]8 p
        }) ~/ v2 @# F/ M2 ]& h
        else{nERR = -1; break;}
8 T4 ?- u8 B$ A: M+ @    }/ Y* d. n- Z$ k1 ~7 x! e8 ]7 ?, s0 q
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& G. M* p" a) x& c! |! {
    else nReturn=GetExpValue(t, csym[0]);
4 E! p) a0 D! r& {    return nERR==-1?1:0;
; M1 V, s' v, ]+ h1 s& S- A}}
/ O0 g  }* `( e! }" |
. s7 Z7 B. R7 Z" V0 L8 W2 ]+ f; ?' s3 \2 }* y

" z/ c7 y, A6 k函数模板使用示例:
) Q5 [# v0 Y! h在以上那段代码的后面加上以下代码:1 d8 \# S: Q5 f" n" _

3 P7 T. H: o2 c8 I6 u $ O" h" z2 A3 ?3 ]% x
2 J  a4 F' w8 x1 _2 p( [4 p# E( Q, f# n
程序代码:
2 \+ J7 _3 a. F
9 m. M; H* w8 _0 L#include<strstream>
$ \1 T1 R" R2 T3 m- p9 l#include<iostream>
3 m: w/ h9 c5 C) b: o#include<string>
* [) o0 `( G* B+ Husing namespace std;* t- E6 f3 `6 P3 W" P" E. Z
int main(void)
. n! R8 X; r# T% a3 o3 e; Z7 A, X{
8 p; g2 |0 B+ w& c  P% v( d    string s1;
, c: V: z0 ~8 h  Z    while(cin>>s1)
- h; N+ V" s) U( g7 f6 m9 j    {
- X2 B9 g6 T, J2 t& L8 L        istrstream isin(s1.data());
( u& p- V/ r% h- R. v0 g        double d;8 P: |8 m* L7 P* T( s% t7 T
        if(fy_Exp::GetExpValue(isin, d))
* f1 H( d. ]  W        {
0 K+ b6 L: }# X            cout<<d<<endl;
, F7 c* ~/ M0 ?: |, ?- ?4 H        }
% H) y/ ?; z+ X        else1 z& C5 A; x) w: u+ ?2 i5 T
        {+ ~6 S5 E) t9 Y% ~6 p# n
            cout<<"ERROR"<<endl;
! I" h4 o9 x! J, N& M1 r$ x        }
- ]/ M' R; H3 p5 ]1 Q& U% i' q- {9 o    }1 g' o1 T: C3 p8 B
    return 0;5 Z! W! ]4 G* P/ \
}
/ s( n6 n( W; a+ a) ?( Q$ }) ^
* B% @7 T& g7 f0 m. b% N. d
* T1 M4 j" R/ v0 u; n然后编译执行就可以了(*^_^*)5 j, O. x5 G! h, z
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( Y8 j1 P) l  q1 `7 ]# M0 Z      建议使用VC7或VC更高版本,或者使用GNU C++编译

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