Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Kabuto

Páginas: 1 ... 37 38 39 40 41 [42] 43 44 45 46 47 ... 50
821
Vale, problema solucionado gracias a alguien más sabio que yo.

Y la solución es tan simple, que me siento estúpido ja ja...

Basta con añadir un repaint() tras "revalidar" el contenedor de la Vista.
Tan simple como eso... y mira que le dí vueltas al asunto este y probé cosas raras.... pero en ningún momento se me ocurrió probar con algo tan evidenete como un repaint()  :o

Queda solucionado modificando así el método:
Código: [Seleccionar]
public void actualizarEncargos(ArrayList<Encargo> encargos) {
contenedor.removeAll();
System.out.println("Encargos.size() --> " + encargos.size()); //Info para debug
for (int i = 0; i < encargos.size(); i++)
{
PanelEncargo temp = new PanelEncargo(encargos.get(i));
temp.botonEliminar.addActionListener(new AccionEliminarPanel(i));
contenedor.add(Box.createRigidArea(new Dimension(0, 20)), -1);
contenedor.add(temp);
}
contenedor.revalidate();
contenedor.repaint();
}

822
Hola a todos.
Por practicar y tal... estoy haciendo un programita en Java en el cual dentro de un JScrollPane, añado y elimino JPanels en tiempo real.
Añadir puedo añadir los que quiera, se van colocando uno debajo de otro.
Cada JPanel tiene un boton "Eliminar" para eliminar este Jpanel en cuestión.

Pues bien, por algún extraño motivo.... si hay más de 3 JPanels mostrándose , sí puedo ir eliminandolos...
Pero cuando ya solo hay dos, o bien solo hay uno...no se eliminan..
Bueno, en realidad, creo que si se eliminan, solo que parece que no se actualiza correctamente el JSCrollPane y siguen mostrándose en pantalla, aunque en realidad si han sido eliminados.

Y es extraño que esto solo falle cuando hay uno o dos paneles.
Como digo, si hay más paneles si se eliminan y se actualiza la pantalla correctamente.
Luego, en principio el código que uso es correcto, pero no entiendo porque falla solo en esa situacion.

El código que uso, tanto para añadir paneles como para eliminar, es en realidad muy sencillo, sin complicaciones.
- Hago un removeAll()
- Genero nuevos JPanel a partir de los datos contenidos en un ArrayList y los voy añadiendo al contenedor correspondiente.
- Por último hago un .revalidate()

Este es el método que se encarga de este proceso:
Código: [Seleccionar]
public void actualizarEncargos(ArrayList<Encargo> encargos) {
contenedor.removeAll();
System.out.println("Encargos.size() --> " + encargos.size()); //Info para debug
for (int i = 0; i < encargos.size(); i++)
{
PanelEncargo temp = new PanelEncargo(encargos.get(i));
temp.botonEliminar.addActionListener(new AccionEliminarPanel(i));
contenedor.add(Box.createRigidArea(new Dimension(0, 20)), -1);
contenedor.add(temp);
}
contenedor.revalidate();
}

Os paso un zip el código fuente completo, pero antes, sabiendo que es extremadamente complicado interpretar el código escrito por otra persona, me gustaría explicaros en que consiste mi programa, lo más resumidamente posible sin daros demasiado la paliza.

Intento hacer un programita muy simple para gestionar Encargos de productos que soliciten clientes.
En mi trabajo, a veces los clientes nos piden que traigamos cierto producto, o bien que les avisemos si por casualidad llega un determinado producto que se está retrasando.
Actualmente, estos encargos se anotan a mano en una agenda, pero muchas veces olvidamos repasar dicha agenda como es debido, o se pierde durante varios dias, o nadie se acuerda de quien tomó nota de un determindo encargo,..

En fin, un desastre.
Y se me ha ocurrido, con mis escasos conocimientos, intentar hacer un programita en Java para gestionar esto desde el ordenador, de forma mas visual.
La idea es que se guarden y muestren en pantalla los datos referentes a cada encargo que nos pidan.
Cada encargo está representado por un JPanel rectangular y se irán colocando uno debajo del otro. Además el color del JPanel varía según la fecha de antigüedad, mostrandose en rojo los encargos muy antiguos y que por lo tanto requieren algún tipo de accion inmediata.

Bueno en fín. Para ello, uso principalmente:
- una clase Encargo con los datos de los encargos que se pidan.
- una clase PanelEncargo, que hereda de JPanel y recibe un objeto Encargo para mostrar sus datos en pantalla.

Estoy siguiendo una estructura Modelo-Vista-Controlador:

Así que en la clase Modelo tengo un ArrayList para almacenar los Encargos que se vayan realizando.
Más adelante, pondré funcionalidad para guardar y recuperar este ArrayList serializandolo en un archivo.

La Vista, obviamente, se encarga de construir el JSCrollPane donde se van añadiendo y quitando los objetos PanelEncargo. Este JScrollPane se pasa luego a la clase principal, que es donde esta el JFrame que muestra lo que va haciendo la Vista.

Y el Controlador, pues nada, hace de nexo entre la Vista y el Modelo.

Hay alguna clase más, como un JDialog para crear Encargos, pero no es relevante ahora.

Bien, paso a explicar como se crean los PanelEncargo.
Lo que hago es que cojo del Modelo el ArrayList de Encargos.
Por cada Encargo, creo un PanelEncargo.
Cada PanelEncargo, muestra los datos del Encargo y tiene dos botones:
- uno para Modificar (que ahora mismo no funciona, no tiene ninguna implementacion todavia)
- otro para Eliminar.

Al boton Eliminar de cada PanelEncargo, le agrego este ActionListener

Código: [Seleccionar]
private class AccionEliminarPanel implements ActionListener {

int numeroPanel;

public AccionEliminarPanel(int nPanel) {
numeroPanel = nPanel;
}

@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Eliminando panel numero: " + numeroPanel); //Info para debug
controlador.eliminarEncargo(numeroPanel);
}
}

Ese atributo numeroPanel, lo uso para guardar el numero de indice que ocupa cada Encargo en el ArrayList.
Es decir, el Encargo en la posicion 0, su correspondiente PanelEncargo tiene un boton Eliminar "personalizado" que ya sabe que cuando se pulse, hay que decirle al Controlador que de orden al Modelo de eliminar el Encargo en la posicion 0.

Una vez eliminado, el Controlador le enviará a la Vista el ArrayList que acaba de cambiar.
Y la Vista eliminará TODOS los PanelEncargo presentes en pantalla, volverá a crear nuevos con los datos actuales del ArrayList de Encargos y "revalidará" el JScrollPane con los nuevos componentes actuales.

Bien, todo este proceso, no se si es eficiente, pero en principio es eficaz.
Y además es una forma fácil de conseguir que todos los PanelEncargo tengan los botones "Eliminar" actualizados. Porque cada vez que borro un Encargo, los indices del ArrayList varían, y por tanto los botones "Eliminar" se han de actualizar o de lo contrario podrían dar ordenes de eliminar Encargos que ya no existen o que ahora pertenece a otros PanelEncargo distintos.

Bueno, como digo, esto "funciona" bien cuando hay muchos PanelEncargo mostrándose en pantalla.
Pero, no se porque, cuando solo hay uno o dos, la Vista no se actualiza correctamente.
Los componentes son eliminados, es decir, el .removeAll() hace su cometido. Pero "visualmente" no se percibe y se quedan en pantalla unos PanelEncargo que en realidad ya no están.

El ArrayList de Encargos se actualiza correctamente, con unos System.out voy controlando como su tamaño aumenta o decrece en cada accion.
Y los botones "Eliminar" también se actualizan correctamente, pues también controlo cuando los pulso que indice van a dar orden de eliminar en el ArrayLsit, y siempre es correcto.

Así que el problema tiene que ser alguna pijada del Swing que yo desconozca, o yo que se...

Os adjunto un zip con el código fuente. No es necesario que os estudieis el código completo.
Quien pueda/quiera ayudarme que centre su neuronas en la clase Vista, en su método actualizarEncargos() que es quien añade/elimina los PanelEncargo.
Y es muy fácil reproducir el fallo. Basta generar tres o cuatro encargos usando la opción del menú superior.
Veréis que se van mostrando correctamente en pantalla.

Cuanto tengais tres o cuatro creados, empezad a eliminar.
Veréis que se van eliminando correctamente, hasta cuando quedan dos en pantalla.
Entonces fallará y no se eliminarán, bueno, más bien no se va a mostrar que SI han sido eliminados.

