Está en la página 1de 46

Estructuras de Datos

LABORATORIO semana 2 -Unidad 1


Semestre 2-2021
Contenido
Preliminares

Tipos de datos

Tipos de Datos Abstractos(TDA)

Especificación de TDAs

Implementación de TDAs

Resumen
Laboratorio Semana 2: Preliminares

Ciclo de desarrollo de programas


• Los programas son soluciones computacionales que resuelven problemas del
mundo. Existen modelos para el ciclo de desarrollo de programas. Por Ejemplo el
modelo en cascada.

de los a los
PROBLEMAS PROGRAMAS
REALIDAD

Análisis de la
Necesidad Diseño de la Pruebas y
Problema ALGORITMO Codificación puesta en
(Formulación y Especificado
solución FORMAL
PROGRAMA

especificación del del programa marcha


(Modelado)
problema)

¿Qué? ¿Cómo? Ejecución del como


USUARIO
Laboratorio semana 2: Tipos de Datos e introducción a los TDA

Proceso de desarrollo de programas


Especificado
Problema

FASE Se expresan ciertos aspectos del problema mediante


MODELACIÓN un modelo matemático apropiado

Algoritmo Informal DISEÑO


• El objetivo de la fase TDA
Se crean los Tipos de Datos Abstractos (TDA) para cada tipo es separar el uso del tipo
FASE TDA de datos (a excepción de los datos de tipo elemental) de dato de su
implementación.
Algoritmo pseudolenguaje

FASE
Para cada TDA se elige una representación (struct) y se
ESTRUCTURAS reemplaza por sentencias en lenguaje C.
DE DATOS CODIFICACIÓN
PROGRAMA

Programa en C
Laboratorio Semana 2: Preliminares
Proceso de abstracción en el desarrollo de
programas
• Modelo: Descripción o representación de la realidad (hechos,
situaciones, fenómenos, procesos, estructuras y sistemas, entre
otros). Dicha representación es una construcción racional de un
campo de estudio concreto, y suele presentarse en diferentes grados
de abstracción(Sierra; 1978:39).
• Los modelos se construyen como un medio de ayuda para estudiar la
realidad.
• El desarrollo de programas utiliza modelos matemáticos ¿por qué?
Laboratorio Semana 2: Preliminares

Proceso de abstracción en el desarrollo de programas

• Abstracción: Proceso mental que realizamos al tratar de dar


solución a los problemas del mundo real.
• Necesitamos los modelos para poder abstraer un problema a una solución
computacional.
• La mejor abstracción es aquella que hace simple las cosas complejas.
• Rescatar y resaltar lo relevante (lo fundamental)
• Esconder los aspectos no importantes, por ejemplo, los detalles de la implementación
• Identificar lo relevante de una realidad aplicando un modelo no es una
habilidad mental fácil.
Laboratorio Semana 2: Preliminares

Proceso de abstracción en desarrollo de programas


¿QUÉ ES UN PROGRAMA? Es un algoritmo implementado con algún Lenguaje de programación y se compone de…

Entrada Conjunto de instrucciones que Salida


(datos que generan
(datos) PROCESAN DATOS
conocimiento )

¿Dónde se
almacenan los
7808670 María 05/06/2020 1.500.000 20.000.000 datos?
García

DATOS: Abstracciones de fenómenos


VARIABLES: espacio físico en la memoria del computador que almacena datos.
reales (imagen, hecho, evento, personas,
Según el tipo de datos de la variable, ésta tendrá diferente estructura y tamaño. Cada
objetos u otras entidades). El significado
tipo de datos tiene representaciones distintas en memoria.
del dato cambia dependiendo del
contexto en que se encuentre.

TIPOS DE DATOS: Representa a datos del mundo real y a las operaciones que se pueden realizar
sobre esos datos.
Laboratorio Semana 2: Preliminares

Proceso de abstracción en desarrollo de programas


Abstracción de procesos (procedimientos y funciones)
Dos formas de abstracción
Abstracción de datos (tipos de datos primitivos y Tipos de datos Abstractos)

• Imagine los siguientes programas (aplicaciones).. Apliquemos abstracción


