Como indicas, por ejemplo si hay 5 en ciencias y 5 en letras cada uno tendría 1 grupo de tres y un grupo incompleto de 2. Mi consulta es más que nada como hacerlo sin usar array y sólo con string, condicionales y bucles. Como lo harías por ejemplo con tres alumnos. Al final que salgan en pantalla. No importa lo de los grupos de 3, como dije ya lo termine pero con arrays, esa parte seria igual.
Mira, te propongo un codigo que creo cumple con lo que se pide.
Pedir 10 alumnos, guardar sus datos en grupos de 3, separados según los dos tipos de carrera y calcular el promedio de edad.
Todo ello sin usar arrays ni matrices.
Lo que hago es declarar 4 Strings, uno para cada grupo. Ya que para 10 alumnos habrán 4 grupos, ni más, ni menos.
Junto con cada String de grupo, declaro su propio contador.
Entonces pido datos: nombre, edad y carrera.
Compongo un unico String con estos datos, evaluo a que tipo de carrera pertenecen (para ello me valgo de un String staticos con algunas de las posibles carreras para cada tipo) y llamo un metodo al que le paso el string con los datos y otro String con un unico caracter para indicar cual es el tipo de carrera: "C" para Ciencias o "L" para Letras.
ESte metodo empezará a consultar los contadores de cada grupo.
Empezará pro el primero.
Si su contador es == 0, es que está vacío y concatenará aqui los datos del alumno, poniendo al principio de todo el caracter de Tipor de Carrera. Así este primer grupo quedará adjudicado al tipo de carrera correpondiente.
Si el contador no es 0, pero es menor que 3, es que el grupo esta empezado y aun queda sitio para otro alumno, pero solo lo añadiremos si el caracter 0 de este STring que representa al grupo, corresponde con el caracter de Tipo de Carrera.
Si no corresponde, es que este grupo pertenece a un tipo distinto al del nuevo alumno que estamos añadiendo, por tanto, pasaremos a hacer las mismas consultas al siguiente grupo.
Y así hasta haber consultado los 4 grupos.
Quizás es algo lioso así explicado, pero es más sencillo de lo que parece.
Mira, este es mi programa:
//https://aprenderaprogramar.com/foros/index.php?topic=7173.0
package gruposAlumnos;
import java.util.Scanner;
public class Grupos {
//Algunas posibles carreras para las dos categorias de CIENCIAS y LETRAS
final static String CARRERAS_CIENCIAS = "astronomia biologia bioquimica biotecnologia fisica genetica geologia matematicas";
final static String CARRERAS_LETRAS = "periodismo historia publicidad humanidades filologia traduccion";
//Los 4 posibles grupos y sus contadores.
static String grupo1 = new String(); static int contGrupo1 = 0;
static String grupo2 = new String(); static int contGrupo2 = 0;
static String grupo3 = new String(); static int contGrupo3 = 0;
static String grupo4 = new String(); static int contGrupo4 = 0;
//Acumulador para el promedio de edades
static int sumaEdades = 0;
//Objeto Scanner para pedir datos por consola
static Scanner teclado = new Scanner(System.in);
/**
* Introduce los datos del alumno en un grupo adecuado según su tipo de carrera
* @param tipoCarrera Cadena String con valor "C" para Ciencias o "L" para Letras
* @param nuevoAlumno Cadena String con nombre, edad y carrera en la que se inscribe
*/
static void agruparAlumno(String tipoCarrera, String nuevoAlumno)
{
/*
* Buscaremos un grupo adecuado para este alumno o iniciaremos uno nuevo.
* Al iniciar un grupo, el primer caracter de su String será el indicado
* por tipoCarrera : "C" para Ciencias o "L" para letras.
* De este modo sabremos a que tipo de carrera está adjudicado cada grupo
*/
if (contGrupo1 == 0)//El primer grupo esta vacio, lo iniciamos y le adjudicamos un tipo de carrera
{
grupo1 = tipoCarrera + nuevoAlumno + "\n";
contGrupo1++;
}
else if (contGrupo1 < 3 && grupo1.startsWith(tipoCarrera))
{
//Grupo1 esta iniciado pero aun queda sitio.
//Sin embargo, solo añadiremos este alumno si corresponde al mismo tipo de carrera
grupo1 += nuevoAlumno + "\n";
contGrupo1++;
}
//LLegados a este punto, es que grupo1 ya esta completo.
//Seguiremos haciendo las mismas preguntas para el resto de grupos
else if(contGrupo2 == 0)
{
grupo2 = tipoCarrera + nuevoAlumno + "\n";
contGrupo2++;
}
else if (contGrupo2 < 3 && grupo2.startsWith(tipoCarrera))
{
grupo2 += nuevoAlumno + "\n";
contGrupo2++;
}
else if(contGrupo3 == 0)
{
grupo3 = tipoCarrera + nuevoAlumno + "\n";
contGrupo3++;
}
else if (contGrupo3 < 3 && grupo3.startsWith(tipoCarrera))
{
grupo3 += nuevoAlumno + "\n";
contGrupo3++;
}
else if(contGrupo4 == 0)
{
grupo4 = tipoCarrera + nuevoAlumno + "\n";
contGrupo4++;
}
else if (contGrupo4 < 3 && grupo4.startsWith(tipoCarrera))
{
grupo4 += nuevoAlumno + "\n";
contGrupo4++;
}
}
public static void main(String[] args) {
for (int i = 1; i <= 10; i++)
{
//Pedimos datos
System.out.println("Alumno #" + i);
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Edad: ");
String edad = teclado.nextLine();
System.out.print("Carrera: ");
String carrera = teclado.nextLine();
//Acumulamos la edad para luego sacar la media
sumaEdades += Integer.parseInt(edad);
//Creamos un unico String con todos los datos en una sola linea
String nuevoAlumno = nombre + " " + edad + " " + carrera;
//Evaluamos el tipo de carrera y añadimos alumno si la carrera es reconocible
if (CARRERAS_CIENCIAS.contains(carrera.toLowerCase()))
{
agruparAlumno("C", nuevoAlumno);
}
else if (CARRERAS_LETRAS.contains(carrera.toLowerCase()))
{
agruparAlumno("L", nuevoAlumno);
}
else
{
System.out.println("\nNo se reconoce la carrera: " + carrera);
System.out.println("Este alumno no sera registrado");
i--;//Revertimos el incremento del indice del bucle
//Revertimos la acumulacion de la edad
sumaEdades -= Integer.parseInt(edad);
}
}
//Bucle for finalizado, tenemos los 10 alumnos en grupos de tres. Mostramos datos.
//Primer grupo
System.out.print("\n\nPrimer grupo.\nTipo de carrera: ");
System.out.println(grupo1.startsWith("C")?"Ciencias":"Letras");
System.out.println("Componentes:");
System.out.println(grupo1.substring(1));//Eludimos el caracter 0, que es el que usamos como indicador del tipo de carrera
//Segundo grupo
System.out.print("\nSegundo grupo.\nTipo de carrera: ");
System.out.println(grupo2.startsWith("C")?"Ciencias":"Letras");
System.out.println("Componentes:");
System.out.println(grupo2.substring(1));
//Tercer grupo
System.out.print("\nTercer grupo.\nTipo de carrera: ");
System.out.println(grupo3.startsWith("C")?"Ciencias":"Letras");
System.out.println("Componentes:");
System.out.println(grupo3.substring(1));
//Ultimo grupo, el del alumno solitario
System.out.print("\nCuarto grupo.\nTipo de carrera: ");
System.out.println(grupo4.startsWith("C")?"Ciencias":"Letras");
System.out.println("Componentes:");
System.out.println(grupo4.substring(1));
//Por ultimo, la media de edad
System.out.println("\n\nEl promedio de edad entre los alumnos es: " + (int)(sumaEdades / 10));
}
}
Y esta es la salida que obtengo al ejecutar el programa e introducir datos de los 10 alumnos.
Fíjate que ha sabido almacenar y agrupar todos los datos correctamente, sin usar arrays u otro tipo de coleccion de datos.
Alumno #1
Nombre: Antonio
Edad: 23
Carrera: Astronomia
Alumno #2
Nombre: Ana
Edad: 25
Carrera: Periodismo
Alumno #3
Nombre: Javier
Edad: 39
Carrera: Biotecnologia
Alumno #4
Nombre: Ramon
Edad: 30
Carrera: Matematicas
Alumno #5
Nombre: Nerea
Edad: 24
Carrera: Humanidades
Alumno #6
Nombre: Irina
Edad: 37
Carrera: Periodismo
Alumno #7
Nombre: Nuria
Edad: 25
Carrera: Publicidad
Alumno #8
Nombre: Edgar
Edad: 32
Carrera: Traduccion
Alumno #9
Nombre: Pedro
Edad: 28
Carrera: Fisica
Alumno #10
Nombre: Lucas
Edad: 24
Carrera: Genetica
Primer grupo.
Tipo de carrera: Ciencias
Componentes:
Antonio 23 Astronomia
Javier 39 Biotecnologia
Ramon 30 Matematicas
Segundo grupo.
Tipo de carrera: Letras
Componentes:
Ana 25 Periodismo
Nerea 24 Humanidades
Irina 37 Periodismo
Tercer grupo.
Tipo de carrera: Letras
Componentes:
Nuria 25 Publicidad
Edgar 32 Traduccion
Cuarto grupo.
Tipo de carrera: Ciencias
Componentes:
Pedro 28 Fisica
Lucas 24 Genetica
El promedio de edad entre los alumnos es: 28