PD:
No me juzguéis por lo fea que es la interfaz  :-[
Está en fase alpha todavía jeje, cuando funcione la haré un poco más bonita.
Aunque no tengo mucho arte yo para esto, así que seguirá siendo fea, solo que entonces no tendré excusa.

Gracias a quien al menos me haya leído, y un saludo.

823
Comunidad / Re:agradecimiento a Kabuto y feliz año nuevo
« en: 31 de Diciembre 2018, 23:55 »
Gracias Mario por la bienvenida y por ofrecerme la posibilidad de colaborar en el foro.
Y gracias a todos los que han hecho posible que exista esta web.
Como ya te comenté, le tengo un cariño especial por ser la única web que encontré capaz de enseñar de una forma más cercana y asequible a los novatos que partíamos casi desde cero.

Espero poder seguir aportando algo también de mi parte.

Feliz año 2019 a todo el mundo. Un abrazo

824
Es que esto de la Programacion Orientada a Objetos (POO), al principio cuesta un poco entender la filosofía que implica.
Pero luego uno se da cuenta de que no es tán difícil, al contrario, es de lo más simple ya que de hecho lo que hace es trasladar a la programación la misma filosofía que explica el mundo real que nos rodea.

Por ejemplo, persona es un concepto abstracto. Es la definición de como ha de ser una persona: es un ser vivo, normalmente un Homo Sapiens, con 2 ojos, 4 extremidades, pelo, boca, un nombre, un sexo, una edad, una estatura, un peso, una procedencia, un parentesco, un idioma materno......

Pero no es algo concreto. Sin embargo, Paramonso, Kabuto, Ogramar... si son cosas concretas.
Somos las concreciones de la idea abstracta de una persona.
 Tenemos unas propiedades comunes individualizadas.
Nos parecemos mucho, pero somos únicos. El conjunto de nuestros atributos nos individualiza.
Todos tenemos ojos, pero no todos los tenemos verdes o azules. O si algunos coincidimos en tenerlos verdes, nos diferencia nuestro nombre. Y si también coincidiese, nos diferenciará nuestra procedencia, nuestro parentesco, nuestro número de teléfono...

Pues en POO es lo mismo.
Una clase Persona es la idea abstracta de cómo necesitamos que sea (que atributos y métodos ha de tener), según las necesidades de nuestro programa, los objetos concretos que luego iremos creando a partir de esta idea abstracta, es decir, de la clase Persona que hemos definido.


Así que la filosofía de la POO es prácticamente un espejo de la filosofía que describe nuestro mundo real.

Incluso en el mundo real contamos con algo similar a la clase Object de Java je je.
Como dijimos, la clase Object define unas propiedades básicas que todo objeto en Java ha de tener, por el simple hecho de ser un objeto de Java. Por eso todas las clases heredan obligatoriamente de Object.

Pues en filosofía del mundo real se habla de las "Propiedades sustanciales generales" que toda cosa sustanciada existente posee, por el simple hecho de ser una cosas sustanciada.

Por ejemplo, una persona y una piedra no se parecen absolutamente en nada. Son objetos o cosas completamente diferentes.
Sin embargo, por el simple hecho de ser "cosas sustanciadas" (objetos)  tienen propiedas comúnes como puede ser masa, volumen, inercia, energía... propiedas que va a tener cualquier cosa física de nuestro universo, ya sea un ratón, un arbol o un planeta.

Y bueno, suficiente filosofía por hoy

825
Ahí lo que dice es que todas las clases en Java, absolutamente todas, son hijas de la clase Object.

Pero una cosa es hablar de objetos (instancias de una clase) y otra cosa es hablar de Object (que es una clase).
Si yo hago:

Código: [Seleccionar]
Object miObjeto = new Object();
String miCadena = new String();
Aquí, si hablo de Object, estoy hablando de una clase.
Si hablo de String, estoy hablando también de una clase.

Si hablo de miObjeto, estoy hablando de un objeto, que es una instancia de la clase Object.
Y si hablo de miCadena, estoy hablando también de un objeto, que es una instancia de la clase String, quien además, al igual que todas las clases, es hija de la clase (superclase mejor dicho) Object.

Que todas las clases hereden de Object, implica que todas las clases heredan automáticamente métodos como .equals(), .hashCode(), .toString(), etc...
En la API de Oracle se puede ver la documentación de Object

Sin embargo, estos métodos, han de ser sobreescritos por el programador para hacer que funcionen correctamente con la clase diseñada por el programador.
En el [url)https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=666:sobreescribir-metodos-tostring-y-equals-en-java-ejemplos-y-ejercicios-resueltos-comparar-objetos-cu00694b&catid=68&Itemid=188]capítulo CU00694B[/url] se habla de esto.

Bueno, en definitiva.
En Java hay clases y objetos, no puede ser de otra forma, pues una cosa implica la otra.
Java además tiene la peculiaridad, de que hay una superclase llamada Object de la cuál automáticamente todas las demás clases heredan de ella.

La intención de esto es establecer mediante la clase Object unos métodos mínimos que todo objeto en Java debería tener. Luego se les dará uso o no..., pero tenerlos, los tienen.

826
Ja ja.
No hay de que.

Y al principio es normal hacerse un poco de lio con estos conceptos abstractos

827
No se por donde he leído que en java no existen clases solamente objetos.

Es que una cosa no puede existir sin la otra.
Si existen objetos, existen clases, y viceversa.
Ya que para instanciar un objeto, ha de haber una clase que defina cómo va a ser ese objeto.

Vamos de hecho, todo lo que se hace en Java es una clase.
De ahí que todos los programas comiencen con las palabras: public class ...

828
Disculpad que me entrometa, pero esto no es correcto:
Citar
En este caso la Clase es TripulacionAvion y dentro de esta clase se ha creado un objeto Persona y de este objeto se han creado tes objetos dependientes de el que son Persona piloto; Persona copiloto1; Persona copiloto2.

Persona también es una clase en este caso, no es un objeto.

Aqui tenemos dos clases: TripulacionAvion y Persona.

La clase TripulacionAvion tiene tres atributos, que son de la clase Persona (que no es un objeto, es una clase).

Cuando vayamos a instanciar un objeto de la clase TripulacionAvion, por ejemplo:
Código: [Seleccionar]
TripulacionAvion nuevaTripu = new Tripulacion();Tenemos un objeto, llamado nuevaTripu.
Y sus atributos, son otros tres objetos, llamados: piloto, copiloto1 y copiloto2.
Estos tres objetos, son de la clase Persona.

Ahora bien, respecto a la pregunta:
Citar
Considera una clase Java que se denomina TripulacionAvion y que tiene como atributos a tres objetos de tipo Persona: Persona piloto; Persona copiloto1; Persona copiloto2.

a) ¿Sería posible que al crear un objeto TripulacionAvion se produjera que piloto, copiloto1 y copiloto2 apuntaran a un mismo objeto, es decir, que existiera una relación de identidad entre los tres atributos?

Pues sí, podría ser posible, si por ejemplo se hiciera algo así..

Código: [Seleccionar]
Persona unaPersona = new Persona();
TripulacionAvion nuevaTripu = new Tripulacion();
nuevaTripu.setPiloto(unaPersona);
nuevaTripu.setCopiloto1(unaPersona);
nuevaTripu.setCopiloto2(unaPersona);

En este hipotético caso, los tres atributos estarían referenciando a un mismo objeto, el objeto unaPersona.

De este modo, los cambios que hagamos en cualquiera de los 4 objetos Persona (unaPersona, piloto, copiloto1 y copiloto2) afectará a todos. Porque en realidad todos están apuntando (referenciando) a un mismo y único objeto.

Ojo, solo afecta por igual los cambios que hagamos sobre ese  objeto referenciado. Si para alguno de ellos, lo que hacemos es darle una nueva instancia (un nuevo new Persona() ), esto solo afecta al objeto en cuestión, el resto seguirán apuntando a la primera instancia.

Mirad, os dejo aquí un código rápido que demuestra como afectan estos cambios.
En el creo una unica Persona y el contructor de TripulacionAvion lo que hace es atribuirsela a los tres atributos: piloto, copiloto1 y copiloto2.
Ahí se ve como los cambios que hagamos a unos a otros, afectan a todos por igual.
Excepto para cuando alguno de ellos les damos unas nuevas instancias (new Persona() ).

Entonces la cosa cambia
Código: [Seleccionar]
package tripulacion;

public class PruebaTripulacion {

static class Persona {
String nombre;

public Persona(String nom) {
nombre = nom;
}

public void setNombre(String nom) {
nombre = nom;
}

public String getNombre() {
return nombre;
}
}

static class TripulacionAvion {
Persona piloto;
Persona copiloto1;
Persona copiloto2;

public TripulacionAvion(Persona persona) {
piloto = persona;
copiloto1 = persona;
copiloto2 = persona;
}

public void mostrarNombresTripulacion() {
System.out.println("Piloto: " + piloto.getNombre());
System.out.println("Copiloto1: " + copiloto1.getNombre());
System.out.println("Copiloto2: " + copiloto2.getNombre());
}

public void setNombrePiloto(String nombre) {
piloto.setNombre(nombre);
}

public void setPiloto(Persona persona) {
piloto = persona;
}
}

public static void main(String[] args) {

Persona unaPersona = new Persona("Andres");
TripulacionAvion nuevaTripu = new TripulacionAvion(unaPersona);

nuevaTripu.mostrarNombresTripulacion();
System.out.println("\n--Cambiamos el nombre del objeto unaPersona, afecta a todos--\n");

unaPersona.setNombre("Susana");
nuevaTripu.mostrarNombresTripulacion();
System.out.println("\n--Cambiamos el nombre del objeto piloto, afecta a todos--\n");

nuevaTripu.setNombrePiloto("Maverick");
nuevaTripu.mostrarNombresTripulacion();
System.out.println("\n--Creamos una nueva instancia de un objeto Persona para asignarselo a piloto--");
System.out.println("--Solo afecta a piloto--\n");

nuevaTripu.setPiloto(new Persona("John Rambo"));
nuevaTripu.mostrarNombresTripulacion();

System.out.println("\n--Creamos una nueva instancia de un objeto Persona para asignarselo a unaPersona--");
System.out.println("--Solo afecta a unaPersona porque ahora hace referencia a una nueva instancia--\n");
unaPersona = new Persona("Soy una nueva Persona");
nuevaTripu.mostrarNombresTripulacion();
System.out.println("\nNuevo nombre de unaPersona: " + unaPersona.getNombre());

}
}

