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

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

在9月8日那天我特意编写的,给大家分享的,
5 J: o7 x0 E: C0 i- L一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' J3 p7 G/ z- S2 g* w! C# Z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! B3 W/ R9 R2 c' r* k8 I1 I' y6 ^# G参数解释:; B! f6 }+ a% b7 E% i* c2 I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
  F! [; R# h2 e: Z+ YnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' P9 {6 K% ]0 `& F$ u# a
返回值:. \& s* {: _$ O, ?) W+ g- v) Z
返回非0表示计算成功,0表示计算失败有错误
/ F6 f0 O1 F) k' g
  |2 y# t. ^# U8 p& R ' G5 v, C- g; t% v& h/ w; p

' r9 l% g+ I- [- J! {6 x! `) M5 O程序代码:
9 C" H, @8 ^) J/ |3 c! [2 `: o$ m; s6 B6 P3 s
namespace fy_Exp{
$ q) m4 f2 h: E9 P7 K, J$ {4 ~5 l) _& Knamespace {template <class _T>7 D; M9 L3 X  G: r
inline _T GetExpValue(_T t[], char& csym){! k! B7 s; q" O  ?, A
    char c=csym; csym=0;
/ [+ |1 v2 U% ^! H    switch(c){0 ^$ r6 b! `0 C
    case '+':return t[0] += t[1];$ M  ~- a% X7 b, f  i2 a; d
    case '-':return t[0] -= t[1];
7 v0 F3 s; Y2 A' B' b* F    case '*':return t[0] *= t[1];
) @6 s2 _3 {" g7 G8 u    default: return t[0] /= t[1];//case '/':
) l/ M* ?9 S" E' T8 d( ]6 a( [    }
4 u8 T1 A$ h8 X% u& |: v}}: T, X/ v8 y# ~. C
template <class _T, class _Tstream>
" Z3 V2 [( W9 v6 Y1 L4 {/* _Tstream: inputstream, _T: get return value
0 @+ S6 |7 d7 N* Return nonzero if get value successfully */3 R# p9 x4 d$ C! Z) h4 l; U
int GetExpValue(_Tstream& istrin, _T& nReturn){+ G5 b, x9 q  }# ]5 ?; N
    _T t[3] = {0}; //雨中飞燕之作& h4 q3 E2 d$ P. ?) u
    char csym[3] = "++";8 L' g, ^4 S( J* e; i. T6 y
    int nLevel = 1, nERR = 0;: V, I2 X2 x0 M' L1 N1 W; [
    if(!(istrin>>t[1]))istrin.clear();
4 k" }4 [4 d  e5 b; s* J    for(;;){
+ ]( x( B" j  Z( d        if(istrin>>csym[2]){
; }5 Z9 k  y6 J9 g1 }            switch(csym[2]){
# i" M, h; i2 f& u5 G            case '(':- C  n3 o$ {" Y$ C0 u+ O
                if(!csym[1]){nLevel=0x100; nERR=1;}else# z; {$ _( q. m0 e1 t/ Z! F1 m4 s
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- @6 y  d  H" a
                else{nLevel=0x100; nERR=1;}8 x- j8 r  F2 ]4 V3 I" p
                break;
: h3 b# S9 P% E% V! Z. |            case ')':; p9 U* F; x! z" z
                {nLevel = 0x100;}break;; g5 m! ?- V6 C: T$ f! w
            case '+':case '-':case '*':case '/':3 E( h5 @2 K% D
                {csym[nLevel++] = csym[2];}break;& y2 U# M" n" M7 A/ B; B, w0 z' H
            case ' ':case '\r':case '\n':case '\t':continue;
- w9 s0 Q) V  y) n: I+ t            default:( ~4 ~: |1 Z/ Z; z
                {nLevel=0x100; nERR=1;}
, v7 I/ b: N/ k. Y            }
' ?) @( O2 w+ Q' c( Q" ~2 h            if(nLevel==0x100)break;
! {! X. q; Q: j3 n: u; r            if(nLevel&0x10 || istrin>>t[2]){) K$ R; S; b' y. h( B0 Y
                nLevel &= 0xF;
/ k' `) A* C8 @$ c4 K3 j                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( x) y: D" J* U) I' p* E                if(csym[1]=='*'||csym[1]=='/'){9 K9 r3 C2 Z9 S( f" o0 N! |$ v  l, Z1 t
                    GetExpValue(t+1, csym[1]);5 [: b! n. j  O$ i' }6 m1 z( ?2 r
                }9 g# T0 \2 E0 j
                else{
& i- _3 E" j# D- I. ]& @                    GetExpValue(t, csym[0]);7 j% w" ]. ^9 Q1 f, L/ W8 d
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! L3 ^% k* x5 w: V8 ]- a: S$ l; J                }
2 R+ E! \$ n" S  `/ @: }                nLevel = 1;
+ a' I6 p, @6 j6 n3 c' H            }
4 ^( t& k, O, Z6 k2 v  |" e            else istrin.clear();( K3 \) `" S2 q9 @3 ~) @
        }
