Arreglos - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/arreglos.pdf · Introducci´on Un...
Transcript of Arreglos - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/arreglos.pdf · Introducci´on Un...
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