Abstracción de procesos 🡪 Funciones en C
• Un programa en C es un conjunto de definiciones de variables y funciones
• Permiten encapsular líneas de código para ser utilizadas en diferentes partes
del código. Es una buena práctica de programación.
• Ejemplo:
✔ Imprimir nueva línea en pantalla
printf(“\n”);
✔ Definir la función newline();
void newline(void){ void newlines(int x){
int i;
printf(“\n”);
for(i=0;i<x;i++)
} printf(“\n”);
}
Funciones
• Declaración de funciones:
✔ Las funciones deben ser declaradas y definidas dentro de un código en C.

tipo-retorno nombre-función(declaración argumentos){


declaraciones e instrucciones
}
✔ La declaración “nada(){}”, corresponde a una declaración mínima de una función.
✔ Si se omite tipo-retorno, C assume que se retorna int
✔ Se usa la instrucción return expr; para retornar un valor.
✔ El tipo de dato de expr debe coincidir con tipo-retorno declarado en la función
Funciones
1 #include <stdio.h>
2
• Scope de variables y 3 float valor;
4 float func1(int a, int b){
declaraciones 5 b = b + 1;
✔ Define el espacio donde las 6 return (float)(a/b);
variables y declaraciones son 7 }
conocidas por el programa 8 void func2(){
9 printf("%f",valor);
• ¿Cuál es la salida del programa 10 valor = valor+10;
en las líneas: 11 }
✔ Línea 9: 12 int main(){
13 int a=21, b=8;
✔ Línea 16: 14 valor = func1(a,b);
✔ Línea 17: 15
✔ Línea 18: 16 printf("%d\n", a);
17 printf("%d\n", b);
18 printf("%f",valor);
19 }
Funciones

• Las variables y declaraciones son …


conocidas desde que se declaran int main(){…}

hasta el final del archivo que se float valor;


compila
float func1(int a, int b){…}

• ¿qué variables son conocidas por int x, y;


cada función?
void func2(){…}

Funciones
• Existe diferencia entre declarar y definir una variable/función
✔ Definir se reserva el espacio para almacenamiento de la variable
int a;
float F[100];

✔ Declaración se enuncia las propiedades de una variable, e indica que en alguna otra
parte (otro archivo) será definida
extern int a;
extern float F[100];

✔ Debe existir sólo una definición de cada variable, pero la declaración puede estar
muchas veces (debe coincidir con la definición) en distintos ámbitos.
Funciones
• El uso de archivos header, permite la utilización de varias funciones
predefinidas.
• Se pueden construir archivos propios con definiciones que serán incluidas en
el código.
✔ Útil para implementar una serie de funciones asociadas a un TDA específico
• Las definiciones de las bibliotecas de funciones y variables de ANSI C pueden
ser consultadas acá:
✔ https://www.tutorialspoint.com/c_standard_library/index.htm
Funciones
• Funciones recursivas:
✔ Función se llama a si misma durante la ejecución

salida algRec(entrada n)

if (condición(n)) Caso base
Condición de término
return valor
end if


valor = algRec(entrada modificada)
return valor

15
Funciones
• Ejemplo:
✔ Calcular el factorial de un número positivo n:
• F(n) = n*n-1*n-2*n-3*….*2*1
• F(n) = n*F(n-1); F(1) = 1; F(0)=0

int F_Iter(int n){ int F_Rec(int n){


int i,acum=1; if((n == 0) || (n == 1))
return n;
for(i=1;i<=n;i++) else
acum = acum * i; // acum *= i; return n*F_Rec(n-1);
}
return acum;
}
Tipos de Datos y TDAs
Abstracción de Datos 🡪 Tipos de datos y TDAs
• Un Tipo de Dato, en un lenguaje de programación,
representa a datos del mundo real y a las operaciones
posibles de realizar sobre ellos.
• Los lenguajes de programación proveen de diversos Tipos
de Datos. Se clasifican en: Simples o Primitivos y
Compuestos .
• Los Tipos de Datos Primitivos de C :
• Enteros (con varios rangos, con y sin signo)
• punto flotante (con precisión simple y doble).
• Booleano : Se manejan en C, pero no explícitamente (FALSO: 0.
VERDADERO: distinto de 0)
• Caracteres : Se les define como char, sin embargo, permite la
operatoria de int debido a su tratamiento código ASCII.
• Punteros: Un puntero es un tipo de dato que almacena una
dirección de memoria.
Tipos de Datos y TDA
Tipos de datos - Punteros

