Beruflich Dokumente
Kultur Dokumente
Propiedades:
• Útil
• Completa
• Consistente
• Entradas
• Salidas
• Requisitos
• Efectos
ED: Abstracción de Datos 6
• Elementos modificados
Especificación de una Abs. Proc. (II)
/**
...
*/
@doc
Calcula la suma de las componentes de
’partidas’ con valor negativo. Pone a
cero cada componente negativa, cambia
el signo de la suma resultante y la
devuelve.
*/
T minimo(T a, T b)
{
return (a < b ? a : b);
}
@doc
Modifica (si es necesario) la disposición
de los componentes de array dejándolos en
orden creciente (según el operador <).
*/
Conceptos manejados:
Ventajas de la separación:
Estructura de la especificación:
/**
TDA Fecha.
Definición:
Fecha representa fechas según el calendario
occidental.
Son objetos mutables.
Residen en memoria estática.
Operaciones:
*/
@doc
Crea un objeto Fecha a partir de los argumentos.
Devuelve el objeto creado sobre f.
*/
int dia(Fecha f)
/**
Obtiene el dı́a del objeto receptor.
int mes(Fecha f)
/**
Obtiene el mes del objeto receptor.
int a~no(Fecha f)
/**
Obtiene el a~
no del objeto receptor.
@return A~
no del objeto f.
*/
@doc
Sobre ’cadena’ se escribe una representación
en formato ’dd/mm/aaaa’ del objeto f. Devuelve
la dirección de la cadena escrita.
*/
void Siguiente(Fecha * f)
/**
Cambia f por la fecha siguiente a la que
representa.
void Anterior(Fecha * f)
/**
Cambia f por la fecha anterior a la que
representa.
@return
true, si f1 es una fecha estrictamente anterior
a f2.
false, en otro caso.
*/
@return
true, si f1 es una fecha anterior o igual a f2.
false, en otro caso.
*/
#include <stdio.h>
#include "fecha.h"
int main()
{
Fecha f, g;
int dia, mes, anio;
char c1[100], c2[100];
• Tipo rep:
Es importante:
Problemas:
Fecha f;
constructor(&f, 19, 3, 2001);
f.dia = 40; /* <<Error!! */
Fecha f, g;
Fecha f, g;
f = constructor(20, 2, 2001);
g = constructor(30, 3, 2001);
if (menor(f, g)) {
...
}
• Tipos referencia.
• Funciones inline.
class Fecha {
public:
Fecha (int dia, int mes, int anio);
void Lee(const char * cadena);
int Dia() const;
int Mes() const;
int Anio() const;
void Escribe(char * cadena) const;
void Siguiente(Fecha * g) const;
void Anterior(Fecha * g) const;
bool menor(Fecha f2);
bool menor_o_igual(Fecha f2);
private:
int dia;
int mes;
int anio;
};
class Fecha {
public:
Fecha (int dia, int mes, int anio);
void Lee(const char * cadena);
int Dia() const;
int Mes() const;
int Anio() const;
void Escribe(char * cadena) const;
void Siguiente(Fecha & g) const;
void Anterior(Fecha & g) const;
bool operator<(const Fecha & f2);
bool operator<=(const Fecha & f2);
private:
int dia;
int mes;
int anio;
};
private:
int dia;
int mes;
int anio;
• Control de acceso
• Funciones miembro
• Constructores
a) dentro de la clase
b) fuera de la clase
class Fecha {
int Dia() const
{ return dia; }
};
class Fecha {
int Dia() const;
};
class Fecha {
friend ostream & operator<<(ostream &s,
const Fecha & f);
};
class racional {
racional();
};
class racional {
racional(const racional & r);
};
class Fecha {
~Fecha();
};
#include <iomanip>
#include "Fecha.h"
bool
Fecha::bisiesto(int anio) const
{
return (((anio % 4 == 0) && (anio % 100 != 0))
|| (anio % 400 == 0));
}
• función global.
#include <iostream>
class Fecha {
friend ostream & operator<<(ostream &s, const Fecha &f);
friend istream & operator>>(istream &i, Fecha & f);
• TDA racional:
num
{num, den} −→
den
• TDA Fecha:
• TDA Polinomio:
Ejemplos:
#include "racional.h"
/*
** Función de abstracción:
----------------------
fA : tipo_rep ----> Q
{num, den} ----> q
La estructura {num, den} representa al número
racional q = num/den.
** Invariante de Representación:
----------------------------
Cualquier objeto del tipo_rep, {num, den},
debe cumplir:
- den != 0
*/
& %
/**
VectorDinamico::VectorDinamico, ~VectorDinamico,
redimensionar, dimension, componente,
asignar_componente
Declaración de un template:
template < parámetros > declaración
array_n<complejo,1000> w;
VectorDinamico<int> vi;
VectorDinamico<float> vf;
VD.h
' $
#ifndef __VD_H__
#define __VD_H__
#include "VD.cpp"
#endif
& %
VD.cpp
' $
#include <cassert>
1. Elección de la mutabilidad.
• Debe corresponder con la entidad del mundo
real que modelan.
• Seguridad: tipos inmutables.
• Eficiencia: tipos mutables.
4. Elección de la representación:
• Se elige después de haber hecho la especificación.
Existe el riesgo de hacerlo a la inversa.
• La elección viene condicionada por la sencillez y
la eficiencia en las implementaciones de las opera-
ciones del tipo.