Autor Tema: Java Clase Math API java y funciones de redondeo round ceil ejemplo CU00906C  (Leído 3390 veces)

PatAs

  • Sin experiencia
  • *
  • Mensajes: 19
  • ¿Libre...? - Solo cuando pienso y aprendo!!
    • Ver Perfil
Buenas noches. Presento código con posible solución al ejercicio propuesto CU00906C del tutorial de programación Java avanzado.

EJERCICIO
Supón que un partido de fútbol tiene una duración de 90 minutos. El minuto 1 se considera que abarca desde los 0 segundos hasta los 59 segundos. El minuto 2 abarca desde los 60 segundos hasta los 119 segundos. Así sucesivamente hasta el último minuto, que es el minuto 90 y abarca desde los 5340 segundos hasta los 5400 segundos. Crea un programa que pida al usuario el número de segundos transcurridos y mediante el uso de alguna función de redondeo (floor, ceil ó round) de la clase Math
muestre el minuto en que nos encontramos. El programa debe pedir valores de segundos hasta que el usuario decida terminar. Ejemplo de ejecución:
Introduzca valor de segundos: 32
El minuto es el 1
¿Otro valor (s/n)? s
Introduzca valor de segundos: 2595
El minuto es el 44
¿Otro valor (s/n)? n


Cordial saludo.

Código: [Seleccionar]
package CU00906C;
import CU00903C.EntradaPorTeclado;

/**
 * Write a description of class MinutoEnPartidoDeFutbol here.
 *
 * @author (Arnaldo R. Martinez)
 * @version (15_Ago-2017) - Ejercicio propuesto por aprenderaprogramar.com
 */
public class MinutoEnPartidoDeFutbol {
public static void main (String arg[]) {
System.out.println("Comienza el programa: ");
EntradaPorTeclado entrada = new EntradaPorTeclado();
int tmpSegundos = 0;
double minuto = 0.0;
char tecla = 's';
do {
System.out.println("Introduzca el valor de segundos trasncurridos: ");
entrada.pedirEntrada();
tmpSegundos = Integer.valueOf(entrada.getEntrada());
if (tmpSegundos <= 5400) { //Condición para no sobrepasar el tiempo del partido
minuto = tmpSegundos/60.0;
System.out.println("El minuto es el: " +(1+Math.floor(minuto)));//Redondeo hacia abajo y se le suma '1', para indicar desde 1 segundo como 1 minuto
System.out.println("Otro valor? (s/n)");
entrada.pedirEntrada();
String cadena = entrada.getEntrada();//Convierte entrada del teclado en 'char'
char letra = cadena.charAt(0);
if (letra == 'n' || letra == 'N') {
letra = 'n';
tecla = letra;
} else if (letra == 's' || letra == 'S') {
letra = 's';
tecla = letra;
}
} else {
System.out.println("El valor de segundos ingresados excede el tiempo del partido.");
}
}
while(tecla == 's');
System.out.println("Fin del programa.");
}
}

Se adjunta tambien código auxiliar 'EntradaPorTeclado'

Código: [Seleccionar]
package CU00903C;

import java.util.Scanner;
/**
 * Para obtener entradas por teclado
 *
 * @author (Arnaldo Martinez)
 * @version (01_2016)
 */
public class EntradaPorTeclado{
   
    private String entradaTcl; //Campo de la clase
    //Constructor
    public EntradaPorTeclado(){
        entradaTcl= "";
        pedirEntrada(); //Llamado a un mètodo interno
    }
    //Mètodos de la clase
    public void pedirEntrada(){
        Scanner eEsc= new Scanner(System.in);
        entradaTcl= eEsc.nextLine();
    }
   
    public String getEntrada(){
        return entradaTcl;
    }
}
« Última modificación: 22 de Septiembre 2017, 19:00 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Hola,

sobre esta parte del código:
Citar
if (letra == 'n' || letra == 'N') {
               letra = 'n';
               tecla = letra;
            } else if (letra == 's' || letra == 'S') {
               letra = 's';
               tecla = letra;
            }

Entiendo que quieres asegurarte de que la letra será minúscula para que funcione la condición del while.

Pero haces una redundancia:
Citar
letra = 'n';
tecla = letra;

Podrías simplificarlo escribiendo directamente:
Citar
tecla = 'n';

De hecho, no necesitas la variable letra pudiendo usar directamente la variable tecla:
Citar
char letra = cadena.charAt(0);
tecla = cadena.charAt(0);
if (tecla == 'n' || tecla == 'N') {
   tecla = 'n';
} else if (tecla  == 's' || tecla  == 'S') {
   tecla  = 's';
}

Aún más, estos if para forzar que la letra introducida sea minúsucla, también te los puedes ahorrar.
Hay dos posibilidades para hacerlo:

1.- Modificar la condición del while para que acepte tanto 's' como 'S'
Citar
while(tecla == 's' || tecla == 'S');

2.-La más óptima, usar el método toLowerCase() de la clase String.
Tu primero usas una variable String para leer lo introducido por teclado, y luego extraes el primer caracter:
Citar
String cadena = entrada.getEntrada();
tecla = cadena.charAt(0);

Y luego usas código para asegurarte de obtener el carácter en minúsculas.

Pero puedes pedirle al String cadena que directamente te pase a minúsculas el caracter que le pides usando este método:
Citar
String cadena = entrada.getEntrada();
tecla = cadena.toLowerCase().charAt(0);

De este modo luego no tienes que andar preocupándote de si el usuario ha escrito en mayúsculas o minúsculas haciendo IF ni nada. EL carácter que has pedido ya estará en minúsculas.

