Java - Problema con ejercicio Java

 
Vista:
sin imagen de perfil
Val: 6
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Problema con ejercicio Java

Publicado por Javier (3 intervenciones) el 26/01/2020 11:06:28
Hola buenas, tengo un problema con este ejercicio (Adjunto enunciado mas abajo) funciona correctamente pero al repetirse el bucle, no me da la opción de volver a escribir el String.

ENUNCIADO: Calcular las calificaciones de un grupo de alumnos. La nota final de cada alumno se calcula según el siguiente criterio: La parte práctica vale un 10%, la parte de problemas vale un 50% y la parte teórica vale un 40%. El algoritmo leerá el nombre del alumno, las 3 notas, escribirá el resultado, y volverá a pedir
los datos del siguiente alumno. Hasta que el nombre sea una cadena vacía. Las notas deben estar entre 0 y 10, si no lo están no imprimirá las notas, si no que mostrará un mensaje de error y volverá a pedir otro alumno.

Este es mi código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
    Scanner sc = new Scanner (System.in);
    float NPract, NProblem, NTeori;
    String nombre;
    do {
        System.out.println("Introduce el nombre del alumno: ");
        nombre = sc.nextLine();
        System.out.println("Introduce la nota de la practica: ");
        NPract = sc.nextFloat();
        System.out.println("Introduce la nota de los problemas: ");
        NProblem = sc.nextFloat();
        System.out.println("Introduce la nota de la teoria: ");
        NTeori = sc.nextFloat();
        System.out.println("La media de " +nombre+ " es: " +((NPract+NProblem+NTeori)/3));
        System.out.println("\n");
        }
    while ((NPract>=0 && NPract<=10) && (NProblem>=0 && NProblem<=10) && (NTeori>=0 && NTeori<=10)
    && (nombre!=null));
}

La salida es esta:

Introduce el nombre del alumno:
felipe
Introduce la nota de la practica:
8
Introduce la nota de los problemas:
9
Introduce la nota de la teoria:
4
La media de felipe es: 7.0


Introduce el nombre del alumno:
Introduce la nota de la practica:
5
....
Introduce la nota de los problemas:
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Problema con ejercicio Java

Publicado por Juan (70 intervenciones) el 27/01/2020 11:25:00
Buenas javier, te comento el objeto scanner cuando te lee un número float con esta instrucción "sc.nextFloat()" cuando presionas el enter, obtiene el número y lo guarda en tu variable, pero deja en su memoria por llamarlo de algún modo, porque no recuerdo como se llama jeje. deja en su memoria el enter almacenado, es decir el salto de línea, debido a que este dato no puede almacenarlo en un float, se lo queda para él. y cuando el ciclo se repite la instrucción "sc.nextLine();" obtiene ese salto de línea que se había guardado el objeto scanner para él. y salta a la siguiente instrucción, almacenando en la variable nombre ese salto de línea. una posible solución es poner al final de tu ciclo, antes de volver a repetirlo otra instrucción como esta "sc.nextLine();" para que suelte ese salto de línea, y cuando vuelva a empezar el objeto scanner no tenga nada almacenado en su memoria (Creo que se llama buffer, pero no me hagas mucho caso que no recuerdo).

te hice alguna modificación, porque en el ciclo la condición de salida según el enunciado es cuando el nombre este vacío, y tu has puesto cuando sea null, lo cual nunca pasara. y has puesto como condicion tambien cuando una nota no este entre 0 y 10 y eso no es condición para finalizar el ciclo, es solo mandar un mensaje de error y volver a empezar el ciclo. También te añadi un if para que si el nombre esta vacio no te pida las notas, si no que salga del ciclo directamente.

Y otra cosa, cuando compares string usa el método equals porque si no te dará error, porque con el == o el != no funcionan bien los string. Quedando de este modo:

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
public static void main(String args[]) {
    Scanner sc = new Scanner (System.in);
    float NPract, NProblem, NTeori;
    String nombre;
    do {
        System.out.println("Introduce el nombre del alumno: ");
        nombre = sc.nextLine();
        if (!nombre.equals("")){
            System.out.println("Introduce la nota de la practica: ");
            NPract = sc.nextFloat();
            System.out.println("Introduce la nota de los problemas: ");
            NProblem = sc.nextFloat();
            System.out.println("Introduce la nota de la teoria: ");
            NTeori = sc.nextFloat();
 
            sc.nextLine();//Esto es para quitar el salto de linea almacenado
 
            if ((NPract>=0 && NPract<=10) && (NProblem>=0 && NProblem<=10) && (NTeori>=0 && NTeori<=10))
                System.out.println("La media de " +nombre+ " es: " +((NPract+NProblem+NTeori)/3)+"\n");
             else
                System.out.println("Error, las notas no son válidas\n");
        }
    }while ((!nombre.equals("")));
    System.out.println("Fin del programa");
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 6
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Problema con ejercicio Java

Publicado por Javier (3 intervenciones) el 28/01/2020 10:53:57
Hola Juan, muchas gracias por tus observaciones y la mejora del código. Con limpiar el buffer ya conseguí poder volver a introducir un nombre pero luego también me di cuenta de que se me olvido multiplicar por el porcentaje que valía cada nota jajaj. Gracias por tu aportación me ha ayudado mucho, soy bastante novato en esto y había cosas que no sabia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de José Manuel
Val: 25
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Problema con ejercicio Java

Publicado por José Manuel (7 intervenciones) el 27/01/2020 15:59:00
Hola:

En las condiciones de salida de tu bucle, una de ellas es que nombre sea null:

nombre!=null

Y tal como está, nunca lo será después de la primer iteración.

Yo sustituiría las líneas:

1
2
3
4
5
6
3: String nombre = "";   // Cadena vacía, no null.
... // resto de código.
16: nombre = "";           // Hemos insertado esta línea. Las condiciones del while que antes comenzaban en la línea 17 ahora
                                     // comienzan en la línea 18.
...
19: && (!nombre.equals(""))    // Sustituimos la condición.

Cuéntanos. Un saludo,
https://obelearningservices.com/blog/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 6
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Problema con ejercicio Java

Publicado por Javier (3 intervenciones) el 28/01/2020 10:59:04
Muchas gracias por tu aportación, es otra forma que no se me había ocurrido, funciona perfectamente. Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema con ejercicio Java

Publicado por Rodrigo (623 intervenciones) el 28/01/2020 16:46:18
En vez de comparar usando equals y un string literal vacio, sugiero usar isEmpty() que ejecuta y documenta exactamente lo que quieres.

Para el caso particular, seria

!nombre.isEmpty()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar