Arreglos - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/arreglos.pdf · Introducci´on Un...

Preview:

Citation preview

Arreglos

Amparo Lopez Gaona

Agosto de 2008

Amparo Lopez Gaona () Arreglos Agosto de 2008 1 / 21

Introduccion

Un arreglo es

un objeto que agrupa una cantidad fija y predeterminada deelementos del mismo tipo.La declaracion de un arreglo requiere crear una referencia a el y luegollamar al constructor de la clase.Referencia: tipoDeDato [] nombreDeArreglo ;Constructor: new tipoDeDato [tamano];Ejemplo:

int[] enteros;enteros = new int [10];

int [] enteros = new int[10]; // Declaracion en una sola instruccion

0 1 2 3 4 5 6 7 8 9

10 elementos

Índices

int [] enteros

= new int[10]

Amparo Lopez Gaona () Arreglos Agosto de 2008 3 / 21

Introduccion

Un arreglo es un objeto que agrupa una cantidad fija y predeterminada deelementos del mismo tipo.La declaracion de un arreglo requiere crear una referencia a el y luegollamar al constructor de la clase.Referencia:

tipoDeDato [] nombreDeArreglo ;Constructor: new tipoDeDato [tamano];Ejemplo:

int[] enteros;enteros = new int [10];

int [] enteros = new int[10]; // Declaracion en una sola instruccion

0 1 2 3 4 5 6 7 8 9

10 elementos

Índices

int [] enteros

= new int[10]

Amparo Lopez Gaona () Arreglos Agosto de 2008 3 / 21

Introduccion

Un arreglo es un objeto que agrupa una cantidad fija y predeterminada deelementos del mismo tipo.La declaracion de un arreglo requiere crear una referencia a el y luegollamar al constructor de la clase.Referencia: tipoDeDato [] nombreDeArreglo ;Constructor:

new tipoDeDato [tamano];Ejemplo:

int[] enteros;enteros = new int [10];

int [] enteros = new int[10]; // Declaracion en una sola instruccion

0 1 2 3 4 5 6 7 8 9

10 elementos

Índices

int [] enteros

= new int[10]

Amparo Lopez Gaona () Arreglos Agosto de 2008 3 / 21

Introduccion

Un arreglo es un objeto que agrupa una cantidad fija y predeterminada deelementos del mismo tipo.La declaracion de un arreglo requiere crear una referencia a el y luegollamar al constructor de la clase.Referencia: tipoDeDato [] nombreDeArreglo ;Constructor: new tipoDeDato [tamano];Ejemplo:

int[] enteros;enteros = new int [10];

int [] enteros = new int[10]; // Declaracion en una sola instruccion

0 1 2 3 4 5 6 7 8 9

10 elementos

Índices

int [] enteros

= new int[10]

Amparo Lopez Gaona () Arreglos Agosto de 2008 3 / 21

Introduccion

Un arreglo es un objeto que agrupa una cantidad fija y predeterminada deelementos del mismo tipo.La declaracion de un arreglo requiere crear una referencia a el y luegollamar al constructor de la clase.Referencia: tipoDeDato [] nombreDeArreglo ;Constructor: new tipoDeDato [tamano];Ejemplo:

int[] enteros;enteros = new int [10];

int [] enteros = new int[10]; // Declaracion en una sola instruccion

0 1 2 3 4 5 6 7 8 9

10 elementos

Índices

int [] enteros

= new int[10]

Amparo Lopez Gaona () Arreglos Agosto de 2008 3 / 21

Introduccion

Un arreglo es un objeto que agrupa una cantidad fija y predeterminada deelementos del mismo tipo.La declaracion de un arreglo requiere crear una referencia a el y luegollamar al constructor de la clase.Referencia: tipoDeDato [] nombreDeArreglo ;Constructor: new tipoDeDato [tamano];Ejemplo:

int[] enteros;enteros = new int [10];

int [] enteros = new int[10]; // Declaracion en una sola instruccion

0 1 2 3 4 5 6 7 8 9

10 elementos

Índices

