22 mayo, 2021

Primera Evaluación Continua Java Avanzado

¡Buen día, coders! En esta oportunidad vamos a resolver una evaluación continua que nos envió un seguidor de la página. Consta de 2 partes, una parte teórica y otra práctica. Les dejaré la solución a este examen y cualquier duda que tengan en la sección de comentarios.


PRIMERA EVALUACIÓN CONTINUA

Parte 1: Teoría

1. Indicar el motivo por el cual la siguiente clase no compilará:

import java.io.*;

public class Pregunta1 {

               public void limitador (String s) {

                               if (s.length() > 10) {

                                  throw new IOException();

                               }

               }

}

Respuesta: No compilará porque el tipo de excepción IOException no está controlada.

public void limitador (String s) throws IOException {

if (s.length() > 10) {

                  throw new IOException();

               }

}


2. Una de las siguientes afirmaciones sobre la utilización de finally es incorrecta. Indicar ¿cuál y por qué?

·         Si se produce una excepción en try y ningún bloque catch la captura, las instrucciones definidas en finally no se ejecutarán (F)

·         Si no se ha definido ningún catch para el try, la utilización de finally se hace obligatoria. (V)

·         Aunque no se produzca la excepción en try, el bloque finally se ejecutará. (V)

·         No es posible definir dos bloques finally para un mismo try. (V)

Respuesta: La primera opción es falsa. Un bloque FINALLY encierra código que siempre es ejecutado después del bloque TRY, sea que se produzca o no una excepción.  La cláusula FINALLY no es obligatoria. Por otro lado, dado que el compilador no requiere una cláusula CATCH, podemos tener código con un bloque TRY seguido inmediatamente por un bloque FINALLY.


3. ¿Por qué es inapropiado el uso del assert en el siguiente contexto?

public class Pregunta3 {

               int x = -1;

               public static void main(String[] args) {

                               assert(x++ > 0);

               }

}

Respuesta: Es inapropiado decir que la prueba es verdadera ya que la variable x primeramente no es estática static int x = -1. Por lo tanto, al probar la aplicación, la asunción fallará ya que la prueba es falsa. Lanzará un AssertionError.


4. Si queremos definir tres catch para controlar las excepciones RuntimeExcepcion, NumberFormatException y Exception. ¿Cuál debe ser el orden de colocación de estos? ¿Por qué?

Respuesta: La jerarquía de excepciones nos dice que primero debemos especificar las subclases y al final la superclase. Por lo tanto, el orden debería ser: NumberFormatException, RuntimeExcepcion y al final, Exception.


Parte 2: Práctica

Problema 1. Manejo de Excepciones

Este problema trata de la utilización de las capturas de error mediante las sentencias ty..catch..finally

Se tiene los siguientes datos (nombre, notas (4) y promedio) para el control de estudiantes de un aula. El profesor ingresará el nombre del alumno, la cantidad de notas a evaluar y las notas correspondientes. En caso de no ocurrir ningún problema se mostrará el promedio.

Se debe mostrar al usuario los avisos correspondientes a posibles errores como: números mal ingresados o la cantidad de notas no es la adecuada, entre otras a su criterio.

La aplicación debe continuar ingresando alumnos hasta indicar lo contrario. Teniendo en cuenta que la cantidad de alumnos es 21 como máximo.

Solución:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package parte2;

import javax.swing.JOptionPane;

public class Problema1 {

