140 likes | 373 Views
Tema 1. Introducción a la programación (Lenguaje java). 1.4 Estructuras de datos. 1.4 Estructuras de datos. Concepto de Estructura de datos : Agrupación de datos que se trata como una unidad en su conjunto. Se construyen a partir de los tipos de datos simples Clasificación:
E N D
Tema 1. Introducción a la programación (Lenguaje java). 1.4 Estructuras de datos.
1.4 Estructuras de datos. Concepto de Estructura de datos: Agrupación de datos que se trata como una unidad en su conjunto. Se construyen a partir de los tipos de datos simples Clasificación: Por su naturaleza: Homogénea: Todos del mismo tipo (ej: vectores, tablas, matrices n dimensionales. Heterogénea: De diferente tipo (ej: registros). Por su forma de almacenamiento. Memoria central: Estática. Tamaño conocido a priori. Dinámica. El tamaño varía durante la ejecución del programa (ej: listas, árboles, grafos). Memoria externa (ficheros y bases de datos).
1.4 Estructuras de datos. Tecnología para estructuras dinámicas (I). • Se basa en el concepto de puntero (pointer). • Puntero: variable estática cuyo contenido (referencia) es la dirección de una región de la memoria dinámica (nodo) que contiene el dato. • Mediante un puntero se puede (además de acceder al contenido de su nodo) reservar y liberar espacio. • Modelo:
1.4 Estructuras de datos. Tecnología para estructuras dinámicas (II). • En Java los punteros apuntan a (referencian) objetos. En otros lenguajes (C o Pascal) pueden apuntar a estructuras de datos. • Sintaxis: • Crear un nodo: <tipo> <variable> = new <tipo | Constructor>; • Eliminar un nodo: innecesario en Java. • Asignación: <puntero1> = <puntero2>. La referencia <puntero2> se copia en <puntero1>, • Comparación: <puntero1> == <puntero2>. Devuelve un valor booleano en función de que ambas referencias sean iguales o no. • Puntero “especial”: null. No apunta a ningún sitio (no hay reserva de memoria).
1.4 Estructuras de datos. Estructuras de datos estáticas (I). • Homogéneas: • Unidimensionales (vectores) • Modelo. • Sintaxis. • Declaración (vector nulo):<tipoElementos> [] <nombreVector>; • Construcción: <tipoElementos> [ ] <nombreVector> = new <tipoElementos> [<tamaño>] • Acceso: • Al conjunto (referencia):<nombreVector> • A un elemento:<nombreVector> [<indice>]
1.4 Estructuras de datos. • Ejemplo de uso de vector: public class PruebaVectores { static float media (int [ ] dato) { float resul = 0; for (int i = 0; i < 5; i ++) resul = resul + dato [i]; resul = resul / i; return resul; } public static void main (String [ ] args) throws NumberFormatException, IOException { int [ ] d = new int [5]; int i, rango; float media; BufferedReader linea = new BufferedReader (new InputStreamReader (System.in)); System.out.println ("Introduce cinco numeros enteros: "); for (i = 0; i < 5; i ++) d [i] = Integer.parseInt (linea.readLine ()); media = media (d); System.out.println("El valor medio es: " + media); } }
1.4 Estructuras de datos. Estructuras de datos estáticas (II). • Homogéneas: • Bidimensionales (matrices o tablas) • Modelo. • Sintaxis. • Declaración:<tipoElementosMatriz> [ ] [ ] <nombreMatriz>; • Acceso: • Al conjunto (referencia):<nombreMatriz> • A un elemento:<nombreMatriz> [<indice1>] [<indice2>] • N-dimensionales. • Porgeneralización
1.4 Estructuras de datos. • Ejemplo de uso de matriz: public class Prueba_matrices { static void leerMatriz (int [ ][ ] temperaturas) throws NumberFormatException, IOException { BufferedReader linea = new BufferedReader(new InputStreamReader(System.in)); for (int i = 0;i<7;i++) for (int j = 0; j < 2; j++) { System.out.println("Valor dia: " + i + " extremo: " + j + ": "); temperaturas [i] [j] = Integer.parseInt (linea.readLine ()); } } static int min (int [ ] [ ] temperaturas) { int i, resul = temperaturas [0] [0]; for (i = 1; i < 7; i++) if (temperaturas [i] [0] < resul) resul = temperaturas [i][0]; return resul; } public static void main(String[] args) throws NumberFormatException, IOException { int [ ] [ ] temp = new int [7] [2]; leerMatriz(temp); int mini = min(temp); System.out.println("Temperatura minima: " + mini); } }
1.4 Estructuras de datos. Estructuras de datos estáticas (III). • Heterogéneas (registros). • Cada uno de sus elementos se denomina campo o atributo. Uno de ellos suele utilizarse como identificativo o clave (key). • Modelo.
1.4 Estructuras de datos. Estructuras de datos estáticas (IV). • Heterogéneas (registros). • Sintaxis. • Declaración: class <variableRegistro> { // miembros <modificadorDeAccesoMiembro1> <tipoCampo1><nombreCampo1>; ... <modificadorDeAccesoN> <tipoCampoN><nombreCampoN>; // constructor <modificadorAcceso> <variableRegistro>(<tipoCampo1><nomCampo1>, ... ,<tipoCampoN> <nomCampoN>) { <AsignacionDeValoresInicialesDeCampos>; } } • Acceso: • Al conjunto (referencia)<nombreRegistro> • A un elemento:<nombreRegistro> .<nombreCampo>
1.4 Estructuras de datos. • Ejemplo de uso de registro. Clase RegistroAlumno (I): class RegistroAlumno { //Variables miembro public String numeroMatricula; public String apellidos; public String nombre; public String eMail; public int año; public float calificacion; // Constructor public RegistroAlumno () { numeroMatricula=null; apellidos =null; nombre = null; eMail=null; año = 1980; calificacion = 0; }
1.4 Estructuras de datos. • Ejemplo de uso de registro. Clase RegistroAlumno (II): //Métodos public String aCadena () { return numeroMatricula+" "+" "+apellidos+" "+nombre+" "+eMail+" "+año+" "+calificacion; } public void cargarRegistro () throws IOException { BufferedReader linea = new BufferedReader (new InputStreamReader (System.in)); System.out.println ("Numero de matricula: "); numeroMatricula = new String (linea.readLine ()); System.out.println ("Apellidos: "); apellidos = new String (linea.readLine ()); System.out.println ("Nombre: "); nombre = new String (linea.readLine ()); System.out.println ("Correo electronico: "); eMail = new String (linea.readLine ()); System.out.println ("Año de nacimiento: "); año = Integer.parseInt (linea.readLine ()); System.out.println ("Calificación: "); calificacion= Float.parseFloat (linea.readLine ()); System.out.println (this.aCadena ()); } }
1.4 Estructuras de datos. Estructuras de datos estáticas (V). • Híbridas (ej: vector de registros)
1.4 Estructuras de datos. • Ejemplo de uso de vector de registros. Clase PruebaRegistro: public class PruebaReg { static void cargarTabla (RegistroAlumno [ ] alumnos) throws IOException { for (int i = 0; i < 6; i ++) { System.out.println ("Datos del alumno N: " + i); alumnos [i].cargarRegistro (); } } static float mediaCalif (RegistroAlumno [ ] alumnos) { float resul; resul = 0; for (int i = 0; i < 6; i ++) resul = resul + alumnos [i].calificacion; return resul/6; } public static void main (String [ ] args) throws IOException { RegistroAlumno [ ] alumnos = new RegistroAlumno [6]; float media; for (int i = 0; i < 6; i ++) alumnos[i]= new RegistroAlumno(); cargarTabla (alumnos); media = mediaCalif (alumnos); System.out.println ("La media de las calificaciones es: "+media); } }