int [] enteros

= new int[10]

Amparo Lopez Gaona () Arreglos Agosto de 2008 3 / 21

... Introduccion

Otra forma de declaracion:int [] enteros = new int[] {0,1,1,2,3};int [] enteros = {0,1,1,2,3};

Existe una constante length que indica el numero de elementos en elarreglo.

for (int i = 0; i < enteros.length; i++)System.out.print(enteros[i] + ",");

System.out.println();

Amparo Lopez Gaona () Arreglos Agosto de 2008 5 / 21

... Introduccion

Otra forma de declaracion:int [] enteros = new int[] {0,1,1,2,3};int [] enteros = {0,1,1,2,3};Existe una constante length que indica el numero de elementos en elarreglo.

for (int i = 0; i < enteros.length; i++)System.out.print(enteros[i] + ",");

System.out.println();

Amparo Lopez Gaona () Arreglos Agosto de 2008 5 / 21

Problema

En una escuela se necesita un programa para ayudar con el trabajo de laseccion escolar. El programa debe conservar y obtener datos acerca de losalumnos. Los datos que debe tener, o en su caso calcular, son los datospersonales del alumno, calificaciones, promedio, la mayor calificacionobtenida, los cursos en los cuales su calificacion es 10 y determinar elaprovechamiento de un alumno con respecto al resto del grupo.

1 Encontrar los objetos principales.Sustantivos: seccion escolar, alumno.

2 Determinar el comportamiento deseado.Alumno:

Crear un registro de alumno.Obtener el valor de cada uno de los atributos.Asignar valor a cada atributo.Calcular el promedio de las calificaciones.Obtener la calificacion mas alta.Determinar el curso con una calificacion particular.Determinar todos los cursos con calificacion igual a 10.Determinar el aprovechamiento de un alumno con respecto al resto del grupo.

Amparo Lopez Gaona () Arreglos Agosto de 2008 6 / 21

Problema

En una escuela se necesita un programa para ayudar con el trabajo de laseccion escolar. El programa debe conservar y obtener datos acerca de losalumnos. Los datos que debe tener, o en su caso calcular, son los datospersonales del alumno, calificaciones, promedio, la mayor calificacionobtenida, los cursos en los cuales su calificacion es 10 y determinar elaprovechamiento de un alumno con respecto al resto del grupo.

1 Encontrar los objetos principales.Sustantivos: seccion escolar, alumno.

2 Determinar el comportamiento deseado.Alumno:

Crear un registro de alumno.Obtener el valor de cada uno de los atributos.Asignar valor a cada atributo.Calcular el promedio de las calificaciones.Obtener la calificacion mas alta.Determinar el curso con una calificacion particular.Determinar todos los cursos con calificacion igual a 10.Determinar el aprovechamiento de un alumno con respecto al resto del grupo.

Amparo Lopez Gaona () Arreglos Agosto de 2008 6 / 21

... Problema

1 Definir escenario.

1 El programa muestra un menu con las opciones.2 El usuario selecciona una opcion.3 Dependiendo de la opcion seleccionada, se solicita mas informacion.4 Estos pasos se repiten hasta que el usuario seleccione la opcion para

terminar de trabajar.

Amparo Lopez Gaona () Arreglos Agosto de 2008 7 / 21

Clase Alumno

public class Alumno {

private String nombre;

private String numRegistro;

private char carrera;

private int [] calif;

public Alumno (String n, String ng, char c) {

final int numCursos; // Cantidad de cursos

nombre = n;

numRegistro = ng;

carrera = c;

switch(carrera) {

case ’a’: numCursos = 40; break; //Actuar’ia

case ’m’: numCursos = 32; break; //Matem’aticas

case ’c’: numCursos = 36; break; //Computaci’on

case ’b’: numCursos = 35; break; //Biolog’ia

case ’f’: numCursos = 30; break; //F’isica

default: numCursos = 5; //Para probar los m’etodos

}

calif = new int[numCursos];

}

Amparo Lopez Gaona () Arreglos Agosto de 2008 9 / 21

Clase Alumno

public String obtenerNombre() {return nombre;

}// ... Los otros obtenerXpublic int obtenerNumCalificaciones() {

return calif.length;}public void registrarCalif(int curso, int cal) {

if (curso > 0 && curso < calif.length)calif[curso] = (cal >= 0 && cal <=10) ? cal : 0;

}public double promedio() {

double suma = 0;for (int i=0; i< calif.length; i++)suma += calif[i];

return suma/calif.length;}