	public static void main(String[] args) {
		// Declaración de variables
		String nombre;
		int cant, nota1 = 0, nota2 = 0, nota3 = 0, nota4 = 0, cont=0;
		double promedio = 0;
		boolean OK = false;
		
		do {
			try {
				// Entrada de datos
				nombre = JOptionPane.showInputDialog(
								 "Programa para saber el promedio de notas\n" +
								 "Ingrese nombre");
				cant = Integer.parseInt(JOptionPane
						.showInputDialog("Ingrese cantidad de notas"));
				
				// Validar el nombre ingresado
				if (nombre.isEmpty()) {
					JOptionPane.showMessageDialog(null, "Ingrese un nombre", 
							"¡Oops!", JOptionPane.ERROR_MESSAGE);
				} else {
					// Validar la cantidad de notas ingresada
					if (cant == 4) {
						try {
							// Entrada de datos
							nota1 = ingresarNota("1");
							nota2 = ingresarNota("2");
							nota3 = ingresarNota("3");
							nota4 = ingresarNota("4");
							OK = true;
						} catch (NumberFormatException nfe) {
							JOptionPane.showMessageDialog(null, 
									"Solo se admiten números", "¡Oops!", 
									JOptionPane.ERROR_MESSAGE);
						} catch (Exception ex) {
							JOptionPane.showMessageDialog(null, ex.getMessage(), 
									"¡Oops!", JOptionPane.ERROR_MESSAGE);
						} finally {
							if (OK) {
								promedio = (nota1 + nota2 + nota3 + nota4) / 4;
								JOptionPane.showMessageDialog(null, 
										"Nombre: " + nombre + 
										"\nEl promedio es: " + promedio);
								cont++;
							}
						}
					} else {
						JOptionPane.showMessageDialog(null, "Solo 4 notas.", 
								"¡Oops!", JOptionPane.ERROR_MESSAGE);
					}
				}
			} catch (Exception e) {
				JOptionPane.showMessageDialog(null, "Solo se admiten números", 
						"¡Oops!", JOptionPane.ERROR_MESSAGE);
			}
			
			// Validar el máximo de alumnos
			if (cont == 21) {
				JOptionPane.showMessageDialog(null, 
						"Ya no se puede agregar más alumnos", "¡Oops!", 
						JOptionPane.ERROR_MESSAGE);
				break; // termino el ciclo
			}
		} while (JOptionPane.showConfirmDialog(null, "Continua..") == 0);

	}

	private static int ingresarNota(String n) throws Exception {
		int nota = Integer.parseInt(JOptionPane.
				showInputDialog("Ingresar nota " + n + ": "));
		if (nota < 0 || nota > 20) {
			throw new Exception("La nota debe ser de 0 a 20");
		}
		return nota;
	}

}

Resultado



Problema 2. Manejo de Aserciones

Deseamos comprobar que nuestra aplicación pueda obtener la raíz cuadrada de un número. Realizar las asunciones necesarias.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package parte2;

import java.util.Scanner;

public class Problema2 {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("Ingresar número: ");
		int num = sc.nextInt();
		assert (num >= 0) : "El número no puede ser negativo";
		System.out.print("La raíz cuadrada del número es: " + Math.sqrt(num));
	}

}

Resultado:

Ingresar número: 4

La raíz cuadrada del número es: 2.0

Ingresar número: -4

Exception in thread "main" java.lang.AssertionError: El número no puede ser negativo

at parte2.Problema2.main(Problema2.java:17)


Problema 3. Manejo de Cadenas

Este problema hace empleo de las clases de cadena para optimizar la actualización de información:

Se pide ingresar los datos de Apellido Paterno, Apellido Materno, Sexo y Nombre de los clientes de la empresa (máx. 10) mediante un arreglo de clase o arreglo de datos y generar su ID. Autogenerado, de acuerdo con las siguientes características:

. 1 y 3 carácter del apellido Paterno y Materno

. 1 y 3 carácter del nombre

. Carácter del sexo

. Número de acuerdo con la posición de registro

Todos los ID, se almacenarán en un StringBuffer de nombre codigos, separando cada ID por el carácter “,”.

Mostrar al finalizar los datos ingresados, así como el ID generado y la cadena de códigos almacenada.

Solución:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package parte2;

import java.util.Scanner;

class Persona {
	
	private String apePat;
	private String apePMat;
	private String sexo;
	private String nombre;
	private String id;

	public Persona(String apePat, String apePMat, 
			String sexo, String nombre, String id) {
		this.apePat = apePat;
		this.apePMat = apePMat;
		this.sexo = sexo;
		this.nombre = nombre;
		this.id = id;
	}

	@Override
	public String toString() {
		return "Persona [apePat=" + apePat + ", apePMat=" + apePMat + 
				", sexo=" + sexo + ", nombre=" + nombre + ", id=" + id + "]";
	}

}