• El código que genera la ejecución de un programa (en


cualquier lenguaje de programación) es almacenado en la
memoria principal (arquitectura de von neumman).
• Así también las variables, funciones, declaraciones, datos, etc.
• Al ejecutar la instrucción: int a=100;
✔ Se crea un espacio en memoria principal llamado ‘a’ y se indica que
almacena un entero
✔ Se asigna a ese espacio un valor de 100
Tipos de datos – Punteros en C
MEMORIA
PRINCIPAL
• Suponiendo que cada variable se almacena Dir Contenido
en una celda de memoria
@10
• Ejemplos a @11 100
int a = 100, b, c; b @12 300
c @13 400
char car = ‘x’;
car @14 ‘x’
b = 300; @15
c = a + b @16
printf(“%c= %d”,car,c); => “x = 400” @17
@18
@19
@20
@21
@22
@23
@24
Tipos de Datos y TDA
Tipos de datos – Punteros en C

•Punteros: Un puntero es un tipo de dato que almacena


una dirección de memoria. Se declara de la siguiente
forma:

• Donde:
✔ p es la variable que almacena una dirección de memoria, y
✔ Tipo_dato corresponde al Tipo de Dato que se almacena en esa
dirección de memoria
Punteros en C
Dir Contenido
• Es posible definir en C un tipo de dato puntero, que
almacena una dirección de memoria en la cual se @10
encuentra un dato de cierto tipo. Ejemplo: @11
int *p=NULL; //crea un puntero a entero p @12 NULL
@20
@13
• Existen dos operadores para una variable tipo puntero: @14
✔ *p: indica el contenido de la dirección indicada por p @15
✔ &a: indica la dirección de la variable a @16
@17
• Ejemplo: @18
int x = 450; @19
p = &x; //se dice que “p apunta a x” x @20 450
300
printf(“%d”, *p); @21
@22
*p = 300;
@23
printf(“%d”, x); @24
Punteros en C

• En resumen:

int *x;

printf(“%d”, x); // dirección de memoria a la que apunta x


printf(“%d”, &x); // dirección de memoria de x
printf(“%d”, *x); // valor en la dirección de memoria donde apunta x
Tipos de datos – Punteros en C
Dir Contenido
• Ejercicio:
@10
int *p1, *p2 // suponga se crean en @10 y @11
@11
int a=150, b=100;//suponga se crean en @15 y @16 @12
p1 = &a; @13
p2 = &b; @14
@15
printf(“%d”, *p1 + *p2); @16
b = *p1 + 40; @17
printf(“%d”, b); @18
@19
p2 = p1;
@20
printf(“dirección %p: %d”, p1, *p1); @21
printf(“dirección %p: %d”, p2, *p2); @22
@23
@24
Tipos de datos Compuestos

• Los Tipos de Datos Compuestos de C :


• Arreglos: agrupa en una sola variable, una cantidad fija de elementos del mismo tipo de
dato. Este tipo de dato puede ser primitivo o compuesto (es decir, no permite variar su
tamaño en tiempo de ejecución). Puede poseer una o más dimensiones. Ejemplo:

