返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,1 q1 B3 D8 \8 v1 `8 l
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# R( r* `# K! Y6 h# H2 \只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% A# s. Y1 v; D$ b) g' O7 r: U' T  }
参数解释:
6 \' m0 p! X- r# F+ U4 mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. y& u$ ^2 N+ ?# mnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# L6 f1 ]& a* y7 \* n0 W返回值:
* W/ D+ t. U$ p) a- K返回非0表示计算成功,0表示计算失败有错误
; G% s+ [; V" ~3 Z! a/ w/ ^
4 I, a. i+ f2 i# Q  _, Y8 x
: [; X8 k: p/ ?+ B  o" q6 Q2 j4 y9 E8 E! H
程序代码: 0 ^; C$ I/ z, y- l3 e6 B  w
' Q4 p0 O5 Y9 f* y& m
namespace fy_Exp{
3 ?' B. C. `4 R! k7 x8 c" Bnamespace {template <class _T>
4 @' l; U. \6 ~, _$ Finline _T GetExpValue(_T t[], char& csym){1 S0 {4 Y+ t% P! Q* |" X3 J
    char c=csym; csym=0;& i$ L/ H& ?4 {; p8 X. |
    switch(c){
5 [: E- ~, E9 J% i  R0 Z    case '+':return t[0] += t[1];7 l3 v  X4 U( m5 d; X! B1 l
    case '-':return t[0] -= t[1];
7 R5 }( q3 A- U    case '*':return t[0] *= t[1];
3 j( |+ z% T6 H; l    default: return t[0] /= t[1];//case '/':
) R1 t3 A' r4 H$ r    }
* G$ s( B0 h% Q7 \: _2 C0 t}}% b. {! [3 i5 V1 G0 y" d9 t" Y
template <class _T, class _Tstream>
/ ?) E6 y% `8 L) @- K. p4 w/* _Tstream: inputstream, _T: get return value; Q  u) l: ^6 Z* q8 }
* Return nonzero if get value successfully */  m- d% n8 D; S8 p% T$ `
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 e* H7 t! Q0 ^+ K3 c% g2 a: C- h" }    _T t[3] = {0}; //雨中飞燕之作$ f) q: R" |6 v
    char csym[3] = "++";
  b: l, A( c2 [    int nLevel = 1, nERR = 0;
$ i7 \, c% P, r- g$ n; P    if(!(istrin>>t[1]))istrin.clear();
. O; |2 P! D' A# a7 E; Q    for(;;){# F; F6 \0 B" n" s0 t# X! N" }: C
        if(istrin>>csym[2]){
  J& R( [3 g# R: a) J            switch(csym[2]){
3 ?  a* v  u- P+ n$ B) H6 X4 N4 E/ x            case '(':# f8 A0 x2 R1 t' U9 }1 S
                if(!csym[1]){nLevel=0x100; nERR=1;}else& L1 f% Y; `. @
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
( e- ~! z! j) A                else{nLevel=0x100; nERR=1;}
: Z- ^# Z1 a9 O: g; n                break;
8 Q" Y% x4 i$ O9 i( s$ r            case ')':7 f8 N1 k7 w1 P/ s2 H$ f7 n
                {nLevel = 0x100;}break;
3 s: z0 e  G% M            case '+':case '-':case '*':case '/':2 q9 _  L; P6 J% X: z
                {csym[nLevel++] = csym[2];}break;
1 g7 \! D+ @4 M" A4 U, x            case ' ':case '\r':case '\n':case '\t':continue;8 T) V/ L( |4 W; g0 G
            default:  @. ]6 q7 \. l2 A. M- s
                {nLevel=0x100; nERR=1;}3 b7 k' x, c, x; g0 k9 \
            }$ G4 A/ z, X$ a6 {
            if(nLevel==0x100)break;" z, u: ^- d% Y& n
            if(nLevel&0x10 || istrin>>t[2]){
+ J% X% j6 A0 w) z# D                nLevel &= 0xF;
) }5 g% Y7 r) a; I0 e5 _                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 K+ q; u8 Y% K2 _# U/ V- ]0 U
                if(csym[1]=='*'||csym[1]=='/'){
: @- l( s0 ?' i7 U1 ?2 p: g                    GetExpValue(t+1, csym[1]);1 Y, g7 v* _2 J( V/ e+ y8 z$ x
                }0 D7 a8 u) `1 _  y% P6 a
                else{
9 i+ i3 @6 g1 ~+ h* {# k5 X, f* F                    GetExpValue(t, csym[0]);
2 I0 t4 Q( m6 ^$ b- I; c                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;) T# C- j. z6 A! q- O
                }
/ _* D1 A" W( h" b! v+ O- Z! S  Z                nLevel = 1;
+ v4 }" G6 I+ E1 K! P" Z            }
! }- D4 P, f$ |$ b: |5 Q/ F            else istrin.clear();  p* q( U# f) _, Z2 U3 J
        }
2 K6 S$ O# f; }! ^9 {        else{nERR = -1; break;}
% G# R, ^: g; z5 ^3 U8 P6 D% }    }
& T" F+ `. Z: t% N    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);0 ?8 J) y0 E/ a. F! l/ X
    else nReturn=GetExpValue(t, csym[0]);% `0 ?# f6 g7 w' K1 p
    return nERR==-1?1:0;- s1 n5 E+ z7 z. @' v
}}
( g" z2 e/ U9 _
2 }; i# }. H& ^/ F
" y9 Z. L: g) ~6 v8 [1 S
, u. V0 A; j" f函数模板使用示例:' f1 t7 H# e* v: c, j2 b+ p
在以上那段代码的后面加上以下代码:
& T! y: u" x' B1 m; ~
& S- \6 V: ]4 E* B5 p 2 n2 E# m; D; ?4 f' x' a
$ ~1 K6 Y) L, X, |  ?1 {
程序代码:
7 ?; Z; F0 X, K( o
. j  a$ f! U" @3 R8 A+ X#include<strstream>) T% Y0 T) p  Y2 H; p
#include<iostream>
% R0 f( Z- A" `# _# j+ N#include<string>7 h: m/ Z# B- s6 q" L9 w
using namespace std;& g8 Y+ ]+ y# U7 v( Z8 y) [* n0 e
int main(void)* C* O* E& \9 k1 {! w% k# \
{/ y, I3 b- U) X( J. c5 @6 [
    string s1;
: d* |" \; U9 q" D- Q# F    while(cin>>s1); O3 E, i! u* m; N$ m
    {
8 N5 l' u3 i9 Q        istrstream isin(s1.data());; p/ n3 c# b9 S8 A' @2 q
        double d;
$ u2 S* e7 ~9 E$ f' K! G; {        if(fy_Exp::GetExpValue(isin, d))
9 b" m# X$ L$ G/ @( X6 B# v% U/ b! u        {; A8 @( e. L' f) \# d
            cout<<d<<endl;. n& U9 a' y8 G. l
        }
( G  _; b8 e/ Q, z# K6 d        else
' k* Q9 {2 Y' F" O( H! w3 f7 {2 ^( U        {9 z) K2 w  y0 {3 Q
            cout<<"ERROR"<<endl;/ B' Z3 g0 N) R' h& B
        }. Q2 v6 |1 I2 [7 O% b0 h; h
    }
  t( i5 [) U$ _' y: D! u( {    return 0;# ~0 w/ H/ q, ^; I% |! g( D) R
}
# u4 P: v0 J- u0 E: P, C- D# D( ~3 o( C6 ~/ R# l! f$ T

$ ]6 E) K: u. [7 p- H然后编译执行就可以了(*^_^*)' [: e* E1 ]- H) ~
其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 n) r. W6 B6 G; y- I% r
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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