Professional Documents
Culture Documents
EJERCICIOS
RESUELTOS Autor: José
USANDO
Roberto
Colón
Villalta
ARREGLOS EN
JAVA
Colección de ejercicios resueltos utilizando lenguaje
Java, los cuales involucran en su desarrollo el uso
de arreglos (arrays) de una o dos dimensiones
Contenido
Introducción ..............................................................................................................................................................2
Primera parte: Ejercicios resueltos con vectores de una dimensión ........................................................................3
Ejercicio #1: ..........................................................................................................................................................3
Solución al ejercicio #1: ........................................................................................................................................3
Observaciones importantes a la solución del ejercicio #1: ...................................................................................3
Ejercicio #2: ..........................................................................................................................................................4
Solución al ejercicio #2: ........................................................................................................................................4
Observaciones importantes a la solución del ejercicio #2: ...................................................................................5
Ejercicio #3: ..........................................................................................................................................................6
Solución al ejercicio #3: ........................................................................................................................................6
Observaciones importantes a la solución del ejercicio #3: ...................................................................................7
Ejercicio #4: ..........................................................................................................................................................8
Solución al ejercicio #4: ........................................................................................................................................8
Observaciones importantes a la solución del ejercicio #4: ...................................................................................8
Ejercicio #5: ..........................................................................................................................................................9
Solución al ejercicio #5: ........................................................................................................................................9
Observaciones importantes a la solución del ejercicio #5: ................................................................................ 10
Ejercicio #6: ....................................................................................................................................................... 11
Solución al ejercicio #5: ..................................................................................................................................... 11
Observaciones importantes a la solución del ejercicio #6: ................................................................................ 12
Ejercicio #7: ....................................................................................................................................................... 15
Solución al ejercicio #7: ..................................................................................................................................... 15
Observaciones importantes a la solución del ejercicio #7: ................................................................................ 16
Segunda parte: Ejercicios resueltos con matrices (vector de dos dimensiones) .................................................. 18
Ejercicio #8: ....................................................................................................................................................... 18
Solución al ejercicio #8: ..................................................................................................................................... 18
Observaciones importantes a la solución del ejercicio #8: ................................................................................ 19
Ejercicio #9: ....................................................................................................................................................... 21
Solución al ejercicio #9: ..................................................................................................................................... 21
Observaciones importantes a la solución del ejercicio #9: ................................................................................ 23
Ejercicio #10: ..................................................................................................................................................... 26
Solución al ejercicio #10: ................................................................................................................................... 26
Observaciones importantes a la solución del ejercicio #10: .............................................................................. 27
Ejercicio #11: ..................................................................................................................................................... 28
Solución al ejercicio #11: ................................................................................................................................... 28
Observaciones importantes a la solución del ejercicio #11: .............................................................................. 29
Referencias ............................................................................................................................................................ 32
1
Introducción
2
Primera parte: Ejercicios resueltos con vectores de una dimensión
Ejercicio #1:
Desarrolle un vector de tamaño dinámico de entre 1 y 50 posiciones, determinado por el
usuario, que almacene calificaciones en un rango válido de 0.0 a 10.0. Finalmente, muestre
cada una de las calificaciones del vector separadas por comas (,).
3
Ejercicio #2:
Desarrolle un vector de tamaño dinámico de entre 1 y 100 posiciones, determinado por el
usuario, que almacene valores enteros; muestre el contenido del vector como originalmente
se llenó; posteriormente, aplique el método de la burbuja (Fundamentos de la programación,
2013-2014, pág. 649) para ordenarlos del menor valor al mayor; finalmente, muestre el vector
ordenado ascendentemente.
do {
tamanio = Integer.parseInt(JOptionPane.showInputDialog("¿De qué tamaño es el
vector? (entre 1 y 100)"));
} while (tamanio < 1 || tamanio > 100);
vector = new int[tamanio];
/*proceso de ordenamiento usando dos bucles anidados, el primero de ellos para las
repeticiones del proceso y el segundo bucle para comparar una posición del vector con
la siguiente*/
for (iteracion = 1; iteracion <= tamanio; iteracion++) {
for (posicion = 0; posicion < (tamanio - 1); posicion++) {
if (vector[posicion] > vector[posicion + 1]) {
burbuja = vector[posicion];
vector[posicion] = vector[posicion + 1];
vector[posicion + 1] = burbuja;}
}
}
4
Observaciones importantes a la solución del ejercicio #2:
Para las entradas y salidas de datos se está utilizando la librería javax.swing.JOptionPane, la
cual será necesario importarla y usarla como parte del código.
El método de ordenamiento de vectores de una dimensión es un proceso bien documentado y
de revisión indispensable en los cursos de programación. Personalmente recomiendo hacer
una revisión del documento titulado: “Fundamentos de la programación”, página 649, del autor:
Luis Hernández Yáñez; que a fecha 6 de octubre de 2017 está en línea en la Web oficial de la
Universidad Complutense – Facultad de Informática, URL:
https://www.fdi.ucm.es/profesor/luis/fp/FP.pdf
5
Ejercicio #3:
Desarrolle el mismo ejercicio #2, pero para cada iteración o recorrido del vector que trata de
ordenarse ascendentemente, muestre como va quedando el vector.
do {
tamanio = Integer.parseInt(JOptionPane.showInputDialog("¿De que tamaño es el
vector? (entre 1 y 100)"));
} while (tamanio < 1 || tamanio > 100);
vector = new int[tamanio];
7
Ejercicio #4:
Hasta el momento le hemos llamado vector dinámico a los que para dimensionarse, primero
se le pregunta al usuario ¿de qué tamaño será el vector?, o con preguntas similares. Sin
embargo, en Java existen verdaderos vectores dinámicos que aumentan y disminuyen de
tamaño en virtud de los elementos que se le agregan o quitan.
A continuación se desarrolla un ejemplo sencillo en el cual el array (ArrayList) contendrá datos
de cualquier tipo y dejará de recibirlos al ingresar un valor vacío. Luego mostrará el contenido.
8
Ejercicio #5:
A continuación se desarrolla un ejemplo sencillo en el cual el array (ArrayList) contendrá datos
de tipo String y tratará de guardarse nombres masculinos y femeninos, finalizará cuando se
ingrese un nombre vacío. Se mostraran los nombres guardados y se dará la oportunidad de
quitar algún nombre de la lista.
if (nombres.size()<cuantos){
JOptionPane.showMessageDialog(null, "Se removió "+cualQuitar+" de la lista");
}
else{
JOptionPane.showMessageDialog(null, "No se encontró el nombre");
}
10
Ejercicio #6:
Imagine una administración de casilleros, dónde el usuario alquila un casillero por un tiempo,
dicho cobro es por $2 y a la hora que lo “devuelve” y queda vacío se le regresa $1 al cliente.
Tenga en cuenta que no se puede alquilar un casillero ya ocupado, y que también para
devolver un casillero este debió estar ocupado. En general las opciones a programar son las
siguientes: Mostrar el estado de los casilleros: “d” significará desocupado y “o” ocupado,
alquilar casillero, devolver llave de casillero, caja (cuánto dinero se ha recaudado), cerrar el
negocio y ver el historial de préstamos y devoluciones de casilleros.
opcion = Integer.parseInt(JOptionPane.showInputDialog("Menú:\n1.Mostrar\n2.Alquilar
casillero\n3.Devolver llave\n4.Caja\n5.Cerrar\nCualquier otro número para salir"));
while (opcion >= 1 && opcion <= 5) {
if (opcion == 1) {
salida = "";
salida2 = "";
for (posicion = 0; posicion < tamanio; posicion++) {
salida = salida + casilleros[posicion] + "\t";
salida2 = salida2 + posicion + "\t";
}
hoja.setText(salida + "\n" + salida2);
JOptionPane.showMessageDialog(null, hoja);
} else if (opcion == 2) {
do {
cual = Integer.parseInt(JOptionPane.showInputDialog("¿Cual casillero quiere?
(entre 0 y " + (tamanio - 1) + ")"));
} while ((cual < 0 || cual >= tamanio) || casilleros[cual] == 'o');
casilleros[cual] = 'o';
caja = caja + 2;
historial = historial + "Se prestó el casillero #" + cual + " (aumento $2 la caja)\n";
11
} else if (opcion == 3) {
do {
cual = Integer.parseInt(JOptionPane.showInputDialog("¿De cual casillero
devolvera llave? (entre 0 y " + (tamanio - 1) + ")"));
} while ((cual < 0 || cual >= tamanio) || casilleros[cual] == 'd');
casilleros[cual] = 'd';
caja = caja - 1;
historial = historial + "Se recibió la llave del casillero #" + cual + " (disminuye
$1 la caja)\n";
} else if (opcion == 4) {
JOptionPane.showMessageDialog(null, "Se ha recolectado $" + caja);
} else if (opcion == 5) {
hoja.setText(historial);
JOptionPane.showMessageDialog(null, hoja);
}
opcion =Integer.parseInt(JOptionPane.showInputDialog("Menú:\n1.Mostrar\n2.Alquilar
casillero\n3.Devolver llave\n4.Caja\n5.Cerrar\nCualquier otro número para salir"));
}
El menú se mantiene en funcionamiento con dicho while que permitirá permanecer dentro
mientras se elijan opciones válidas:
while (opcion >= 1 && opcion <= 5) {
opcion = Integer.parseInt(JOptionPane.showInputDialog("Menú:\n1.Mostrar\n2.Alquilar
casillero\n3.Devolver llave\n4.Caja\n5.Cerrar\nCualquier otro número para salir"));
}
La segunda opción es: 2.Alquilar casillero, se debe buscar el casillero, determinar si existe y
si está desocupado, entoncesproceder a cambiar su estado de ‘d’ a ‘o’:
else if (opcion == 2) {
do {
cual = Integer.parseInt(JOptionPane.showInputDialog("¿Cual casillero quiere?
(entre 0 y " + (tamanio - 1) + ")"));
} while ((cual < 0 || cual >= tamanio) || casilleros[cual] == 'o');
casilleros[cual] = 'o';
caja = caja + 2;
historial = historial + "Se prestó el casillero #" + cual + " (aumento $2 la caja)\n";
}
Muy importante es hacer notar que cuando se han alquilado todos los casilleros y se accede
a dicha opción, se puede incurrir en un bucle infinito, debido a que no hay casilleros disponibles
y el proceso requiere de uno libre para poder salir.
La tercera opción es: 3.Devolver llave, se debe buscar el casillero, determinar si existe y si
está ocupado, entonces proceder a cambiar su estado de ‘o’ a ‘d’; también se debe reducir en
1 el valor de la variable caja debido a la devolución de $1 al cliente, tal como lo indica el
planteamiento del problema:
else if (opcion == 3) {
do {
cual = Integer.parseInt(JOptionPane.showInputDialog("¿De cual casillero
devolvera llave? (entre 0 y " + (tamanio - 1) + ")"));
} while ((cual < 0 || cual >= tamanio) || casilleros[cual] == 'd');
casilleros[cual] = 'd';
caja = caja - 1;
historial = historial + "Se recibió la llave del casillero #" + cual + " (disminuye
$1 la caja)\n";
}
La cuarta opción es: 4.Caja, se muestra el valor acumulado hasta ese momento en la variable
caja:
else if (opcion == 4) {
JOptionPane.showMessageDialog(null, "Se ha recolectado $" + caja);
}
13
La quinta opción es: 5.Cerrar, se muestra un historial de todas los alquileres y devoluciones
ocurridos; para ello, siempre que se hace un alquiler o una devolución -opción 2 y opción 4,
respectivamente- se agrega una texto indicando dicha acción, la variable que guarda dichas
anotaciones es historial:
else if (opcion == 5) {
hoja.setText(historial);
JOptionPane.showMessageDialog(null, hoja);
}
14
Ejercicio #7:
Imagine la administración de dinero de un usuario a través de dos rubros principales: entradas
de efectivo y salidas de efectivo.
Para ello se crearan dos vectores: el primero, entradas, este se utilizará para registrar cada
ingreso de dinero; por el contrario, el segundo, salidas, se utilizará para registrar cada egreso
de dinero.
do{
tamanio=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantos registros desea
administrar?(máximo 100)"));
}while(tamanio<=0 || tamanio>100);
entradas = new double[tamanio];
salidas=new double[tamanio];
opcion=Integer.parseInt(JOptionPane.showInputDialog("Opciones:\n1.Salida de
efectivo\n2.Entrada de efectivo\n3.Ver estado de cuenta, Cualquier otro número para
salir"));
//acceso al menú
while(opcion>=1 && opcion<=3){
if (opcion==1){
//salida de efectivo
do{
salida=Double.parseDouble(JOptionPane.showInputDialog("¿Cuánto fue la
salida de efectivo? (mayor a cero)"));
}while(salida<=0);
salidas[posicionSalida]=salida;
posicionSalida=posicionSalida+1;
}
else if (opcion==2){
//entrada de efectivo
do{
entrada=Double.parseDouble(JOptionPane.showInputDialog("¿Cuánto fue la
entrada de efectivo? (mayor a cero)"));
}while(entrada<=0);
entradas[posicionEntrada]=entrada;
posicionEntrada=posicionEntrada+1;
}
else if (opcion==3){
//estado de cuenta
posicion=0;
15
cadena1="Salidas\n";
cadena2="Entradas\n";
while (salidas[posicion]!=0.0){
cadena1=cadena1+salidas[posicion]+",";
posicion=posicion+1;
}
posicion=0;
while (entradas[posicion]!=0.0){
cadena2=cadena2+entradas[posicion]+",";
posicion=posicion+1;
}
pagina.setText(cadena1+"\n"+cadena2);
JOptionPane.showMessageDialog(null, pagina);
}
opcion=Integer.parseInt(JOptionPane.showInputDialog("Opciones:\n1.Salida de
efectivo\n2.Entrada de efectivo\n3.Ver estado de cuenta, Cualquier otro número para
salir"));
}
Se tienen dos vectores: entradas y salidas, ambos de dimensiones que el usuario determina
durante la ejecución del programa, validando que su tamaño no sea menor a 1 ni mayor a 100
posiciones:
do{
tamanio=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantos registros desea
administrar?(máximo 100)"));
}while(tamanio<=0 || tamanio>100);
entradas = new double[tamanio];
salidas=new double[tamanio];
El menú se mantiene en funcionamiento con dicho while que permitirá permanecer adentro
mientras se elijan opciones válidas:
while (opcion >= 1 && opcion <= 3) {
opcion=Integer.parseInt(JOptionPane.showInputDialog("Opciones:\n1.Salida de
efectivo\n2.Entrada de efectivo\n3.Ver estado de cuenta, Cualquier otro número para salir"));
}
16
La codificación de cada una de las opciones es la siguiente:
La primera opción es: 1.Salida de efectivo, es decir, registrar en el vector salida el egreso de
una cantidad de dinero válida:
if (opcion==1){
//salida de efectivo
do{
salida=Double.parseDouble(JOptionPane.showInputDialog("¿Cuánto fue la
salida de efectivo? (mayor a cero)"));
}while(salida<=0);
salidas[posicionSalida]=salida;
posicionSalida=posicionSalida+1;
}
La tercera opción es: 3.Estado de cuenta, genera una salida a través de un cuadro de dialogo
que contiene un objeto JTextArea llamado pagina, en el cual se listan cada uno de los
elementos del vector salidas separadas por comas (,) y luego de un salto de línea, se listan
cada uno de los elementos del vector entradas separadas por comas (,):
else if (opcion==3){
//estado de cuenta
posicion=0;
cadena1="Salidas\n";
cadena2="Entradas\n";
while (salidas[posicion]!=0.0){
cadena1=cadena1+salidas[posicion]+",";
posicion=posicion+1;}
posicion=0;
while (entradas[posicion]!=0.0){
cadena2=cadena2+entradas[posicion]+",";
posicion=posicion+1;}
pagina.setText(cadena1+"\n"+cadena2);
JOptionPane.showMessageDialog(null, pagina);
}
17
Segunda parte: Ejercicios resueltos con matrices (vector de dos
dimensiones)
Ejercicio #8:
Se gestionaran calificaciones para un grupo de estudiantes. El grupo de clase puede ser de un
solo alumno hasta un máximo de treinta, las calificaciones que se administran para cada
estudiante son como mínimo 3 y máximo 10.
do{
alumnos=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantos alumnos?
(mínimo 1 y máximo 30)"));
}while(alumnos<1 || alumnos>30);
do{
periodos=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantos períodos?
(mínimo 3 y máximo 10)"));
}while(periodos<3 || periodos>10);
for (alumno=0;alumno<alumnos;alumno++){
JOptionPane.showMessageDialog(null, "Ingresará las notas del alumno
#"+(alumno+1));
for (periodo=0;periodo<periodos;periodo++){
do{
nota=Double.parseDouble(JOptionPane.showInputDialog("Ingrese la nota del
período #"+(periodo+1)+" del alumno #"+(alumno+1)));
}while(nota<0 || nota>10);
notas[alumno][periodo]=nota;
}
}
18
//generar la secuencia de calificaciones para cada estudiante
for (alumno=0;alumno<alumnos;alumno++){
salida=salida+(alumno+1)+"\t";
for (periodo=0;periodo<periodos;periodo++){
salida=salida+notas[alumno][periodo]+"\t";
}
salida=salida+"\n";
}
hoja.setText(salida);
JOptionPane.showMessageDialog(null, hoja);
Para lograr que la matriz sea de tamaño variable en cada ejecución del programa, se procede
a utilizar dos bucles que validan sus dimensiones:
do{
alumnos=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantos alumnos?
(mínimo 1 y máximo 30)"));
}while(alumnos<1 || alumnos>30);
do{
periodos=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantos períodos?
(mínimo 3 y máximo 10)"));
}while(periodos<3 || periodos>10);
notas= new double[alumnos][periodos];
El proceso de ingreso de calificaciones para cada estudiante, requiere del uso de tres bucles
anidados: el primero, para recorrer cada una de las filas de la matriz, cada fila representa a un
estudiante; el segundo bucle, para ingresar cada una de las calificaciones del estudiante, es
decir, cada una de las columnas de la matriz; finalmente, el tercer bucle, valida que calificación
ingresada este en el rango de 0.0 a 10.0:
for (alumno=0;alumno<alumnos;alumno++){
JOptionPane.showMessageDialog(null, "Ingresará las notas del alumno
#"+(alumno+1));
for (periodo=0;periodo<periodos;periodo++){
do{
nota=Double.parseDouble(JOptionPane.showInputDialog("Ingrese la nota del
período #"+(periodo+1)+" del alumno #"+(alumno+1)));
}while(nota<0 || nota>10);
notas[alumno][periodo]=nota;
}
}
19
Mostrar el conjunto de notas requiere de un encabezado que se ajuste a la cantidad de
calificaciones que se desean mostrar, por ejemplo, mostrar tres calificaciones por estudiante
requiere de tres columnas; mostrar 5 calificaciones por estudiante requiere de cinco columnas;
en términos generales se necesita de un encabezado ajustable, pero se debe recordar que
como mínimo son 3 calificaciones por estudiante y como máximo son 10:
//formación de un encabezado dinámico
salida="Alumno#\tP1\tP2\tP3";
for (texto=4;texto<=periodos;texto++){
salida=salida+"\tP"+texto;
}
salida=salida+"\n";
Al final, todo el texto acumulado en la variable salida es asignada al objeto hoja (objeto de tipo
JTextArea); el objeto hoja se muestra a través de un cuadro de dialogo.
20
Ejercicio #9:
Se gestionaran calificaciones para un grupo de estudiantes utilizando una matriz de tipo double
y de nombre notas. El grupo de clase puede ser de un solo alumno hasta un máximo de treinta;
las calificaciones que se administran para cada estudiante son como mínimo 3 y máximo 10.
Adicionalmente, se administraran los nombres de los estudiantes en un vector de tipo String.
do{
alumnos=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantos alumnos
administra en su clase? (entre 1 y 25)"));
}while(alumnos<1 || alumnos>25);
nombres=new String[alumnos];
do{
evaluaciones=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantas evaluaciones
administrará? (entre 3 y 5)"));
}while(evaluaciones<3 || evaluaciones>5);
notas=new double[alumnos][evaluaciones];
for (alumno=0;alumno<alumnos;alumno++){
do{
nombre=JOptionPane.showInputDialog("Ingrese el nombre del alumno #"+alumno);
}while(nombre.length()==0);
nombres[alumno]=nombre;
}
for (alumno=0;alumno<alumnos;alumno++){
do{
nota=Double.parseDouble(JOptionPane.showInputDialog("Ingrese la nota del
alumno "+nombres[alumno]));
}while(nota<0 || nota>10);
notas[alumno][periodo-1]=nota;
}
}
else if (opcion==3){
do{
periodo=Integer.parseInt(JOptionPane.showInputDialog("¿De cuál período
desea ver notas? entre (1 y "+evaluaciones+")" ));
}while(periodo<1 || periodo>evaluaciones);
salida="";
salida="Alumno\tPeríodo#"+periodo+"\n";
for (alumno=0;alumno<alumnos;alumno++){
salida=salida+nombres[alumno]+"\t"+notas[alumno][periodo-1]+"\n";
}
hoja.setText(salida);
JOptionPane.showMessageDialog(null, hoja);
}
opcion=Integer.parseInt(JOptionPane.showInputDialog("Opciones:\n1.Ver listado de
estudiantes\n2.Ingresar notas por período\n3.Ver notas por período\n4.Mostrar
promedios\nCualquier otro número para salir"));
}
22
Observaciones importantes a la solución del ejercicio #9:
Para las entradas y salidas de datos se está utilizando la librería JOptionPane, la cual deberá
importarse (Meza González, 2012-2017) y usarla como parte del código, además se importará
la librería javax.swing.JTextArea que nos proporcionará cuadros de texto para mejorar las
salidas cuando la cantidad de datos por mostrarse es grande o requiere formato.
Se tiene una matriz de nombre notas, que administrará datos de tipo double.
Para lograr que la matriz y el vector sean de tamaño variable en cada ejecución del programa,
se procede a utilizar dos bucles que validan sus dimensiones:
do{
alumnos=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantos alumnos
administra en su clase? (entre 1 y 25)"));
}while(alumnos<1 || alumnos>25);
nombres=new String[alumnos];
do{
evaluaciones=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantas evaluaciones
administrará? (entre 3 y 5)"));
}while(evaluaciones<3 || evaluaciones>5);
notas=new double[alumnos][evaluaciones];
Para facilitar el uso del programa al usuario, se administrará un menú que permitirá
permanecer dentro de él se seleccionen opciones válidas y salir al ingresar un valor de opción
de menú que no exista:
//se administrará un menú de opciones para el usuario
opcion=Integer.parseInt(JOptionPane.showInputDialog("Opciones:\n1.Ver listado de
estudiantes\n2.Ingresar notas por período\n3.Ver notas por período\n4.Mostrar
promedios\nCualquier otro número para salir"));
while (opcion>=1 && opcion<=4){
//Aquí irá todo el código relativo a las opciones del 1 al 4 del menú
opcion=Integer.parseInt(JOptionPane.showInputDialog("Opciones:\n1.Ver listado de
estudiantes\n2.Ingresar notas por período\n3.Ver notas por período\n4.Mostrar
promedios\nCualquier otro número para salir"));
}
La primera opción del menú es: 1.Ver listado de estudiantes, se requiere de un bucle que
recorra una a una las posiciones del vector nombres y los añada a la variable de tipo String
llamada salida, luego ese grupo de texto se asigna a un objeto llamado hoja (objeto de tipo
JTextArea) y finalmente se muestra a través de un cuadro de dialogo:
23
if (opcion==1){//crear lista de nombre de alumnos
salida="";
salida="Nombre del alumno\n";
for (alumno=0;alumno<alumnos;alumno++){
salida=salida+nombres[alumno]+"\n";
}
hoja.setText(salida);
JOptionPane.showMessageDialog(null, hoja);
}
La segunda opción del menú es: 2.Ingresar notas por período, debido a lo complicado de
ingresar notas para todos los estudiantes de todos los períodos, es factible hacerlo de un
período en particular a la vez.
else if (opcion==2){//ingresar notas de un período en partícular
do{
periodo=Integer.parseInt(JOptionPane.showInputDialog("¿De cuál período
ingresará notas? entre (1 y "+evaluaciones+")" ));
}while(periodo<1 || periodo>evaluaciones);
for (alumno=0;alumno<alumnos;alumno++){
do{
nota=Double.parseDouble(JOptionPane.showInputDialog("Ingrese la nota del
alumno "+nombres[alumno]));
}while(nota<0 || nota>10);
notas[alumno][periodo-1]=nota;
}
}
Al momento de guardar una calificación de un período en particular, es importante recordar
que aunque el usuario indique período 1, 2, 3….10; en el vector notas se estaría haciendo
referencia a un número de columna anterior al indicado, debido a que la matriz comienza su
conteo de columnas en cero.
La tercera opción es: 3.ver calificaciones por período, se procede a utilizar un bucle que
recolecte el nombre del estudiante desde el vector nombres y también recolecte las
calificaciones de una misma columna de la matriz notas, ambas informaciones se van
acumulando en una variable de nombre salida:
else if (opcion==3){
do{
periodo=Integer.parseInt(JOptionPane.showInputDialog("¿De cuál período
desea ver notas? entre (1 y "+evaluaciones+")" ));
}while(periodo<1 || periodo>evaluaciones);
salida="";
salida="Alumno\tPeríodo#"+periodo+"\n";
for (alumno=0;alumno<alumnos;alumno++){
salida=salida+nombres[alumno]+"\t"+notas[alumno][periodo-1]+"\n";
}
hoja.setText(salida);
JOptionPane.showMessageDialog(null, hoja);}
24
Todo el texto acumulado en la variable salida se asigna al objeto hoja (objeto de tipo
JTextArea) y este se muestra a través de un cuadro de dialogo.
La cuarta opción es: 4.Mostrar promedios, para facilitar este cálculo, se asume que cada
calificación tiene igual ponderación. El cálculo del promedio requiere que se acumule cada una
de las calificaciones de cada estudiante y luego este valor acumulado se divida entre la
cantidad de evaluaciones. Cada nombre de estudiante y promedio calculado se acumula en
una variable de tipo String llamada salida:
else if(opcion==4){//calcular promedios, las calificaciones tienen igual ponderación
salida="";
salida="Alumno\t\tPromedio\n";
for (alumno=0;alumno<alumnos;alumno++){
promedio=0.0;
for (evaluacion=0;evaluacion<evaluaciones;evaluacion++){
promedio=promedio+notas[alumno][evaluacion];
}
promedio=promedio/evaluaciones;
salida=salida+nombres[alumno]+"\t\t"+promedio+"\n";
}
hoja.setText(salida);
JOptionPane.showMessageDialog(null, hoja);
}
Todo el texto acumulado en la variable salida se asigna al objeto hoja (objeto de tipo
JTextArea) y este se muestra a través de un cuadro de dialogo.
25
Ejercicio #10:
Se tiene un matriz que almacena números de tipo entero, las dimensiones mínimas de la matriz
son de 1 fila y 1 columna, y sus máximas 100 filas y 100 columnas. Después de ingresar datos,
se desea buscar si existe un número en particular y la frecuencia con que éste aparece.
do {
filas = Integer.parseInt(JOptionPane.showInputDialog("¿Cuantas filas? (entre 1 y
100)"));
} while (filas < 1 || filas > 100);
do {
columnas = Integer.parseInt(JOptionPane.showInputDialog("¿Cuantas columnas?
(entre 1 y 100)"));
} while (columnas < 1 || columnas > 100);
matriz = new int[filas][columnas];
//busque un dato
busqueda = Integer.parseInt(JOptionPane.showInputDialog("¿Cual número busca?"));
for (fila=0;fila<filas;fila++){
for (columna=0;columna<columnas;columna++){
if (busqueda==matriz[fila][columna]){
encontrado=true;
frecuencia=frecuencia+1;
}
}
}
if (encontrado==true){
JOptionPane.showMessageDialog(null, "El número "+busqueda+" se encontró
"+frecuencia+" veces");
}
else{
JOptionPane.showMessageDialog(null, "El número "+busqueda+" no se encontró");
}
26
Observaciones importantes a la solución del ejercicio #10:
Para las entradas y salidas de datos se está utilizando la librería JOptionPane, la cual deberá
importarse (Meza González, 2012-2017) y usarla como parte del código.
Para lograr que la matriz sea de tamaño variable en cada ejecución del programa, se procede
a utilizar dos bucles que validan sus dimensiones:
do {
filas = Integer.parseInt(JOptionPane.showInputDialog("¿Cuantas filas? (entre 1 y
100)"));
} while (filas < 1 || filas > 100);
do {
columnas = Integer.parseInt(JOptionPane.showInputDialog("¿Cuantas columnas?
(entre 1 y 100)"));
} while (columnas < 1 || columnas > 100);
matriz = new int[filas][columnas];
En este caso, no se requerirá validar las entradas, se puede ingresar cualquier número entero
y guardar en la matriz:
//Ingreso de datos que no requieren validación
for (fila=0;fila<filas;fila++){
for (columna=0;columna<columnas;columna++){
matriz[fila][columna]=Integer.parseInt(JOptionPane.showInputDialog("matriz["+fila+"]["
+columna+"]"));
}
}
}
}while (opcion>=1 && opcion<=2);
Para lograr que la matriz sea de tamaño variable en cada ejecución del programa, se procede
a utilizar dos bucles que validan sus dimensiones:
do{
filas=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantas filas? (mínimo 10 y
máximo 26)"));
}while(filas<10|| filas>26);//al menos diez filas y como máximo 26
do{
columnas=Integer.parseInt(JOptionPane.showInputDialog("¿Cuantas columnas?
(mínimo 10 y máximo 26)"));
}while(columnas<10|| columnas>26);//al menos diez columnas y como máximo 26
sala=new String[filas][columnas];
La asignación de un código a cada butaca, consiste en considerar que la primera fila es la letra
‘a’ y que el primer asiento es el número 1, de ahí que su código sea: a1, el siguiente asiento a
la derecha (columna en la matriz) es el asiento a2 y así sucesivamente. Al avanzar a la fila de
29
abajo –la segunda fila- esa será la letra ‘b’ y su primer asiento es el número 1, de ahí que su
código sea: b1; el proceso se repetirá para el resto de filas y columnas:
//asignación de código a butacas y mostrar la sala
for (fila=0;fila<filas;fila++){
for (columna=0;columna<columnas;columna++){
sala[fila][columna]=letras[fila]+String.valueOf(columna+1);
salida=salida+sala[fila][columna]+"\t";
}
salida=salida+"\n";
}
hoja.setText(salida);
JOptionPane.showMessageDialog(null, hoja);
Se utiliza una variable String de nombre salida para ir acumulando todo el texto de lo que será
la apariencia de la sala de cine; luego ese cumulo de texto se le asigna al objeto hoja (objeto
de tipo JTextArea). Finalmente se muestra la apariencia de la sala de cine a través de un
cuadro de dialogo.
En este caso, se usará un menú de solo dos opciones: 1. Ver la sala y 2. Vender boleto. Para
simular el comportamiento de un menú en el cual se permanece mientras se eligen opciones
válidas (1 o 2) y del cual se sale al ingresar una opción no válida (cualquier número diferente
de 1 o 2), se usará un bucle do-while:
La primera opción del menú es: 1.Ver sala, se recorre la matriz y se acumulan los códigos de
las butacas en una variable String de nombre salida, luego ese cumulo de texto se asigna al
objeto hoja y finalmente se muestra a través de un cuadro dialogo:
if (opcion==1){
salida="";
for (fila=0;fila<filas;fila++){
for (columna=0;columna<columnas;columna++){
salida=salida+sala[fila][columna]+"\t";
}
salida=salida+"\n";
}
hoja.setText(salida);
JOptionPane.showMessageDialog(null, hoja);
}
30
La segunda opción es: 2.Vender boleto, antes de mostrar la sala de cine en su estado actual,
es neceaario volver a generar la apariencia de la sala, el código utilizado es similar al de la
opción #1 (1.ver sala); el proceso de vender boleto continua, cuando se le pregunta al usuario
por el código del asiento que desea; posteriormente el programa averiguará si el código es
válido, es decir si la fila existe, en caso de no existir notificar al usuario, en caso de que la fila
si existe, entonces buscar el número de asiento en la fila indicada y cambiar su código a “X”.
salida="";
for (fila=0;fila<filas;fila++){
for (columna=0;columna<columnas;columna++){
salida=salida+sala[fila][columna]+"\t";
}
salida=salida+"\n";
}
hoja.setText(salida+"\n"+"¿Cuál asiento desea?");
cualAsiento=JOptionPane.showInputDialog(hoja);
letra=cualAsiento.charAt(0); //extraer la primer letra de la búsqueda
for(columna=0;columna<letras.length;columna++){//hacer la búsqueda
if (letra==letras[columna]){
encontrado=columna;
}
}
if (encontrado>filas){
JOptionPane.showMessageDialog(null, "No existe esa fila en la sala");
}
else{
for(columna=0;columna<columnas;columna++){//hacer la búsqueda
if (cualAsiento.equals(sala[encontrado][columna])){
sala[encontrado][columna]="X";
JOptionPane.showMessageDialog(null, "Asiento vendido");
}
}
}
}
Mejora sugerida a la solución: cuando se trata de vender una butaca que ya ha sido vendida
(ya marcada con una “X”), el programa actual, simplemente regresa al menú; sería deseable
que se le muestre un mensaje al usuario indicándole que la butaca ya ha sido vendida.
31
Referencias
32