Pro2324 Help

Tema 1 - Tipos Abstractos de Datos (TAD)

Pásame El Código

Visita nuestra nueva página web con contenidos actualizados y mucho más.

Estos apuntes también están en: Pásame el Código

    ¿Qué es la abstracción?

    Abstraer

    1. tr. Separar por medio de una operación intelectual un rasgo o una cualidad de algo para analizarlos aisladamente o considerarlos en su pura esencia o noción.

    2. intr. Hacer caso omiso de algo, o dejarlo a un lado.

    La abstracción, entendiéndola como su primera acepción es fundamental tanto en la programación como en cualquier disciplina intelectual.

    Gracias al pensamiento abstracto el avance tecnológico/científico humano no parece tener límite.

    Un ejemplo sencillo, un conductor no necesita conocer el complicado mecanismo que permite a su coche cambiar las marchas (ni siquiera que son las marchas) del motor. Lo único que debe entender es una implementación (abstracción) "sencilla" como es el embrague y la palanca de cambios y como interactuar con ella.

    En el ámbito de la programación la abstracción es constante. Cuando programamos en C, no necesitamos conocer como ha sido implementada la función printf(), solo debemos conocer como interactuar con ella, el formato que acepta que puede o no leer, etc.

    En este tema nos centraremos en los TADs los Tipos Abstractos de Datos, un tipo de abstracción común y que en el futuro nos resultará muy util.

    Definición de Tipo Abstracto de Datos

    A la hora de definir un TAD, debemos seguir unas pautas formales, para obtener la abstracción que facilita el desarrollo a otros/as programadores/as como nosotros/as.

    Programador del tipo
    Usuario
    Implementación
    Representación del tipo
    Implementación de las Operaciones
    Especificación
    Valores
    Operaciones (Sintaxis y Semática)
    Diseño TAD

    Especificación de un TAD

    Nombre_de_operación (tipo_de_argumento) -> tipo_de_resultado

    TAD

    Nombre_del_tipo

    VALORES

    valores que pueden tomar los datos del tipo

    OPERACIONES

    nombre de las operaciones que los manipulan

    Objetivo

    Descripción de la operación

    Entrada

    Descripción los datos de entrada

    Salida

    Que se espera como retorno en invocación

    Precondiciones

    Que condiciones se esperan de los datos de entrada

    Poscondiciones

    Que efectos laterales puede tener invocar la función (Que modifica, que añade, etc)

    Podemos clasificarlas en:

    • Constructoras: Devuelven el TAD

      • Generadoras: Solo ellas pueden generar el TAD

      • Modificadoras: El resto

    • Observadoras / Acceso: No devuelve un TAD

    • Destructoras: Devuelven el TAD

    Ejemplo de especificación de un TAD: Rational

    Vamos a crear un TAD para los números racionales, es decir, un par de números enteros: Numerador y denominador

    Constructoras Generadoras

    • Objetivo: Crea un número racional.

      Entrada: Numerador del nuevo racional y denominador del nuevo racional.

      Precondición: Denominador distinto de 0.

      Salida: El número racional creado.

    Constructoras Modificadoras

    • Objetivo: Calcula la suma de dos números racionales.

      Entrada: Números racionales a sumar.

      Salida: Un nuevo racional suma de los números a la entrada.

    Observadoras

    • Objetivo: Obtiene el numerador de un número racional.

      Entrada: Número racional del que obtener el numerador.

      Salida: Numerador del número a la entrada.

    • Objetivo: Obtiene el denominador de un número racional.

      Entrada: Número racional del que obtener el denominador.

      Salida: Denominador del número a la entrada.

    Rational TAD: El código

    // SPDX-FileCopyrightText: Facultade de Informática de A Coruña // // SPDX-License-Identifier: CC-BY-4.0 #include <stdio.h> //#include "rational_struct.h" //#include "rational_pointer.h" int main() { Rational r1, r2, r3, r4, s; r1 = createRational(2, 3); r2 = createRational(5, 7); r3 = createRational(7, 3); r4 = createRational(5, 4); s = sum(r1, r2); printf("The sum is %d/ %d\n", numerator(s), denominator(s)); s = sum(r3, r4); printf("The sum is %d/ %d\n", numerator(s), denominator(s)); }
    // SPDX-FileCopyrightText: Facultade de Informática de A Coruña // // SPDX-License-Identifier: CC-BY-4.0 #include <stdlib.h> #include "rational_pointer.h" // Operación para crear un racional Rational createRational(int n, int d) { Rational temp; temp = malloc(sizeof(*temp)); temp->num = n; temp->den = d; return temp; } // Operación que retorna el numerador de un racional int numerator(Rational r) { return r->num; } // Operación que retorna el denominador de un racional int denominator(Rational r) { return r->den; } // Operación que retorna la suma de dos racionales Rational sum(Rational r1, Rational r2) { Rational s; s = malloc(sizeof(*s)); s->num = r1->num * r2->den + r2->num * r1->den; s->den = r1->den * r2->den; return s; }
    // SPDX-FileCopyrightText: Facultade de Informática de A Coruña // // SPDX-License-Identifier: CC-BY-4.0 #ifndef TAD_Rational_RATIONAL_POINTER_H #define TAD_Rational_RATIONAL_POINTER_H typedef struct Data *Rational; struct Data { int num; int den; }; Rational createRational(int n, int d); int numerator(Rational r); int denominator(Rational r); Rational sum(Rational r1, Rational r2); #endif // TAD_Rational_RATIONAL_POINTER_H
    // SPDX-FileCopyrightText: Facultade de Informática de A Coruña // // SPDX-License-Identifier: CC-BY-4.0 #include "rational_struct.h" // Operación para crear un racional Rational createRational(int n, int d) { Rational temp; temp.num = n; temp.den = d; return temp; } // Operación que retorna el numerador de un racional int numerator(Rational r) { return r.num; } // Operación que retorna el denominador de un racional int denominator(Rational r) { return r.den; } // Operación que retorna la suma de dos racionales Rational sum(Rational r1, Rational r2) { Rational s; s.num = r1.num * r2.den + r2.num * r1.den; s.den = r1.den * r2.den; return s; }
    // SPDX-FileCopyrightText: Facultade de Informática de A Coruña // // SPDX-License-Identifier: CC-BY-4.0 #ifndef TAD_Rational_RATIONAL_STRUCT_H #define TAD_Rational_RATIONAL_STRUCT_H typedef struct Data Rational; struct Data { int num; int den; }; Rational createRational(int n, int d); int numerator(Rational r); int denominator(Rational r); Rational sum(Rational r1, Rational r2); #endif // TAD_Rational_RATIONAL_STRUCT_H
    # SPDX-FileCopyrightText: Facultade de Informática de A Coruña # # SPDX-License-Identifier: CC-BY-4.0 cmake_minimum_required(VERSION 3.22) project(TAD_Rational) set(CMAKE_C_STANDARD 99) add_executable(Rational_struct main.c rational_struct.c rational_struct.h) add_executable(Rational_pointer main.c rational_pointer.c rational_pointer.h)
    Last modified: 02 November 2024