返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
6 e4 d" U. W9 w7 M& r% _& g/ i一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# B- }& k% u9 I只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): k) `8 @, L5 A2 m) @( D* E% R
参数解释:
5 ~4 ]1 a5 B% o9 @6 Qistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
, K" \' D9 c; R3 o/ C( H4 lnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# O5 e0 h+ B3 P7 Z! a返回值:
. ^4 W; s8 T  r' j$ z" d: g* _返回非0表示计算成功,0表示计算失败有错误' z2 L$ J2 G- G9 B$ G1 j8 x

, ^3 S, C9 F( A0 z! F- K & L  H8 D# E" ?$ e! }
' D8 V; \/ s7 C* K: N- k! E4 _
程序代码:
1 e( f. n; d1 P; S* A0 {* L7 f8 D' J. x1 ~2 ]5 I; b
namespace fy_Exp{
+ N0 H+ Z' B6 Z2 S- Dnamespace {template <class _T>
; T) G) J/ c! u/ S' N2 f+ Pinline _T GetExpValue(_T t[], char& csym){
# J$ U3 l$ a% }: r4 U' S$ J- K, _; U! _    char c=csym; csym=0;
+ H/ P8 Q9 s* M- ^    switch(c){" m/ e3 r; J: j% f* X
    case '+':return t[0] += t[1];% R" q' g, h, Y& v/ O
    case '-':return t[0] -= t[1];
" h7 a4 L3 F$ i    case '*':return t[0] *= t[1];& v) t' h2 I. k8 g. A
    default: return t[0] /= t[1];//case '/':( P1 t! l8 V9 n  d# {% q5 a1 P
    }
8 P8 V! D* W4 _% z' z}}2 Y1 r( b1 a. v1 @# k! K5 C
template <class _T, class _Tstream>
; |- _. ~. j# }# \: z0 t/* _Tstream: inputstream, _T: get return value2 \( @* T' y# G0 u! |
* Return nonzero if get value successfully */7 B/ |9 s+ T" _4 z4 C: {$ w2 E
int GetExpValue(_Tstream& istrin, _T& nReturn){
& Q; G+ z/ @3 x) x# b    _T t[3] = {0}; //雨中飞燕之作
& J3 u9 N5 ]. C% j5 l8 n0 M    char csym[3] = "++";; G3 I0 {5 p% V; S* ^2 i4 l, N
    int nLevel = 1, nERR = 0;
" F) ^$ N; g* Y/ h" F9 t! _    if(!(istrin>>t[1]))istrin.clear();! ]8 i" m) w6 h" M! Y
    for(;;){4 i" [; P* d5 a
        if(istrin>>csym[2]){( l# g) J% _0 _
            switch(csym[2]){
+ |7 r. G3 f4 x$ a- ?# W2 A( [            case '(':  w" k% P2 w9 V" G% P% S! S
                if(!csym[1]){nLevel=0x100; nERR=1;}else; P+ @6 b! @( l6 J
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 d  I5 R6 W1 U+ K) Z" g
                else{nLevel=0x100; nERR=1;}% @! D6 I0 E: p/ M
                break;
# z* s2 |, ^- }3 q0 A/ F' [1 U' e            case ')':6 T6 c; e( O" l/ f7 m
                {nLevel = 0x100;}break;
0 b# h! n' I: V, k8 B            case '+':case '-':case '*':case '/':
3 l1 K; v& t" O# ~) c3 c- R                {csym[nLevel++] = csym[2];}break;
/ v9 I( n% Z- S$ h" W            case ' ':case '\r':case '\n':case '\t':continue;
2 f$ q3 s& D1 Z/ p3 ^            default:
/ b& @3 g. V" M' r4 f/ ^                {nLevel=0x100; nERR=1;}6 T, K2 |1 w8 p6 S
            }) I# x: O  x" n: v
            if(nLevel==0x100)break;
$ o$ X: ~6 r+ J; ?0 r1 ~$ U; t* r* e            if(nLevel&0x10 || istrin>>t[2]){% B1 e, W! j+ K" ^* n5 D0 g' \$ a  `
                nLevel &= 0xF;1 f1 ?; K, i6 ^1 I1 ]4 O( ]+ F
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 B; A# z7 Z( O1 j( E+ S
                if(csym[1]=='*'||csym[1]=='/'){
) \4 q2 p9 e/ G% Q8 p& D                    GetExpValue(t+1, csym[1]);
6 ?( Q" i3 j5 R! e* s2 {4 A                }! P$ w9 I+ U$ {- l8 E3 a
                else{3 A2 N- H3 ^- w0 L* @
                    GetExpValue(t, csym[0]);
/ L" I" k/ n, l0 t3 ]2 p                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 {5 r$ j) T! f4 d  H3 }# K                }. Z& a# ?& E3 U+ s
                nLevel = 1;' C+ y/ \) i) q  h, o, u% A! b
            }
4 W3 ]+ \0 ?, B4 p/ h            else istrin.clear();# ~. V' N& ~, J6 c& c
        }
- c7 U' A; L0 u% G  M9 N' B4 U        else{nERR = -1; break;}5 a# d8 |- {9 r! ?
    }4 W9 K9 k, D" i
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 f; ?+ z. n+ q4 y2 B
    else nReturn=GetExpValue(t, csym[0]);. h6 c' i( Q4 Y; Z
    return nERR==-1?1:0;
) a2 A( {, K- u5 r8 }6 t" \}}
; t! V9 M' `4 A. G  k0 x: V7 R
# W( J9 g& U: U4 c, u9 K6 E6 F' v2 }  h: D8 b7 I& q

: ]4 z; |4 R- |; w5 k函数模板使用示例:8 G: _; F2 g7 P8 v
在以上那段代码的后面加上以下代码:2 b! v+ U0 d+ Z3 F/ e- V1 F" ~
0 d' Z* C4 \. g! {
" o$ O" ]9 A3 K* E; y# E  J
4 U1 O5 w* I* K! S1 z6 C
程序代码: ; N$ v" f+ y& ]6 Z+ ?
4 P. {( {$ k. ~- X) g& u5 i) y: E
#include<strstream>
8 F+ a! m% V: G0 |7 H/ |#include<iostream>
! J0 F! c; y; Y#include<string>- a' V/ B2 P" z% p
using namespace std;
; Y# S8 Z' J0 V, \- o& E4 A, Iint main(void)
7 N8 E. O1 a( S6 q0 m- m" ^6 ]7 z9 V{+ p. @" g# {: C. s2 ?1 ?4 }
    string s1;
+ X* |) w& {8 r3 x    while(cin>>s1)
* @; t; V$ d5 F    {
5 t7 {, R' Z# P* H) H7 U        istrstream isin(s1.data());
. R6 @; k) Y; y0 f5 o$ O$ J4 E9 I        double d;# j/ S1 y; J, `1 ], L+ |
        if(fy_Exp::GetExpValue(isin, d))3 H0 i5 ?  p: Y" f3 I" \0 }
        {
; F! a: B! ?% ]; n0 o! Q7 }# u            cout<<d<<endl;
8 h: {% J! ~+ [; v# ]        }
+ M5 Y( E8 `" U8 S) S        else4 P9 ?* p& c6 s& _3 E% ]: {
        {' D: W) E3 O* t3 y
            cout<<"ERROR"<<endl;8 M$ c$ h! }# H. |) y3 c
        }3 J& }' r# t/ F. J/ B- c& K. U
    }
: [5 Z  u$ }. q# P    return 0;* F3 z0 q- ^0 ~$ A5 y. r9 J
}
2 c2 J+ g+ E+ @# o' e* M: I" e; ^1 j
2 L0 w- Z. G4 d8 O: @
然后编译执行就可以了(*^_^*)
0 j6 p. y' o" g8 N, I) r& L其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% }  J5 {  F) l. N- T      建议使用VC7或VC更高版本,或者使用GNU C++编译

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