Tema 1. Introducción a la programación (Lenguaje java). 1.4 Estructuras de datos.

Post on 03-Feb-2015

25 views 1 download

Transcript of Tema 1. Introducción a la programación (Lenguaje java). 1.4 Estructuras de datos.

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. Por generalizació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);}

}