Esta es la salida que nos da por consola:
Citar
Piloto: Andres
Copiloto1: Andres
Copiloto2: Andres

--Cambiamos el nombre del objeto unaPersona, afecta a todos--

Piloto: Susana
Copiloto1: Susana
Copiloto2: Susana

--Cambiamos el nombre del objeto piloto, afecta a todos--

Piloto: Maverick
Copiloto1: Maverick
Copiloto2: Maverick

--Creamos una nueva instancia de un objeto Persona para asignarselo a piloto--
--Solo afecta a piloto--

Piloto: John Rambo
Copiloto1: Maverick
Copiloto2: Maverick

--Creamos una nueva instancia de un objeto Persona para asignarselo a unaPersona--
--Solo afecta a unaPersona porque ahora hace referencia a una nueva instancia--

Piloto: John Rambo
Copiloto1: Maverick
Copiloto2: Maverick

Nuevo nombre de unaPersona: Soy una nueva Persona

829
Aprender a programar desde cero / Re:Ejercicios para resolver
« en: 27 de Octubre 2018, 01:07 »
Yo tengo algún listado de ejercicios simples de iniciación.
Son de cuando estudié Java, pero pueden resolverse en pseudocódigo o en el lenguaje que quieras.

Estos que pongo ahora son sencillisimos, pedir datos y computar.
No hay tomas de decisiones alternativas, bucles de iteración ni nada.

Luego buscaré y publicaré los siguientes ejercicios, un poco más avanzados.

  • Escribir "Hola Mundo" por pantalla
  • Leer dos numeros reales y escribir la suma, resta, multiplicacion y division
  • Leer el radio de un círculo y escribir su perimetro y su area.
  • Leer tres numeros reales y calcular su media aritmética
  • Leer la base y altura de un triangulo y calcular su area.
  • Leer el precio de un producto. Leer tambien el porcentaje de IVA(VAT) y el porcentaje de descuento aplicable.
    Calcular el precio final del producto.
  • Calcular el areal lateral (AL) y el volumen V de un cilindro recto, leyendo por teclado los valores de radio y altura.
    Los calculos se hacen con estas formulas:

    V = Pi * r² * h
    AL = 2  * Pi * r * h

  • Leer con valores enteros el numero de horas, numero de minutos y numero de segundos.
    Calcular a cuantos segundos totales equivalen los valores introducidos
  • Leer un valor entero de un numero de segundos.
    Calcular a cuantas horas, minutos y segundos equivalen
  • Leer la distancia en Km entre dos aeropuertos y la velocidad media en Km/h de un avion.
    Calcular cuanto tardará el avion, expresado en horas y minutos, en recorrer la distancia
  • Leer un valor de temperatura en grados Celsius (C) y transformarlo a grados Farenheit(F).
    Formula:

    F = (9 / 5 * C) + 32
  • Leer un temperatura en Farenheit y transformar a Celsius. Deducir la fórmula a partir de la del ejercicio anterior.
  • Leer dos valores numéricos y guardarlos en dos variables. Intercambiar el valor de dichas variables y mostrar su valor en pantalla
  • Calcular al area(A) de un trapecio, pidiendo por teclado el valor de las dos bases (B y b) y la altura (a).
    Fórmula:

    A = (B + b) * a / 2
  • Leer una distancia en millas náuticas y transformarla a metros. 1 milla = 1852 metros
  • Pedir por teclado el precio pagado por un producto y el precio real. Calcular cuál ha sido el porcentaje de descuento aplicado.
  • Calcular la velocidad media en km/h de un tren, pidiendo por teclado la distancia recorrida en metros y el tiempo en segundos que ha empleado en recorrer la distancia

830
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:

Código: [Seleccionar]
//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.
Citar
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

831
Aprender a programar desde cero / Re:ayuda para instalar java
« en: 19 de Octubre 2018, 00:02 »
hola a todos hace tiempo estaba estudiando el curso de java pero tuve que dejarlo y hoy incio a retomarlo... necesito ayuda con la instalación pues en la pagina de oracle no encuentro la version del jdk7 que se usa en el curso, están solo las nuevas actualozaciones..alguien me puede mandar el link directo?....gracias de antemano

La web de Oracle contiene un archivo histórico de todas la versiones.
Aqui la JDK7

Sin embargo, no deberías tener ningún problema en hacer el curso usando un JDK actual.
Seguramente todo lo que enseñen sigue vigente en los JDK actuales. Puede que estos contengan alguna clase o instrucción más moderna en algún caso, pero normalmente se conserva también la antigua

832
Permitir el registro de 10 alumnos a una clase con su respectivo nombre, edad y carrera a
la que ingresa:
 Obtener el promedio de edad de los asistentes a la clase.
 Agrupar a los alumnos en grupos de 3 de acuerdo al tipo de carrera, ciencias o letras.
Por ejemplo:
Luis 20 años Ingeniería Industrial; Mario 18 Comunicaciones; María 18 Literatura.
En un grupo estarían
Mario 18 Comunicaciones y María 18 Literatura.

¿Seguro que el enunciado es correcto?
Dice ingresar 10 alumnos y hacer grupos de 3.. por consiguiente, solo se podrán hacer 3 grupos (3 grupos x 3 alumnos = 9 alumnos) y 1 alumno quedaría solitario sin grupo.

Se puede "almacenar" sin arrays.
Para las edades simplemente usar un int donde se van sumando las edades y luego se divide entre 10 para sacar la media.

Los nombres se pueden ir concatenando en una cadena tipo String (obviamente es una chapuza, lo correcto sería usar arrays)
Incluso las edades se pueden concatenar también en un String si queremos mostrarlos en pantalla junto los nombres, a parte de sumarlas en el acumulador para el calculo del promedio de edad.

Lo que no me queda claro es lo de agrupar en grupos de 3, no cuadran los números como he dicho, ni tampoco tengo claro si luego se desea mostrarlos en pantalla o no...


Muchas veces, es más dificil desentrañar que narices nos está pidiendo el enunciado de un ejercicio, que luego codificar el algoritmo.

833
Es importante familiarizarse con la documentación oficial de Oracle.

Se te añade la linea porque al objeto FileWriter le estás pasando true como parametro.
Citar
bw = new BufferedWriter(new FileWriter(archivo, true));

Si miras la docu oficial verás que al pasarle true, le estamos dando orden de que los próximos datos a escribir se añadan al final del documento.

Si no queremos añadir nuevas líneas, como será en este caso, debemos indicarle false (o no indicar nada)

834
Si quieres modificar el archivo, tendrás que usar las clases FileWriter y BufferedWriter de forma similar a como has usado los FileReader y BufferedReader.
Tendrás que construir un String con TODOS los datos (no solo los cambiados) de la matriz, poniendo el separador "|" ahí donde deba ir y también los caracteres para crear saltos de línea (puedes usar el caracter especial "\n")
Luego le pasas ese String al metodo writer() del objeto BufferedWriter y lo escribirá en el archivo de texto, eliminando lo que hubiera previamente.

835
Te muestro aqui el resultado que obtengo en consola al ejecutar el programa

Código: [Seleccionar]

MENU LIENZO JAVA
-1- Mostrar lienzo actual
-2- Insertar un RECTANGULO
-0- FIN DE PROGRAMA
Elija opcion: 1
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------


MENU LIENZO JAVA
-1- Mostrar lienzo actual
-2- Insertar un RECTANGULO
-0- FIN DE PROGRAMA
Elija opcion: 2

PUNTO DE INICIO

Inserte coordenada X entre 0 y 29: 1

Inserte coordenada Y entre 0 y 59: 89

Inserte coordenada Y entre 0 y 59: 1

PUNTO DE FIN

Inserte coordenada X entre 0 y 29: 15

Inserte coordenada Y entre 0 y 59: 15

RECTANGULO insertado


MENU LIENZO JAVA
-1- Mostrar lienzo actual
-2- Insertar un RECTANGULO
-0- FIN DE PROGRAMA
Elija opcion: 1
------------------------------------------------------------
-###############--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-###############--------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------


MENU LIENZO JAVA
-1- Mostrar lienzo actual
-2- Insertar un RECTANGULO
-0- FIN DE PROGRAMA
Elija opcion: 2

PUNTO DE INICIO

Inserte coordenada X entre 0 y 29: 4

Inserte coordenada Y entre 0 y 59: 4

PUNTO DE FIN

Inserte coordenada X entre 0 y 29: 40

Inserte coordenada X entre 0 y 29: 20

Inserte coordenada Y entre 0 y 59: 40
NO se pudo insertar, pruebe otras coordenadas


MENU LIENZO JAVA
-1- Mostrar lienzo actual
-2- Insertar un RECTANGULO
-0- FIN DE PROGRAMA
Elija opcion: 2