Si algún dia necesitases lo contrario, obtenerlo en mayúsculas, existe el metodo opuesto:
Citar
String cadena = entrada.getEntrada();
tecla = cadena.toUpperCase().charAt(0);

Estos métodos de la clase String son muy socorridos y puedes usarlos de muchas formas.
Si por ejemplo quisieras asegurarte de que ABSOLUTAMENTE TODO lo que introduce el usuario sea en minúsculas, puedes colocar el método directamente en tu clase 'EntradaPorTeclado':
Citar
package CU00903C;

import java.util.Scanner;
/**
 * Para obtener entradas por teclado
 *
 * @author (Arnaldo Martinez)
 * @version (01_2016)
 */
public class EntradaPorTeclado{
   
    private String entradaTcl; //Campo de la clase
    //Constructor
    public EntradaPorTeclado(){
        entradaTcl= "";
        pedirEntrada(); //Llamado a un mètodo interno
    }
    //Mètodos de la clase
    public void pedirEntrada(){
        Scanner eEsc= new Scanner(System.in);
        entradaTcl= eEsc.nextLine().toLowerCase();
    }
   
    public String getEntrada(){
        return entradaTcl;
    }
}



NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

PatAs

  • Sin experiencia
  • *
  • Mensajes: 19
  • ¿Libre...? - Solo cuando pienso y aprendo!!
    • Ver Perfil
Hola Kabuto.
Por lo visto estuve buscando una solución complicada cuando en realidad era cuestión de bastante simpleza. Hay muchas herramientas/métodos que desconozco y que gracias a apreciaciones como las que estás indicando y otras que voy tomando del foro permiten que avance en el aprendizaje.
Muchas gracias por brindarme la oportunidad de mejorar, tomo en cuenta las sugerencias y en próximo envío trataré de modificar mi código para optimizarlo, ya que tal lo expresado es de aplicación corriente.
Saludos.


 

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Esto es muy habitual en la programación.
Conforme se va aprendiendo y familiarizándose con el lenguaje, cada vez se va consiguiendo obtener los mismos resultados con menos código.

Ha veces repito viejos ejercicios que ya había hecho tiempo atrás y ahora los resuelvo con menos instrucciones y más eficiencia.

En cualquier caso, lo importante es conseguir encontrar siempre soluciones, aunque sea empleando más código del necesario.
Con el tiempo y compartiendo código con otras personas, no solo se aprenden cosas nuevas si no que se entiende mejor lo que ya conocemos y sabremos aprovecharlo mejor.

Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

PatAs

  • Sin experiencia
  • *
  • Mensajes: 19
  • ¿Libre...? - Solo cuando pienso y aprendo!!
    • Ver Perfil
Junto con los comentarios de Kabuto, tuve otra corrección desde el curso 'Java desde cero' sobre un problema que venía arrastrando desde varias lecciones anteriores. La clase auxiliar 'EntradaPorTeclado' tenía errores de concepto que interferian en el normal desempeño de los programas para resolver los ejercicios propuestos.
Ahora estoy cargando los códigos corregidos.
Muchas gracias a todos por encausarme en dirección apropiada para continuar aprendiendo.
Saludos.
Los nuevos códigos:
Código: [Seleccionar]
package CU00906C;
import CU00903C.EntradaPorTeclado;

/**
 * Write a description of class MinutoEnPartidoDeFutbol here.
 * 
 * @author (Arnaldo R. Martinez)
 * @version (15_Ago-2017) - Ejercicio propuesto por aprenderaprogramar.com
(Corrección 16-Ago-2017) - Se corrige 'EntradaPorTeclado' y código interno redundante (Sugerencia de forista KABUTO)
 */
public class MinutoEnPartidoDeFutbol {
public static void main (String arg[]) {
System.out.println("Comienza el programa: ");
EntradaPorTeclado entrada = new EntradaPorTeclado();
int tmpSegundos = 0;
double minuto = 0.0;
char tecla = 's';
do {
System.out.println("Introduzca el valor de segundos trasncurridos: ");
entrada.setEntrada();
tmpSegundos = Integer.valueOf(entrada.getEntrada());
if (tmpSegundos <= 5400) { //Condición para no sobrepasar el tiempo del partido
minuto = tmpSegundos/60.0;
System.out.println("El minuto es el: " +(1+Math.floor(minuto)));//Redondeo hacia abajo y se le suma '1', para indicar desde 1 segundo como 1 minuto
System.out.println("Otro valor? (s/n)");
entrada.setEntrada();
tecla = (entrada.getEntrada()).charAt(0);
} else {
System.out.println("El valor de segundos ingresados excede el tiempo del partido.");
}
}
while(tecla == 's' || tecla == 'S');
System.out.println("Fin del programa.");
}
}
Código: [Seleccionar]
package CU00903C;

import java.util.Scanner;
/**
 * Para obtener entradas por teclado
 *
 * @author () Foro de aprenderaprogramar.com
 * @version (01_2016) -
 * Corregido (16-Ago-2017) por feedback desde aprenderaprogramar.com
 */
public class EntradaPorTeclado{
     //Campos de la clase
    private String entrada;
private Scanner entradaTcl;
    //Constructor
    public EntradaPorTeclado(){
        entrada= "";
        entradaTcl = new Scanner(System.in);
    }
   
public void setEntrada() {
entrada = entradaTcl.nextLine();
}

    public String getEntrada(){
        return entrada;
    }
}

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".