4 j9 s/ j' N! f6 C- ^( A) Z: E        else{nERR = -1; break;}+ K+ U) Y. h# c
    }% _2 A; k" _  Y: Q$ t
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 @. D2 i/ k: ^* g0 k    else nReturn=GetExpValue(t, csym[0]);
, e- y( A8 D3 n    return nERR==-1?1:0;
8 ?2 a- V- F# g5 p3 c2 f}}
4 H% ~4 S- S8 t% G* c7 s
8 w( p7 ]! Q7 n0 p- ^  o7 W. T2 d: v+ K
+ F% H6 a0 t* ^2 {
函数模板使用示例:
. ~5 _% r0 y* P( K% S, I- d在以上那段代码的后面加上以下代码:. o$ C2 j$ D, ~, B5 X; s8 r
0 F, \5 W) e" E1 I

8 j$ G1 u( \9 a7 b+ W& b5 H8 I
, {7 c. H& s2 i0 `; z; g$ R# {; d程序代码: ! S) z7 A8 Y( _$ \$ ~9 P! Y1 I
9 T& [6 J8 ^- z
#include<strstream>6 G) J+ F! o; c; k$ s6 U! L( K7 Q
#include<iostream>
9 x9 m* s% d' a: L#include<string>+ b6 @) V( M) U" o3 A) e" I2 P
using namespace std;
$ Y* R( J) B1 H  _; R& V; b$ c9 |int main(void)$ D, ?* P) r/ t! [3 _
{$ f- q# v& w: t6 A, i; h
    string s1;# r5 E) u' Y4 m; w
    while(cin>>s1)
, Z$ m/ ~1 e4 r+ O    {' l4 B. l2 ~4 P& c, b0 P
        istrstream isin(s1.data());
- \. t& N/ J& C5 H3 [( O7 e; A        double d;
1 \7 {( L' |  a3 F' T        if(fy_Exp::GetExpValue(isin, d)); l( _  N9 h. n* @  Z, r
        {- s% }6 E7 Z3 N3 v0 }% t, n5 G( A4 f
            cout<<d<<endl;) X" W7 I; F( I
        }
" P2 K. U8 ^  x8 Q4 q        else. q4 g4 |. i/ {9 G
        {
) `3 {; T  r8 s! g  a/ Q( H            cout<<"ERROR"<<endl;
) A9 d. U+ m0 K* V8 ~        }
! G! [# J5 p  |  t# w) R    }+ `; }& D( v# b! V( A6 ^
    return 0;
! E9 Y: g5 N, B# g}
4 I4 k4 z4 c$ u  ^8 W# @* q
- i3 x) h1 k5 H: T& E% n
# g$ \3 {9 h' Q( e然后编译执行就可以了(*^_^*)/ v) L& ~1 G, B1 n, U
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 V9 z$ S: a5 f1 `2 _- U6 d7 ^      建议使用VC7或VC更高版本,或者使用GNU C++编译

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