PUNTO DE INICIO

Inserte coordenada X entre 0 y 29: 16

Inserte coordenada Y entre 0 y 59: 16

PUNTO DE FIN

Inserte coordenada X entre 0 y 29: 8

Inserte coordenada Y entre 0 y 59: 40

RECTANGULO insertado


MENU LIENZO JAVA
-1- Mostrar lienzo actual
-2- Insertar un RECTANGULO
-0- FIN DE PROGRAMA
Elija opcion: 1
------------------------------------------------------------
-###############--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------##########################-------------------
-#-------------##-----------------------#-------------------
-#-------------##-----------------------#-------------------
-#-------------##-----------------------#-------------------
-#-------------##-----------------------#-------------------
-#-------------##-----------------------#-------------------
-#-------------##-----------------------#-------------------
-################-----------------------#-------------------
----------------#########################-------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------


MENU LIENZO JAVA
-1- Mostrar lienzo actual
-2- Insertar un RECTANGULO
-0- FIN DE PROGRAMA
Elija opcion: 2

PUNTO DE INICIO

Inserte coordenada X entre 0 y 29: 29

Inserte coordenada Y entre 0 y 59: 59

PUNTO DE FIN

Inserte coordenada X entre 0 y 29: 24

Inserte coordenada Y entre 0 y 59: 10

RECTANGULO insertado


MENU LIENZO JAVA
-1- Mostrar lienzo actual
-2- Insertar un RECTANGULO
-0- FIN DE PROGRAMA
Elija opcion: 1
------------------------------------------------------------
-###############--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------#--------------------------------------------
-#-------------##########################-------------------
-#-------------##-----------------------#-------------------
-#-------------##-----------------------#-------------------
-#-------------##-----------------------#-------------------
-#-------------##-----------------------#-------------------
-#-------------##-----------------------#-------------------
-#-------------##-----------------------#-------------------
-################-----------------------#-------------------
----------------#########################-------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
----------##################################################
----------#------------------------------------------------#
----------#------------------------------------------------#
----------#------------------------------------------------#
----------#------------------------------------------------#
----------##################################################


MENU LIENZO JAVA
-1- Mostrar lienzo actual
-2- Insertar un RECTANGULO
-0- FIN DE PROGRAMA
Elija opcion: 0


FIN DE PROGRAMA

836
Hola.
Me ha parecido interesante este ejercicio y he hallado una solución. La explico aquí a ver si te sirve.

Sobre la matriz que representa el lienzo
Usar booleanos no es mala idea del todo.
Tambien se podría usar directamente char y llenar la matriz con '-' y '#'

Pero ambos casos presentan un problemita.

El enunciado no lo especifica, pero supongo que las figuras NO se pueden solapar. Es decir, no se podría dibujar un rectangulo encima de otro. O tal vez si...

Pero en el caso de que NO se pueda, aunque se utilicen solo dos símbolos para representar el lienzo, en realidad cada "punto" del lienzo tiene tres posibles estados.
  • Vacio, porque no hay nada. Se representa con '-'
  • Ocupado, si es el borde de la figura, se representa con '#'
  • Ocupado, pero si es el area interna de la figura, no el borde, se representa tambien con '-'

Este tercer estado es el que complica un poco la cosa. El char '-' en realidad no implica que el espacio este vacío, puede tratarse del area interna de una figura ya dibujada.
Así que puesto que tenemos tres posibles estados: vacio, ocupado por borde u ocupado por area interna.... no nos va a servir rellenar la matriz con boolean ni tampoco directamente con los dos char usados para dibujar.

Necesitamos idear otra forma que nos indique las tres posibilidades.
Por ejemplo, podemos usar un valor numerico, un int o un byte, para rellenar la matriz.
Y podemos establecer que solo tenga tres posibles valores: 0, 1 y 2
0 -> Espacio libre, se representa en pantalla con "-"
1 -> Area interior de la figura, espacio ocupado, pero se representa tambien con "-"
2 -> Borde exterior de la figura, espacio ocupado, se representa con "#"


Así ya solucionamos el como representar los tres posibles estados.

Bueno, dicho esto. Para separar código, he escrito una clase llamada Lienzo (luego la mostraré) cuyo atributo es precisamente la matriz que representa el lienzo.
Esta clase tiene métodos que se encargan de dibujar en pantalla el lienzo y otro, el más importante y un pelín complicado, el método que se encarga de insertar un rectángulo en el lienzo a partir de dos puntos.
Cada punto, requiere de dos coordenados, una X para la vertical y otra Y para la horizontal.

Es decir, el usuario para "pintar" un rectángulo tendrá que proporcionar cuatro valores.
El X e Y del punto de "inicio" y el X e Y del punto de "fin"
Con ese inicio y ese fin, podemos dibujar un rectangulo dentro del lienzo.

Bien, aunque no es del todo necesario, para que el programa sea más legible he escrito una clase llamada Punto. Es posiblemente la clase más simplona de la historia de la programación xD , pero ayuda a que luego el programa se entienda mejor que está haciendo.
Es basicamente dos atributos X e Y, y sus correspondientes getters
Punto
Código: [Seleccionar]
package pintaLienzo;

public final class Punto {

private byte puntoX;
private byte puntoY;

public Punto(byte x, byte y) {
puntoX = x;
puntoY = y;
}

public byte getX() {
return puntoX;
}

public byte getY() {
return puntoY;
}

}


A continuacion explico la clase Lienzo.

-Tiene tres atributos, una matriz de byte y dos constantes para fijar los limites horizontales y verticales de la matriz/lienzo.

- El constructor, lo que hace es inicalizar la matriz y rellenarla con el valor 0, es decir, el lienzo se inicia completamente vacio

- el metodo mostrarLienzo() es muy simple. Recorre la matriz y si encuentra el valor 2, dibuja el char '#' que es el que representa el borde de las figuras.
Si no, dibujará un char '-', ya sea espacio vacio o area interna de alguna figura.

- el metodo insertarRectangulo() es un pelin complicado.
Recibe por parametros dos Puntos, el de inicio y el de fin.
Se podría haber simplificado si hubieramos decidido que el punto de inicio siempre va a representar la esquina superior izquierda del rectangulo, y el punto de fin siempre será la esquina inferior derecha.
Por ejemplo, inicio = 1,1 ; fin = 10,10
De este modo, siempre recorreriamos la matriz, desde las coordenadas indicadas, de izquierda a derecha y de arriba a abajo.

Pero no he podido resistirme ha dar cierta libertad al usuario para que el decida que esquina representará el punto de inicio y fin.
Así que puede ocurrir que los puntos sean, por ejemplo, inicio 10,1; fin = 1,10
EStas coordenadas en realidad van a dibujar exactamente el mismo rectangulo que las coordenadas del ejemplo anterior, solo que habrá que empezar a dibujar desde una esquina distinta.

Y averiguar donde esta la esquina de inicio, donde la de fin y decidir que direccion van a tomar los bucles que recorren la matriz, ha de hacerlo el código.

Por eso este metodo tiene varios if else anidados. Porque comparo los valores X e Y de ambos puntos, para discernir si inicio esta arriba o abajo respecto a fin, y si además está a la derecha o a la izquierda de este.
Esto significa cuatro posibilidades,  y para cada posibilidad, los bucles harán el recorrido en un sentido o en otro.

Otra cosa importante que hace este método es, antes de insertar la figura y modificar ningún valor, comprueba que realmente el area que va a ocupar la figura está libre y no se va a solapar con ninguna otra figura.
Es un metodo de tipo booleano, así que si no puede insertar la figura, devolverá FALSE.
Si no hubo problema en insertar, devolverá TRUE

Lienzo
Código: [Seleccionar]
package pintaLienzo;

