返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,0 U, Q8 b7 O- t1 a
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 `9 u! z9 m9 t2 o/ z
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' r% r2 i5 X' a- n
参数解释:) V' ^% m# N# q/ S/ \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ P. M* d) ]4 C
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定9 V4 z% k. o8 |! t: d2 w+ v
返回值:9 x+ _  n) X: R8 ^
返回非0表示计算成功,0表示计算失败有错误
2 w' @2 o  {! c+ Z3 q6 F4 U- ~5 G0 X7 c' k# H% g

2 V/ R6 n8 z- u$ s' [
5 @  C' |$ a; X$ `4 E  z9 P8 p程序代码:
/ ~9 y" ]; v+ O& K  L% }! n; l8 D+ F" P; H, X. \6 c
namespace fy_Exp{
% B  X- E& M* c3 m; ]) nnamespace {template <class _T>1 v* s; {: D8 T7 G
inline _T GetExpValue(_T t[], char& csym){
+ n6 j) G0 b+ T8 g! l! X    char c=csym; csym=0;1 ]6 U# H/ {$ U, g
    switch(c){% P: f( s' M2 I9 U: a
    case '+':return t[0] += t[1];' w5 }0 b$ P4 L6 ]# R# B
    case '-':return t[0] -= t[1];
* i$ E/ M4 K; b, R% d' I    case '*':return t[0] *= t[1];
( }5 M; b, p. J1 E( c2 x    default: return t[0] /= t[1];//case '/':" w9 v9 v+ w" X; u, b! f
    }: M/ S" x. R  Z; p
}}
9 L2 L# J) j9 n. b) \: Z3 ?: ktemplate <class _T, class _Tstream>
3 o% ~% E- r+ Y" H2 o  B6 p0 ]/* _Tstream: inputstream, _T: get return value
0 B) j7 f+ e7 R* Return nonzero if get value successfully */
/ C' ^5 H, s  H: mint GetExpValue(_Tstream& istrin, _T& nReturn){
; u1 x; ^3 S. N# P- |2 I# z    _T t[3] = {0}; //雨中飞燕之作0 J1 z% c2 p+ [1 A+ `/ t% I
    char csym[3] = "++";  Z  T2 M" f0 L$ {3 o% S8 s" {: |% Z
    int nLevel = 1, nERR = 0;
1 Z9 S) M3 u. o  K. I. B9 T    if(!(istrin>>t[1]))istrin.clear();4 i- e/ v; |* n& C5 O% _
    for(;;){, \1 i4 {, m8 g
        if(istrin>>csym[2]){6 k4 F% Q$ U: B- T
            switch(csym[2]){6 h' N- @3 W8 Y4 x) s1 s. y
            case '(':9 v& f- n; f0 K* e- j- T6 |2 G- G
                if(!csym[1]){nLevel=0x100; nERR=1;}else, u2 _& i% _, T- f$ Y# c
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 K: A' J6 m) C0 z% ~
                else{nLevel=0x100; nERR=1;}1 C9 l% ~) t' h/ y; a7 J8 O2 H
                break;
6 a5 [6 B: D9 h! f            case ')':
7 b( i" Q5 [* O" w% K" x                {nLevel = 0x100;}break;
: z  A' f. z8 Q            case '+':case '-':case '*':case '/':, `  I9 K, o# ^1 O' g
                {csym[nLevel++] = csym[2];}break;) J8 _* O6 R0 @8 g6 z0 Q- U  f5 `
            case ' ':case '\r':case '\n':case '\t':continue;
/ d6 o( p  `* P8 `0 Z/ h/ h            default:; d7 `7 w; o1 }# G+ Q2 X" ^
                {nLevel=0x100; nERR=1;}
; n3 E0 J  h1 S. d            }
# s! g; b0 F1 ~, W# `6 R            if(nLevel==0x100)break;
) `2 s7 h6 R/ m8 h1 g. `7 a2 N1 b            if(nLevel&0x10 || istrin>>t[2]){
8 H. u  @! U7 ]. q- j. {9 x                nLevel &= 0xF;+ v7 e! D- U& f% x) [
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- A& l/ l1 m4 D) W  Q& D( q                if(csym[1]=='*'||csym[1]=='/'){. \6 `8 q% E4 b1 l7 T( W
                    GetExpValue(t+1, csym[1]);
' K& h, ^1 ~1 k: k+ G9 ]) j                }) E3 k* `: I3 A4 e' P
                else{
; Q3 {+ Q8 |6 E* q7 M* D7 {                    GetExpValue(t, csym[0]);
  S$ x2 i3 t- ^; y                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;! _, J* N5 q4 @/ ~. O
                }
* {( w" _. a3 F4 e2 L2 A                nLevel = 1;
( B$ [# i1 l+ Q# e5 B# P            }2 g9 M  ]+ {% T: k; ]: v
            else istrin.clear();- t* S( J9 P( t, P3 d2 Z: y
        }
5 N& m) G5 I! K; @7 N  {        else{nERR = -1; break;}
  u) h2 \8 n( F+ v$ L    }1 |1 }: d* u' ~
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
  O) H1 q( l+ g9 Z    else nReturn=GetExpValue(t, csym[0]);
: a; H, X: Q( y3 N6 w. T: l# Y    return nERR==-1?1:0;
8 o+ L% v. `3 H! ~}}
- m! y0 L+ {, J! d( O% i+ X6 C0 Y; U, L$ ]: a5 Z
: v: v" K6 t- U* a! q
9 W* q* }/ h( |' w. M2 k. g
函数模板使用示例:
! o5 t0 ]' m/ C# F1 W2 K9 j6 O在以上那段代码的后面加上以下代码:) U$ C+ n: G1 F' A

( ~2 H, }% R- |4 E( ?: K
- s( e; ^! f8 `6 U* @% W
4 J  H( E7 R# {9 ^程序代码: 7 n- t: \! i& f! ^: h0 ~, o
; \/ s* j6 ?( A: K( k
#include<strstream>% i& I; }' @/ x( }( V% ]& F
#include<iostream>
! _8 M" h% O! V* S#include<string>- `0 ~6 f9 V2 `3 w
using namespace std;8 v7 b, V- H* d* t" j
int main(void)4 n; R5 r) b) ~+ H3 W
{
" h; Y; t2 x$ E    string s1;
  G' U# }# u7 W! r    while(cin>>s1)7 U3 T" e; m) [1 o5 B" Z
    {
8 t. Y  W, ?! h9 g. o. v- T1 {( q        istrstream isin(s1.data());1 `$ L0 K* ^7 G
        double d;
" m2 E  P: Y/ F, f' J        if(fy_Exp::GetExpValue(isin, d))% G8 j; L1 ~5 x6 k4 z% i
        {5 j) l: B. n! h9 {
            cout<<d<<endl;0 O; t' b: T( J! z% v3 l* f
        }, S/ o) G0 q" W) i& w& w. `
        else
9 Z0 i3 G0 ~( G3 B) y        {
  k7 a3 \, \7 J: ^, ?7 |            cout<<"ERROR"<<endl;
" c& l( s5 i9 O0 g! {, z0 U8 s        }! z( m# y& H1 R) z8 z/ L
    }/ T& q/ O4 n1 X+ b& L! q7 N8 q
    return 0;8 ]; Z9 R1 r/ @% q/ S
}
9 t$ k. r8 D* U0 x( d8 Y2 u/ s- r4 Q; z

0 M6 O4 J; ?- L- A; a. p3 d然后编译执行就可以了(*^_^*)
+ T' V3 Z6 m4 g# w其它:TC++上一定编译错误,不保证在VC6上也能通过编译% r/ @( ~9 a- C1 Q
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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