• Estructuras : Agrupa en un tipo de dato definido por el programador una cantidad fija de
campos. Estos campos pueden ser del mismo o de distinto tipo de dato. Estos tipos de datos
a su vez puede ser primitivo o compuesto.
Punteros y arreglos en C
Dir Contenido
• Arreglos y asignación de memoria
@10
• Cuando se crea un arreglo (int a[5]) se reservan 5 espacios @11
de memoria consecutivos para almacenar enteros @12
a[0] @13
• La asignación *p1 = &a[1] (suponiendo p1 puntero a a[1] @14
entero), hará apuntar p1 a la dirección @14 a[2] @15
• p1 + 1, indica el siguiente elemento en el arreglo a[3] @16
a[4] @17
✔ p1 + i: referencia a i elementos después de p1 @18
✔ p1 – i: referencia a i elementos antes de p1 @19
@20
@21
@22
@23
@24
Punteros y arreglos en C
Dir Contenido
• Ejercicio:
1 int a[10]={12,4,65,3,23,45,87,6,9,10}// desde @11 @10
2 int *p1, i;//suponga se crea en @23 @11
3 p1 = &a[0]; @12
4 for(i=0;i<10;i++) @13
5 printf(“%d ”, *(p1+i)); @14
6 @15
7 for(i=0;i<9;i++){ @16
8 if(*p1 > *(p1+1)) @17
9 swap(p1, (p1+1)) // definida antes @18
10 p1 = p1 + 1; @19
11 } @20
12 @21
13 for(i=0;i<10;i++) @22
14 printf(“%d ”, a[i]); @23
@24
Punteros en C
Dir Contenido

• Es posible crear de otra manera un arreglo: asignando @10


memoria @11
@12
• La función malloc asigna posiciones contiguas de memoria
@13
según el tamaño pedido y retorna la referencia según el tipo
@14
de dato solicitado @15
int *p1; @16
p1 = (int *)malloc(sizeof(int) * 10); @17
@18
• Crea 10 posiciones de enteros y retorna la dirección inicial
@19
• Ahora p1 puede ser usado casi como un arreglo @20
• Siempre un puntero debe ser inicializado para poder ser @21
@22
usado
@23
• ¿Qué hace la función calloc? @24
Punteros en C
• Paso de parámetros por valor y por referencia
✔ Al crear las funciones podemos pasar parámetros.
✔ Usando punteros, podemos definir dos tipos de pasos de parámetros:
• Por valor: se crea una copia de la variable pasada
• Por referencia: se entrega una referencia a la variable pasada

int sumarValor(int x, int y){ int sumarRef(int *x, int *y){


return a + b; *x = *x + *y;
} }

… …
… …
a = sumar (a,b) sumar (&a,&b)
Punteros en C
Dir Contenido
• Ejemplo: ¿cómo hacer una función que intercambie el
@10
valor de dos variables?. Es decir: swap(a ,b)
@11
temp = a; @12
a = b; @13
@14
b = temp
@15
void swap(int *v1, int *v2){ @16
int temp; @17
@18
temp = *v1;
@19
*v1 = *v2; @20
*v2 = temp; @21
} @22
@23
El llamado a la función será swap(&a, &b) @24
Recordemos que…

• Cada tipo de datos no solamente es reconocido por los


elementos de datos que puede tomar, sino que además por
las operaciones asociadas a él. A un conjunto de elementos
de datos se le conoce como dominio de datos.
• Ahora es el turno de los Tipos de Datos Abstractos (TDA)
Laboratorio semana 2: Tipos de Datos e introducción a los TDA

Definición TDA (se verá o se vio en detalle en la cátedra)

• Un Tipo de Datos Abstracto es un tipo de dato diseñado por el programador mediante


el uso de los tipos de datos primitivos y/o compuestos de un lenguaje, con el objetivo
de representar entidades más complejas de la realidad. La idea es agregarlo al lenguaje
de programación para acercar el lenguaje al mundo del problema.
• Las propiedades de generalización y encapsulación son igualmente aplicables a los TDA:
✔ Un TDA no especifica la forma de implementación
✔ Los TDAs son generalizaciones de los tipos de datos básicos (enteros, caracteres, etc.) y de las
operaciones primitivas (suma, resta, etc.).
✔ Un TDA encapsula cierto tipo de datos en el sentido que es posible localizar la definición del tipo y
todas sus operaciones en una sección del programa.
✔ Una vez definido un TDA, éste se puede utilizar como si fuese un tipo de dato primitivo, sin
preocuparse de su implementación.
Metodologías para la definición de un TDA

• Existen varias formas de definir los TDA:


• Informal.
• Formal.
• Semi formal
• Nosotros usaremos una semi formal.
• Independiente de la formalidad todas ellas definen:
• El dominio del TDA: Consiste en la definición del tipo propiamente tal y
de la definición del validación del tipo de dato.
• La especificación de las operaciones y los efectos que producen en el
dominio del TDA cada una de las operaciones definidas
Tipos de Datos Abstracto

Ejemplo - Especificación del tipo de datos entero


• Dominio D = {1,2,3,…n-1, n}, donde e0, ,e1…,en-1 en son los elementos del dominio D tal
que e0, > 0 y en-1< en

• Ejemplos para presentar las operaciones del tipo de datos entero:

ALTERNATIVA 1 ALTERNATIVA 2
Tipos de Datos Abstracto
Ejemplo - Especificación del TDA matriz de enteros

• Dominio:

Validación: M > 0, N > 0, xi,j,i,j,N,M ∈


enteros
OPERACIÓN DOMINIO RECORRIDO (RETORNO)
creaMat : int x int Matriz
• Operaciones
AsignaElementoMat : Matriz x int x int x int Matriz
informacionMat : Matriz x int x int int
filasMat : Matriz int
columnasMat : Matriz int
Tipos de Datos Abstracto

Ejemplo - Especificación del TDA matriz de enteros


Matriz creaMat(int M, int N)
/* Construye y retorna una matriz de dimension [1 ... M][1 ... N], inicializada con 0s. */
{validacion parametros de entrada: M>0, N>0}

Matriz AsignaElementoMat(Matriz mat, int fil, int col, int val)


/* Asigna a la celda de la matriz "mat" de coordenadas ["fil", "col"] el valor "val". */
{validacion parametros de entrada: 1 <=fil<=M, 1<=col<=N

int informacionMat(Matriz mat, int fil, int col)


/* Retorna el contenido de la celda de la matriz "mat" que esta en las coordenadas ["fil", "col"]. */
{validacion parametros de entrada: 1<=fil<=M, 1<=col<=N}

int filasMat(Matriz mat)


/* Retorna el numero de filas de la matriz "mat". */

int columnasMat(Matriz mat)


/* Retorna el numero de columnas de la matriz "mat". */
Funciones
• Trabajo para casa:

✔ Implementar un programa en C que calcule el valor de la serie de Fibonacci de un


número x:
• Versión iterativa de Fibonacci
• Versión recursiva de Fibonacci
✔ Usar la biblioteca time.h para calcular el tiempo que se demora cada función en
ejecutarse para x=10, 20, 30, 40, 50
Tipos de Datos Abstracto

TDAs para las aplicaciones ejemplos:


• Imagina los siguientes programas (aplicaciones).. ¿y ahora?
Tarea:
• Especificar los TDAs de las aplicaciones WhatsApp y Zoom
• Especificar e implementar(programar) un TDA conjunto con
sus operaciones básicas: unión, intersección y diferencia.
Resumen

• Importancia de los modelos en el proceso de abstracción para identificar lo


relevante en el desarrollo de un programa.
• Abstracción de Procesos - Funciones en C
• Abstracción de Datos - Tipos de datos primitivos en función de sus elementos y
operaciones (operadores)
• Abstracción de Datos - Tipos de datos Abstractos (TDA): son tipos de datos
(independientes del lenguaje de programación), creados por nosotros en la fase de
diseño, que al ser implementados, deben comportarse como un tipo de datos
primitivo.
• La especificación de los TDA a nivel de diseño.
• La implementación de los TDA contienen las estructuras de datos del programa
resultante.
Consultas
Punteros en C

• Paso de parámetros por línea de comandos a un programa en C


• ¿Cómo le puedo entregar parámetros a un programa en C en la llamada?

Número de parámetros

int main(int argc, char *argv[]){ Lista de parámetros como un arreglo


… de caracteres

}
Punteros en C
• Ejemplo:
> programa.exe 10 “datos.txt” 3.4

argc=4 argv[]
0 “programa.exe”
1 “10”
2 “datos.txt”
3 “3.4”
• Al ser de tipo char * (cadenas de caracteres), ¿qué debo hacer para usar los
valores de entrada?

También podría gustarte