Amparo Lopez Gaona () Arreglos Agosto de 2008 11 / 21

Clase Alumno

public String obtenerNombre() {return nombre;

}// ... Los otros obtenerXpublic int obtenerNumCalificaciones() {

return calif.length;}public void registrarCalif(int curso, int cal) {

if (curso > 0 && curso < calif.length)calif[curso] = (cal >= 0 && cal <=10) ? cal : 0;

}public double promedio() {

double suma = 0;for (int i=0; i< calif.length; i++)suma += calif[i];

return suma/calif.length;}

Amparo Lopez Gaona () Arreglos Agosto de 2008 11 / 21

Clase Alumno

public String obtenerNombre() {return nombre;

}// ... Los otros obtenerXpublic int obtenerNumCalificaciones() {

return calif.length;}public void registrarCalif(int curso, int cal) {

if (curso > 0 && curso < calif.length)calif[curso] = (cal >= 0 && cal <=10) ? cal : 0;

}public double promedio() {

double suma = 0;for (int i=0; i< calif.length; i++)suma += calif[i];

return suma/calif.length;}

Amparo Lopez Gaona () Arreglos Agosto de 2008 11 / 21

Clase Alumno

public String obtenerNombre() {return nombre;

}// ... Los otros obtenerXpublic int obtenerNumCalificaciones() {

return calif.length;}public void registrarCalif(int curso, int cal) {

if (curso > 0 && curso < calif.length)calif[curso] = (cal >= 0 && cal <=10) ? cal : 0;

}public double promedio() {

double suma = 0;for (int i=0; i< calif.length; i++)suma += calif[i];

return suma/calif.length;}

Amparo Lopez Gaona () Arreglos Agosto de 2008 11 / 21

Metodo para saber los cursos en los que obtuvo 10 el alumno.

public int[] todosLosDieces () {int j = 0;int [] dieces = new int[califs.length + 1];

for (int i = 0; i < califs.length; i++) {if (califs[i] == 10) {dieces[++j] = i;

}}dieces[0] = j ;return dieces;

}

Uso de este metodo

int[] excelentes = alumn.todosLosDieces();for (int i=1; i<=excelentes[0];i++)System.out.println(excelentes[i]+" ");

Amparo Lopez Gaona () Arreglos Agosto de 2008 13 / 21

Metodo para saber los cursos en los que obtuvo 10 el alumno.

public int[] todosLosDieces () {int j = 0;int [] dieces = new int[califs.length + 1];

for (int i = 0; i < califs.length; i++) {if (califs[i] == 10) {dieces[++j] = i;

}}dieces[0] = j ;return dieces;

}

Uso de este metodo

int[] excelentes = alumn.todosLosDieces();for (int i=1; i<=excelentes[0];i++)System.out.println(excelentes[i]+" ");

Amparo Lopez Gaona () Arreglos Agosto de 2008 13 / 21

Metodo para saber los cursos en los que obtuvo 10 el alumno.

public int[] todosLosDieces () {int j = 0;int [] dieces = new int[califs.length + 1];

for (int i = 0; i < califs.length; i++) {if (califs[i] == 10) {dieces[++j] = i;

}}dieces[0] = j ;return dieces;

}

Uso de este metodo

int[] excelentes = alumn.todosLosDieces();for (int i=1; i<=excelentes[0];i++)System.out.println(excelentes[i]+" ");

Amparo Lopez Gaona () Arreglos Agosto de 2008 13 / 21

Metodo para determinar el aprovechamiento de un alumno con respecto alresto del grupo.

