Buenas después de estar mucho tiempo buscando el problema ,así que decante por crear un tema :D :D.
Tengo una consulta/problema con un arreglo bidimensional ,este mismo tiene 5 notas de n cantidad de alumnos ingresadas ,al momento de pedir el alumno con mayor nota (Osea el nombre y la nota) no tengo problema me lo muestra sin complicaciones pero al mostrar el mínimo me muestra la mínima nota bien pero el nombre del alumno me lo muestra null
mayor = menor= not1[0][0];//se toma el primero como mayor y menor
for (f = 0; f < nombres.length; f++) { //
for (a = 0; a < not1[f].length; a++) {
if (not1[f][a] > mayor) {
mayor = not1[f][a];
nombreMayor = nombres[f];
} else if (not1[f][a] < menor) {
menor = not1[f][a];
nombreMenor = nombres[f];
}
}
}
System.out.println("Mayor nota de la clase del alumno "+nombreMayor+ " " + mayor);
System.out.println("Menor nota de la clase del alumno "+nombreMenor+ " " + menor);
}
para orientarse un poco:
int nualumn=0 //es el numeros de alumnos ingresados
public static String[] nombres; //donde ingreso los nombres
public static int [][] not1; //el array bidimensional para las 5 notas
public static String nombreMenor ; //este es el del problema
public static String nombreMayor ; //String para almacenar el nombre mayor
int a=0
int f=0
se que aca no se hace la tarea de nadie ,solo estoy preguntando si como lo formule esta mal puesto o es algun error tonto no pido que me lo resuelvan :P :P,solo una ayuda que ya me esta desquiciando
si falto algun dato estare pendiente al tema y lo agregare ,y si no cumpli con alguna norma ,soy nuevo :xD :xD y si las lei pero si se me paso alguna sepan perdonar :P .
mayor y menor debería empezar a 0, porque si la primera nota resulta ser la menor o la mayor entonces núnca se ejecutarán nombreMayor = nombres[f]; y nombreMenor = nombres[f];
Disculpa mi ignorancia pero en que parte el mayor y menor deberian empezar en cero? las variables las tengo inicializadas en 0 mayor=0
menor=0
pero no creo que te refieras a eso.
mayor = menor= not1[0][0];//se toma el primero como mayor y menor
Inician con los valores de las primeras notas, sólo tendrías que quitar esa linea.
(http://s12.postimg.org/bc5lgbv99/dddd.jpg) Aca hay un imagen de lo que sucede ,elimine la linea que me dijiste y sigue pasando lo mismo solo que aparece null 0 ahora en vez de null y el minimo ,ahi en la imagen aparece la linea que me dijiste pero la puse despues de ejecutar para ver algo. no se si se puede postear la imagen directamente o tengo que poner slo el link cualquier cosa despues lo edito
Perdón es:
mayor = -1;
menor = 101;
(http://s7.postimg.org/5r5ixtenv/gffgfgg.jpg)
Genial funciona lo del nombre por lo menos no me muestra null ,lo unico malo es que ahora solo me toma el mayor y menor de el ultimo ingresado.
Gracias 0xFer por ayudarme con lo del nombre :D :D
Te podemos ayudar más rápido si pegas todo el código, pero utiliza la etiqueta Geshi.
import java.util.*;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
public class Finalv1 {
public static void main(String[] args)
{
int intentos = 0,op = 0;
Scanner teclado = new Scanner(System.in);
String usuarioCorrecto = "admin";
String usuarioIngresado = "";
String contraseñaCorrecta = "123";
String contraseñaIngresada = "";
do
{
System.out.println("Bienvenido a Gestion de Alumnos 1.0 ");
System.out.println("Ingrese Usuario: ");
usuarioIngresado = input.next();
System.out.println("Ingrese Contraseña: ");
contraseñaIngresada = input.next();
if (usuarioIngresado.equals(usuarioCorrecto) == false || contraseñaIngresada.equals(contraseñaCorrecta) == false || ((intentos <= 3)))
{
intentos++; // contador para los intentos
if (usuarioIngresado.equals(usuarioCorrecto) && contraseñaIngresada.equals(contraseñaCorrecta))
{
System.out.println("Datos ingresados correctos");
}
else if (intentos < 3)/* Aca que se repitiera siempre y cuando los intentos sean menores a 3*/
{
System.out .println("Error! usuario o contraseña incorrecta");
}
else
{
// Y aca te manda el ultimatum si te equivocas 3 veces
System.out.println("Contacte con el soporte tecnico.");
System.exit(0);
}
}
}
while (usuarioIngresado.equals(usuarioCorrecto) == false || contraseñaIngresada.equals(contraseñaCorrecta) == false);
do{
try{
System.out.print("\n\nMenú principal \n\n1: Ingresar información \n\n2: Grafica \n\n3: Datos de los Alumnos \n\n4: Finalizar programa");
System.out.println("\nSeleccione una opción del menú");
op=input.nextInt();
}catch(Exception e){
System.out.println("Error! ingrese una opción válida del menú");
input.nextLine();
}
switch (op){
case 1: ingreseDatos();
break;
case 2:
try{
grafica();
}catch(NullPointerException e){
System.out.println("Error todavia no se ha ingresado ningun dato Presione Cualquier tecla para volver");
input.nextLine();
}finally{
break;}
case 3:
try{
mostrarDatos();
}catch(NullPointerException e){
System.out.println("Error todavia no se ha ingresado ningun dato Presione Cualquier tecla para volver");
input.nextLine();
}finally{
break;}
case 4:
System.out.println("Fin del programa");
break;
default:
System.out.println("Error! ingrese una opción válida del menú");
}
}while (op!=4 );
}
public static Scanner input = new Scanner(System.in);
public static String[] nombres;
public static String nombreMayor;
public static String nombreMenor;
public static int[][] not1;
public static int a = 0, f = 0, pos = 0, sumaPos = 0, r = 0, suma = 0, PromedioTMP = 0,nualumn = 0, mayor=-1, menor=101,promedioAlumn,promedioGral,sumaProm,promFin,cont1=0,cont2=0,cont3=0,cont4=0;
public static void ingreseDatos()
{
try{
System.out.println("Cantidad de alumnos en el grupo: ");
nualumn = input.nextInt();
}catch(Exception e){
input.nextLine();
System.out.println("Error Numero invalido regresando al menu");
}
nombres = new String[nualumn];
not1 = new int[nualumn][5];
for (f = 0; f < nombres.length; f++)
{
System.out.println("Ingrese nombre del alumno ");
nombres[f] = input.next();
for (a = 0; a < 5; a++)
{
while ( not1[f][a] < 1 || not1[f][a] > 12)
{
try{
System.out.println("Introduzca nota "+(a+1));
not1[f][a] = input.nextInt();
}catch(InputMismatchException e){
input.nextLine();
System.out.println("Error ingrese un numero valido");
}
}
}
}
}
private static void grafica() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("Aprobados", cont1);
dataset.setValue("Desaprobados", cont2);
JFreeChart grafica = ChartFactory.createPieChart3D(
"Grafica de Aprobados y Desaprobados", // El nombre de la gráfica
dataset, // El arreglo de datos
false, // Indica si lleva leyenda
true, // Indica si lleva tooltips
false); // Indica si son URls
// Mostramos la grafica en pantalla
ChartFrame frame = new ChartFrame("Graficador", grafica);
frame.pack();
frame.setVisible(true);
}
// Opcion 3 de la lista
private static void mostrarDatos(){
for (f = 0; f < nombres.length; f++)
{
System.out.println("Alumno: " + nombres[f]);
for (a = 0; a < 5; a++)
{
System.out.println("Notas " + not1[f][a]);
}
}
for (f = 0; f < nombres.length; f++)
{
PromedioTMP = 0;
// Ciclo para recorrer las columnas
for (a = 0; a < 5; a++)
{
PromedioTMP = PromedioTMP + not1[f][a];
}
promedioAlumn=PromedioTMP/5;
for( int i=0; i<nualumn; i++ ){
sumaProm+= promedioAlumn;
}
promFin=((sumaProm/nualumn)/nualumn);
System.out.println("Promedio del alumno " + nombres[f] + ": "+ promedioAlumn);
if(promedioAlumn>=7){
cont1 = cont1 + 1;
System.out.println("Aprobado");
}
else{
System.out.println("Reprobado");
cont2=cont2+1;
}
if(promedioAlumn>=3||promedioAlumn<7){
cont3 = cont3 + 1;
}
else if(promedioAlumn < 3){
cont4=cont4+1;
}
}
for (f = 0; f < nombres.length; f++) { //
for (a = 0; a < not1[f].length; a++) {
if (not1[f][a] > mayor) {
mayor = not1[f][a];
nombreMayor = nombres[f];
} else if (not1[f][a] < menor) {
menor = not1[f][a];
nombreMenor = nombres[f];
}
}
}
System.out.println("Mayor nota ingresada de la clase del alumno "+ nombreMayor + " " + mayor);
System.out.println("Menor nota ingresada de la clase del alumno "+ nombreMenor + " " + menor);
System.out.println("Promedio General de la Clase : "+promFin);
}
}
Aca esta el codigo ,lo unico que use librerias de JfreeChart para unas graficas.
También debes crear dos arreglos para guardar las notas mayores y menores de cada alumno:
int[] mayor = new int[nombres.length];
int[] menor = new int[ nombres.length];
for (f = 0; f < nombres.length; f++) { //
for (a = 0; a < not1[f].length; a++) {
if (not1[f][a] > mayor) {
mayor[f] = not1[f][a];
nombreMayor = nombres[f];
} else if (not1[f][a] < menor) {
menor[f] = not1[f][a];
nombreMenor = nombres[f];
}
}
}
así puedes saber las notas mayores y menores de los alumnos
Al momento de crear los dos arreglos para guardar las notas mayores y menores ,me crea problemas aca int[] mayor = new int[nombres.length];
int[] menor = new int[ nombres.length];
for (f = 0; f < nombres.length; f++) { //
for (a = 0; a < not1[f].length; a++) {
if (not1[f][a] > mayor) { <------
mayor[f] = not1[f][a]; <------
nombreMayor = nombres[f];
} else if (not1[f][a] < menor) { <------
menor[f] = not1[f][a]; <------
nombreMenor = nombres[f];
}
}
}
Como ahora es un arreglo sería mayor[f] y menor[f], pero recuerda iniciar todos los elementos del arreglo.
Hay algo aca que estoy pasando por alto porque me tira esto
Mayor nota ingresada de la clase del alumno 4orotro [I@68f7aae2
Menor nota ingresada de la clase del alumno null [I@4f47d241
Tengo esto aca
int mayor[] = new int[nombres.length];
int menor[] = new int[ nombres.length];
for (f = 0; f < nombres.length; f++) { //
for (a = 0; a < not1[f].length; a++) {
if (not1[f][a] > mayor[f]) {
mayor[f] = not1[f][a];
nombreMayor = nombres[f];
} else if (not1[f][a] < menor[f]) {
menor[f] = not1[f][a];
nombreMenor = nombres[f];
}
}
}
y esto
int mayor=-1,menor=101
No puedes tener dos variables con el mismo nombre, ¿Cuál estás utilizando? para saber, por ejemplo, la nota más alta de los n alumnos entonces debes recorrer los arreglos donde se guardan las notas mayores de cada alumno:
int notaMayorEntreNAlumnos = 0;
for(int i = 0; i < nombres.length;i++){
if( notaMayorEntreNAlumnos < mayor[i] )
notaMayorEntreNAlumnos = mayor[i];
}
Creo que así puedes conocer la nota mayor de cada alumno y la nota mayor de entre todas las notas obtenidas por los alumnos. sería lo mismo para conocer la nota menor.
Edito: Te salen estos resultados(4orotro [I@68f7aae2 y null [I@4f47d241) creo que porque no has iniciado los valores de los 2 arreglos que te creaste, o sea todos los mayores deben ir a -1 y los menores 101. Disculpa mi lentitud, la verdad no me siento bien en estos momentos.
Aun inicianizandolos me tira lo mismo,no te preocupes solo lo pedi como ayuda no es urgente ni nada,creo que aun me estoy perdiendo de algo
import java.util.*;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
public class Finalv1 {
public static void main(String[] args) throws InterruptedException
{
int intentos = 0,op = 0;
Scanner teclado = new Scanner(System.in);
String usuarioCorrecto = "admin";
String usuarioIngresado = "";
String contraseñaCorrecta = "123";
String contraseñaIngresada = "";
System.out.println("Bienvenido a Gestion de Alumnos 1.0 ");
do
{
System.out.println("Ingrese Usuario: ");
usuarioIngresado = input.next();
System.out.println("Ingrese Contraseña: ");
contraseñaIngresada = input.next();
if (usuarioIngresado.equals(usuarioCorrecto) == false || contraseñaIngresada.equals(contraseñaCorrecta) == false || ((intentos <= 3)))
{
intentos++; // contador para los intentos
if (usuarioIngresado.equals(usuarioCorrecto) || contraseñaIngresada.equals(contraseñaCorrecta))
{
System.out.println("Datos ingresados correctos");
}
else if (intentos < 3)/* Aca que se repitiera siempre y cuando los intentos sean menores a 3*/
{
System.out .println("Error! usuario o contraseña incorrecta");
}
else
{
// Y aca te manda el ultimatum si te equivocas 3 veces
System.out.println("Contacte con el soporte tecnico.");
Thread.sleep(200000000);
}
}
}
while (usuarioIngresado.equals(usuarioCorrecto) == false || contraseñaIngresada.equals(contraseñaCorrecta) == false);
do{
try{
System.out.print("\n\nMenú principal \n\n1: Ingresar información \n\n2: Datos de los Alumnos \n\n3: Grafica \n\n4: Finalizar programa");
System.out.println("\nSeleccione una opción del menú");
op=input.nextInt();
}catch(Exception e){
System.out.println("Error! ingrese una opción válida del menú");
input.nextLine();
}
switch (op){
case 1: ingreseDatos();
break;
case 2:
try{
mostrarDatos();
}catch(NullPointerException e){
System.out.println("Error todavia no se ha ingresado ningun dato Presione Cualquier tecla para volver");
input.nextLine();
}finally{
break;}
case 3:
try{
grafica()
;
}catch(NullPointerException e){
System.out.println("Error todavia no se ha ingresado ningun dato Presione Cualquier tecla para volver");
input.nextLine();
}finally{
break;}
case 4:
System.out.println("Fin del programa");
break;
default:
System.out.println("Error! ingrese una opción válida del menú");
}
}while (op!=4 );
}
public static Scanner input = new Scanner(System.in);
public static String[] nombres;
public static String nombreMayor;
public static String nombreMenor;
public static int[][] not1;
public static int a = 0, f = 0, pos = 0, sumaPos = 0, r = 0, suma = 0, PromedioTMP = 0,nualumn = 0,promedioAlumn,promedioGral,sumaProm,promFin,cont1=0,cont2=0,cont3=0,cont4=0;
public static void ingreseDatos()
{
try{
System.out.println("Cantidad de alumnos en el grupo: ");
nualumn = input.nextInt();
}catch(Exception e){
input.nextLine();
System.out.println("Error Numero invalido regresando al menu");
}
nombres = new String[nualumn];
not1 = new int[nualumn][5];
for (f = 0; f < nombres.length; f++)
{
System.out.println("Ingrese nombre del alumno ");
nombres[f] = input.next();
for (a = 0; a < 5; a++)
{
while ( not1[f][a] < 1 || not1[f][a] > 12)
{
try{
System.out.println("Ingrese nota "+(a+1));
not1[f][a] = input.nextInt();
}catch(InputMismatchException e){
input.nextLine();
System.out.println("Error ingrese un numero valido");
}
}
}
} System.out.println("Datos Ingresados Correctamente volviendo al Menu");
}
private static void grafica() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("Aprobados", cont1);
dataset.setValue("Desaprobados", cont2);
JFreeChart grafica = ChartFactory.createPieChart3D(
"Grafica de Aprobados y Desaprobados", // El nombre de la gráfica
dataset, // El arreglo de datos
false, // Indica si lleva leyenda
true, // Indica si lleva tooltips
false); // Indica si son URls
// Mostramos la grafica en pantalla
ChartFrame frame = new ChartFrame("Graficador", grafica);
frame.pack();
frame.setVisible(true);
}
// Opcion 3 de la lista
private static void mostrarDatos(){
for (f = 0; f < nombres.length; f++)
{
System.out.println("Alumno: " + nombres[f]);
for (a = 0; a < 5; a++)
{
System.out.println("Notas " + not1[f][a]);
}
}
for (f = 0; f < nombres.length; f++)
{
PromedioTMP = 0;
// Ciclo para recorrer las columnas
for (a = 0; a < 5; a++)
{
PromedioTMP = PromedioTMP + not1[f][a];
}
promedioAlumn=PromedioTMP/5;
for( int i=0; i<nualumn; i++ ){
sumaProm+= promedioAlumn;
}
promFin=((sumaProm/nualumn)/nualumn);
System.out.println("Promedio del alumno " + nombres[f] + ": "+ promedioAlumn);
if(promedioAlumn>=7){
cont1 = cont1 + 1;
System.out.println("Aprobado");
}
else{
System.out.println("Reprobado");
cont2=cont2+1;
}
}
int mayor[] = new int[nombres.length];
int menor[] = new int[ nombres.length];
for (f = 0; f < nombres.length; f++) { //
for (a = 0; a < not1[f].length; a++) {
if (not1[f][a] > mayor[f]) {
mayor[f] = not1[f][a];
nombreMayor = nombres[f];
} else if (not1[f][a] < menor[f]) {
menor[f] = not1[f][a];
nombreMenor = nombres[f];
}
}
}
System.out.println("Mayor nota ingresada de la clase del alumno "+ nombreMayor + " " + mayor[f]);
System.out.println("Menor nota ingresada de la clase del alumno "+ nombreMenor + " " + menor[f]);
System.out.println("Promedio General de la Clase : "+promFin);
}
}
Para iniciar todos los valores tendrías que hacerlo así:
for(int i = 0; i < nombres.length;i++)
mayor[i] = -1;
Haces lo mismo con menor[]. por cierto en las últimas lineas de tu código:
System.out.println("Mayor nota ingresada de la clase del alumno "+ nombreMayor + " " + mayor[f]);
System.out.println("Menor nota ingresada de la clase del alumno "+ nombreMenor + " " + menor[f])
Lo que haces es imprimir la nota más alta pero del último alumno. Antes de eso tendrías que ver cuál nota( de entre las mejores notas obtenidas por los alumnos) es la mayor así;
int notaMayorEntreNAlumnos = 0;
for(int i = 0; i < nombres.length;i++){
if( notaMayorEntreNAlumnos < mayor[i] )
notaMayorEntreNAlumnos = mayor[i];
}
Si sólo te interesa saber cúal es la nota más alta de entre todas las calificaciones obtenidas(y la más baja) pues no es neccesario utilizar arreglos, sólo basta con declarar una variable que guarde la nota mayor y menor, eso es lo que estás intentando hacer no? Conocer sólo la nota más alta( y más baja) y saber el alumno que la obtuvo