Logo Studenta

Práctica 1 - Memoria dinámica_Memoria Estática

¡Estudia con miles de materiales!

Vista previa del material en texto

Instituto Tecnológico Superior Progreso
Dirección General
Subdirección Académica
	
	INSTITUTO TECNOLÓGICO SUPERIOR PROGRESO
Organismo Público Descentralizado del Gobierno del Estado
	
	
	PRÁCTICA EDD 2023B
	
Ingeniería en Sistemas Computacionales
Tercer Semestre – G1
 
Asignatura:
Estructura de Datos
Docente:
Dr. Holzen A. Martínez García 
Estudiante:
Eduardo Escalante Pacheco
Actividad de aprendizaje 2:
Práctica de memoria estática y dinámica
 
Fecha de entrega:
Jueves 7 de septiembre de 2023
OBJETIVO: El alumno comprenderá e identificará las diferencias entre la memoria estática y la dinámica en tiempo de compilación y ejecución.
1.- Elabora el siguiente código y ejecútalo.
¿Qué hace el código? Detalla todo lo que puedas de la manera más clara posible.
Este código declara una clase pública llamada MemoriaEstatica que solo contiene una función de entrada (main). En la función main, primero se declara un arreglo de enteros llamada "datos", al cual se le asignan 10 espacios en la memoria estática para almacenar 10 valores enteros. Al ser una estructura de datos estática, el tamaño que ocupa este arreglo en la memoria no puede ser cambiado durante la ejecución del programa.
En la siguiente línea se declara un bucle for, cuyo inicializador es una variable de tipo entero llamada "i", inicializada con valor igual a 0; la condición para que el ciclo siga iterando es que “i” sea menor a 10; por último, al final de cada ciclo se suma 1 a la variable “i”. El alcance de esta variable se limita sólo al contenido de este ciclo. 
En cada iteración del ciclo se le asigna un valor a cada uno de los espacios del arreglo “datos”, dicho valor es igual al valor en ese momento de la variable “i” (es decir, un número entre 0 y 9) multiplicado por 10.
Después, se declara un segundo bucle for, con los mismos parámetros que el anterior. Se puede destacar que se declara de nuevo una variable de tipo entero llamada "i". Lo anterior es posible porque, como se mencionó, el alcance de la variable "i" del primer ciclo for sólo se limitaba al contenido de ese ciclo en específico, por lo tanto, fuera de él la variable "i" es desconocida. Por ese motivo es posible volver a crear otra variable llamada "i" dentro del siguiente ciclo for, cuyo alcance también será solamente el contenido del ciclo en el que fue declarado. 
En este segundo ciclo, se imprime en la consola todos los valores contenidos en el arreglo "datos". Una vez que termina el ciclo acaba la ejecución del programa.
2.- Cambia la línea 6 en su segundo parámetro, quedando i<=10. Ejecútalo después de volver a construirlo. ¿Ahora, qué sucede? ¿A qué se debe?
Java arroja una excepción de tipo ArrayIndexOutOfBoundsException, que se produce por intentar acceder a un índice inexistente de un arreglo. La razón por la que ocurre este error al cambiar la condición es porque ahora permite que el ciclo se ejecute cuando i es igual a 10, ocasionando que el código intente acceder al undécimo índice del arreglo, el cual no existe (los índices de los arreglos comienzan a partir de cero). 
Un arreglo es una estructura de datos estática, lo que significa que el tamaño que ocupará en memoria (es decir, el número de espacios reservados para almacenar un valor) se define al momento de inicializar el arreglo (int[] datos = new int[10]) y es asignado en la memoria estática al inicio de la ejecución del programa, impidiendo que este espacio en memoria pueda modificarse después de haber sido asignado.
Dado que se definió en la línea 6 del ejemplo que el arreglo debe ocupar 10 espacios en la memoria estática, se le indica al compilador que únicamente reserve 10 espacios contiguos para valores enteros y al intentar recuperar un valor en un undécimo espacio en memoria que no fue asignado, el programa arroja un error. 
3.- Ahora, procede a transcribir y ejecutar el siguiente código.
¿Qué hace este otro código? Detalla todo lo que puedas de la manera más clara posible.
Este código declara una clase pública llamada Pila, que implementa una estructura de datos abstracta de tipo FIFO (First In First Out). Dentro de la clase Pila se declara una clase anidada llamada Nodo, que solamente tiene dos atributos: info, que representa el valor del nodo (de tipo entero) y una referencia al siguiente nodo de la pila.
La clase Pila solo tiene un atributo de tipo Nodo llamado raíz, que representa el último nodo insertado en la pila y, por tanto, el siguiente nodo que será extraído.
La clase Pila solo declara un constructor, público, sin parámetros, que inicializa al atributo raíz como nulo. También declara tres métodos públicos no estáticos: insertar, extraer e imprimir.
El método insertar no retorna ningún valor y acepta como parámetro un número entero "x". Al ejecutarse, instancia un nuevo nodo en cual se copia el valor de "x" y se le asigna como nodo siguiente el nodo raíz de la pila cuando no es nulo. En caso de que el nodo raíz apunte a nulo, la referencia al siguiente nodo se asigna como nulo. De esta forma, se añade un nuevo valor a la pila, que se convertirá en el siguiente valor que se podrá extraer de la estructura.
La función extraer devuelve un entero y no acepta ningún parámetro. Si el nodo raíz no es nulo, se hace una copia del valor almacenado en el nodo raíz y el nodo referenciado como el siguiente es asignado como el nuevo nodo raíz (en caso de que no haya un siguiente nodo, el nodo raíz se convierte en nulo). En caso de que se intente extraer un valor de una pila al que no se le ha insertado ningún valor, devuelve Integer.MAX_VALUE, que es una propiedad estática de la clase Integer con el valor más grande posible que puede almacenar una variable de tipo entero.
El método imprimir no retorna ningún valor y no acepta ningún parámetro. Lo primero que hace es crear una variable de tipo Nodo llamada "reco" y se le asigna una referencia al nodo raíz en una variable, luego imprime en la consola el mensaje "Listado de todos los elementos de la pila.". Después ejecuta un ciclo while, cuya condición de ejecución es que la variable "reco" no sea nula. En cada iteración del ciclo se imprime el valor del nodo referenciado en la consola y después se asigna a "reco" la referencia al nodo siguiente. 
Eventualmente no habrá un nodo siguiente, tras lo cual la variable "reco" tendrá valor nulo y el ciclo se detendrá, habiendo mostrado en pantalla todos los valores guardados en la pila, en el órden en el que pueden ser extraídos (y sin remover ningún nodo). 
Por último, en la clase Pila también se declara el método main, en el cual se instancia un objeto de la clase Pila, se insertan en la misma tres valores enteros, se llama al método imprimir, después se extrae un elemento de la pila mostrando el valor recuperado en la consola y por último, se vuelven a imprimir los valores de la pila.
4.- Intenta describir gráficamente (con cuadros dibujos y breves notas). Lo que sucede en el ejercicio 1, y después lo que sucede en el ejercicio 2, internamente (en la memoria).
Ejercicio 1:
Ejercicio 2:
5.-Ingresa las capturas de pantalla donde estás programando, y donde estás ejecutando los binarios.
6.- Comprime tu código fuente y súbelo a un enlace público (Onedrive, GDrive, Dropbox, etc.) Asegúrate de darle permiso público (que cualquiera con el enlace pueda verlo y descargarlo). Copia el enlace público y pégalo en este espacio.
Google Drive: 
https://drive.google.com/file/d/1KLppyhZBy8IxpRUX6M6UWJvbgAcAIlfR/view?usp=sharing
7.- Al inicio de este documento, incluye la portada con los datos pertinentes. Por último, convierte este documento (ya debe estar listo con portada y lleno con tus resultados) a formato PDF con el nombre que cumpla la estructura P1_ADA2_EDD_APATERNO_AMATERNO_NOMBRE.pdf, por ejemplo (P1_ADA2_EDD_Martinez_Garcia_Holzen.pdf). Súbelo en el apartado correspondiente en plataforma.
Boulevard Tecnológico de Progreso S/N por 62 Progreso, Yucatán, C.P. 97320 
Tel. 969 934 3023 Cel. 999 278 6219
tecnm.mx | progreso.tecnm.mx
NOMBRE: _____________EDUARDO ESCALANTEPACHECO______________ ISC 3 – 2023B

Continuar navegando