public class Problema3 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		Persona[] personas = new Persona[10];
		StringBuffer codigos = new StringBuffer();

		// Recorremos el arreglo
		for (int i = 0; i < personas.length; i++) {
			System.out.println("DATOS DE LA PERSONA: " + i);
			System.out.print("INGRESAR APELLIDO PATERNO: "); String ap = scanner.next();
			System.out.print("INGRESAR APELLIDO MATERNO: "); String am = scanner.next();
			System.out.print("INGRESAR SEXO (M/F)      : "); String sex = scanner.next();
			System.out.print("INGRESAR PRIMER NOMBRE   : "); String nom = scanner.next();

			String id1, id2, id3, id4, idgenerado;
			// ID1: 1° y 3° carácter del apellido Paterno y Materno
			id1 = "" + ap.charAt(0) + ap.charAt(2) + am.charAt(0) + am.charAt(2);
			// ID2: 1° y 3° carácter del nombre
			id2 = "" + nom.charAt(0) + nom.charAt(2);
			// ID3. Carácter del sexo
			id3 = "" + sex.charAt(0);
			// ID4: Número de acuerdo con la posición de registro
			id4 = "" + i;
			//ID GENERADO
			idgenerado = id1 + id2 + id3 + id4;

			System.out.println("\nAP : " + ap  + "\n" + 
								 "AM : " + am  + "\n" + 
								 "SEX: " + sex + "\n" + 
								 "NOM: " + nom + "\n" +
								 "ID :" + idgenerado);
			
			// Adicionamos la persona al arreglo
			personas[i] = new Persona(ap, am, sex, nom, idgenerado);

			// Agregamos los códigos generados al SB
			if (i == 9)
				codigos.append(idgenerado);
			else
				codigos.append(idgenerado + ",");

			System.out.println("\n");
		}

		// Imprimir
		for (Persona p : personas) {
			System.out.println(p);
		}
		
		System.out.println("Códigos: " + codigos);
	}

}

Resultado:

DATOS DE LA PERSONA: 0

INGRESAR APELLIDO PATERNO: TORO

INGRESAR APELLIDO MATERNO: ALCARRAZ

INGRESAR SEXO (M/F)      : M

INGRESAR NOMBRE          : JOSE

 

AP: TORO

AM: ALCARRAZ

SEX: M

NOM: JOSE

ID. TRACJSM0

 

DATOS DE LA PERSONA: 1

INGRESAR APELLIDO PATERNO: ROJAS

INGRESAR APELLIDO MATERNO: HUERTAS

INGRESAR SEXO (M/F)      : F

INGRESAR NOMBRE          : TATIANA

 

AP: ROJAS

AM: HUERTAS

SEX: F

NOM: TATIANA

ID: RJHETTF1

 

DATOS DE LA PERSONA: 2

INGRESAR APELLIDO PATERNO: LIMA

INGRESAR APELLIDO MATERNO: SOTO

INGRESAR SEXO (M/F)      : F

INGRESAR NOMBRE          : MERCIA

 

AP: LIMA

AM: SOTO

SEX: F

NOM: MERCIA

ID: LMSTMRF2

 

Persona [apePat=TORO, apePMat=ALCARRAZ, sexo=M, nombre=JOSE, id=TRACJSM0]

Persona [apePat=ROJAS, apePMat=HUERTAS, sexo=F, nombre=TATIANA, id=RJHETTF1]

Persona [apePat=LIMA, apePMat=SOTO, sexo=F, nombre=MERCIA, id=LMSTMRF2]

Códigos: TRACJSM0,RJHETTF1,LMSTMRF2


Pregunta

Puntaje

Criterios de evaluación

Parte 1

8

Identifica y responde adecuadamente.                                                                                                              

2 puntos c/u

Parte 2

12

 

 

2

5 puntos

Empleo de clases de las estructuras

Lógica

Funcionamiento

3 ptos

1 pto.

1 pto.

3

2 puntos

Realiza la asunción mostrando el error

2 ptos

4

5 puntos

Empleo de clases de Cadena y sus métodos

Lógica

Funcionamiento

3 ptos

1 pto.

1 pto.

DESARROLLO TUS ALGORITMOS 🔥🔥


✅ 1. Envía tu algoritmo.
✅ 2. Indica en qué lenguaje de Programación lo deseas.
✅ 3. Para qué fecha lo quieres.
✅ 4. De que país eres (para tu forma de pago)
✅ 5. También se desarrollan al momento.
✅ 6. Los 3 primeros ejercicios son gratis.
🔸 Explico cada ejercicio que desarrollo en el código.

No hay comentarios, ¡cuéntame algo!

Me gustaría saber tu opinión. ¡Saludos!