Alternativa a esto? ejercicio Java

B

Hola, tengo un ejercicio en el cual tengo un array bidimensional, donde las filas son cursos, y las columnas notas de los alumnos, pues bien, queremos saber qué curso tiene más aprobados, en cada posicion del array guardaremos una nota, y si es igual o superior a 5 se cuenta como aprobado.

Ejemplo de salida:


Curso A: [6][1][5][6][5][2][6][6][10][9][10]
Curso B: [5][7][1][1][10][3][3][8][6][2][2]
Curso C: [6][9][8][6][8][7][10][9][8][6][10]
Contador del curso A 9
Contador del curso B 5
Contador del curso C 11
El curso con más aprobados es el C con 11

Pues bien, hasta aquí lo he hecho más o menos bien, excepto cuando un curso tiene el mismo número de aprobados que otro, que ahí me he liado un poco con los ifs, pero esa no es la cuestión.

El problema es el siguiente, yo he escrito el código en base a lo que me pide el ejercicio, que son 3 cursos, pero, si en un futuro añado más cursos, tendría que rehacer todo mi código, y eso no puede ser, debe de haber alguna manera de que al añadir un curso todo se haga automáticamente.

Este es mi código para el ejercicio:

https://pastebin.com/nQnDWPZA

Como veis, si tuviera 10 cursos, sería una locura hacer 10 contadores, y mucho más comparar A con B,C,D,E... etc, ya me costó con 3 no me quiero imaginar con 10.

Como puedo mejorarlo?

Saludos y gracias por leerme.

Xancros

Necesitas que se haga estrictamente con arrays estáticos o pueden ser otras estructuras de datos?
Opciones hay varias, pero depende de la implementación que quieras.
Si lo quieres con array bidimensionales, lo primero que tendrías que hacer sería preparar el algoritmo para que sea generico, haciendo que o bien por argumentos del main o bien desde el propio código a pelo, cambies los valores que se inicializa la estructura y luego haciendo un recorrido por un doble for para lineas y columnas. Si lo que quieres es guardar el máximo de nota y la referencia al curso, puedes tener dos punteros, uno que sea el valor y el otro la profundidad del array (que representaría el número de curso) y uno auxiliar que te guarde la nota acumulativa.
Entonces el grueso del algoritmo residiría en el for, que tendrías que mirar si la nota de "array[j] > 5 => aux+=1" al finalizar el recorrido de la fila y salir del segundo for, comprobarías si "aux>max => max=aux;curso=i".
Algo así y con eso tendrías algo más normal.
Pero como te digo, es una mejora algo facilonga, porque se siguen usando arrays definidos y no listas que te podrían albergar X notas, pero la mecánica básica es la misma, y además si lo único que necesitas es saber el máximo, no necesitas tantos bucles.
Si no me explico bien me lo dices y te lo intento explicar mejor xD

rafag

El contador de aprobados podría ser un array con tantos elementos como cursos. Así, el bucle de la línea 20 quedaría más o menos así:

for (int f = 0; f < array.length; f++) {
     for (int c = 0; c < array[f].length; c++) {
          if (array[f][c] >= 5) {
               aprobados[f]++;
          }
     }
}

(No he probado el código)

Ahora bien, te tendrías que comer un poco más la cabeza para comprobar qué curso o cursos tienen más aprobados.

EDIT: hay algo raro en el if de la línea 55 (y posteriores). Si contadorA==contadorB dices que A y B son los cursos con más aprobados pero, ¿y si C tiene más que A y B? Se seguiría cumpliendo esa condición y no debería.

1 respuesta
B

#3 Exacto, ese es el error que me ocurría, ejemplo:

[5][7][8][6][7][1][3][2][10][3][2]
[10][3][4][8][1][10][10][9][10][7][8]
[5][4][8][4][1][4][9][10][5][10][1]
Contador del curso A 6
Contador del curso B 8
Contador del curso C 6
Los cursos con más aprobados son el C con 6 y el A con 6
El curso con más aprobados es el B con 8

La línea Los cursos con más aprobados son el C con 6 y el A con 6 no debería de salir.

1 respuesta
LeSoK

#4 https://pastebin.com/w3rYc5uu

Lo puedes hacer asi, que haya un contador y luego una comparación con un maximo de aprobados por linea.
Si haces un metodo puedes introducir los cursos que quieras.
Out:

Introduce un numero de cursos
5

[8][5][4][6][6][6][3][9][7][3][6]
[10][5][2][4][3][6][6][8][9][1][4]
[10][4][4][8][8][1][8][5][8][9][1]
[4][7][5][10][9][8][9][10][2][1][6]
[1][2][1][1][6][5][8][2][6][2][7]
 Numero de aprobados 7

 Numero de aprobados 5

 Numero de aprobados 6

 Numero de aprobados 7

 Numero de aprobados 4
El curso con mas aprobados es 4

La putada es si hay dos iguales, pero vamos se podria arreglar para que se guardaran los dos,
Edit: esta de 5 para arriba , sin incluir, pon >= jajaja

1 respuesta
B

#5 No entiendo la línea 9 y 14.

1 respuesta
LeSoK

#6 Es un metodo estatico, entonces puedo introducirle un int que es lo que hago en la nueve, y en la catorce inicializo el array con el numero que le he pasado, asi pongo el tamaño que yo quiera al array

1
Camp1

Puedes hacer una matriz, de tamañoo N, siendo N los cursos que tienes (Si los cursos tienen el mismo número de estudiantes). Luego recorres la matriz fila a fila, y un único contador con el máximo de aprobados.

Usuarios habituales