返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
) j+ F+ {' s8 @! ~# ?5 \一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! y9 ~% k) z$ i* w# `! }只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* O! W2 v' w, V# \参数解释:( s% o4 U+ k0 L  I. v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! s) W+ |3 Z* o  _
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
; V; d5 ~2 A* |返回值:
0 E) a- S% g! a  S( i8 E7 S返回非0表示计算成功,0表示计算失败有错误9 o5 s3 f0 ?7 \' y: E  L

9 z9 m' _, M1 x3 }
' H  z1 a# H3 j7 p) V6 s  Z  V
, ?+ g- c% e1 ~' {" ], D程序代码: 4 W9 {, C5 U: J7 _4 s
3 N5 S. S$ J: h  e% H3 R
namespace fy_Exp{
' f' l0 R. t: z$ V0 t; Vnamespace {template <class _T>
# O2 k* r$ t' x) ^7 ]2 e1 r$ _9 sinline _T GetExpValue(_T t[], char& csym){
' @6 J& ~: q, i3 n  O    char c=csym; csym=0;$ L( j* ^+ S' L+ u- S- c3 Q
    switch(c){3 D4 _3 R: z" M6 c
    case '+':return t[0] += t[1];: ~& F( `+ z( J! X: |
    case '-':return t[0] -= t[1];' x% A0 N: G& H3 v- g, ~% A
    case '*':return t[0] *= t[1];$ |3 w: B$ S7 J: c' v
    default: return t[0] /= t[1];//case '/':$ N, k1 U. g8 W) L8 u9 k* M0 R
    }% q1 @7 S6 v( H7 `4 A# l; l
}}
- ]7 k) C; j. i9 }' B: ntemplate <class _T, class _Tstream>8 t. e  o; P/ i5 _4 S3 A* o0 l: `
/* _Tstream: inputstream, _T: get return value
* @; [' q3 N9 W( j6 W4 W* Return nonzero if get value successfully */+ s+ h6 Y* {* O+ h
int GetExpValue(_Tstream& istrin, _T& nReturn){
9 c: K; ~0 t' D5 W7 P; i    _T t[3] = {0}; //雨中飞燕之作
, S" r& x2 B& b+ l* l; h1 ]    char csym[3] = "++";
; g" n7 b# a/ S1 e2 U    int nLevel = 1, nERR = 0;1 Y- x3 o7 F( s2 w1 p* d, c0 o3 K
    if(!(istrin>>t[1]))istrin.clear();
" S/ p" I3 \# E: B    for(;;){- g$ F% I& X9 v- L4 [
        if(istrin>>csym[2]){5 |) u8 d% v5 h3 R
            switch(csym[2]){  h) j- x4 F* Z( m9 K/ a0 \
            case '(':
0 ]: `3 i& C/ P; y7 F7 ?) n                if(!csym[1]){nLevel=0x100; nERR=1;}else
: d% Q* P" w# j, J5 T) ?                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 Y7 E! |/ q2 z" f2 f+ q. Y                else{nLevel=0x100; nERR=1;}
3 U! ]8 U7 z* V9 U                break;7 s+ _4 n8 t# M
            case ')':
1 Z/ w/ g8 m1 P1 h1 x                {nLevel = 0x100;}break;
7 o* }( `& j. P, E; o. t% q            case '+':case '-':case '*':case '/':  X9 N  W5 `" M* k$ E
                {csym[nLevel++] = csym[2];}break;
2 L# j+ U: m8 n3 i: u            case ' ':case '\r':case '\n':case '\t':continue;
6 x7 t% `( Q) t/ D% `, @            default:% [) I4 E0 g' B3 d
                {nLevel=0x100; nERR=1;}7 T* Q8 k) t5 [  \. x' P1 K
            }9 v& ]2 b0 Y6 S7 q, \
            if(nLevel==0x100)break;5 F6 F6 e+ l5 t, u- a/ h
            if(nLevel&0x10 || istrin>>t[2]){
2 K- M. H0 f  H8 B3 M+ f( D/ x                nLevel &= 0xF;2 q. |: Z. P! j8 z* i
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}4 J" }1 n; [1 j" g  y# a7 `
                if(csym[1]=='*'||csym[1]=='/'){
+ u9 `; Z. P; M5 Y                    GetExpValue(t+1, csym[1]);. o7 {; y6 s( o4 L. I: J# B
                }
+ X$ b4 T! I$ m                else{
& f* W' q' O4 L! X) O* X                    GetExpValue(t, csym[0]);
7 }0 q" J# X5 K7 W                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 b+ o2 g: }6 t3 ?4 ~* |1 F
                }% v5 b+ w1 l0 j9 V
                nLevel = 1;+ U6 p( v: k" ?: {% L( U, H8 {9 X4 _1 }
            }
5 p$ x+ T1 U5 H1 ?/ l9 i( e  r( H3 a            else istrin.clear();  d) N( B9 `' c$ j: s
        }' Q8 q( y- |7 Q! B
        else{nERR = -1; break;}4 [0 e; M3 j0 _/ ^. c! g9 V
    }# |6 Z$ A3 p; i  N% H" J
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- L" I' r5 k* o; ~- a& e, u
    else nReturn=GetExpValue(t, csym[0]);% Z' a) t  y1 u; }7 x# d
    return nERR==-1?1:0;# k* i/ A" ?) ~7 c9 q. t3 `
}}
' M9 k1 [* C/ K, U1 G/ s
& _" E2 ~" x( ^9 Q- E) a# ]9 V# b4 z" v: z
/ X7 R! k4 P: ]. x7 I$ C9 N
函数模板使用示例:
6 y! L" g" A. {5 j0 l在以上那段代码的后面加上以下代码:8 s  C- I2 E: Z( D
3 `; x1 }6 J- I2 @
9 W3 \$ h$ s( p; B; o- |+ P. d: H7 C

: c7 [5 P9 b: \( v程序代码:
: |) U: C! f. ^9 P& w6 p0 I; W
: J1 V' M! S. g4 B' N* ]) B#include<strstream>
, {$ z0 P* w. E2 m0 z#include<iostream>6 W' r" I* a; x  O  @0 r
#include<string>
8 {; k" ?: A6 H: `; cusing namespace std;
8 F2 X+ p: z* M  \. `1 w0 K* Jint main(void)
7 g2 S1 j0 ]5 C" m; u+ q5 B9 W{) V1 V: I7 t  R2 j; G. H
    string s1;
) Z3 M: m. K" I. x1 v% Z9 R    while(cin>>s1)+ ]. k8 t# `9 V0 E+ Z
    {
- q1 v( K5 N+ U: J; _        istrstream isin(s1.data());: e3 C6 q6 R2 ^. C- P5 M
        double d;! [& U' k6 D; n  w1 c% `9 G
        if(fy_Exp::GetExpValue(isin, d)): ?+ @" j. A" b7 j3 o; A
        {
* _! {! F6 S, a            cout<<d<<endl;) j' B4 L! V2 j* C: E! w( x
        }7 A* d. S- n- |
        else
% E5 ^9 ?3 Z6 f4 ~% ~; f- e5 s# n" w        {
8 h% P. F. ~$ p, @            cout<<"ERROR"<<endl;% e0 Q* |, Q! ], `4 u9 k, G
        }& A) J+ |/ H- A) Z5 @5 f; ~
    }
6 z, `: K6 q) O8 z/ s" W1 m0 c4 C4 ?    return 0;/ J7 c) N% ^' F( A4 w( W. w
}& e- x, ?, x$ e' S/ X; n

3 b6 ^* }# a. P7 N2 t, t" N
+ `+ p' o& L/ @2 B) t然后编译执行就可以了(*^_^*)( ~8 a+ E6 X% y8 P0 f. `+ C
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 o3 G6 a/ @- t- H      建议使用VC7或VC更高版本,或者使用GNU C++编译

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