public final class Lienzo {

private final int VERTICAL = 30;
private final int HORIZONTAL = 60;
private byte[][] lienzo;
/*
* La matriz que representa el lienzo tendrá 3 posibles valores.
* 0 -> Espacio libre, se representa en pantalla con "-"
* 1 -> Area interior de la figura, espacio ocupado, pero se representa tambien con "-"
* 2 -> Borde exterior de la figura, espacio ocupado, se representa con "#"
*/

public Lienzo() {
lienzo = new byte[VERTICAL][HORIZONTAL];
for (int i = 0; i < VERTICAL; i++)
for (int j = 0; j < HORIZONTAL; j++)
lienzo[i][j] = 0;
}

/**
* Muestra el lienzo en pantalla segun los valores de la matriz
*/
public void mostrarLienzo() {
for (int i = 0; i < VERTICAL; i++) {
for (int j = 0; j < HORIZONTAL; j++)
System.out.print(lienzo[i][j] == 2?"#":"-");//Si es borde, pintamos "#", sino pintamos "-"
System.out.println();
}
}

public boolean insertarRectangulo(Punto inicio, Punto fin) {
/*
* Nos han proporcionado dos Puntos entre los que debemos crear un rectangulo.
* Lo logico sería que el Punto inicio represente la esquina superior izquierda de la figura y
* el Punto fin represente la esquina inferior derecha.
* Pero no tiene por que ser así, podemos dar libertad para que el usuario proporcione los Puntos
* como quiera y el programa se encargue de discenir como orientar la figura
*/
if (inicio.getX() < fin.getX())//Punto de inicio esta por ENCIMA del Punto fin
if (inicio.getY() < fin.getY()) {//Punto de inicio esta a la IZQUIERDA del Punto fin

//inicio es esquina sup-izq, fin es esquina inf-der
/*
* Antes de insertar, comprobamos que el area que va a ocupar el rectangulo
* no está ocupada ya por otra figura
*/
for (int i = inicio.getX(); i <= fin.getX(); i++)
for (int j = inicio.getY(); j <= fin.getY(); j++)
if (lienzo[i][j] != 0) return false;//Se ha encontrado algun espacio ocupado, no se puede insertar figura

//Comprobado que el area esta libre, insertamos la figura
for (int i = inicio.getX(); i <= fin.getX(); i++)
for (int j = inicio.getY(); j <= fin.getY(); j++)
//Si es borde insertamos 2, si es area interior insertamos 1
if (j == inicio.getY() || j == fin.getY() || i == inicio.getX() || i == fin.getX())
lienzo[i][j] = 2;//Es un borde
else
lienzo[i][j] = 1;//Es area interna
}
else {//Punto de inicio esta a la DERECHA del Punto fin

//inicio es esquina sup-der, fin es esquina inf-izq
for (int i = inicio.getX(); i <= fin.getX(); i++)
for (int j = inicio.getY(); j >= fin.getY(); j--)
if (lienzo[i][j] != 0) return false;
//Insertamos
for (int i = inicio.getX(); i >= fin.getX(); i--)
for (int j = inicio.getY(); j <= fin.getY(); j++)
if (j == inicio.getY() || j == fin.getY() || i == inicio.getX() || i == fin.getX())
lienzo[i][j] = 2;
else
lienzo[i][j] = 1;
}
else//Punto de inicio esta por DEBAJO del Punto fin
if (inicio.getY() < fin.getY()) {
//inicio es esquina inf-izq, fin es sup-der
for (int i = inicio.getX(); i >= fin.getX(); i--)
for (int j = inicio.getY(); j <= fin.getY(); j++)
if (lienzo[i][j] != 0) return false;
//Insertamos
for (int i = inicio.getX(); i >= fin.getX(); i--)
for (int j = inicio.getY(); j <= fin.getY(); j++)
if (j == inicio.getY() || j == fin.getY() || i == inicio.getX() || i == fin.getX())
lienzo[i][j] = 2;
else
lienzo[i][j] = 1;
}
else {
//inicio es esquina inf-der, fin es sup-izq
for (int i = inicio.getX(); i >= fin.getX(); i--)
for (int j = inicio.getY(); j >= fin.getY(); j--)
if (lienzo[i][j] != 0) return false;
//Insertamos
for (int i = inicio.getX(); i >= fin.getX(); i--)
for (int j = inicio.getY(); j >= fin.getY(); j--)
if (j == inicio.getY() || j == fin.getY() || i == inicio.getX() || i == fin.getX())
lienzo[i][j] = 2;
else
lienzo[i][j] = 1;
}
//Llegados a este punto, es que la insercion ha sido correcta
return true;
}


}

Y por ultimo, una pequeña clase Test para comprobar si funciona.

Muestra un pequeño menu para que el usuario escoja entre mostrar el Lienzo, insertar un Rectangulo o finalizar el programa.

Para insertar el Rectangulo, se le piden los valores X e y para el Punto inicio y el Punto fin. Para pedir estos valores uso un par de metodos que solo aceptan valores acordes a las dimensiones del lienzo.
Una vez obtenido los Puntos, se los paso a la clase Lienzo para que intente insertar la figura y me devolverá TRUE o FALSE segun si pudo insertarla o no.

Test
Código: [Seleccionar]
package pintaLienzo;

import java.util.Scanner;

public final class Test {

static Lienzo lienzo = new Lienzo();
static Scanner teclado = new Scanner(System.in);

static byte pedirX() {
byte x = -1;
do {
System.out.print("\nInserte coordenada X entre 0 y 29: ");
x = teclado.nextByte();
} while(x < 0 || x > 29);
return x;
}

static byte pedirY() {
byte y = -1;
do {
System.out.print("\nInserte coordenada Y entre 0 y 59: ");
y = teclado.nextByte();
} while(y < 0 || y > 59);
return y;
}

static void mostrarMenu() {
System.out.println("\n\n\t\tMENU LIENZO JAVA");
System.out.println("-1- Mostrar lienzo actual");
System.out.println("-2- Insertar un RECTANGULO");
System.out.println("-0- FIN DE PROGRAMA");
System.out.print("Elija opcion: ");
}

static void dibujarRectangulo() {
System.out.println("\n\tPUNTO DE INICIO");
byte inicioX = pedirX();
byte inicioY = pedirY();
System.out.println("\n\tPUNTO DE FIN");
byte finX = pedirX();
byte finY = pedirY();

Punto inicio = new Punto(inicioX, inicioY);
Punto fin = new Punto(finX, finY);

System.out.println(lienzo.insertarRectangulo(inicio, fin)?"\nRECTANGULO insertado":"NO se pudo insertar, pruebe otras coordenadas");
}

public static void main(String[] args) {

int opcion = -1;
do {
mostrarMenu();
opcion = teclado.nextInt();
switch (opcion) {
case 0:
System.out.println("\n\n\t\tFIN DE PROGRAMA");
break;
case 1:
lienzo.mostrarLienzo();
break;
case 2:
dibujarRectangulo();
break;
default:
System.out.println("\nOpcion invalida");
}
}while(opcion != 0);
}
}

Creo que esto cumple con el enunciado.
Siempre y cuando, NO se permita el solapamiendo de figuras.
Si no hubiera problema en dibujar figuras una encima de otras, todo sería más simple y no necesitariamos controlar tres posibles estados.

Echale un ojo y pregunta lo que no entiendas.

837
Hola.

Lo primero, aclarar que esta seccion es para presentarse y saludar a la comunidad.
Para pedir ayuda hay otras secciones.
De todos modos, no te preocupes, algun moderador lo moverá a su sitio.

Sobre tu consulta.
Con el primer ejercicio sí te puedo ayudar. Con el segundo me temo que no, porque yo tampoco estoy nada familiarizado con las IndexedList  :-\
Aunque luego miraré a ver que puedo aprender de ellas.

El primer ejercicio.
Al margen de algún pequeño olvido como el indicado en rojo:
Citar
if(a[ i ]==elem){  //si la posicion i del array igual a elem
en realidad casi lo consigues, pero lo has complicado más de lo necesario. No hace falta usar bucles anidados. Con un solo bucle recorriendo el array es suficiente.

Mira te dejo aquí una clase con el método escrito y un pequeño main() para ponerlo a prueba.
Incluye comentarios largos para que se entienda mejor lo que hace el código.
Citar
public final class Test {
   
   public static int maxNumRepeated(Integer[] a, Integer elem) {
      int contador = 0;
      int maxConsecutiva = 0;
      
      for (int i=0; i<a.length; i++)
         if (a[ i ].equals(elem)) {//Ocurrencia, contamos
            contador++;
            }
         }
         else {//No hay ocurrencia. Aquí tenemos dos posibles escenarios.
            
            /*
             * Escenario (1). NO estabamos contando porque en este momento no habían ocurrencias.
             * Podemos saber que estamos en este escenario si contador == 0.
             * En cualquier caso, en este escenario no tenemos que hacer nada de nada, así que ni
             * siquiera vamos a preguntar por el valor de contador. Simplemente dejamos que el bucle
             * siga su curso.
             */
            
            /*
             * Escenario (2). SÍ estabamos contando porque estabamos dentro de una serie de ocurrencias.
             * Podemos saber que estamos en este escenario si contador > 0.
             * En este escenario, tenemos que averiguar si esta serie de ocurrencias consecutivas (que ya ha
             * terminado puesto que ahora ya han dejado de haber ocurrencias), hay que ver si es mayor
             * que otras posibles series anteriores, en cuyo caso, actualizaremos la variable maxConsecutiva
             * que es la que cuenta la serie de ocurrencias más larga que tenga lugar.
             */
            if (contador > 0) {//Estabamos contando..
               if (contador > maxConsecutiva) {//Actualizamos maxConsecutiva
                  maxConsecutiva = contador;
               }
               contador = 0; //Reiniciamos contador, pues esta serie de ocurrencias ya ha finalizado
            }      
         }
      
      return maxConsecutiva;
   }
   

   public static void main(String[] args) {
      
      Integer[] numeros = {8, 10, 20, 30, 8, 8, 8, 4, 10, 10, 5, 10, 30, 6, 10, 10, 10, 20, 8, 8, 8, 8, 8, 8};
      
      System.out.println(maxNumRepeated(numeros, 10));

   }

}

Con esta solución, APARENTEMENTE ya está solucionado lo que nos piden.
Y remarco lo de aparente porque en realidad hay un pequeño fallo en la lógica que puede pasar desapercibido.
Si lo ejecutas con el array que he puesto de ejemplo y preguntas cual es la mayor serie de repeticiones del número 10, te saldrá en pantalla un 3
Eso es correcto.
Si preguntas por el 20, te saldrá un 1
También es correcto.

