获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,8 ]( O  U8 @' R0 [$ l' e
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" R% {1 @+ I7 o# H- x; U% }
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. ]5 |3 |5 f# M/ c5 Z1 u参数解释:/ }6 b* x- l- k5 ?# `
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' v- y2 S- D" f0 w) F
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( p& Q/ w; S! {: Z! S/ {) W% u$ {1 [
返回值:
1 u2 G" f& Y) A  W6 N) H) r- a' r返回非0表示计算成功,0表示计算失败有错误; I5 c- r* M* |$ e

2 a0 y# C6 _* \ 6 |/ h( a$ u+ t/ L

" M- {' f1 l( m' x8 R# j5 E程序代码: * ]5 ^2 }( B- Q

0 t. U3 M2 x' {+ k6 a1 Ynamespace fy_Exp{
: @. e! d: P1 u. D/ Wnamespace {template <class _T>  ^* m8 m9 W* y/ G+ x( U
inline _T GetExpValue(_T t[], char& csym){
, j2 b6 z; l; C( K7 ~* z- u+ [* B    char c=csym; csym=0;
4 G/ c  q/ l5 S: v    switch(c){" \3 Z4 O& L' U) V( l5 C4 V# q
    case '+':return t[0] += t[1];
) f0 x% I, O5 @; D% H5 v. A    case '-':return t[0] -= t[1];
& D5 w* z) Z# L* w3 q4 ^    case '*':return t[0] *= t[1];
- |- U8 h$ Y) v" I    default: return t[0] /= t[1];//case '/':
. {. t1 x" G: }% F- K; P% P    }
1 K1 c9 u/ b" X1 W}}, x! M; U( N# S( `
template <class _T, class _Tstream>
  H6 x: T5 \* i/* _Tstream: inputstream, _T: get return value0 t' }7 M6 Z" ^
* Return nonzero if get value successfully */; z' G+ |, x( G5 a3 x. m" x. v
int GetExpValue(_Tstream& istrin, _T& nReturn){
, h) O5 [9 l1 D5 C" a6 _    _T t[3] = {0}; //雨中飞燕之作  P; u( b; c- ]6 p
    char csym[3] = "++";( |# A4 V! ^" D0 O
    int nLevel = 1, nERR = 0;
2 ]; S8 t! [! b; o    if(!(istrin>>t[1]))istrin.clear();
. B) T; S0 G8 y% h    for(;;){8 ]- ?9 E3 \* L/ L
        if(istrin>>csym[2]){
( d3 R* g+ q( q/ w" E            switch(csym[2]){
1 u0 G" O! w7 a' {, F: w            case '(':
& q- Y/ E2 {7 H+ v" I; S! E" c                if(!csym[1]){nLevel=0x100; nERR=1;}else) a  _4 M9 a" H* T: z5 |
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 ~) W$ t7 ^: t0 u- v                else{nLevel=0x100; nERR=1;}
% B& h2 l) e) N                break;5 w) i3 P& }6 A% w" L
            case ')':2 g5 S5 S) |5 G
                {nLevel = 0x100;}break;  J# h/ D# {& Q( S3 ^
            case '+':case '-':case '*':case '/':
+ s6 M4 e( s9 j' Z$ O                {csym[nLevel++] = csym[2];}break;
; f& e7 P- u6 ^. ?            case ' ':case '\r':case '\n':case '\t':continue;
0 K( F% F0 Y' P            default:
8 J! n* F" u+ `% f6 v4 i                {nLevel=0x100; nERR=1;}. ?" e5 @2 t6 k6 d' F6 N1 Q
            }3 S+ I1 E. @* b, N' @% E2 e
            if(nLevel==0x100)break;
6 o' a% S& E% B" _/ d. m0 J            if(nLevel&0x10 || istrin>>t[2]){) C% K2 N( r/ Q# f
                nLevel &= 0xF;* O3 \) `$ [) _4 K8 v5 U- q
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 `! D8 P. r) I" R
                if(csym[1]=='*'||csym[1]=='/'){7 T$ b  Y+ g( t( H' k0 K) A
                    GetExpValue(t+1, csym[1]);
' _- V0 t. ]$ i: O+ e                }. b( |; G* @# [1 d3 ~6 a2 f: ]
                else{% i$ B! B4 K; Q- v
                    GetExpValue(t, csym[0]);
: j( y4 z$ w% x* H" A& k7 f                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, ^9 T& Q0 F# v6 ~7 \                }
5 P$ k# t1 J, S2 ?% n                nLevel = 1;
6 W, z' N8 H# `, N0 [/ `            }
& K9 s$ `( r1 I( S# \2 W8 ]            else istrin.clear();
: n4 I9 f  E5 Y1 Z* M# U. J+ W' n        }2 E' L" P3 i# F- N  T% N0 J
        else{nERR = -1; break;}1 U" P  W) O  ?# e6 f8 k
    }
/ g5 U: Y7 K% x+ Z" n2 t    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: f/ Z& O3 @, O3 i2 G5 t    else nReturn=GetExpValue(t, csym[0]);
+ z/ G2 v0 c7 U. o# `3 S& Q* D    return nERR==-1?1:0;
! u( Z( t' O: D2 _% A# |3 S% Y}}
0 r! P5 a; d. H" `$ }2 P9 S6 [% c/ ~- u5 ^2 ]
+ ?7 |0 J% p* F4 i3 j4 F9 [

1 L2 [% w4 \! Q% J函数模板使用示例:
2 @7 w+ P( T; j9 U; s在以上那段代码的后面加上以下代码:
  j+ g9 d* Q1 b! y) H1 {* i9 v' t
5 D; ~% k1 s8 m" `& U0 ~7 [$ L 5 c2 ]' p# j1 e: w0 k9 Q: {

1 @+ Z$ X& K7 b/ _  V9 w0 m: S7 G! f程序代码: , ^6 s; [! z9 D9 q: V* D

4 u& T4 U3 c% r$ ]: f#include<strstream>
0 S5 U+ \  O+ J6 u0 f7 k#include<iostream>8 L# f0 T8 r; j- G. a& F% T2 C8 c& B
#include<string>4 s2 h( {, q6 C1 S
using namespace std;$ T& M+ z4 z- q  ^$ q8 g9 |
int main(void)
/ I, P) X7 _5 ?{5 T: h. d3 d3 J+ M4 W6 H
    string s1;  N5 d" ^0 P* v
    while(cin>>s1): B4 y, T3 P) ^) f. @
    {
* \$ a, H9 y! n$ `        istrstream isin(s1.data());5 K" R9 H; A: ?: A6 u* b0 l
        double d;
$ }; y3 s7 z; Q) d% M5 a        if(fy_Exp::GetExpValue(isin, d))/ a8 ^7 C- \# A  m/ C. S; i6 G
        {5 C9 G" t/ W! V9 i, K! p
            cout<<d<<endl;8 ~' Y, B# x) D8 U
        }( ~4 j1 U  h0 z  c
        else
& e5 N4 r+ d8 L6 k* f; O; q4 v2 J        {/ t+ i7 V  ~* \/ L
            cout<<"ERROR"<<endl;
5 _; {7 Y! v; e% ?# O        }
" m2 j+ C% N: h. f    }
8 q: s; n7 p9 O! ]- ?: F9 |    return 0;
0 W0 L# m+ c! {$ y}
% J& g. L6 c$ b
) \) i2 x+ J4 I, X: g
8 ]; c& J. e) u7 j8 U2 C然后编译执行就可以了(*^_^*)
" `4 i# r$ w4 D( s" Q0 ?1 @其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; u" J$ r. J/ `& s3 M      建议使用VC7或VC更高版本,或者使用GNU C++编译

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