public int compararPromedio(int [] promedio) {int menor = 0, mayor = 0, igual = 0;

for (int i = 0; i < calif.length; i++)if (calif[i] < promedio[i])menor ++;

else if (calif[i] > promedio[i])mayor ++;

elseigual ++;

if (mayor > menor && mayor > igual) return 1;if (menor > mayor && menor > igual) return -1;return 0;

}

Amparo Lopez Gaona () Arreglos Agosto de 2008 15 / 21

Metodo para determinar el aprovechamiento de un alumno con respecto alresto del grupo.

public int compararPromedio(int [] promedio) {int menor = 0, mayor = 0, igual = 0;

for (int i = 0; i < calif.length; i++)if (calif[i] < promedio[i])menor ++;

else if (calif[i] > promedio[i])mayor ++;

elseigual ++;

if (mayor > menor && mayor > igual) return 1;if (menor > mayor && menor > igual) return -1;return 0;

}

Amparo Lopez Gaona () Arreglos Agosto de 2008 15 / 21

Paso de parametros por valor

public class Cambios{

static void modificar(int [] x) {

for (int i = 0; i < x.length; i ++)

x[i] *= 2;

}

static void modificar(int x) {

x *= 2;

}

static public void main (String [] pps) {

int a[] = {0,1,2,3,4,5,6};

System.out.println("El arreglo original tiene ");

for (int i = 0; i < a.length; i ++)

System.out.print(" " + a[i]);

modificar(a);

System.out.println("\nEl arreglo ahora tiene ");

for (int i = 0; i < a.length; i ++)

System.out.print(" " + a[i]);

modificar(a[4]);

System.out.println("\nEl arreglo ahora tiene ");

for (int i = 0; i < a.length; i ++)

System.out.print(" " + a[i]);

}

La salida de este programa es:

El arreglo original tiene

0 1 2 3 4 5 6

El arreglo ahora tiene

0 2 4 6 8 10 12

El arreglo ahora tiene

0 2 4 6 8 10 12

Amparo Lopez Gaona () Arreglos Agosto de 2008 17 / 21

Paso de parametros por valor

public class Cambios{

static void modificar(int [] x) {

for (int i = 0; i < x.length; i ++)

x[i] *= 2;

}

static void modificar(int x) {

x *= 2;

}

static public void main (String [] pps) {

int a[] = {0,1,2,3,4,5,6};

System.out.println("El arreglo original tiene ");

for (int i = 0; i < a.length; i ++)

System.out.print(" " + a[i]);

modificar(a);

System.out.println("\nEl arreglo ahora tiene ");

for (int i = 0; i < a.length; i ++)

System.out.print(" " + a[i]);

modificar(a[4]);

System.out.println("\nEl arreglo ahora tiene ");

for (int i = 0; i < a.length; i ++)

System.out.print(" " + a[i]);

}

La salida de este programa es:

El arreglo original tiene

0 1 2 3 4 5 6

El arreglo ahora tiene

0 2 4 6 8 10 12

El arreglo ahora tiene

0 2 4 6 8 10 12Amparo Lopez Gaona () Arreglos Agosto de 2008 17 / 21

Arreglos de cadenas

public static void main(String [] pps) {String [] materia = {"’Algebra", "C’alculo","Computaci’on",

"Estructuras de Datos", "Bases de Datos"};

Alumno alumn= new Alumno("Andrea","921404",’x’);...excelentes = alumn.todosLosDieces();for (int i = 1; i<=excelentes[0]; i++)System.out.println("Obtuvo 10 en "+materia[excelentes[i]]);

}

Amparo Lopez Gaona () Arreglos Agosto de 2008 19 / 21

Parametros del main

public class PruebaAlumno {public static void main (String[] pps) {if (pps.length != 3) {System.out.println("Error: cantidad inadecuada de datos.");

} else {Alumno alumn= new Alumno(pps[0],pps[1],pps[2].charAt(0));System.out.print("Los par’ametros son ");for (int i = 0; i < pps.length; i++)System.out.print(" " + pps[i]);

System.out.println();alumn.asignarCalifs();... //Todo como antes

}}

}

Amparo Lopez Gaona () Arreglos Agosto de 2008 21 / 21

Arreglos de objetos

public class SecEscolar {Alumno [] poblaci’onEst ;int nAlumnos;

public SecEscolar () {poblaci’onEst = new Alumno[100];nAlumnos = 0;

}

public SecEscolar (int tam) {poblaci’onEst = (tam > 0) ? new Alumno[tam]: new Alumno[100];nAlumnos = 0;

}

public void insertar(Alumno alum) {if (nAlumnos < poblaci’onEst.length && buscar(alum) == -1) {poblaci’onEst[nAlumnos++] = alum;

}}Amparo Lopez Gaona () Arreglos Agosto de 2008 23 / 21

public int buscar(Alumno alum) {return buscar (alum.obtenerNombre());

}

private int buscar(String alumn) {int i = 0;boolean encontro = false;alumn = alumn.trim();

for (int i = 0; i < nAlumnos && !encontro; i++) {if (poblacionEst[i].obtenerNombre().equalsIgnoreCase(alumn)) {encontro = true;

}}return (encontro) ? i - 1 : -1;

}

Amparo Lopez Gaona () Arreglos Agosto de 2008 25 / 21

Arreglos bidimensionales

Matriz de diez renglones, cada uno de cinco columnas.

final int renglones = 10, columnas = 5;double [][] matriz = new double[renglones][columnas];

0 1 2 3 4

0

1

2

3

4

5

6

7

8

9

matriz

for (int i = 0; i < matriz.length; i++) {for (int j = 0; j < matriz[i].length; j++) {

matriz[i][j] = i + j;}

}Amparo Lopez Gaona () Arreglos Agosto de 2008 27 / 21

Arreglos bidimensionales

Diferimiento de la creacion de cada renglon de la matriz.

double [][] matriz = new double[renglones][];for (int renglon = 0; renglon < matriz.length; renglon++)matriz[renglon] = new double[columnas];

Es posible tener arreglos donde cada renglon tenga diferente cantidad deelementos.

final int renglones = 5;int [][] triangulo = new int [renglones][];for (int i = 0; i < triangulo.length; i++) {triangulo[i] = new int [i+1];

}

Cambiar de un renglon por otro.

double [] temp = matriz[3];matriz [3] = matriz[4];matriz [4] = temp;

Amparo Lopez Gaona () Arreglos Agosto de 2008 29 / 21

Arreglos bidimensionales

Diferimiento de la creacion de cada renglon de la matriz.

double [][] matriz = new double[renglones][];for (int renglon = 0; renglon < matriz.length; renglon++)matriz[renglon] = new double[columnas];

Es posible tener arreglos donde cada renglon tenga diferente cantidad deelementos.

final int renglones = 5;int [][] triangulo = new int [renglones][];for (int i = 0; i < triangulo.length; i++) {triangulo[i] = new int [i+1];

}

Cambiar de un renglon por otro.

double [] temp = matriz[3];matriz [3] = matriz[4];matriz [4] = temp;

Amparo Lopez Gaona () Arreglos Agosto de 2008 29 / 21

Inicializacion de una matriz

Declaracion e inicializacion de una matriz de cuatro renglones cadauno de tres enteros.

int [][] matriz4x3 = {{0, 23, 32},{67, 89, 98},{56, 34, 7},{17, 20, 89},};Declaracion e inicializacion de una matriz triangular de cincorenglones.

int [][] trianguloPascal = {{1},{1,1},{1,2,1},{1,3,3,1},{1,4,6,4,1},};Amparo Lopez Gaona () Arreglos Agosto de 2008 31 / 21

Tamano de una matriz

En el caso de matrices length indica la cantidad de renglones que tiene lamatriz.Por cada renglon hay otra length que indica su longitud.matriz[i].length = cantidad de elementos en el renglon i.matriz.length = cantidad de renglones que tiene la matriz.

Amparo Lopez Gaona () Arreglos Agosto de 2008 32 / 21

Recommended