Pero, si preguntas por el número 8, te saldrá en pantalla un 3
¡Eso es incorrecto! :o
Lo correcto sería que respondiera con un 6, ya que la mayor serie de repeticiones del número 8 son claramente los últimos seis elementos del array.
Me gustaría que lo probaras para que vieras que efectivamente algo falla.

Pero, ¿que está fallando? ¿Por qué sí lo hace bien con otros números y no con el 8?

El problema tiene su respuesta.
Si miramos el código, usamos la variable maxConsecutiva para controlar cuál es la mayor serie de repeticiones consecutivas de un número concreto.

Esta variable la actualizamos cuando, tras estar contando una serie de ocurrencias/repeticiones, nos encontramos con un elemento distinto, lo que significa que la serie de ocurrencias ha finalizado y tenemos que comprobar si esta serie ha sido mayor que otras.
Y aquí esta el problema SOLO actualizamos maxConsecutiva cuando encontramos un elemento distinto.

Si preguntamos por el elemento 10, las series de ocurrencias(marcadas en verde) finalizan al encontrar un elemento distinto (marcado en rojo)
Citar
Integer[] numeros = {8, 10, 20, 30, 8, 8, 8, 4, 10, 10, 5, 10, 30, 6, 10, 10, 10, 20, 8, 8, 8, 8, 8, 8};

Cada vez que nos encontramos en uno de esos elementos en rojo, se actualiza maxConsecutiva. Y aparentemente esto funciona bien.

Ahora vamos a fijarnos las series con el número 8:
Citar
Integer[] numeros = {8, 10, 20, 30, 8, 8, 8, 4, 10, 10, 5, 10, 30, 6, 10, 10, 10, 20, 8, 8, 8, 8, 8, 8};

Aquí se aprecia cuál es el problema. La última serie de ocurrencias, la de los seis 8, como está al final del array, no tenemos un "elemento rojo" tras esta serie. Por lo tanto, no estamos actualizando la variable maxConsecutiva para esta última serie de ocurrencias y por ello el código que hemos escrito no es del todo correcto, pues falla cuando una serie de ocurrencias esta justo al final del array.

Pero por suerte, esto es fácil de solucionar.
Si quieres intentar encontrarle tú la solución adelante, estos problemas "tontos" y casi impensables, intentar solucionarlos enseñan mucho sobre cómo "piensan" los ordenadores.

En cualquier caso, aquí abajo publico de nuevo el ejercicio, marcando en verde la modificación necesaria para esquivar este problemita.
Pregunta lo que creas oportuno.
Y sobre la segunda parte del ejercicio, si me entero de algo que pueda ser útil, lo compartiré por aquí.
Un saludo.
Citar
public final class Test {
   
   public static int maxNumRepeated(Integer[] a, Integer elem) {
      int contador = 0;
      int maxConsecutiva = 0;
      
      for (int i=0; i<a.length; i++)
         if (a[ i ].equals(elem)) {//Ocurrencia, contamos
            contador++;
            /*
             * Existe la posibilidad de que una serie de ocurrencias finalice por el hecho
             * de que ya hemos llegado al ultimo elemento del array. En este caso, hemos de
             * comprobar si esta serie es mayor que otras que hayan podido haber anteriormente
             */
            if (i == a.length-1) {
               if (contador > maxConsecutiva) {//Actualizamos maxConsecutiva
                  maxConsecutiva = contador;
               }
            }

         }
         else {//No hay ocurrencia. Aquí tenemos dos posibles escenarios.
            
            /*
             * Escenario (1). NO estabamos contando porque en este momento no habían ocurrencias.
             * Podemos saber que estamos en este escenario si contador == 0.
             * En cualquier caso, en este escenario no tenemos que hacer nada de nada, así que ni
             * siquiera vamos a preguntar por el valor de contador. Simplemente dejamos que el bucle
             * siga su curso.
             */
            
            /*
             * Escenario (2). SÍ estabamos contando porque estabamos dentro de una serie de ocurrencias.
             * Podemos saber que estamos en este escenario si contador > 0.
             * En este escenario, tenemos que averiguar si esta serie de ocurrencias consecutivas (que ya ha
             * terminado puesto que ahora ya han dejado de haber ocurrencias), hay que ver si es mayor
             * que otras posibles series anteriores, en cuyo caso, actualizaremos la variable maxConsecutiva
             * que es la que cuenta la serie de ocurrencias más larga que tenga lugar.
             */
            if (contador > 0) {//Estabamos contando..
               if (contador > maxConsecutiva) {//Actualizamos maxConsecutiva
                  maxConsecutiva = contador;
               }
               contador = 0; //Reiniciamos contador, pues esta serie de ocurrencias ya ha finalizado
            }      
         }
      
      return maxConsecutiva;
   }
   

   public static void main(String[] args) {
      
      Integer[] numeros = {8, 10, 20, 30, 8, 8, 8, 4, 10, 10, 5, 10, 30, 6, 10, 10, 10, 20, 8, 8, 8, 8, 8, 8};
      
      System.out.println(maxNumRepeated(numeros, 8 ));

   }

}

838
El compareTo() es para "enseñarle a una clase como se han de comparar los objetos creados a partir de ella.
En este caso, le estamos "enseñando" que a los objetos Persona se han de comparar según su atributo sueldo.

Quizás no lo estás viendo claro porque estas comparaciones en tu código las está haciendo el metodo Arrays.sort() de manera interna.
sort() se encarga de ordenar los objetos que contiene el array.
Si los objetos fueran numeros enteros, no tendrá problemas para ordenarlos porque ordenar numeros es muy facil y esto ya sabe hacerlo. Es evidente si un numero es mayor o menor que otro.

Pero si se trata de objetos creados a partir de una clase diseñada por el programador, sort() no va a tener ni puñetera idea de como ordenarlo. ¿Como va a saber el si una Persona es mayor o menor que otra?
Entonces, Arrays.sort() lo que hace es buscar en la clase Persona el metodo compareTo() (metodo que todas las clases heredan de la clase Object, que es padre de TODAS las clases) con la esperanza de que ahí, le hayamos explicado en que atributo debe fijarse para decidir el orden de las Personas.

Podríamos decirle que las ordene segun la edad, según la estatura, según el peso....en este caso le decimos que las ordende según el sueldo. Y en compareTo() explicamos como ha de hacerse esta comparación.

Prueba a añadir el siguiente código en el main() para tener un ejemplo más visual de como funciona el compareTo().
Vamos a comparar a Zulema(Array[0]) con Rafael(Array[1])

Código: [Seleccionar]
if (Array[0].compareTo(Array[1]) == 1)
    System.out.println("Zulema cobra MAS que Rafael");
else if (Array[0].compareTo(Array[1]) == -1)
    System.out.println("Zulema cobra MENOS que Rafael");
else if (Array[0].compareTo(Array[1]) == 0)
    System.out.println("Zulema y Rafael cobran lo mismo");

Prueba a modificar los sueldos de estas dos Personas y ejecuta varias veces el código, para que veas como cambia el mensaje según sus sueldos.

Si no he sabido explicarme bien, insiste de nuevo y buscamos otra forma de explicarlo.
Un saludo.

839
Aprender a programar desde cero / Re:Ayuda URGENTE
« en: 15 de Septiembre 2018, 02:08 »
Vale.
Mira, te explico mi propuesta.
Para solucionar el ejercicio, de manera limpia y ordenada, propongo usar 7 clases.

Las 3 clases básicas: Paciente, Medico e HistorialClinico

Otras 3 clases, que se encargarán de gestionar las anteriores: GestorPacientes, GestorMedicos y GestorHistoriales

Y por ultimo, la clase con el metodo main() que mostrará los menus al usuario y según lo que este escoja, llamará a las clases "gestoras" para que hagan lo que el usuario haya solicitado.
Esta clase puede llamarse TestClinica

Bueno, a continuacion pongo las 3 clases básicas. Son las mismas que puse antes, solo he modifiado el metodo mostrar() que ahora muestra los datos en un panel de JOptionPane en lugar mostrarlos por consola.

Paciente
Código: [Seleccionar]
package clinica;

import javax.swing.JOptionPane;

public final class Paciente {

private String id;
private String nombre;
private String apellidos;
private int edad;
private String genero;

public Paciente(String id, String nombre, String apellidos, int edad, String genero) {
this.id = id;
this.nombre = nombre;
this.apellidos = apellidos;
this.edad = edad;
this.genero = genero;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getApellidos() {
return apellidos;
}

public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}

public int getEdad() {
return edad;
}

public void setEdad(int edad) {
this.edad = edad;
}

public String getGenero() {
return genero;
}

public void setGenero(String genero) {
this.genero = genero;
}

/**
* Muestra en un panel todos los datos del Paciente
*/
public void mostrar() {
String mensaje = "ID Paciente: " + id + "\nNombre: " + nombre
+ "\nApellidos: " + apellidos + "\nEdad: " + edad
+ "\nGenero: " + genero;
JOptionPane.showMessageDialog(null, mensaje, "Mostrar Paciente", JOptionPane.INFORMATION_MESSAGE);
}

}

Medico
Código: [Seleccionar]
package clinica;

import javax.swing.JOptionPane;

