TransWikia.com

Mostrar en pantalla el alumno con mayor y menor nota

Stack Overflow en español Asked on February 3, 2021

Buenas tengo un ejercicio de meter nombres y notas de alumnos, y luego tengo que decir cuantos están aprobados, suspensos, media de todas las notas, decir el nombre del alumno con menor y mayor nota y por último decir quien se llama Antonio. Tengo casi todo, menos lo de sacar el nombre del alumno con mayor y menor nota.

    Scanner sn = new Scanner(System.in);
    Scanner sc = new Scanner(System.in);
    double nota = 0, media = 0, suma = 0, mayor_nota = 0, menor_nota = 0;
    int aprobado = 0, suspenso = 0, cont = 0;
    String nombre = "", posicion_mayor = "", posicion_menor = "";
    
    for (int i = 0; i < 3; i++) {
        System.out.println("Dime el nombre del alumno: ");
        nombre = sc.nextLine();
        System.out.println("Dime la nota de Programación del alumno: ");
        nota = sn.nextDouble();
        mayor_nota = 0;
        menor_nota = 0;
        posicion_mayor = "";
        posicion_menor = "";
        if(nota >= 5) {
            aprobado++;
        } else if (nota < 5) {
            suspenso++;
        }
        if (nota < mayor_nota) {
            mayor_nota = nota;
            posicion_mayor = nombre;
        }
        if (nota > menor_nota) {
            menor_nota = nota;
            posicion_menor = nombre;
        }
        if (nombre.equalsIgnoreCase("antonio")) {
            cont++;
        }
        suma = suma + nota;
        media = suma / 3;
    }
    System.out.println(aprobado);
    System.out.println(suspenso);
    System.out.println("El alumno con mayor nota es: " + posicion_mayor);
    System.out.println("El alumno con menor nota es: " + posicion_menor);
    System.out.println("La media de las notas es: " + media);
    System.out.println("Hay " + cont + " personas que se llaman Antonio.");
    

2 Answers

La operación en ambos casos es bastante simple, debes considerar lo siguiente:

  1. Los valores de partida en ambos casos deben ser el máximo y el mínimo posibles, en tu ejemplo: mayor_nota = 0 (suponiendo que esa es la nota mínima posible) y menor_nota = 10 (suponiendo que esa es la máxima nota posible).

  2. Al momento de decidir las condicionales serás de la siguiente manera:

    • if (nota >= mayor_nota) { mayor_nota = nota; posicion_mayor = nombre; }
    • if (nota <= menor_nota) { menor_nota = nota; posicion_menor = nombre; }

De esta manera estas asegurando que se van a considerar todos los casos ingresados.

Espero te sirva, saludos.

Answered by Jhonn Brxndon on February 3, 2021

A ver, por una parte, estás asignandole un valor preestablecido a nota_menor y nota_mayor dentro del bucle for, con lo que en cada vuelta tu nota_menor y nota_mayor pasan a valer 0 otra vez. Esta asginación la tienes que hacer antes de entrar en el bucle (o puedes hacerlo donde asignas los estados iniciales (for (int i=0, nota_menor=10, nota_mayor=0;....)

Por otro lado, no puedes asignar a "nota_menor" el valor 0, porque luego cualquier nota de cualquier alumno será mayor que esta. Lo que puedes hacer es asignar a nota_mayor el menor valor que se puede asignar a una nota (es decir, 0), y a nota_menor el mayor numero posible (es decir, 10), o mejor aún, podrias asignarles valores fuera del rango, ya que si por ejemplo, un alumno saca un 0, con la condición < no entraría dentro del condicional (siempre puedes hacer un <=). Una tercera opción, sería que, si es la primera vuelta del bucle, a nota_mayor y nota_menor le asignes la nota introducida, asi partes de un valor inicial real

if ( i == 0 ) {
nota_menor=nota;
nota_mayor=nota;
posicion_menor = nombre;
posicion_mayor = nombre;
}
else {
 if (mayor_nota<nota) {
                mayor_nota = nota;
                posicion_mayor = nombre;
            }
            if (menor_nota>nota) {
                menor_nota = nota;
                posicion_menor = nombre;
            }

Lo mismo vale para `posicion_menor y posicion_mayor, si dentro del bucle haces posicion_menor="", siempre pasará a tener ese valor en cada vuelta, y esto no es lo que buscas.

  Scanner sn = new Scanner(System.in);
            Scanner sc = new Scanner(System.in);
            double nota = 0, media = 0, suma = 0, mayor_nota = -1, menor_nota = 11;
            int aprobado = 0, suspenso = 0, cont = 0;
            String nombre = "", posicion_mayor = "", posicion_menor = "";
           
            for (int i = 0; i < 3; i++) {
                System.out.println("Dime el nombre del alumno: ");
                nombre = sc.nextLine();
                System.out.println("Dime la nota de Programación del alumno: ");
                nota = sn.nextDouble();

               

                if(nota >= 5) {
                    aprobado++;
                } else if (nota < 5) {
                    suspenso++;
                }
                if (mayor_nota<nota) {
                    mayor_nota = nota;
                    posicion_mayor = nombre;
                }
                if (menor_nota>nota) {
                    menor_nota = nota;
                    posicion_menor = nombre;
                }
                if (nombre.equalsIgnoreCase("antonio")) {
                    cont++;
                }
                suma = suma + nota;
               
            }

            media = suma / 3;
            System.out.println(aprobado);
            System.out.println(suspenso);
            System.out.println("la menor es: " + menor_nota);
            System.out.println("la mayor es: " +mayor_nota);

También, como te dicen en el comentario, la media tienes que calcularla fuera del bucle.

Answered by Rodrigo on February 3, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP