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

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

在9月8日那天我特意编写的,给大家分享的,
  Q1 H, l2 R' w1 V; D$ P一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, S4 R% X9 _! K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 C) }6 ?' l3 w7 t+ V! `- k
参数解释:
7 N# D0 o7 ]6 X+ ^& o" B' R: fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流# U7 B; G# `' z" u  _! `
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! G, U; a) L0 n/ U0 v# h- d" N; H
返回值:
0 Q" q8 p" u4 n/ w* z! q返回非0表示计算成功,0表示计算失败有错误
/ }8 ^% z2 \' ^4 U/ k4 w3 F# O4 B" e8 Y# y
: a+ l% P8 R  P% A6 _7 `

* r& j$ y* _8 F2 i/ g程序代码: 5 o6 }* q) @- y; ]: u& K- S  n
( ], w6 L( ~( F% g" C
namespace fy_Exp{$ y% x0 C% d# |1 o
namespace {template <class _T>
" D# i1 b9 R/ Q; `; binline _T GetExpValue(_T t[], char& csym){
0 I1 w4 {& H  j: A5 B" M    char c=csym; csym=0;
9 o1 l  [2 r3 w) s8 A    switch(c){
/ |% t, ]! ~3 {/ C/ t    case '+':return t[0] += t[1];
; M  r" _" S: l# l    case '-':return t[0] -= t[1];# B  i6 h$ w1 o1 J+ T3 f3 H+ a
    case '*':return t[0] *= t[1];
7 p+ F4 _9 k. Z0 ?* Q( X+ D1 T    default: return t[0] /= t[1];//case '/':2 k9 B8 ~0 c8 R# j* c
    }
6 t# Q1 J- h3 X* x}}
3 q& n: w- z) ?7 m2 Btemplate <class _T, class _Tstream>; C9 Y* {3 R# C% B
/* _Tstream: inputstream, _T: get return value' y1 w" V  C; \: _3 I
* Return nonzero if get value successfully */
1 d* ?# ?- [/ J* rint GetExpValue(_Tstream& istrin, _T& nReturn){1 T2 Q" ?3 l! @
    _T t[3] = {0}; //雨中飞燕之作
# a! s( g0 l& @    char csym[3] = "++";
. B# P1 T5 ~' r" A; T/ v    int nLevel = 1, nERR = 0;+ x2 m  C3 N/ C4 w/ X: c8 _
    if(!(istrin>>t[1]))istrin.clear();
- D4 h) n$ J( k$ \. U; k3 x+ A    for(;;){
$ a: y% L+ [/ f        if(istrin>>csym[2]){2 y* D/ a2 d- r- ?& }
            switch(csym[2]){0 s9 u  T9 o1 r( v* |0 X4 ?
            case '(':) x2 k) d- u2 G1 g' o
                if(!csym[1]){nLevel=0x100; nERR=1;}else
% k; |! O" x; k  |& x5 X( p                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 A7 a. L/ O. f$ m8 D
                else{nLevel=0x100; nERR=1;}
  v# C) `  w5 I3 g; y+ H% _                break;
' J- |4 S. y( `, x            case ')':
$ Y+ h: k% ?% P+ t9 \. H                {nLevel = 0x100;}break;" _: J( `( i9 c9 e/ q" }
            case '+':case '-':case '*':case '/':5 J, j) h2 e, f6 j' K2 S
                {csym[nLevel++] = csym[2];}break;/ |7 ]7 r5 B' m- W! e: m
            case ' ':case '\r':case '\n':case '\t':continue;; t, L" O/ I  ^8 E
            default:, C9 M8 G$ X' h( X( t' t" T
                {nLevel=0x100; nERR=1;}& A  R+ Z. k; `& i
            }' N# ~0 f5 D1 j* f# U/ e% W# M3 U
            if(nLevel==0x100)break;3 R0 P" |& v+ u. o- h; Z! |
            if(nLevel&0x10 || istrin>>t[2]){" y4 y/ M) R( l! [8 ^
                nLevel &= 0xF;
8 W' @; i5 I; q0 E% G! `                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; F" G! i0 g. Z$ V1 V/ _1 t
                if(csym[1]=='*'||csym[1]=='/'){& ], ~, s+ D8 n% d" v, y
                    GetExpValue(t+1, csym[1]);  q9 V8 B2 m5 Z# C" ~
                }3 D5 E4 L8 o! h* ~7 d! C1 x
                else{7 C) e) g* h+ H& b
                    GetExpValue(t, csym[0]);
9 i! U6 |. `% |5 t! |" }                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" T, i  l  Q6 d3 l                }$ V9 A/ r9 d0 ~4 `$ n
                nLevel = 1;( E5 [3 O! h3 S1 }
            }2 ], J8 b! q2 P" x5 K& n
            else istrin.clear();
* H, B" X8 _. U: c& R" G  o' V6 q        }8 ~( D- z6 V. r- ^& U
        else{nERR = -1; break;}
0 X/ V+ C+ b' z) p, M- H. c    }7 i/ D: P, h) @( J2 c' M  `
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
3 ]$ R$ \6 n% E, Q/ v3 a2 q( U    else nReturn=GetExpValue(t, csym[0]);
* I8 P( X1 ?( S6 m    return nERR==-1?1:0;
; J: d1 L/ @( ^. K. _7 v9 k}}6 w' k$ w; Z7 p( M

, X+ X, \$ _3 `; ^2 }7 s( d% s1 j8 [: u% g

/ l8 {) s' O$ K5 O5 p函数模板使用示例:
! s: X& t2 n% M* E) y7 G" d在以上那段代码的后面加上以下代码:- \) H  L/ I1 J0 R- x, _
6 U8 c  _- H' h$ ^7 e4 q

8 @% \8 |* ?" f1 _+ _3 T$ `
; ~+ M- |0 ]) ^程序代码: ) c, ~1 J0 F0 \* B( u: \

* z- |* _4 e, c! D6 j( d$ B#include<strstream>  ?! O1 E$ a; n
#include<iostream>
" ?6 i' I1 `! n  i( k#include<string>. X! `1 s: r7 X' B1 T. M  P- i7 b
using namespace std;" [) g9 }3 ~3 s5 n  G
int main(void)
6 o9 y9 ]+ _2 P5 x{
( B* y* J$ @* G1 q3 S2 k4 S/ q' u    string s1;0 H# }# {0 W9 G4 j, z' c( e- U
    while(cin>>s1)* s/ x$ G0 j0 ?# Z
    {
4 B8 Y! x3 m1 ?1 R" F        istrstream isin(s1.data());2 ^- U+ ^: U1 {3 g  c4 c0 p1 Y
        double d;: }4 c9 W8 s$ B- r7 a8 j/ J7 d6 K$ J
        if(fy_Exp::GetExpValue(isin, d))
+ _( T; w, ~8 e8 C        {
& E6 M) {. ?* w3 V2 x            cout<<d<<endl;5 K4 ~9 D" `" e0 c2 H9 Z* F
        }. g( _- E) e& k6 E
        else# u/ H8 |$ |; k$ c4 O. `, S6 I
        {2 a' H! Q$ S$ h
            cout<<"ERROR"<<endl;3 K* J' S" {0 l* S
        }
& G6 e) b! z) T: F' Y# @8 w0 Y) d# K    }0 c  Q" B. |% y8 w2 j  i8 P
    return 0;0 p* o/ R: K( ?% |( [3 w
}7 a+ L- D9 p6 ?" I- g& i" }0 l# L2 s* y
) R- {  r6 S' w" `0 K

- ^2 T1 K2 ?6 e然后编译执行就可以了(*^_^*), x* H& g4 ~. a9 [4 j7 E9 n
其它:TC++上一定编译错误,不保证在VC6上也能通过编译* I  n3 N% i7 \8 C
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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