public final class Medico {

private String id;
private String nombre;
private String apellidos;
private String especialidad;

public Medico(String id, String nombre, String apellidos, String especialidad) {
this.id = id;
this.nombre = nombre;
this.apellidos = apellidos;
this.especialidad = especialidad;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getApellidos() {
return apellidos;
}

public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}

public String getEspecialidad() {
return especialidad;
}

public void setEspecialidad(String especialidad) {
this.especialidad = especialidad;
}

/**
* Muestra por panel todos los datos del Medico
*/
public void mostrar() {
String mensaje = "ID Medico: " + id + "\nNombre: " + nombre
+ "\nApellidos: " + apellidos + "\nEspecialidad: " + especialidad;
JOptionPane.showMessageDialog(null, mensaje, "Mostrar Medico", JOptionPane.INFORMATION_MESSAGE);
}

}

HistorialClinico
Código: [Seleccionar]
package clinica;

import javax.swing.JOptionPane;

public final class HistorialClinico {

private String codigo;
private String fecha;
private String idPaciente;
private String idMedico;
private String observaciones;

public HistorialClinico(String codigo, String fecha, String idPaciente,
String idMedico, String observaciones) {
this.codigo = codigo;
this.fecha = fecha;
this.idPaciente = idPaciente;
this.idMedico = idMedico;
this.observaciones = observaciones;
}

public String getCodigo() {
return codigo;
}

public void setCodigo(String codigo) {
this.codigo = codigo;
}

public String getFecha() {
return fecha;
}

public void setFecha(String fecha) {
this.fecha = fecha;
}

public String getIdPaciente() {
return idPaciente;
}

public void setIdPaciente(String idPaciente) {
this.idPaciente = idPaciente;
}

public String getIdMedico() {
return idMedico;
}

public void setIdMedico(String idMedico) {
this.idMedico = idMedico;
}

public String getObservaciones() {
return observaciones;
}

public void setObservaciones(String observaciones) {
this.observaciones = observaciones;
}

/**
* Muestra por panel todos los datos del Historial Clinico
*/
public void mostrar() {
String mensaje = "Codigo Historial: " + codigo + "\nFecha: " + fecha
+ "\nID Paciente: " + idPaciente + "\nID Medico: " + idMedico
+ "\nObservaciones:\n" + observaciones;
JOptionPane.showMessageDialog(null, mensaje, "Mostrar Medico", JOptionPane.INFORMATION_MESSAGE);
}
}

Ahora vendrían las clases "gestoras", solo he escrito la que gestiona los Pacientes.
Es similar a la que puse en el mensaje anterior, solo que ahora ya no usamos Scanner, sino que usamos la clase JOptionPane para mostrar y pedir datos.
Y además ahora ya si está completa. Tiene los cuatro metodos necesarios para hacer las operaciones que nos solicitan: nuevo Paciente, mostrar listado de pacientes, modificar un paciente y eliminar un paciente.

Te la pongo a continuación. Fíjate que tiene bastante código.
Imagina poner todo ese código, junto con el necesario para gestionar las otras dos clases, junto con el codigo necesario para mostrar menus, más un metodo main(), todo junto en una única clase... sería una locura. Por eso mejor dividir y separar el codigo en más clases.
 Revisala, intenta comprenderla, pregunta lo que no entiendas o que te parezca extraño. Y una vez la tengas clara, intenta escribir tu las clases GestorMedicos y GestorHistoriales
Estas dos clases serán prácticamente idénticas a la que yo he puesto, solo hay que cambiar los datos que se piden y muestran para que sean acordes a los atributos de las clases Medico e HistorialClinico

GestorPacientes
Código: [Seleccionar]
package clinica;

import java.util.ArrayList;

import javax.swing.JOptionPane;

public final class GestorPacientes {

private ArrayList<Paciente> pacientes;

public GestorPacientes() {
pacientes = new ArrayList<Paciente>();
}

/**
* Crea y registra un nuevo paciente.
* @return True si se pudo registrar con éxito el nuevo paciente.
* False si no fue posible registrarlo.
*/
public boolean nuevoPaciente() {
String id = JOptionPane.showInputDialog(null, "Introduzca Identificador:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE);
String nombre = JOptionPane.showInputDialog(null, "Nombre:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE);
String apellidos = JOptionPane.showInputDialog(null, "Apellidos:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE);
String genero = JOptionPane.showInputDialog(null, "Genero:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE);
int edad = 0;
try {
edad = Integer.parseInt(JOptionPane.showInputDialog(null, "Edad:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE));
}
catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Solo se admite introducir numeros para la edad\nNo se ha registrado el valor introducido",
"Error", JOptionPane.WARNING_MESSAGE);
}
Paciente nuevoPaciente = new Paciente(id, nombre, apellidos, edad, genero);
return pacientes.add(nuevoPaciente);//Devuelve TRUE si se insertó correctamente, FALSE si no se pudo insertar
}

/**
* Lista por pantalla los datos de todos los pacientes registrados.
*/
public void mostrarPacientes() {
if (pacientes.isEmpty())
JOptionPane.showMessageDialog(null, "No hay Pacientes registrados", "Mostrar Pacientes",
JOptionPane.WARNING_MESSAGE);
else {
for (Paciente p: pacientes)
p.mostrar();
}
}

/**
* Modifica el Paciente que el usuario solicite mediante el ID de Paciente.
* @return True al finalizar la modificacion correctamente.
* False si no se encontró ningun paciente con el ID indicado.
*/
public boolean modificarPaciente() {
String id = JOptionPane.showInputDialog(null, "Introduzca Identificador del paciente a modificar:",
"Modificar Paciente", JOptionPane.QUESTION_MESSAGE);
/*
* Ahora buscaremos el paciente en el ArrayList y si lo encontramos lo referenciaremos
* a otro objeto de la clase Paciente que incialmente tiene valor null.
* Si tras finalizar la búsqueda, este objeto sigue valiendo null significa que no hemos
* encontrado el Paciente que nos han pedido e informaremos al usuario.
*/
Paciente paciente = null;
for (int i = 0; i < pacientes.size(); i++){
if (pacientes.get(i).getId().equals(id)) {
paciente = pacientes.get(i);//Referenciamos a otro nombre de objeto
break;//No hace falta seguir buscando, "rompemos" el bucle for
}
}

if (paciente == null) {
JOptionPane.showMessageDialog(null, "No se encuentra Paciente con el ID:\n" + id,
"Paciente no encontrado", JOptionPane.WARNING_MESSAGE);
return false;
}
else {
//Comienza el proceso de modificacion
paciente.setId(JOptionPane.showInputDialog(null, "ID actual: " + paciente.getId()
+ "\nIntroduzca nuevo identificador:", "Modificar Paciente", JOptionPane.QUESTION_MESSAGE));
paciente.setNombre(JOptionPane.showInputDialog(null, "Nombre actual: " + paciente.getNombre()
+ "\nIntroduzca nuevo nombre:", "Modificar Paciente", JOptionPane.QUESTION_MESSAGE));
paciente.setApellidos(JOptionPane.showInputDialog(null, "Apellidos actuales: " + paciente.getApellidos()
+ "\nIntroduzca nuevos apellidos:", "Modificar Paciente", JOptionPane.QUESTION_MESSAGE));
paciente.setGenero(JOptionPane.showInputDialog(null, "Genero actual: " + paciente.getGenero()
+ "\nIntroduzca nuevo genero:", "Modificar Paciente", JOptionPane.QUESTION_MESSAGE));
try {
paciente.setEdad(Integer.parseInt(JOptionPane.showInputDialog(null, "Edad actual: " + paciente.getEdad()
+ "\nIntroduzca nueva edad:", "Modificar Paciente", JOptionPane.QUESTION_MESSAGE)));
}
catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Solo se admite introducir numeros para la edad\nNo se ha registrado el valor introducido",
"Error", JOptionPane.WARNING_MESSAGE);
}
return true;
}
}

/**
* Elimina el Paciente indicado por el usuario mediante el ID del Paciente.
* @return True si tuvo éxito la eliminacion.
* False si no se encontró el Paciente indicado.
*/
public boolean borrarPaciente() {
String id = JOptionPane.showInputDialog(null, "Introduzca Identificador del paciente a borrar:",
"Borrar Paciente", JOptionPane.QUESTION_MESSAGE);

Paciente paciente = null;
for (int i = 0; i < pacientes.size(); i++){
if (pacientes.get(i).getId().equals(id))
paciente = pacientes.remove(i);//Al eliminar el objeto, el ArrayList nos lo devuelve y lo recogemos en "paciente"
}

if (paciente == null) {
JOptionPane.showMessageDialog(null, "No se encuentra Paciente con el ID:\n" + id,
"Paciente no encontrado", JOptionPane.WARNING_MESSAGE);
return false;
}
else {
JOptionPane.showMessageDialog(null, "Se elimino el paciente con ID:\n" + id,
"Paciente Eliminado", JOptionPane.INFORMATION_MESSAGE);
return true;
}
}

}


Por último, te dejo aquí una primera versión de la clase TestClinica.
Esta es una versión puramente de prueba, no hay menus todavía ni nada.
Es solo para que veas en funcionamiento la clase GestorPacientes
Cuando la ejecutes, lo que hace es:
- ofrece registrar dos pacientes nuevos.
- muestra los pacientes registrados.
- ofrece modificar un paciente.
- vuelve a mostrar los pacientes registrados, para que se vea la modificacion.
- ofrece eliminar un paciente.
- muestra una vez mas los pacientes registrados, para verificar que se ha eliminado el paciente indicado.

TestClinica
Código: [Seleccionar]
package clinica;

public final class TestClinica {

static GestorPacientes pacientes = new GestorPacientes();

public static void main(String[] args) {

pacientes.nuevoPaciente();
pacientes.nuevoPaciente();
pacientes.mostrarPacientes();
pacientes.modificarPaciente();
pacientes.mostrarPacientes();
pacientes.borrarPaciente();
pacientes.mostrarPacientes();

}

}

Cuando tengamos las clases "gestoras" terminadas, daremos forma a la clase TestClinica para que ya si muestre menus y podamos gestionar todo.
Pero esto lo dejamos para el final.

840
Aprender a programar desde cero / Re:Ayuda URGENTE
« en: 14 de Septiembre 2018, 01:49 »
Hola.
Quizás sería más interesante que mostraras lo que tienes hecho y donde te has atascado para poder ayudarte.
O bien volver a empezar desde el principio y rehacer el programa juntos..

En fin, vamos paso a paso.
Estas serían las clases básicas conforme a lo que pide el enunciado. No creo que aquí hayas tenido ningún problema.
Clase Paciente
Código: [Seleccionar]
package clinica;

public final class Paciente {

private String id;
private String nombre;
private String apellidos;
private int edad;
private String genero;

public Paciente(String id, String nombre, String apellidos, int edad, String genero) {
this.id = id;
this.nombre = nombre;
this.apellidos = apellidos;
this.edad = edad;
this.genero = genero;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getApellidos() {
return apellidos;
}

public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}

public int getEdad() {
return edad;
}

public void setEdad(int edad) {
this.edad = edad;
}

public String getGenero() {
return genero;
}

public void setGenero(String genero) {
this.genero = genero;
}

/**
* Muestra por consola todos los datos del Paciente
*/
public void mostrar() {
System.out.println("\n\t---------------");
System.out.println("ID Paciente: " + id);
System.out.println("Nombre: " + nombre);
System.out.println("Apellidos: " + apellidos);
System.out.println("Edad: " + edad);
System.out.println("Genero: " + genero);
System.out.println("\t---------------");
}
}

Clase Medico
Código: [Seleccionar]
package clinica;

public final class Medico {

private String id;
private String nombre;
private String apellidos;
private String especialidad;

public Medico(String id, String nombre, String apellidos, String especialidad) {
this.id = id;
this.nombre = nombre;
this.apellidos = apellidos;
this.especialidad = especialidad;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getApellidos() {
return apellidos;
}

public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}

public String getEspecialidad() {
return especialidad;
}

public void setEspecialidad(String especialidad) {
this.especialidad = especialidad;
}

/**
* Muestra por consola todos los datos del Medico
*/
public void mostrar() {
System.out.println("\n\t---------------");
System.out.println("ID Medico: " + id);
System.out.println("Nombre: " + nombre);
System.out.println("Apellidos: " + apellidos);
System.out.println("Especialidad: " + especialidad);
System.out.println("\t---------------");
}

}

Clase HistorialClinico
Código: [Seleccionar]
package clinica;

public final class HistorialClinico {

private String codigo;
private String fecha;
private String idPaciente;
private String idMedico;
private String observaciones;

public HistorialClinico(String codigo, String fecha, String idPaciente,
String idMedico, String observaciones) {
this.codigo = codigo;
this.fecha = fecha;
this.idPaciente = idPaciente;
this.idMedico = idMedico;
this.observaciones = observaciones;
}

public String getCodigo() {
return codigo;
}

public void setCodigo(String codigo) {
this.codigo = codigo;
}

public String getFecha() {
return fecha;
}

public void setFecha(String fecha) {
this.fecha = fecha;
}

public String getIdPaciente() {
return idPaciente;
}

public void setIdPaciente(String idPaciente) {
this.idPaciente = idPaciente;
}

public String getIdMedico() {
return idMedico;
}

public void setIdMedico(String idMedico) {
this.idMedico = idMedico;
}

public String getObservaciones() {
return observaciones;
}

public void setObservaciones(String observaciones) {
this.observaciones = observaciones;
}

/**
* Muestra por consola todos los datos del Historial Clinico
*/
public void mostrar() {
System.out.println("\n\t---------------");
System.out.println("Codigo Historial: " + codigo);
System.out.println("Fecha: " + fecha);
System.out.println("ID Pacielnte: " + idPaciente);
System.out.println("ID Medico: " + idMedico);
System.out.println("Observaciones:\n" + observaciones);
System.out.println("\t---------------");
}
}

Fíjate que en cada clase, les he creado un metodo llamado mostrar() que se encargaría de mostrar por pantalla todos los datos de la clase en cuestión.

Bueno, esta es la parte fácil.
La otra parte, en realidad no es nada difícil, pero si tiene el inconveniente de que requiere mucho código.
Hay que escribir un menu principal, un menu para las opciones del Paciente, Medico e Historial, submenus para crear y modificar Pacientes, Medicos e Historiales...

Repito que no es nada dificil, pero tantas líneas de código, si no se organizan correctamente, tendremos un código enooooorme, muy caótico, dificil de comprender y de mantener.. que solo mirarlo ya nos dará dolor de cabeza.

Y es entonces cuando yo te pregunto: ¿Sabes si hay que ceñirse únicamente a esas clases?
¿O podríamos crear otras clases que nos ayuden a facilitar la tarea?


De hecho, sería lo lógico y lo que cualquier programador haría para encarar este ejercicio.
Podríamos hacer tres nuevas clases, las cuáles cada una se encargaría de la gestión de cada una de las anteriores.
Por ejemplo, una clase llamada GestorPacientes, tendría como atributo un ArrayList                                                                                     donde se guardarían los Pacientes.
Y tendría unos métodos para cada una de las acciones necesarias para gestionar esta base de datos.
Un metodo para dar de alta un nuevo Paciente, otro para mostrar listado de pacientes, otro para modificar, otro para borrar...
De este modo, todo el código necesario para gestionar Pacientes, estaría concentrado en su propia clase y separado de todo el código necesario para gestionar Medicos y de todo el código necesario para gestionar Historiales, los cuáles estarían en sus respectivas clases de Gestion.

La clase GestorPacientes podría ser como la que pongo a continuación. Aunque no está completa, solo incluye los metodos para crear nuevo Paciente y para mostrar todo el listado de pacientes.
Faltarían los metodos para modificar y borrar pacientes.

Clase GestorPacientes
Código: [Seleccionar]
package clinica;

import java.util.ArrayList;
import java.util.Scanner;

public final class GestorPacientes {

private ArrayList<Paciente> pacientes;
private Scanner teclado;

public GestorPacientes() {
pacientes = new ArrayList<Paciente>();
teclado = new Scanner(System.in);
}

/**
* Crea y registra un nuevo paciente.
* @return True si se pudo registrar con éxito el nuevo paciente.
* False si no fue posible registrarlo.
*/
public boolean nuevoPaciente() {
System.out.println("\n\tALTA NUEVO PACIENTE");
System.out.print("Introduzca Identificador: ");
String id = teclado.nextLine();
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Apellidos: ");
String apellidos = teclado.nextLine();
System.out.print("Genero: ");
String genero = teclado.nextLine();
System.out.print("Edad: ");
int edad = teclado.nextInt();
teclado.nextLine();//Tras leer un int, conviene "limpiar" el stream de entrada, para evitar problemas al querer leer luego datos String
Paciente nuevoPaciente = new Paciente(id, nombre, apellidos, edad, genero);
return pacientes.add(nuevoPaciente);//Devuelve TRUE si se insertó correctamente, FALSE si no se pudo insertar
}

/**
* Lista por pantalla los datos de todos los pacientes registrados.
*/
public void mostrarPacientes() {
for (Paciente p: pacientes)
p.mostrar();
}

}

Si crees que es posible enfocar el ejercicio de esta manera, podemos seguir adelante a partir de aquí.
Intenta completar los dos métodos que faltarían para esta clase y tomandola como ejemplo, intenta escribir las clases GestorMedicos y GestorHistoriales

Fíjate que tienen un segundo atributo, un Scanner para pedir datos por pantalla.
Cada clase tendrá su propio Scanner

He usado un Scanner porque es lo habitual para pedir datos por consola. Si estas acostumbrado a pedir datos al usuario usando otras formas como la clase JOptionPane que muestra pequeñas ventanas de dialogo para que el usuario meta datos, podemos modificarlo.


Insisto en que lo ideal e inteligente sería crear estas tres nuevas clases para separa la gestión de las tres entidades principales.
Crear estas tres nuevas clases no supone escribir más código. La cantidad de código será la misma, solo que de este modo está mejor organizado.
Si no usamos estas tres clases para la gestión, todo este código estará escrito en la clase donde pongamos el metodo main(), con lo cuál será una clases muy sobrecargada de código... :-\

Un saludo

Páginas: 1 ... 37 38 39 40 41 [42] 43 44 45 46 47 ... 50

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".