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 ... 7 8 9 10 11 [12] 13 14 15 16 17 ... 50
221
Comunidad / Re: JS
« en: 11 de Abril 2022, 17:15 »
Para eso está el foro, para publicar dudas y compartir respuestas.
Yo la verdad es que no controlo mucho de JavaScript, pero haremos lo que podamos para ayudarte.

Un saludo.

222
Comunidad / Re: JS
« en: 08 de Abril 2022, 12:02 »
Prueba con este curso, a ver si te ayuda a asimilar mejor el aprendizaje de JS

Hay que tener claro que con HTML y CSS, lo que haces es maquetar, es decir "dar forma" a una página web. Por eso es algo que puedes visualizar inmediatamente.

Con JavaScript, en cambio, lo que se hace es "programar el comportamiento" de esa web.

Imagina que tienes que crear una web que consiste en una examen tipo test.

Con HTML y CSS puedes colocar el texto de las preguntas, las respuestas seleccionables con sus radio button (<input type="radio">), imágenes, campos de texto para que el alumno inserte su nombre, el botón para terminar la evaluación, etc...

Cuando el usuario pulse el botón de terminar evaluación, vamos a querer que la página compruebe las respuestas y de una nota, un resultado según los aciertos y los errores.
Pues ahí es donde entra JavaScript.

Con JS escribiremos un código que recorra el DOM de la página comprobando las respuestas y contando las correctas y las incorrectas.
Incluso si se detectan preguntas sin responder, JS puede resaltarlas cambiando su color o agruparlas juntas en un nuevo <div/> creado de forma dinámica para que el alumno las vea fácilmente y confirme si quiere dejarlas sin respuesta o no.

Y cuando el programa ya tenga las respuestas confirmadas, pues podrá computar los aciertos/errores y mostrar si el alumno ha aprobado el examen o no, puede además mostrar los temas en los que ha fallado y mostrar enlaces a los contenidos que debería repasar para poder aprobar la próxima vez que se evalúe.

Y en fin, se puede hacer casi cualquier cosa que pase por nuestra imaginación.

En resumen, HTML y CSS son para crear lo que vemos. Es el barro que nos permite modelar una estatua o figura.
Pero para dar "vida" a esa figura, hacer que responda, se mueva y cambie ella sola según los eventos que ocurran, necesitamos JS.

223
Comunidad / Re: Buena a todos!
« en: 07 de Abril 2022, 11:06 »
Bienvenido.
Espero que participes en el foro y puedas aprender de unos y enseñar a otros. ;)

Un saludo.

224
Hola.
Suponiendo que tu enum sea como este:
Código: [Seleccionar]
public enum TEvento {

CINE,TEATRO,CONCIERTO
}

Y cambiando en tu clase Abono el método para setear eventos de esta manera:
Código: [Seleccionar]
    public void setTipoEvento(TEvento TipoEvento)
    {
        this.TipoEvento = TipoEvento;
    }


Bien, la forma sencilla y rápida de cambiar el valor del enum en un objeto, es pedir al usuario que elija mediante un menú, y según lo que elija, seteamos el valor correspondiente desde el código.
Por ejemplo, si ejecutamos este código:
Código: [Seleccionar]
public class PruebaAbono {

public static void main(String[] args) {

Scanner teclado = new Scanner(System.in);
Abono abono = new Abono();

int opcion = -1;
while (opcion != 0) {
System.out.println("\nTipo de Evento actual: " + abono.getTipoEvento());
System.out.println("Escoja cambiar el Evento o terminar aplicacion.");
System.out.println("[1] - Cine");
System.out.println("[2] - Teatro");
System.out.println("[3] - Concierto");
System.out.println("[0] - TERMINAR");
System.out.print("Opcion: ");
opcion = Integer.parseInt(teclado.nextLine());

switch(opcion) {
case 0:
System.out.println("\n\tFIN DE PROGRAMA");
break;
case 1:
abono.setTipoEvento(TEvento.CINE);
break;
case 2:
abono.setTipoEvento(TEvento.TEATRO);
break;
case 3:
abono.setTipoEvento(TEvento.CONCIERTO);
break;
default:
System.out.println("Opcion equivocada");
}
}

teclado.close();
}

}

Veremos en pantalla que podemos cambiar el valor del enum a través de las opciones de un menú:
Citar
Tipo de Evento actual: CINE
Escoja cambiar el Evento o terminar aplicacion.
[1] - Cine
[2] - Teatro
[3] - Concierto
[0] - TERMINAR
Opcion: 2

Tipo de Evento actual: TEATRO
Escoja cambiar el Evento o terminar aplicacion.
[1] - Cine
[2] - Teatro
[3] - Concierto
[0] - TERMINAR
Opcion: 3

Tipo de Evento actual: CONCIERTO
Escoja cambiar el Evento o terminar aplicacion.
[1] - Cine
[2] - Teatro
[3] - Concierto
[0] - TERMINAR
Opcion: 1

Tipo de Evento actual: CINE
Escoja cambiar el Evento o terminar aplicacion.
[1] - Cine
[2] - Teatro
[3] - Concierto
[0] - TERMINAR
Opcion: 0

   FIN DE PROGRAMA


Como ves, pidiendo al usuario que introduzca simplemente un número entre 1 y 3, ya podemos cambiar el valor del enum y no hay por qué complicarse más la vida.

Espero haber resuelto tu duda.
Saludos.

225
A ver, lo primero que hay que hacer es crear el ArrayList con esos empleados. Bueno, crear el ArrayList es lo segundo, porque lo primero es crear una clase Empleado
Código: [Seleccionar]
public class Empleado {

private int codigo;
private String nombre;
private double salario;

public Empleado(int codigo, String nombre, double salario) {
this.codigo = codigo;
this.nombre = nombre;
this.salario = salario;
}

public int getCodigo() {
return codigo;
}

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

public String getNombre() {
return nombre;
}

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

public double getSalario() {
return salario;
}

public void setSalario(double salario) {
this.salario = salario;
}

}

Ahora que tenemos esta clase, en el programa principal añadimos un ArrayList con esos tres empleados.
Además añadiremos un atributo donde tendremos una referencia al empleado que se haya seleccionado actualmente. Este atributo tendrá valor null cuando no haya ningún empleado seleccionado.

Citar
public class LiquidacionNomina extends javax.swing.JFrame {

   private ArrayList<Empleado> empleados;
   Empleado empleadoSeleccionado;
      
    public LiquidacionNomina() {
       empleadoSeleccionado = null;
       empleados = new ArrayList<Empleado>();
       empleados.add(new Empleado(123, "Juan Camilo Perez", 950000d));
       empleados.add(new Empleado(124, "Lina Maria Mejia", 2125000d));
       empleados.add(new Empleado(125, "Carlos Antonio Ruiz", 1750000d));

        initComponents();
    }

Vale, ya tenemos datos sobre los que trabajar.
Hay dos botones, "Buscar" y "Calcular Nomina".
El enunciado, como es habitual (yo no se que pasa con los docentes...), es confuso. No queda claro si datos como el auxilio de transporte se ha de mostrar al buscar al empleado o al pulsar el botón de calcular nómina.

Creo que lo lógico es que el botón "Buscar" se dedique a encontrar el empleado cuyo código hemos digitado y mostrar en  pantalla el nombre y el salario base.

Luego el botón "Calcular Nómina" ya se ocupará de todo lo demás.


Pues vamos a ver primero el código del botón "Buscar"(jButton1).
Lo que hará será capturar el texto introducido e intentar encontrar un empleado con ese código en el ArrayList de Empleados.
Si no lo encuentra, avisa con mensaje.
En caso de encontrarlo, referenciamos ese empleado en el atributo "empleadoSeleccionado".
Y mediante esa referencia, obtenemos el nombre y el salario para mostrarlo en los JLabel correspondientes.(jLabel6 y jLabel7)
Importante controlar posibles errores y excepciones, como que el campo esté vacío o que para el código nos hayan dado letras en lugar de números.

Este es el código para su ActionListener:
Código: [Seleccionar]
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    empleadoSeleccionado = null; //Reiniciamos referencia
        //Recogemos dato introducido por usuario
    String codigo = jTextPane2.getText();
    if (codigo.isBlank())
    JOptionPane.showMessageDialog(null, "Introduzca un código", "Buscar Empleado", 2);
    else {
    //Buscamos en el ArrayList el empleado según código leido
    try {
        for (Empleado emp: empleados)
        if (emp.getCodigo() == Integer.parseInt(codigo))
        empleadoSeleccionado = emp;
        //Comprobamos si hemos encontrado empleado
        if (empleadoSeleccionado == null)
        JOptionPane.showMessageDialog(null, "No existe empleado con ese código", "Buscar Empleado", 2);
        else {
        //Empleado encontrado, mostramos sus datos en la interfaz
        jLabel6.setText(empleadoSeleccionado.getNombre());
        jLabel7.setText(String.valueOf(empleadoSeleccionado.getSalario()));
        }
    }
    catch(NumberFormatException nfe) {
    JOptionPane.showMessageDialog(null, "El código ha de ser numérico", "Buscar Empleado", 2);
    }
    }
    }   


Veamos el botón "Calcular Nómina" (jButton2).
Aquí lo que tiene que ocurrir es obtener el salario base del empleado seleccionado (si es que hay uno seleccionado) y hacer una serie de cálculos para obtener el "salario final".
Hay unas deducciones, por salud y pensión, de 4% cada una.
Luego, hay una ayuda para el transporte, un importe concreto, según si su salario base es inferior a dos veces el salario mínimo.
Desconozco los valores reales para esos datos, tampoco creo que sea importante, así que en mi caso me los voy a inventar.

Calcularemos por separado cada deducción y ayuda y los vamos mostrando en los JLabel correspondientes.
Cuando tengamos todos estos valores, los restamos/sumamos al salario base y de esta manera obtendremos el salario final.

Código: [Seleccionar]
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    if (empleadoSeleccionado == null)
    JOptionPane.showMessageDialog(null, "No hay un Empleado seleccionado", "Calcular Nomina", 2);
    else {
    //Hacemos cálculos segun salario base
    double salarioBase = empleadoSeleccionado.getSalario();
    double salarioFinal = salarioBase;//Luego se aplicarán deducciones y ayudas
    //Deducciones
    double salud = 4 * salarioBase / 100;
    double pension = 4 * salarioBase / 100;
    /*
    * Auxilio transporte.
    * Un empleado recibe auxilio de transporte si gana menos de 2 salarios mínimos.
    * Desconozco salario minimo e importe del auxilio, así que me lo invento.
    */
    final double SAL_MINIMO = 900000d;
    final double AUX_TRANSPORTE = 40000d;
    //Actualizamos los JLabel en la interfaz
    if (salarioBase < SAL_MINIMO * 2) {
    jLabel12.setText(String.format("%.2f", AUX_TRANSPORTE));
    salarioFinal += AUX_TRANSPORTE; //Añadimos ayuda al salario
    }
    else
    jLabel12.setText("0");
   
    jLabel13.setText(String.format("%.2f", salud));
    jLabel14.setText(String.format("%.2f", pension));
   
    salarioFinal -= (salud + pension); //Aplicamos deducciones
    jLabel15.setText(String.format("%.2f", salarioFinal));
    }
    }

Y ya esta. Ya tenemos los dos botones funcionando.
Pruébalo y pregunta si algo no ha quedado claro.

Un saludo.

226
Hola.
¿El código es tuyo o copiado? Tiene errores y algunas "malas costumbres", como poner los nombres de los atributos comenzando con mayúscula. En Java, la "buena costumbre" es escribirlos en minúsculas.

A ver, tenemos una clase Persona.
Con su constructor y métodos get/set. Además queremos un método que nos retorne de una sola vez todos los datos para mostrarlos en pantalla o donde sea.
Para esto, lo apropiados es sobreescribir el método toString(), donde construiremos un único String con toda la información de los atributos (o los que creamos importantes) y retornarlo.
En este ejemplo lo construyo usando String.format(), pero el String se puede construir como se quiera.
Código: [Seleccionar]
public class Persona {

protected String nombre;
protected int edad;
protected char sexo;
protected String curp;
protected String domicilio;

public Persona(String nombre, int edad, char sexo, String curp, String domicilio) {
this.nombre = nombre;
this.edad = edad;
this.sexo = sexo;
this.curp = curp;
this.domicilio = domicilio;
}

public String getNombre() {
return nombre;
}

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

public int getEdad() {
return edad;
}

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

public char getSexo() {
return sexo;
}

public void setSexo(char sexo) {
this.sexo = sexo;
}

public String getCURP() {
return curp;
}

public void setCURP(String curp) {
this.curp = curp;
}

public String getDomicilio() {
return domicilio;
}

public void setDomicilio(String domicilio) {
this.domicilio = domicilio;
}

@Override
public String toString() {
return String.format("Nombre: %s, Edad: %d, Sexo: %s\nCURP: %s, Domicilio: %s", nombre, edad, sexo,
curp, domicilio);
}

}

De esta clase, tienen que heredar Alumno y Docente.

La clase Alumno tiene un atributo llamado status cuyo valor no debe ser proporcionado por el usuario, si no que se calcula según el valor de su nota promedio.
Para hacer este cálculo usamos un método privado llamado calcularEstatus(), al cuál debemos invocar siempre que se modifique la nota promedio.
Por tanto, lo vamos a invocar en el constructor y también dentro del método setPromedio()

Esta clase también tiene un método toString(), lo que hace es coger el método toString que retorna su super clase (Persona) y añadirle los valores del alumno, para construir un único String con todos los datos.
Código: [Seleccionar]
public class Alumno extends Persona {

private int numControl;
private String carrera;
private int semestre;
private char grupo;
private float promedio;
private String status;

public Alumno(String nombre, int edad, char sexo, String curp, String domicilio, int numControl, String carrera,
int semestre, char grupo, float promedio) {
super(nombre, edad, sexo, curp, domicilio);
this.numControl = numControl;
this.carrera = carrera;
this.semestre = semestre;
this.grupo = grupo;
this.promedio = promedio;
calcularEstatus();
}

private void calcularEstatus(){
if (promedio>60){
if (promedio>85)
status="Excelente";
else
status="Regular";
}
else
status="Irregular";
}

public int getNumControl() {
return numControl;
}

public void setNumControl(int numControl) {
this.numControl = numControl;
}

public String getCarrera() {
return carrera;
}

public void setCarrera(String carrera) {
this.carrera = carrera;
}

public int getSemestre() {
return semestre;
}

public void setSemestre(int semestre) {
this.semestre = semestre;
}

public char getGrupo() {
return grupo;
}

public void setGrupo(char grupo) {
this.grupo = grupo;
}

public float getPromedio() {
return promedio;
}

public void setPromedio(float promedio) {
this.promedio = promedio;
calcularEstatus();
}

public String getStatus() {
return status;
}

@Override
public String toString() {
return String.format("%s\nNº Control: %d, Carrera: %s, Semestre: %d\nGrupo: %s, Promedio: %.2f, Status: %s",
super.toString(), numControl, carrera, semestre, grupo, promedio, status);
}

}

Con la clase Docente, ocurre algo similar. Tiene un atributo llamado sueldoBase cuyo valor no lo decide el usuario, si no que se autocalcula según las horas que trabaja.
Así que de nuevo usaremos un método privado para este cálculo, al que llamaremos al construir el objeto y cada vez que se cambie el valor de las horas en el método setHoras()
Código: [Seleccionar]
public class Docente extends Persona {

private String idEmpleado;
    private String academia;
    private int horas;
    private float sueldoBase;
    private char nivel;
   
public Docente(String nombre, int edad, char sexo, String curp, String domicilio, String idEmpleado,
String academia, int horas, char nivel) {
super(nombre, edad, sexo, curp, domicilio);
this.idEmpleado = idEmpleado;
this.academia = academia;
this.horas = horas;
this.nivel = nivel;
calcularSueldo();
}

private void calcularSueldo() {
sueldoBase=(float) (horas*33*.85*8*15);
    }

public String getIdEmpleado() {
return idEmpleado;
}

public void setIdEmpleado(String idEmpleado) {
this.idEmpleado = idEmpleado;
}

public String getAcademia() {
return academia;
}

public void setAcademia(String academia) {
this.academia = academia;
}

public int getHoras() {
return horas;
}

public void setHoras(int horas) {
this.horas = horas;
calcularSueldo();
}

public float getSueldoBase() {
return sueldoBase;
}

public char getNivel() {
return nivel;
}

public void setNivel(char nivel) {
this.nivel = nivel;
}
   
    @Override
    public String toString() {
    return String.format("%s\nID Emp.: %s, Academia: %s, Horas: %d\nSueldo: %.2f, Nivel: %s",
    super.toString(), idEmpleado, academia, horas, sueldoBase, nivel);
    }
}


Vale, tendríamos modeladas las entidades principales que actúan en este programa.
Ahora necesitamos una forma de gestionarlas, es decir, registrarlas en algún tipo de colección y que luego se pueda consultar.
En el código que has puesto, parece que se intenta usar un arreglo primitivo, pero con error en su sintaxis.
De todos modos, no es el tipo de colección ideal porque hay que establecerle un tamaño fijo que luego no puede aumentarse.

Es mejor usar un ArrayList, que tiene un tamaño dinámico y puede crecer según se van añadiendo objetos.

De hecho, usaremos dos, uno para Alumnos y otro para Docentes.
Habrá que escribir código para todo lo relativo a la gestión de estos datos y también código para escribir un menú en pantalla, capturar opción escogida, etc...
Se puede hacer todo junto en una sola clase.

O bien, separarlo en dos. Una clase exclusivamente para gestionar los dos ArrayList y la otra exclusivamente para encargarse del menú principal.

Yo prefiero esta última opción y esta podría ser la clase "gestora" de datos:
Código: [Seleccionar]
import java.util.ArrayList;

import javax.swing.JOptionPane;

public class GestionDatos {

private ArrayList<Alumno> alumnos = new ArrayList<Alumno>();
private ArrayList<Docente> docentes = new ArrayList<Docente>();

public void registrarAlumno() {
String nombre = JOptionPane.showInputDialog("Nombre:");
int edad = Integer.parseInt(JOptionPane.showInputDialog("Edad:"));
char sexo = JOptionPane.showInputDialog("Sexo: ").charAt(0);
String curp = JOptionPane.showInputDialog("CURP:");
String domicilio = JOptionPane.showInputDialog("Domicilio:");
int nControl = Integer.parseInt(JOptionPane.showInputDialog("Nº Control:"));
String carrera = JOptionPane.showInputDialog("Carrera:");
int semestre = Integer.parseInt(JOptionPane.showInputDialog("Semestre:"));
char grupo = JOptionPane.showInputDialog("Grupo:").charAt(0);
float promedio = Float.parseFloat(JOptionPane.showInputDialog("Promedio:"));

alumnos.add(new Alumno(nombre, edad, sexo, curp, domicilio, nControl, carrera, semestre, grupo, promedio));

JOptionPane.showMessageDialog(null, "Nuevo Alumno registrado");
}

public void listarAlumnos() {
if (alumnos.isEmpty())
JOptionPane.showMessageDialog(null, "No hay Alumnos registrados");
else {
for (int i = 0; i < alumnos.size(); i++)
JOptionPane.showMessageDialog(null, alumnos.get(i),
String.format("Alumno %d/%d", (i+1), alumnos.size()), 1);
}
}

}
¡¡NO ESTÁ TERMINADA!!
Solo he puesto lo necesario para registrar Alumnos y también poder listar los que ya están registrados.
Luego intenta por tu parte, añadir dos métodos más registrar y listar Docentes. Casi es copiar lo que yo he puesto.

Veamos ahora la clase principal, usaremos un menú hecho con JOptionPane, tal y como se hace en el código que tú has puesto antes.
Su principal atributo, será un objeto de la clase "gestora" de datos

De momento, solo ofrecemos 5 opciones: registrar alumno, listarlos, registrar docentes, listarlos y TERMINAR.

Con un switch analizamos que ha pedido el usuario, y según su opción, llamamos al método adecuado de la clase "gestora".
Creo que es sencillo de entender el código.

Código: [Seleccionar]
public class Principal {

private static GestionDatos gestor = new GestionDatos();
private static final String MENU = "[1] -- Registrar Alumno\n[2] -- Registrar Docente"
+ "\n[3] -- Listar Alumnos\n[4] -- Listar Docentes\n[0] -- TERMINAR PROGRAMA";

public static void main(String[] args) {

String opcion = "";

do {
opcion = JOptionPane.showInputDialog(MENU);
switch(opcion) {
case "0":
JOptionPane.showMessageDialog(null, "FIN DE PROGRAMA");
break;
case "1":
gestor.registrarAlumno();
break;
case "2":
//gestor.registrarDocente();
break;
case "3":
gestor.listarAlumnos();
break;
case "4":
//gestor.listarDocentes();
break;
default:
JOptionPane.showMessageDialog(null, "Opcion equivocada");
}
}while(!opcion.equals("0"));

}

}

Pues como dije, intenta completar lo necesario para poder gestionar los Docentes.

Y cuando lo tengas, tú mismo intenta añadir más opciones, como modificar la nota promedio de un Alumno, o las horas que trabaja un Docente..., lo que se te ocurra.

Cuando te atasques, o si hay cosas que no te han quedado claras, vuelve a preguntar por aquí.
Un saludo.

227
Hola

Encapsular simplemente consiste en ocultar los miembros de una clase (atributos, métodos...) de forma que no se pueda acceder a ellos desde "fuera" de la propia clase.
Esto lo hacemos con los modificadores de acceso: public, private, protected...

Es decir, cuando en una clase declaramos sus atributos como private, pues ya estamos encapsulando.  :)

Por lo general, los atributos vamos a querer que sean privados y los métodos querremos que sean públicos.
De hecho, usaremos métodos públicos (getters/setters) para dar acceso desde el exterior a los atributos privados.

Pero, ¿entonces para que hacemos atributos privados si luego los "desprotegemos" dando acceso mediante métodos públicos?

La cuestión es que si hacemos los atributos públicos, no tendremos forma de controlar que valor reciben.
En cambio, dando acceso mediante métodos, aquí si que podemos poner controles, si queremos.

Por ejemplo, supón que creamos una clase Persona donde hacemos public un atributo que representa la edad.
Puede que alguien que esté usando nuestra clase haga un programa sin un control de "calidad de datos" mínimo y ocurran cosas como que el atributo edad reciba el valor 1500, o el valor -45, es decir, valores que son absurdos para la edad de una persona.

Si ese programador es descuidado, no es culpa nuestra. Pero podemos poner de nuestra parte para que nuestra maravillosa clase Persona, sea más segura y fiable.

Así que lo que haremos será "encapsular" el atributo edad para que no se pueda acceder directamente a él.
Escribiremos un método para dar acceso al atributo, uno llamado setEdad(int edad);, pero dentro del método pondremos nosotros un control de "calidad de datos".
Con un if podemos comprobar si la edad recibida entre paréntesis, es un valor apropiado.
Si es un valor negativo o es demasiado alto, lo rechazaremos y mostraremos mensaje de aviso en pantalla.
Y si es un valor aceptable, pues entonces sí se lo asignaremos al atributo edad que tenemos "encapsulado" y protegido.

De esta manera, nuestra clase ya impone ciertas reglas y límites para los valores de los atributos. Y esto hace que el programador que use nuestra clase, tenga que ser más cuidadoso con su código ya que no podrá registrar "personas" si no se ocupa de controlar mejor la calidad de los datos que vaya a recoger.


Bien, tras aclarar que es el encapsulamiento y cuál es su propósito, vamos a ver el ejercicio.

Piden clases, encapsulamiento, herencia y control de excepciones. Es un ejercicio sencillo donde la herencia no parece necesaria, pero bueno, podemos "forzarla" un poco para incluirla.


Mi propuesta sería crear una clase Usuario y una clase Mantenimiento.
Esta última, sería la clase madre de otras tres subclases: Reparacion, Calibracion y Otros
Así ya tenemos herencia.

Esta podría ser la clase Usuario:
Código: [Seleccionar]
public class Usuario {

private int numCliente;
private String nombre;
private String celular;

public Usuario(int numCliente, String nombre, String celular) {
this.numCliente = numCliente;
this.nombre = nombre;
this.celular = celular;
}

public int getNumCliente() {
return numCliente;
}

public String getNombre() {
return nombre;
}

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

public String getCelular() {
return celular;
}

public void setCelular(String celular) {
this.celular = celular;
}

@Override
public String toString() {
return String.format("Nº Cliente: %d\nNombre: %s\tCelular: %s", numCliente, nombre, celular);
}

}

Esta la clase Mantenimiento, que como está destinada a ser clase "madre", la podemos declarar como abstracta. Esto es porque luego en el programa, no vamos a querer crear objetos de esta clase madre, si no que vamos a querer crear solo objetos de sus clases hijas.
Código: [Seleccionar]
public abstract class Mantenimiento {

protected Usuario usuario;
protected String equipo;

public Mantenimiento(Usuario usuario, String equipo) {
this.usuario = usuario;
this.equipo = equipo;
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
public String getEquipo() {
return equipo;
}
public void setEquipo(String equipo) {
this.equipo = equipo;
}
@Override
public String toString() {
return String.format("Datos Usuario: %s\n\t---------------\nEquipo: %s\n\t---------------\n",
usuario, equipo);
}
}

Fíjate que aquí los atributos están como protected y no como private.
Podrían ser private, pero cuando creamos clases abstractas, muchas veces vamos a querer que sus clases hijas puedan acceder directamente a los atributos que están heredando de su clase madre.
Con protected, damos acceso solo a las clases hijas. Siguen estando encapsulados, pero le abrimos las puertas a los "legítimos herederos".

Vamos a ver estas clases hijas.
Esta sería Calibracion, que es casi idéntica a su clase madre, solo varía su método toString().
Código: [Seleccionar]
public class Calibracion extends Mantenimiento {

public Calibracion(Usuario usuario, String equipo) {
super(usuario, equipo);
}

@Override
public String toString() {
return String.format("%sTipo Manteminiento: Calibracion", super.toString());
}

}

La clase Reparacion si añade un nuevo atributo para indicar que pieza es la que requiere ser reparada:
Código: [Seleccionar]
public class Reparacion extends Mantenimiento {

private String piezaFalla;

public Reparacion(Usuario usuario, String equipo, String piezaFalla) {
super(usuario, equipo);
this.piezaFalla = piezaFalla;
}

public String getPiezaFalla() {
return piezaFalla;
}

public void setPiezaFalla(String piezaFalla) {
this.piezaFalla = piezaFalla;
}

@Override
public String toString() {
return String.format("%sTipo Manteminiento: Reparacion\nPieza que falla: %s",
super.toString(), piezaFalla);
}

}

Y la clase Otros, que usa un atributo extra para pedir una descripción del servicio que se necesita:
Código: [Seleccionar]
public class Otros extends Mantenimiento {

private String descripcion;

public Otros(Usuario usuario, String equipo, String descripcion) {
super(usuario, equipo);
this.descripcion = descripcion;
}

public String getDescripcion() {
return descripcion;
}

public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}

@Override
public String toString() {
return String.format("%sTipo Mantenimiento: Otros\nDescripcion: %s", super.toString(), descripcion);
}

}


Con esto, ya podemos hacer una clase main donde usar un ArrayList de tipo Mantenimiento, donde registraremos objetos Calibracion, Reparacion y Otros
Como todas son hijas de Mantenimiento es posible juntar objetos de esas tres clases en esa colección.

Es un ejemplo muy sencillo, un menú muy básico para registrar mantenimientos y mostrar un listado:
Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Scanner;

public class ManteminientoEquipos {

private static ArrayList<Mantenimiento> mantenimientos = new ArrayList<Mantenimiento>();
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

int opcion = 0;

do {
System.out.println("\n\t\tMANTENIMIENTO EQUIPOS");
System.out.println("\t\t------------- -------\n");
System.out.println("[1] --- Registrar nuevo Mantemimiento");
System.out.println("[2] --- Listar Mantenimientos registrados");
System.out.println("[3] --- TERMINAR PROGRAMA");
System.out.print("Elija opcion: ");
try {
opcion = Integer.parseInt(teclado.nextLine());
switch(opcion) {
case 1:
nuevoManteminiento();
break;
case 2:
listarMantenimientos();
break;
case 3:
System.out.println("\n\t\tFIN DE PROGRAMA");
break;
default:
System.out.println("Opcion inexistente");
}
}
catch(NumberFormatException nfe) {
System.out.println("ERROR: Introduzca solo números");
opcion = 0;
}
}while(opcion != 3);

}

private static void nuevoManteminiento() {
//Pedimos datos cliente
System.out.println("\nDATOS DEL CLIENTE:");
System.out.print("Nombre Completo: ");
String nombre = teclado.nextLine();
System.out.print("Celular: ");
String celular = teclado.nextLine();
//Numero cliente se genera según longitud del arraylist
int numCliente = 1000 + mantenimientos.size();
//Preguntamos equipo a mantener
System.out.print("\nEQUIPO A MANTENER: ");
String equipo = teclado.nextLine();
//Preguntamos tipo mantenimiento
int tipo = 0;
while (tipo < 1 || tipo > 3) {
try {
System.out.println("\nTIPO DE MANTEMIENTO:");
System.out.println("[1] -- Calibracion\n[2] -- Reparacion\n[3] -- Otros");
System.out.print("Elija: ");
tipo = Integer.parseInt(teclado.nextLine());
switch (tipo) {
case 1:
mantenimientos.add(new Calibracion(new Usuario(numCliente, nombre, celular), equipo));
break;
case 2:
System.out.print("Pieza que falla: ");
String pieza = teclado.nextLine();
mantenimientos.add(new Reparacion(new Usuario(numCliente, nombre, celular), equipo, pieza));
break;
case 3:
System.out.print("Descripcion del mantenimiento: ");
String descripcion = teclado.nextLine();
mantenimientos.add(new Otros(new Usuario(numCliente, nombre, celular), equipo, descripcion));
break;
default:
System.out.println("Tipo inexistente");
}
}
catch(NumberFormatException nfe) {
System.out.println("ERROR: Introduzca solo números");
tipo = 0;
}
}//Fin del while
//Mostramos datos del mantenimiento registrado
System.out.println("\nMANTENIMIENTO REGISTRADO:\n");
System.out.println(mantenimientos.get(mantenimientos.size() - 1));
}

private static void listarMantenimientos() {
System.out.println("\nLISTADO DE MANTENIMIENTOS");
System.out.println("------- -- --------------\n");
for (Mantenimiento mant: mantenimientos)
System.out.println("\n" + mant + "\n");
}

}

Fíjate que al listar los objetos del ArrayList, aunque están todos guardados como Mantenimiento, luego al imprimirse en pantalla cada objeto se comporta como un Calibracion, o un Reparacion o un Otros, según corresponda.

Esto se llama polimorfismo, otro término más que hay que conocer en POO

Citar
      MANTENIMIENTO EQUIPOS
      ------------- -------

[1] --- Registrar nuevo Mantemimiento
[2] --- Listar Mantenimientos registrados
[3] --- TERMINAR PROGRAMA
Elija opcion: 2

LISTADO DE MANTENIMIENTOS
------- -- --------------


Datos Usuario: Nº Cliente: 1000
Nombre: Lucas Ramirez   Celular: 657908742
   ---------------
Equipo: Impresora de tinta HP900C
   ---------------
Tipo Manteminiento: Calibracion


Datos Usuario: Nº Cliente: 1001
Nombre: Sara Pelaez   Celular: 634561290
   ---------------
Equipo: Laptop Lenovo CN2000
   ---------------
Tipo Manteminiento: Reparacion
Pieza que falla: Pantalla


Datos Usuario: Nº Cliente: 1002
Nombre: Jorge Morales   Celular: 65533990
   ---------------
Equipo: Smartphone Samsung G300
   ---------------
Tipo Mantenimiento: Otros
Descripcion: Sustituir batería por una de 6500mAh


Pregunta si algo no ha quedado claro.
Un saludo.

228
Todo parece correcto, solo cambiaría dos detalles.

El modificador de acceso de los atributos, por norma general, siempre los vamos a declarar como private, no como public

Citar
public class Circulo {
    public static final double numeroPi = 3.1415;
    public double radio;

Habrá situaciones en que resulte más óptimo declararlos como public o como protected(algo a medio camino entre publico y privado).
Pero por lo general los declararemos como privados siempre, y luego si el desarrollo del programa lo exigiese, pues ya cambiaremos el nivel de acceso.


Otra cosa, si un método retorna un valor, pues seguramente no vamos a necesitar que sea el propio método quien lo muestren en pantalla.

Citar
    public double areaCirculo(){
        double area = 0.0;
        area = numeroPi * (radio * radio);
        System.out.println("El area es: " + area + " cm");
        return area;
    }

Y si vamos a hacer que el método lo imprima en pantalla, entonces cuando lo invoquemos en el programa principal, no conviene llamarlo dentro de un System.out.println()
Código: [Seleccionar]
System.out.println(circulo.areaCirculo());Porque eso va a hacer que el valor del area salga en pantalla dos veces: una por el println() que ya tiene el propio método y otra porque el area retornada va a ser impresa por el println() del programa principal.

Si nuestro método ya incorpora un println(), basta con invocarlo directamente en el programa principal, no hace falta ponerlo dentro de otro println()
Código: [Seleccionar]
circulo.areaCirculo();
Pero vamos, lo normal es que si el método retorna el valor, no tenga su propio println().
Citar
    public double areaCirculo(){
        double area = 0.0;
        area = numeroPi * (radio * radio);
        System.out.println("El area es: " + area + " cm");
        return area;
    }


 Si no que será el programa principal quien se ocupe de imprimir en pantalla el valor retornado:
Código: [Seleccionar]
System.out.println("El area es: " + circulo.areaCirculo() + " cm");

Espero haberme explicado bien y no haber liado más las cosas.
Como digo, son detalles, por lo demás el ejercicio parece correcto. :D
Un saludo.

229
De todo un poco... / Re: No entiendo recursividad!!!!!
« en: 27 de Marzo 2022, 23:08 »
En este caso usamos índices, porque los necesitamos para esta tarea.
No significa que para recursividad se necesiten índices siempre.

La recursividad básicamente consiste en hacer que una función se llame a sí misma una y otra vez hasta que se cumpla una determinada tarea, momento en el que se retorna el resultado computado.

En cada llamada recursiva, hay que pasar uno o más valores. Estos valores no pueden ser siempre los mismos (porque entonces la recursividad se vuelve infinita), en cada llamada han de ser modificados de alguna manera.
Qué valores hay que pasar, qué operaciones hay que realizar, que resultado hay que computar... pues todo depende de la tarea que se solicite.

La recursividad no es una solución a un problema, es una forma de procesar la solución. Pero la solución en sí tiene que decidirla el programador.

Un saludo.

230
De todo un poco... / Re: No entiendo recursividad!!!!!
« en: 26 de Marzo 2022, 19:31 »
Hola.
Tal y como he entendido el ejercicio (que quizás lo he entendido mal), usar recursividad aquí no parece lo más óptimo. Pero supongo que lo importante es entender la recursividad, sin importar si este es el mejor escenario para usarla.

A ver, para usar recursividad tenemos que usar una función. Y una función ha de retornar un valor.

Así que hay que pensar en que valor necesitamos retornar.
Tenemos una matriz y hay que indicar que compuerta es la segura. De hecho, puede haber más de una.
Las compuertas son posiciones de la matriz, así que se identifican con dos valores, es decir, dos índices: [0,3], [4,2], etc...

Bien, suponiendo que solo hubiera una compuerta sin coyote, ya tendríamos un problema porque la función solo puede retornar UN valor pero para identificar una compuerta hemos dicho que necesitamos DOS índices.
Lo podríamos solucionar retornando un arreglo de dos elementos, uno para cada índice.

Pero es que en realidad, puede haber más de una compuerta sin coyote, así que no sabemos si vamos a retornar DOS índices, o CUATRO, u OCHO, ...o CIEN MIL......
Así que no nos sirve la idea de retornar un arreglo.

Pero, siendo un poco listos, lo que podemos hacer es retornar un String. En ese String, se pueden ir concatenando las parejas de índices que identifiquen compuertas seguras.
De este modo en UN único valor (un String), podemos tener todos los índices que queramos.

Bien, ya hemos decidido que tipo de dato va a retornar la función recursiva. Ahora hay que decidir cuáles son los argumentos que (lo que va entre paréntesis) hay que aportar en cada llamada a la función.
Es decir, la función se va a ir llamando a sí misma un número indeterminado de veces y en cada llamada hay que aportarle unos argumentos para evaluar.

Un argumento está claro que será la matriz de "compuertas".

Para recorrer la matriz, va a necesitar dos índices, así que también le pasaremos dos valores int. Estos valores int, incrementarán su valor en cada llamada recursiva para que en cada iteración se compruebe una posición de la matriz distinta. Será parecido a cuando usamos dos bucles anidados para recorrer una matriz.

Otro argumento que hay que proporcionar, será el String donde se anoten las posiciones válidas. Este String ha de ir "viajando" en cada llamada recursiva para que se actualice su información en caso de encontrar una compuerta segura.

Ok, pues esta sería la "firma" de nuestra función, que yo la he llamado examinar():
Código: [Seleccionar]
private static String examinar(char[][] matriz, int i, int j, String seguras)Como hemos dicho, sus argumentos son la matriz, dos indices para recorrer la matriz y un String para apuntar las compuertas seguras.
Precisamente este String, será el que esta función retornará cuando finalice su proceso recursivo.

Vamos a pensar ahora en su código.
El código de una función recursiva, siempre tiene como mínimo dos sentencias RETURN.
Un return será una llamada recursiva a sí misma, prolongando su proceso.
El otro return, será el del valor final ya procesado, lo cuál pone fin a todo el proceso recursivo.

Hacer un return u otro, obviamente dependerá de si se cumplen unas condiciones u otras.

Yo por lo general, el código lo comienzo escribiendo las condiciones que van a poner fin al proceso recursivo.
¿Y cuáles son esas condiciones? ¿Cuándo queremos que el proceso termine?
Pues si el objetivo es recorrer la matriz de principio a fin, el proceso ha de terminar cuando ambos índices hayan alcanzado los límites de la matriz (longitud de la matriz - 1).
Para entonces ya no quedarán "compuertas" para comprobar y podremos retornar el String con la lista de compuertas seguras:
Código: [Seleccionar]
private static String examinar(char[][] matriz, int i, int j, String seguras) {
if (i == matriz.length - 1 && j == matriz.length - 1)//Ambos índices están en el límite
return seguras; //Ya se ha recorrido toda la matriz
else  {........

Sigamos, ¿y si aún quedan compuertas por comprobar?
Vale, pues entonces comprobamos si la compuerta actual, la que nos van a indicar los indices i y j, hay un coyote o no.

Si no hay coyote, entonces esta "compuerta" es segura y concatenamos su dirección en el String donde anotamos los índices de compuertas sin coyotes.
Si hay coyote, entonces no haremos nada, así que ni siquiera lo vamos a preguntar.

Con o sin coyote, una vez comprobada la compuerta hay que pasar a la siguiente, es decir, hay que incrementar los índices.
Lo haremos de forma análoga a como se haría si estuvieramos usando dos bucles anidados.
Comprobamos si el indice j se puede incrementar. Si está por debajo del límite de la matriz, se incrementa y listo.
Si está en el límite, entonces retoma valor 0 y es el índice i el que se incrementa

Tras esto, ya tenemos los índices actualizados y listos para pasar a la siguiente compuerta, es decir, hacemos una nueva llamada recursiva a la función, aportando todos los argumentos que han de acompañar esa llamada.
Código: [Seleccionar]
private static String examinar(char[][] matriz, int i, int j, String seguras) {
if (i == matriz.length - 1 && j == matriz.length - 1)//Ambos índices están en el límite
return seguras; //Ya se ha recorrido toda la matriz
else  {
//Comprobamos la compuerta actual
if (matriz[i][j] != 'C')  //Aquí NO hay coyote
seguras += String.format("[%s,%s]\n", i,j);//Añadimos esta posición a la lista de "seguras"

//Ahora incrementamos los índices, vigilando los límites de la matriz
if (j < matriz.length - 1)//Segundo índice está por debajo del límite
j++; //Se puede incrementar
else { //Segundo índice está en el límite
j = 0; //Vuelve a 0...
i++; //...y se incrementa el primer índice
}
//Índices actualizados, hacemos llamada recursiva
return examinar(matriz, i, j, seguras);
}
}


Pues ya tenemos la función recursiva. Ahora hay que ponerla a prueba.
Hacemos un método main, construimos una matriz y llamamos a nuestra función para que construya y retorne un String con las posiciones seguras.

Fíjate que al llamar la función en el programa, tenemos pasarle dos valores 0 para los índices (para que empiece desde el principio de la matriz) y una cadena String vacía que será donde se concatenen las posiciones de compuertas seguras:
Código: [Seleccionar]
public static void main(String[] args) {

char[][] compuertas = {
{'C', 'L', 'L', 'C', 'C'},
{'L', 'L', 'C', 'C', 'C'},
{'C', 'C', 'C', 'C', 'C'},
{'C', 'C', 'L', 'C', 'C'},
{'C', 'C', 'C', 'C', 'C'},
};

System.out.println("Lista de compuertas seguras:");
System.out.println(examinar(compuertas, 0, 0, ""));

}

Si lo ejecutamos, en pantalla veremos la lista de posiciones sin coyotes:
Citar
Lista de compuertas seguras:
[0,1]
[0,2]
[1,0]
[1,1]
[3,2]

Y eso es todo.
Repito que no se si he entendido bien el ejercicio, pero de todos modos, hemos creado un ejemplo de recursividad.
Espero que se haya entendido, pregunta lo que sea necesario.

Un saludo.

231
Lo de "describa dos clases y tres objetos por cada clase", sinceramente, no sé qué quieren indicar con eso.
Para el ejercicio que propone, lo de incrementar un tiempo, no se necesitan dos clases.

Sobre lo de incrementar el tiempo, el enunciado también resulta un poco ambiguo. Voy a interpretar que lo que se pide es leer por teclado un tiempo pidiendo las horas, luego los minutos y después los segundos.
Y mostrar ese tiempo incrementado en las cantidades indicadas.

Bueno, podemos escribir una clase que reciba por constructor las horas, minutos y segundos iniciales.
Y tenga un método que retorne el tiempo incrementado.

Incrementar el tiempo, no es simplemente sumar y ya está.
Hay que tener en cuenta que las horas no puede tener un valor igual1 o mayor de 24.
Y los minutos y segundos no pueden ser igual o mayor a 60.

Si los segundos superan el valor 60, su contador se reinicia a cero y solo suma la diferencia que hay entre ese valor y 60.

Es decir, si comenzamos con 50 segundos, y le incrementamos 20, su valor no puede ser 70.
Será 70 - 60 = 10
Y esto además implicará que hay que añadir +1 minuto al incremento previsto.

Esta podría ser la clase:
Código: [Seleccionar]
public class Tiempo {

//Tiempo inicial, valores se inician por constructor
private int horas;
private int minutos;
private int segundos;

public Tiempo(int horas, int minutos, int segundos) {
this.horas = horas;
this.minutos = minutos;
this.segundos = segundos;
}

public String getTiempoInicial() {
return String.format("%02d:%02d:%02d", horas, minutos, segundos);
}

public String getTiempoIncrementado() {
//Incrementos a aplicar
int incHoras = 2, incMinutos = 10, incSegundos = 20;
//Tiempos que se van a incrementar respecto al tiempo inicial
int horasInc, minutosInc, segundosInc;
/*
* Para incrementar sumamos los incrementos al tiempo inicial
* teniendo en cuenta los limites de cada magnitud.
* Por ejemplo, si al sumar los segundos supera o iguala el valor 60,
* implica que los segundos han de adoptar ese valor - 60 y que hay
* que incrementar 1 minuto extra.
*/
//Incrementamos segundos
segundosInc = segundos + incSegundos;
//Comprobamos límite 60 segundos
if (segundosInc >= 60) {
segundosInc -= 60; //Restamos 60
incMinutos++;//Añadimos 1 minuto al incremento
}
//Mismo proceso con los minutos
minutosInc = minutos + incMinutos;
if (minutosInc >= 60) {
minutosInc -= 60;
incHoras++;
}
//Y con horas, límite es 24
horasInc = horas + incHoras;
if (horasInc >= 24)
horasInc -= 24;
//Retornamos tiempo incrementado
return String.format("%02d:%02d:%02d", horasInc, minutosInc, segundosInc);
}

}

Podemos ponerlo a prueba con este código:
Código: [Seleccionar]
public class TestTiempo {

public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);

System.out.print("Indica tiempo en hh: ");
int hh = teclado.nextInt();
System.out.print("Indica tiempo en mm: ");
int mm = teclado.nextInt();
System.out.print("Indica tiempo en ss: ");
int ss = teclado.nextInt();

Tiempo tmp = new Tiempo(hh,mm,ss);

System.out.println("\nTiempo inicial: " + tmp.getTiempoInicial());
System.out.println("Tiempo incrementado: " + tmp.getTiempoIncrementado());
teclado.close();
}

}

Vemos en pantalla que parece cumplir con lo que se pide:
Citar
Indica tiempo en hh: 10
Indica tiempo en mm: 40
Indica tiempo en ss: 50

Tiempo inicial: 10:40:50
Tiempo incrementado: 12:51:10

232
La variable entrada, ya es un int. Así que hacerle un parseInt() es innecesario, porque ya es un int.

Citar
int entrada = entradaScanner.nextInt();
       
        if (numero == Integer.parseInt(entrada)){

De todos modos, intentas comparar entrada, que es int, con numero que es de la clase adivinarNumero

No puedes compararlos, son cosas distintas. Aunque ambos sean valores numéricos, no se pueden comparar directamente porque están modelados de formas distintas.
entrada es un int primitivo, básicamente es un trocito de memoria RAM que ocupa 32 bit.
numero es un objeto adivinarNumero, al ser una clase POO, es algo mucho más complejo que una simple dirección de memoria reservada.
Por eso no se pueden comparar, al menos no directamente.

Parte del problema radica en que quizás estás buscando una solución más compleja de lo necesario.

El número secreto, o sea, el número que hay que adivinar, no tiene porque ser una clase POO.
Basta con que sea un simple int, igual que el número que ingresará el usuario. La diferencia es que uno va a proceder del teclado del usuario y el otro nos lo dará un objeto Random.

Esta podría ser la forma sencilla de solucionarlo. Añado algo importante que tú no habías puesto, un bucle que se repita hasta que el usuario haya acertado el número secreto:
Código: [Seleccionar]
public class AdivinarNumero {

public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
Random azar = new Random();
int numSecreto = azar.nextInt(100) + 1;
boolean acertado = false;

while(!acertado) {
System.out.print("Acierta un numero entre 1 y 100: ");
int numero = teclado.nextInt();

if (numero == numSecreto) {
System.out.println("Enhorabuena! Has acertado");
acertado = true; //Esto pondrá fin al bucle
}
else if (numero < numSecreto)
System.out.println("Fallaste! El numero es mayor");
else
System.out.println("Fallaste! El numero es menor");
}

teclado.close();
System.out.println("\n\t\tFIN DE PROGRAMA");
}

}

Como ves, aquí no hay ningún problema en comparar los números, porque ambos son int.
Y con esto es suficiente.

Sin embargo, vamos a darle una vuelta de tuerca. Vamos a seguir tu planteamiento de hacer que el número "secreto", sea una clase POO.
Por ejemplo, esta:
Código: [Seleccionar]
public class NumeroSecreto {

private int secreto;

public NumeroSecreto() {
Random azar = new Random();
secreto = azar.nextInt(100) + 1;
}

public int getSecreto() {
return secreto;
}

}
Al construir un objeto de esta clase, obtendremos un int con un valor generado por un Random.

Si lo aplicamos en el programa principal, ahora las comparaciones (marco en rojo) nos van a dar error:
Citar
public class AdivinarNumero {

   public static void main(String[] args) {
      Scanner teclado = new Scanner(System.in);

      NumeroSecreto numSecreto = new NumeroSecreto();
      boolean acertado = false;
      
      while(!acertado) {
         System.out.print("Acierta un numero entre 1 y 100: ");
         int numero = teclado.nextInt();
         
         if (numero == numSecreto) {
            System.out.println("Enhorabuena! Has acertado");
            acertado = true; //Esto pondrá fin al bucle
         }
         else if (numero < numSecreto)
            System.out.println("Fallaste! El numero es mayor");
         else
            System.out.println("Fallaste! El numero es menor");
      }

      teclado.close();
      System.out.println("\n\t\tFIN DE PROGRAMA");
   }

}

¿Por qué da error si el número secreto, en esencia, es un int?
Sí, el numero secreto es un atributo int, pero está "encapsulado" en una clase POO y eso hace que no se pueda comparar directamente con otros int.

Directamente no..., pero, hay otra forma.

Tú intentaste usar el método Integer.parseInt(). Bien, pues no sirve en este caso.
Este método solo puede convertir objetos String a Integer(int).
Pero no podemos pedirle que haga lo mismo con un objeto NumeroSecreto.

En realidad, no necesitamos ayuda externa. Nuestra clase NumeroSecreto ya tiene un método get() que nos puede retornar el atributo int que tenemos encapsulado.
Así que basta con invocar este método para poder comparar con "simples int".
Citar
public class AdivinarNumero {

   public static void main(String[] args) {
      Scanner teclado = new Scanner(System.in);

      NumeroSecreto numSecreto = new NumeroSecreto();
      boolean acertado = false;
      
      while(!acertado) {
         System.out.print("Acierta un numero entre 1 y 100: ");
         int numero = teclado.nextInt();
         
         if (numero == numSecreto.getSecreto()) {
            System.out.println("Enhorabuena! Has acertado");
            acertado = true; //Esto pondrá fin al bucle
         }
         else if (numero < numSecreto.getSecreto())
            System.out.println("Fallaste! El numero es mayor");
         else
            System.out.println("Fallaste! El numero es menor");
      }

      teclado.close();
      System.out.println("\n\t\tFIN DE PROGRAMA");
   }

}

Listo.
Espero haber aclarado tus dudas. Si no fuera así, no dejes de preguntar.
Un saludo.

233
Si hay que usar un arreglo "primitivo", tenemos el inconveniente de que ha de tener un tamaño fijo.
Por eso el programa lo primero que tendrá que hacer es preguntar cuantas cuentas queremos gestionar, es decir, qué tamaño le vamos a dar a ese arreglo.

Tener un tamaño fijo significa que, en realidad, no podemos añadir o borrar Cuentas al arreglo.
Si por ejemplo decimos que queremos gestionar 20 cuentas, pues entonces el arreglo SIEMPRE va a tener 20 Cuentas.
Sin embargo, esas 20 Cuentas puede que tengan valor null o que tengan un objeto Cuenta instanciado.

Y eso es lo que vamos a usar para saber si hay espacio o no para "añadir" o "borrar" cuentas.

Si el arreglo tiene alguna posición con valor null, es que hay espacio para una nueva Cuenta.
Si no hay ningún valor null, es que no se aceptan nuevas cuentas.
Cuando queremos "borrar" una cuenta, lo que haremos será darle valor null.

Bien, lo primero es escribir la clase Cuenta. Yo la he escrito así:
Código: [Seleccionar]
public class Cuenta {

private int numeroCuenta;
private String titular;
private double saldo;


public Cuenta(int numeroCuenta, String titular, double saldo) {
this.numeroCuenta = numeroCuenta;
this.titular = titular;
this.saldo = saldo;
}

public int getNumeroCuenta() {
return numeroCuenta;
}

public void depositar(double monto) {
saldo += monto;
}

public boolean retirar(double importe) {
if (importe > saldo)
return false;
else {
saldo -= importe;
return true;
}
}

@Override
public String toString() {
return String.format("Nº Cuenta: %s, Titular: %s, Saldo: %s", numeroCuenta, titular, saldo);
}

}
Le he puesto un get al atributo "número de cuenta" porque será el valor que necesitaremos para buscar una cuenta en concreto.

Bueno, la clase de la aplicación principal.
Declararemos como atributo un arreglo de clase Cuenta, sin inicializar.

Al comenzar el programa, preguntaremos la cantidad de cuentas a gestionar y con esa respuesta ya podremos inicializar el arreglo dándole un tamaño.
En ese momento, el arreglo estará lleno de valores null, es decir, no hay cuentas creadas.

Entonces comenzamos un bucle, donde mostraremos un menú y recogeremos la opción elegida por el usuario.
Con un switch analizaremos la opción escogida. Para cada opción llamaremos a un método que se encargará de cumplir con la opción solicitada.
El bucle termina cuando se escoge la opción de "terminar.

Mira, esta sería la estructura del programa principal, falta escribir los métodos, que lo veremos después:
Código: [Seleccionar]
import javax.swing.JOptionPane;

public class Banco {

private static Cuenta[] cuentas; //Arreglo de objetos Cuenta

public static void main(String[] args) {

//Empezamos preguntando cuantas cuentas queremos gestionar
String cantidad = JOptionPane.showInputDialog(null, "¿Cuántas cuentas bancarias quiere gestionar",
"Iniciar Banco", JOptionPane.QUESTION_MESSAGE);
//Inicialiamos el arreglo con la respuesta
cuentas = new Cuenta[Integer.parseInt(cantidad)];

//Comienza menu
String opcion = "";
do {
//Pedimos opcion
opcion = JOptionPane.showInputDialog(null, MENU, "Menú Banco", JOptionPane.PLAIN_MESSAGE);
//Analizamos opcion escogida
switch(opcion) {
case "1":
crearCuenta();
break;
case "2":
depositar();
break;
case "3":
retirar();
break;
case "4":
consultarCuenta();
break;
case "5":
borrarCuenta();
break;
case "6":
consultarTodas();
break;
case "7":
JOptionPane.showMessageDialog(null, "FIN DEL PROGRAMA", "Menú Banco",
JOptionPane.INFORMATION_MESSAGE);
break;
default:
JOptionPane.showMessageDialog(null, "Opción equivocada", "Menú Banco", JOptionPane.ERROR_MESSAGE);
}
}while(!opcion.equals("7"));

}

private static void crearCuenta() {


}

private static void depositar() {


}

private static void retirar() {


}

private static void consultarCuenta() {


}

private static void borrarCuenta() {


}

private static void consultarTodas() {


}

//String con las opciones del menu para mostrar en el JOptionPane
private static final String MENU = "1.- Crear Cuenta\n2._ Depositar\n3.- Retirar\n4.- Consultar Cuenta"
+ "\n5.- Borrar Cuenta\n6.- Consultar Todas\n7.- TERMINAR";

}

Vamos a ver el primer método, crear una cuenta.
Primero hay que comprobar si hay una posición libre en el arreglo.
Así que lo recorremos buscando un valor null, si lo encontramos, guardamos esta posicion en una variable.

Si no hemos encontrado una posición libre, pues informamos y aquí se acaba el método.
Pero si tenemos una posición libre, pues ahora pedimos datos para crear una nueva Cuenta y la insertamos en dicha posición:
Código: [Seleccionar]
private static void crearCuenta() {
//Primero buscamos una posición vacía (null) en el arreglo
int posicion = -1;
for (int i = 0; i < cuentas.length; i++)
if (cuentas[i] == null) {
posicion = i; //Hemos encontrado un hueco vacío donde crear una cuenta
break; //Finalizamos la búsqueda
}
//Comprobamos si hemos encontrado una posición disponible
if (posicion == -1) //No hay disponible, el arreglo está lleno de Cuentas
JOptionPane.showMessageDialog(null, "No hay espacio para una nueva cuenta", "Crear Cuenta",
JOptionPane.WARNING_MESSAGE);
else {
//En la variable posicion tenemos la dirección donde colocar una nueva Cuenta, pedimos datos
String numCuenta = JOptionPane.showInputDialog(null, "Nº de Cuenta:", "Crear Cuenta", -1);
String titular = JOptionPane.showInputDialog(null, "Nombre del Titular:", "Crear Cuenta", -1);
String saldo = JOptionPane.showInputDialog(null, "Saldo inicial:", "Crear Cuenta", -1);
//Tenemos datos, creamos nueva Cuenta en la posicion indicada
cuentas[posicion] = new Cuenta(Integer.parseInt(numCuenta), titular, Double.parseDouble(saldo));
JOptionPane.showMessageDialog(null, "Nueva Cuenta registrada", "Crear Cuenta",
JOptionPane.INFORMATION_MESSAGE);
}
}


Veamos otro método, por ejemplo, la opción 4 para consultar una cuenta.
Aquí lo primero es pedir el nº de cuenta que se quiere consultar.
Luego, se recorre el arreglo buscando una cuenta que coincida con el número indicado.

Ojo, las posiciones null hay que evitarlas, si intentamos comparar algo con ellas, se producirá una excepción.
Solo haremos comparaciones si NO es una posición null
Si encontramos la cuenta que buscamos, podemos referenciarla en otra variable Cuenta, previamente declarada.

Cuando termine la búsqueda, comprobamos si tenemos algo referenciado en esa variable Cuenta.
Si no hay nada (null) es que no existe ninguna cuenta con el número que nos han dado.
En cambio, si tiene un objeto referenciado, pues es que hemos encontrado la cuenta consultada y mostramos en pantalla los datos que proporciona su método toString()

Código: [Seleccionar]
private static void consultarCuenta() {
//Preguntamos número de cuenta a consultar
int numCuenta = Integer.parseInt(JOptionPane.showInputDialog(null, "Nº de cuenta:",
"Consultar Cuenta", JOptionPane.QUESTION_MESSAGE));
//Buscamos con un FOR EACH en el arreglo la Cuenta que buscamos comparando los números de cuenta
//MUCHO CUIDADO con las posiciones null, no debemos intentar comparar nada en ellas
Cuenta buscar = null;
for (Cuenta cuenta: cuentas)
if (cuenta != null) { //Solo comparamos con posiciones que NO son null
if (cuenta.getNumeroCuenta() == numCuenta) {
buscar = cuenta; //Hemos encontrado la cuenta que buscamos.
break; //Dejamos de buscar
}
}
//Comprobamos si hemos encontrado algo
if (buscar == null) //No, no hemos encontrado nada
JOptionPane.showMessageDialog(null, "No hay ninguna cuenta con el nº: " + numCuenta,
"Consultar Cuenta", JOptionPane.WARNING_MESSAGE);
else
JOptionPane.showMessageDialog(null, "Datos de la cuenta:\n" + buscar,
"Consultar Cuenta", JOptionPane.INFORMATION_MESSAGE);
}

Bien, a partir de aquí, intenta continuar tú.
Comprueba que entiendes lo que he explicado, pregunta lo que necesites y a ver si lo puedes poner en práctica para completar el resto de métodos.

Haz lo que puedas, no te preocupes por equivocarte o atascarte (es la única forma de aprender). Llega hasta donde te sea posible, publícalo aquí y te ayudamos a completar.

Un saludo.

234
Hola.
Necesitas dos ArrayList, uno para clase String donde guardar los nombres de clientes. Otro para clase Integer (o Double) donde guardan las compras.

Los clientes y sus compras quedan relacionados según la posición que ocupan en los ArrayList.

Es decir, si un cliente ocupa la posición número 4 en su ArrayList de String, pues sus compras estarán en la posición 4 del ArrayList de Integer.
Teniendo en cuenta esta relación, podemos cumplir las funcionalidades que se nos piden.


Mira, este podría ser el "esqueleto" del programa.
- Los dos ArrayList y un Scanner para recibir datos por consola.
- Un menú de opciones donde, con un switch, analizamos qué ha elegido el usuario y llamaremos al método que se ocupará de cumplir esa función
- Y los cuatro métodos para dichas funcionalidades.

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Scanner;

public class RegistroCompras {

private static ArrayList<String> clientes = new ArrayList<String>();
private static ArrayList<Integer> compras = new ArrayList<Integer>();
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

int opcion = 0;

do {
System.out.println("\n\n\t\tREGISTRO DE COMPRAS");
System.out.println("\t\t-------- -- -------\n");
System.out.println("[1] - Registrar cliente y su compra");
System.out.println("[2] - Listar clientes y sus compras");
System.out.println("[3] - Consultar la compra de un cliente");
System.out.println("[4] - Eliminar un cliente");
System.out.println("[9] - FIN DE PROGRAMA");
System.out.print("Opcion: ");
opcion = Integer.parseInt(teclado.nextLine());

switch(opcion) {
case 1:
registrarCliente();
break;
case 2:
mostrarListado();
break;
case 3:
buscarCliente();
break;
case 4:
eliminarCliente();
break;
case 9:
System.out.println("\n\t\tFIN DE PROGRAMA");
break;
default:
System.out.println("Opcion equivocada");
}
}while(opcion != 9);


}

private static void registrarCliente( ) {

}

private static void mostrarListado() {

}

private static void buscarCliente() {

}

private static void eliminarCliente() {

}

}

Falta el código de los métodos, que es lo que realmente importa.

Bien, vamos a escribir el primer método, que es muy sencillo, es pedir un nombre y un valor de compra, y guardarlos en los correspondientes ArrayList:
Código: [Seleccionar]
private static void registrarCliente( ) {
System.out.print("\nNombre Cliente: ");
clientes.add(teclado.nextLine());
System.out.print("Valor de compra: ");
compras.add(Integer.parseInt(teclado.nextLine()));
}
Listo, solo se necesitan esas 4 líneas. No tiene ningún misterio.

Vamos a ver otro método más interesante, el de buscar un cliente y mostrar su compra.
Aquí si que tenemos que poner en práctica la forma de relacionar un dato con el otro.
Pediremos el nombre de un cliente, lo buscaremos en el ArrayList para conocer que posición ocupa.
Sabiendo esa posición, podremos encontrar el valor de su compra en el otro ArrayList:
Código: [Seleccionar]
private static void buscarCliente() {
if (clientes.isEmpty())
System.out.println("\nNo hay clientes registrados");
else {
System.out.print("\nNombre Cliente: ");
int posicion = clientes.indexOf(teclado.nextLine());
if (posicion == -1)
System.out.println("No hay cliente con ese nombre");
else
System.out.println("Valor de compra: " + compras.get(posicion));
}
}
Como ves, tampoco se requiere un código complicado.
La clave es obtener la posición del cliente, esto nos los da el propio ArrayList invocando a su método indexOf().
Si el nombre que damos para buscar no existe, nos retorna el valor -1.
Si existe, entonces si obtendremos la posición que nos sirve para encontrar la compra que le corresponde a dicho cliente.

Intenta tú completar los otros dos métodos que faltan.
Si te atascas o algo no entiendes, pregunta por aquí.

Un saludo.

235
Sí, tu clase EntradaTeclado retorna un String, por tanto no puedes compararlo con un int, a no ser que lo transformes.

Pero es que además, en realidad no estás comparando el int con la entrada de teclado. Estás comparando el int con el objeto EntradaTeclado
Código: [Seleccionar]
        entradaScanner = new EntradaTeclado();       
       
        if (numero == entradaScanner){

Una vez instanciado tu objeto EntradaTeclado, tendría que pedir una entrada, y luego retornarla para poder comparar:
Código: [Seleccionar]
        entradaScanner = new EntradaTeclado();       
        entradaScanner.pedirEntrada();
               
        if (numero == entradaScanner.getEntrada()){
Aquí ahora si estaríamos con el problema de comparar un int con un String, que puedes resolverlo transformando a Integer
Código: [Seleccionar]
        entradaScanner = new EntradaTeclado();       
        entradaScanner.pedirEntrada();
               
        if (numero == Integer.parseInt(entradaScanner.getEntrada())){

Por otra parte, no necesitas escribir una clase específica para pedir entradas por teclado.
Quizás en un programa más complejo, donde te interese hacer un control específico de lo que entra el usuario, o como lo retornas.., entonces sí.

Pero en este caso, donde simplemente quieres que el usuario introduzca un valor int, puedes declarar directamente un objeto Scanner en el programa principal y que pida el int
Citar
import java.util.Scanner;

public class testAdivinarNumero {
   
    public static void main (String [] args){
        Scanner entradaScanner = new Scanner(System.in);
        adivinarNumero numero = new adivinarNumero();
        System.out.println("Se ha creado un número aleatorio entre 1 y 100");
        System.out.println("Ingrese un número: ");
        int numImgresado = entradaScanner.nextInt();       
       
        if (numero == numImgresado ){
            System.out.println ("Usted ha adivinado el número");
        } else if (numero > numImgresado ){
            System.out.println ("El número ingresado es mayor. Intentelo de vuelta: ");
        }else if (numero < numImgresado ){
            System.out.println ("El número ingresado es menor. Intentelo de vuelta: ");
        }

    }
   
}

Así te ahorras tener que escribir/usar una clase, que en realidad no va a hacer nada que no pueda hacer la propia clase Scanner por sí sola.

236
Claro, ese objeto vehículo1 lo estás creando en el case 1.

Pero ese case, puede que ocurra o que no ocurra..., por tanto si ocurre un case 2, sin que previamente haya ocurrido un case 1, estarías haciendo referencia a un objeto que no ha sido creado.

Para evitar esto, puedes declarar ese objeto antes de comience el switch, aunque sea con valor null.
Ya luego, si ocurre un case 1, no lo declaras de nuevo. Solamente has de construir un nuevo objeto usando la misma referencia.

Y en el case 2, ya no habrá problemas para comprobar si esa referencia tiene valor null o no, porque la existencia de esa referencia ahora está garantizada. No va a depender de que ocurra un case 1 previamente.

Citar
        do {
            System.out.println("1. Generar vehículo");
            System.out.println("2. Mostrar datos");
            System.out.println("3. Calcular beneficio");
            System.out.println("4. Salir");

            try {
                System.out.println("Escoge la opcion:");
                opcionMenu = teclado.nextInt();
                Vehiculo Vehiculo1 = null;

                switch (opcionMenu) {
                    case 1:
                        Vehiculo1 = new Vehiculo("1234ABC", "Seat", 1000);
                        System.out.println(Vehiculo1.toString());
                        break;
                    case 2:
                        if (Vehiculo1 == null) {  \\\ AQUÍ TENGO EL PROBLEMA
                            System.out.println("No has creado el vehiculo");
                        }

                        break;
                    case 3:

                        break;
                    case 4:
                        salir = true;
                        break;
                    default:
                        System.out.println("Tienes que introducir un valor entre 1 y 4");
                }
            } catch (InputMismatchException e) {
                System.out.println("Tienes que introducir un valor entre 1 y 4");
                teclado.next(); // volvemos a activar la entrada de teclado aqui. si no entramos en bucle
            }

        } while (!salir);


237
De todo un poco... / Re: Me pdrian ayudar con este problema
« en: 09 de Marzo 2022, 12:14 »
Hola, primero necesitamos una clase Estudiante con algunos atributos, al menos los necesarios para cumplir con las gestiones que se solicitan:
Código: [Seleccionar]
public class Estudiante {

private String nombre;
private String apellidos;
private char sexo; //H hombre, M mujer
private int calificacion;

public Estudiante(String nombre, String apellidos, char sexo, int calificacion) {
this.nombre = nombre;
this.apellidos = apellidos;
this.sexo = sexo;
this.calificacion = calificacion;
}

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 char getSexo() {
return sexo;
}
public void setSexo(char sexo) {
this.sexo = sexo;
}
public int getCalificacion() {
return calificacion;
}
public void setCalificacion(int calificacion) {
this.calificacion = calificacion;
}

@Override
public String toString() {
return String.format("Nombre: %s %s , Calificacion: %d", nombre, apellidos, calificacion);
}

}

Una clase Maestro, la cuál entre sus atributos va a tener un objeto que será una lista inmutable, cuya clase escribiremos después.
Esa lista ha de tener un tamaño determinado, así que lo indicaremos en el constructor:
Código: [Seleccionar]
public class Maestro {

private String nombre;
private String apellidos;
private ListaDelMaestro listaEstudiantes;

public Maestro(String nombre, String apellidos, int nEstudiantes) {
this.nombre = nombre;
this.apellidos = apellidos;
listaEstudiantes = new ListaDelMaestro(nEstudiantes);
}

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 ListaDelMaestro getListaAlumnos() {
return listaEstudiantes;
}

public void setListaAlumnos(ListaDelMaestro listaEstudiantes) {
this.listaEstudiantes = listaEstudiantes;
}

}

Y ahora la clase ListaDelMaestro.
Esta clase será un arreglo de objetos Estudiante con el tamaño indicado.
Tendrá una serie de métodos para poder hacer todo lo que se pide: agregarEstudiante, hacer una lista de aprobados, etc..

Para poder saber hasta cuál posición del arreglo hay estudiantes registrados o no, usaremos un "indice", una variable int que comienza a 0 y va incrementando su valor cada vez que se agrega un estudiante.
Código: [Seleccionar]
public class ListaDelMaestro {

private Estudiante[] lista;
private int indice; //Este indice nos dice hasta que posicion hay estudiantes en el arreglo

public ListaDelMaestro(int nEstudiantes) {
lista = new Estudiante[nEstudiantes];
indice = 0;
}

public void agregarEstudianteFinal(Estudiante estu) {
if (indice == lista.length)
System.out.println("No se pudo agregar, la lista esta completa.");
else {
lista[indice] = estu;
indice++;
System.out.println("Estudiante agregado");
}
}

public void reemplazarEstudiante(Estudiante estu, int posicion) {
if (posicion >= lista.length)
System.out.println("Posicion fuera de rango");
else if (posicion < indice) {
lista[indice] = estu;
System.out.println("Estudiante reemplazado");
}
else
System.out.println("No hay Estudiante para reemplazar en la posicion indicada");
}

public Estudiante getPrimeroLista() {
if (indice == 0) {
System.out.println("La lista esta vacía");
return null;
}
else
return lista[0];
}

public Estudiante getUltimoLista() {
if (indice == 0) {
System.out.println("La lista esta vacía");
return null;
}
else
return lista[indice-1];
}

public Estudiante[] getListaHombres() {

}

public Estudiante[] getListaMujeres() {

}

public Estudiante[] getListaAprobados() {

}

public Estudiante[] getListaReprobados() {

}

public Estudiante[] getListaApellidosEmpiezan(char letra) {

}

public Estudiante[] getListaNombresEmpiezan(char letra) {

}
}

No he escrito el código de todos los métodos, tendrás que intentar escribirlos tú para completar esta clase.
Inténtalo y si no lo consigues, comparte por aquí lo que hayas conseguido y te ayudamos a completar.

Por último, hace falta una clase principal, donde crearemos un Maestro y ofreceremos un menú de opciones para que el usuario pueda gestionar la lista.
En el menú, pedimos una opcion, la evaluamos con switch, y llamaremos a distintos métodos para hacer lo que se pide.

Te pongo un ejemplo también sin terminar, de nuevo, intenta completarlo y pídenos ayuda cuando no puedas avanzar.
Un saludo.

Código: [Seleccionar]
import java.util.Scanner;

public class Main {

private static Maestro maestro;
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {
//Construimos un Maestro, indicando nombre y cuantos Estudiantes tendrá su lista
maestro = new Maestro("Francisco", "Sanchez", 24);

int opcion = 0;
//Menu opciones
do {
System.out.println("\n\t\tMENU DEL MAESTRO");
System.out.println("\t\t---- --- -------\n");
System.out.println("[1] - Agregar Estudiante a la Lista");
System.out.println("[2] - Reemplazar Estudiante en una posicion");
System.out.println("[3] - Regresar primero de la Lista");
System.out.println("[4] - Regresar ultimo de la Lista");
System.out.println("[5] - Obtener Lista de Hombres");
System.out.println("[6] - Obtener Lista de Mujeres");
System.out.println("[7] - Obtener Lista de Aprobados");
System.out.println("[8] - Obtener Lista de Reprobados");
System.out.println("[9] - Obtener Lista de Apellidos que empiezan por una letra");
System.out.println("[10] - Obtener Lista de Nombres que empiezan por una letra");
System.out.println("\t\t---------");
System.out.println("[0] - TERMINAR PROGRAMA");
System.out.print("\nOpcion:");
opcion = Integer.parseInt(teclado.nextLine());
switch(opcion) {
case 0:
System.out.println("\n\tFIN DE PROGRAMA");
break;
case 1:
agregarEstudiante();
break;
case 2:
reemplazarEstudiante();
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
}

}while(opcion != 0);
}

private static void agregarEstudiante() {
//Pedimos datos para construir un estudiante
System.out.println("\nNUEVO ESTUDIANTE\n");
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Apellidos: ");
String apellidos = teclado.nextLine();
System.out.print("Sexo(H/M): ");
char sexo = teclado.nextLine().toUpperCase().charAt(0);
System.out.print("Calificacion(0/10): ");
int califi = Integer.parseInt(teclado.nextLine());

//Agregamos a la lista
maestro.getListaAlumnos().agregarEstudianteFinal(new Estudiante(nombre, apellidos, sexo, califi));

}

private static void reemplazarEstudiante() {
System.out.println("\nREEMPLAZAR ESTUDIANTE\n");
System.out.println("Datos del nuevo estudiante:");
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Apellidos: ");
String apellidos = teclado.nextLine();
System.out.print("Sexo(H/M): ");
char sexo = teclado.nextLine().toUpperCase().charAt(0);
System.out.print("Calificacion(0/10): ");
int califi = Integer.parseInt(teclado.nextLine());

System.out.print("\nPosicion de la lista donde emplazarlo: ");
int posicion = Integer.parseInt(teclado.nextLine());

maestro.getListaAlumnos().reemplazarEstudiante(new Estudiante(nombre, apellidos, sexo, califi), posicion);
}

}

238
Buenas.

Es más intuitivo de lo que parece.
Veamos, un atributo sería la clase SistemaOperativo, que podría ser esta:
Código: [Seleccionar]
public class SistemaOperativo {

private String tipo;
private int version;

public String getTipo() {
return tipo;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}

}

Y luego dos atributos para la camara delantera y para la trasera, que como sus atributos son los mismos, no hace falta escribir dos clases, nos bastaría con una sola clase Camara
Código: [Seleccionar]
public class Camara {

private int resolucion;
private int numCamaras;
private boolean estabilidador;

public int getResolucion() {
return resolucion;
}

public void setResolucion(int resolucion) {
this.resolucion = resolucion;
}

public int getNumCamaras() {
return numCamaras;
}

public void setNumCamaras(int numCamaras) {
this.numCamaras = numCamaras;
}

public boolean tieneEstabilidador() {
return estabilidador;
}

public void setEstabilidador(boolean estabilidador) {
this.estabilidador = estabilidador;
}

}

Fíjate que a estas clases no les he puesto constructor. Podríamos ponérselos, pero para este ejemplo no será necesario (aunque esto va un poco a gusto del programador)

El caso es que ahora hay que crear la clase Movil con estos objetos como atributos:
Código: [Seleccionar]
public class Movil {

private SistemaOperativo so;
private Camara camDelantera;
private Camara camTrasera;


}

No está completa, falta constructor y métodos get/set. Y es que aquí es cuando hay que parase a pensar que es lo que podemos necesitar.
Podemos hacer un constructor que reciba TODOS los parámetros necesarios para dar valores a todos los objetos que componen este teléfono móvil. Así que iremos construyendo cada atributo y les seteamos sus valores
Código: [Seleccionar]
public class Movil {

private SistemaOperativo so;
private Camara camDelantera;
private Camara camTrasera;

public Movil(String tipoSo, int version, int resolCamDelan, int numCamDelan, boolean estabilDelan,
int resolCamTras, int numCamTras, boolean estabilTras) {
//Construimos SO
so = new SistemaOperativo();
so.setTipo(tipoSo);
so.setVersion(version);
//Construimos camara delantera
camDelantera = new Camara();
camDelantera.setResolucion(resolCamDelan);
camDelantera.setNumCamaras(numCamDelan);
camDelantera.setEstabilidador(estabilDelan);
//Construimos la trasera
camTrasera = new Camara();
camTrasera.setResolucion(resolCamTras);
camTrasera.setNumCamaras(numCamTras);
camTrasera.setEstabilidador(estabilTras);
}

}

Pero puede que no siempre vayamos a querer usar un constructor al que haya que pasarle taaaantos parámetros.
Así que podemos darle un segundo constructor a nuestra clase, un constructor "por defecto" el cuál no recibe ningún parámetro.
Simplemente construimos los atributos sin darles valores, con la idea de que ya luego en el programa donde se utilice nuestra clase, ya le darán esos valores con unos setters.
Código: [Seleccionar]
public class Movil {

private SistemaOperativo so;
private Camara camDelantera;
private Camara camTrasera;

//Constructor que recibe valores
public Movil(String tipoSo, int version, int resolCamDelan, int numCamDelan, boolean estabilDelan,
int resolCamTras, int numCamTras, boolean estabilTras) {
//Construimos SO
so = new SistemaOperativo();
so.setTipo(tipoSo);
so.setVersion(version);
//Construimos camara delantera
camDelantera = new Camara();
camDelantera.setResolucion(resolCamDelan);
camDelantera.setNumCamaras(numCamDelan);
camDelantera.setEstabilidador(estabilDelan);
//Construimos la trasera
camTrasera = new Camara();
camTrasera.setResolucion(resolCamTras);
camTrasera.setNumCamaras(numCamTras);
camTrasera.setEstabilidador(estabilTras);
}

//Constructor que no recibe valores.
public Movil() {
so = new SistemaOperativo();
camDelantera = new Camara();
camTrasera = new Camara();
}

}

Y ahora, unos getters/setters.
Código: [Seleccionar]
public class Movil {

private SistemaOperativo so;
private Camara camDelantera;
private Camara camTrasera;

//Constructor que recibe valores
public Movil(String tipoSo, int version, int resolCamDelan, int numCamDelan, boolean estabilDelan,
int resolCamTras, int numCamTras, boolean estabilTras) {
//Construimos SO
so = new SistemaOperativo();
so.setTipo(tipoSo);
so.setVersion(version);
//Construimos camara delantera
camDelantera = new Camara();
camDelantera.setResolucion(resolCamDelan);
camDelantera.setNumCamaras(numCamDelan);
camDelantera.setEstabilidador(estabilDelan);
//Construimos la trasera
camTrasera = new Camara();
camTrasera.setResolucion(resolCamTras);
camTrasera.setNumCamaras(numCamTras);
camTrasera.setEstabilidador(estabilTras);
}

//Constructor que no recibe valores.
public Movil() {
so = new SistemaOperativo();
camDelantera = new Camara();
camTrasera = new Camara();
}

public SistemaOperativo getSo() {
return so;
}

public void setSo(SistemaOperativo so) {
this.so = so;
}

public Camara getCamDelantera() {
return camDelantera;
}

public void setCamDelantera(Camara camDelantera) {
this.camDelantera = camDelantera;
}

public Camara getCamTrasera() {
return camTrasera;
}

public void setCamTrasera(Camara camTrasera) {
this.camTrasera = camTrasera;
}

}

Hay que tener en cuenta que estos getters/setters trabajan también con objetos. Es decir, si quiero obtener la versión de sistema operativo de un móvil, tendré que pedirle al móvili que me retorne su so, y a este so pedirle que me retorne su versión.

Por ejemplo, si ejecutamos este programa de prueba:
Código: [Seleccionar]
public class Prueba {

public static void main(String[] args) {

Movil miMovil = new Movil("Android", 13, 600, 3, true, 400, 2, false);

System.out.println("Tipo de SO: " + miMovil.getSo().getTipo());
System.out.println("Versión: " + miMovil.getSo().getVersion());

}

}

En pantalla obtendremos los datos que hemos buscado:
Código: [Seleccionar]
Tipo de SO: Android
Versión: 13

Y bueno, creo que con esto queda explicado.
Si tuvieras más dudas, solo tienes que preguntar.

Un saludo.

239
La idea es gestionar un mismo material (libros) de dos formas distintas, y con atributos distintos, según si se está funcionando como una biblioteca o como un tienda de libros.
El programa ha de ser ambivalente para ambas situaciones.

Bien, ya ha escrito la clase básica Material
Esta clase, va a tener dos hijas, una para los libros de tienda y otros para los libros de la biblioteca.
Esta podría ser la clase LibroTienda, que añade el atributo para el precio de venta, el cuál se puede proporcionar como parámetro del constructor
Código: [Seleccionar]
public class LibroTienda extends Material {

private double precioVenta;

public LibroTienda(String isbn, String nombre, String autor, double precioVenta) {
super(isbn, nombre, autor);
this.precioVenta = precioVenta;
}

public double getPrecioVenta() {
return precioVenta;
}

public void setPrecioVenta(double precioVenta) {
this.precioVenta = precioVenta;
}

}

Y esta la clase LibroBiblioteca, con dos atributos nuevos para los días que lleva prestado y el valor de multa para un posible retraso en su devolución.
Dichos atributos, parece lógico que se inicialicen a 0 al construir el libro.
Código: [Seleccionar]
public class LibroBiblioteca extends Material {

private int diasPrestamo;
private double valorMulta;

public LibroBiblioteca(String isbn, String nombre, String autor) {
super(isbn, nombre, autor);
diasPrestamo = 0;
valorMulta = 0d;
}

public int getDiasPrestamo() {
return diasPrestamo;
}

public void setDiasPrestamo(int diasPrestamo) {
this.diasPrestamo = diasPrestamo;
}

public double getValorMulta() {
return valorMulta;
}

public void setValorMulta(double valorMulta) {
this.valorMulta = valorMulta;
}

}

Bien, tenemos los dos tipos de material/libros.
Ahora hay que hacer que el programa pueda gestionar de dos formas distintas.
Para ello haremos otras dos clases, cada una enfocada a distinto tipo de negocio.
A pesar de ser negocios distintos, van a tener dos funciones básicas con el mismo nombre: transacción y cambios.

Es aquí donde podemos crear una interfaz, para indicar que esas dos clases han de tener esas dos funciones, aunque su comportamiento será distinto en cada una.
Esa interfaz es tan simple como esto:
Código: [Seleccionar]
public interface IOperarMaterial {

public void cambios();
public void transaccion();

}

Esta interfaz, la implementarán las clases que modelan los distintos tipos de negocio.
Una clase para el negocio de la tienda librería:
Código: [Seleccionar]
import java.util.ArrayList;

public class OperarLibreria implements IOperarMaterial {

private ArrayList<LibroTienda> libros = new ArrayList<LibroTienda>();

@Override
public void cambios() {
// TODO Codigo para que la tienda cambie un libro vendido por otro
//Se debe informar la fecha del cambio y el nombre del nuevo libro por el que fue cambiado.

}

@Override
public void transaccion() {
// TODO Codigo para vender un libro

}


}

Y otra para el negocio de la biblioteca:
Código: [Seleccionar]
import java.util.ArrayList;

public class OperarBiblioteca implements IOperarMaterial {

private ArrayList<LibroBiblioteca> libros = new ArrayList<LibroBiblioteca>();

@Override
public void cambios() {
// TODO Código para hacer la devolución de un libro prestado
//mostrar la fecha de la devolución del libro.

}

@Override
public void transaccion() {
// Codigo para realizar un préstamo a un usuario

}


}

Estas clases, no están terminadas. Intenta escribir el código de cada método, según cada caso.
Por ejemplo para que la tienda venda un libro (transacción) tendrá que preguntar que libro se va a vender, eliminarlo del ArrayList y mostrar en pantalla el precio de venta a modo de factura.

Cuanto tengas esas clases terminadas, ya lo último es crear la clase principal, con dos objetos como atributos para los dos tipos de negocio.
Y mostrar un menú, por ejemplo que empiece preguntando si se quiere operar como libreria o como biblioteca.
Y luego preguntar si se quiere hacer una transaccion o un cambio.
Y ya entonces pedirle al objeto correspondiente (libreria o bliblioteca) que invoquen a sus métodos según lo que haya elegido el usuario.
Código: [Seleccionar]
public class Main {

private static OperarLibreria libreria = new OperarLibreria();
private static OperarBiblioteca biblioteca = new OperarBiblioteca();

public static void main(String[] args) {
// TODO Menu para elebir entre modelo de negocio y preguntar
//que operacion se quiere realizar

}

}

Intenta terminar tú todas estas clases, si no lo consigues, muestra por aquí lo que tengas y te ayudamos a completarlo.

Un saludo.

240
Comencemos creando las interfaces, por ejemplo IOperacionEmpleado
Código: [Seleccionar]
public interface IOperacionEmpleado {

public Empleado crearEmpleado();

public void listarEmpleados();

public void consultarEmpleado();

public void calcularSueldoEmpleado();

}
Fíjate que al ser una interfaz, no incluye código. Solo se pone "la firma" de los métodos, es decir, nombre de los métodos, tipo que retorna y, si fuera necesario, los parámetros a recibir entre paréntesis.

Lo mismo con la interface IOperacionEmpresa.
En esta ocasión, el método asignarEmpleado() probablemente necesitaremos recibir como parámetro el Empleado que hay que asignar.
Código: [Seleccionar]
public interface IOperacionEmpresa {

public void crearEmpresa();

public void asignarEmpleado(Empleado emp);

public void listarEmpresas();

public void contarEmpleadosdeEmpresa();
}

Vamos a ver ahora las clases que van a implementar estas interfaces.
Empecemos por la clase OperacionEmpleado, la cuál tendrá un ArrayList donde guardar los empleados que el usuario vaya creando.
Al indicarle a esta clase que ha de implementar la interface que hemos escrito antes, automáticamente se nos "obliga" a sobreescribir los métodos de dicha interfaz.
Código: [Seleccionar]
import java.util.ArrayList;

public class OperacionEmpleado implements IOperacionEmpleado {

private ArrayList<Empleado> empleados = new ArrayList<Empleado>();

@Override
public Empleado crearEmpleado() {

}

@Override
public void listarEmpleados() {

}

@Override
public void consultarEmpleado(String documento) {

}

@Override
public void calcularSueldoEmpleado(String documento, int horasTrabajadas) {

}

}

Es aquí, ahora, donde hay que escribir el código para que cada uno de estos métodos funcionen.

Código: [Seleccionar]
import java.util.ArrayList;

import javax.swing.JOptionPane;

public class OperacionEmpleado implements IOperacionEmpleado {

private ArrayList<Empleado> empleados = new ArrayList<Empleado>();

@Override
public Empleado crearEmpleado() {
//Preguntamos que tipo empleado se va a crear
int tipo = JOptionPane.showOptionDialog(null, "Elija tipo de Empleado quiere crear",
"Crear Empleado", 0, 3, null,
new String[] {"Admin", "Desarrollador", "Gestor Proyectos"}, null);
//Pedimos datos del empleado
String documento = JOptionPane.showInputDialog(null, "Documento:", "Crear Empleado", 3);
String nombre = JOptionPane.showInputDialog(null, "Nombre:", "Crear Empleado", 3);
double sueldoHora = Double.parseDouble(JOptionPane.showInputDialog(null,
"Sueldo x Hora:", "Crear Empleado", 3));
//Comprobamos elección para determinar que empleado hay que crear
switch(tipo) {
case 0: //Admin
Admin admin = new Admin(documento, nombre, sueldoHora);
empleados.add(admin);
return admin;
case 1: //Desarrollador
Desarrollador desarr = new Desarrollador(documento, nombre, sueldoHora);
empleados.add(desarr);
return desarr;
case 2: //Gestor de proyectos, requiere pedir otro dato
String area = JOptionPane.showInputDialog(null, "Area:", "Crear Empleado", 3);
GestorProyectos gesPro = new GestorProyectos(documento, nombre, sueldoHora, area);
empleados.add(gesPro);
return gesPro;
default:
return null;
}
}

@Override
public void listarEmpleados() {
JOptionPane.showMessageDialog(null, "Se mostrará un listado en la consola",
"Listar Empleados", 1);
System.out.println("\n\t\tLISTA EMPLEADOS");
System.out.println("\t\t----- ---------\n");
for (Empleado emp: empleados)
System.out.println(emp);
}

@Override
public void consultarEmpleado() {
String documento = JOptionPane.showInputDialog(null, "Documento del empleado:", "Consultar Empleado", 3);
//Buscamos el empleado
Empleado buscar = null;
for (Empleado emp: empleados)
if (emp.getDocumento().equals(documento))
buscar = emp;
//Comprobamos si lo hemos encontrado
if (buscar == null)
JOptionPane.showMessageDialog(null, "No hay ningún empleado con ese documento",
"Consultar Empleado", 0);
else
JOptionPane.showMessageDialog(null, buscar,
"Listar Empleados", 1);
}

@Override
public void calcularSueldoEmpleado() {
String documento = JOptionPane.showInputDialog(null, "Documento del empleado:", "Calcular Sueldo", 3);
int horas = Integer.parseInt(JOptionPane.showInputDialog(null, "Horas trabajadas:", "Calcular Sueldo", 3));
//Buscamos empleado
Empleado buscar = null;
for (Empleado emp: empleados)
if (emp.getDocumento().equals(documento))
buscar = emp;
//Comprobamos si lo hemos encontrado
if (buscar == null)
JOptionPane.showMessageDialog(null, "No hay ningún empleado con ese documento",
"Calcular Sueldo", 0);
else {
double calculo = buscar.getSueldoHora() * horas;
JOptionPane.showMessageDialog(null,String.format("Sueldo: %.2f", calculo),
"Calcular Sueldo", 1);
}
}

}

Lo mismo con la clase OperacionEmpresa, implementamos la interfaz y escribimos el código para los métodos.
La clase cuenta con su ArrayList para guardar empresas.
Código: [Seleccionar]
import java.util.ArrayList;

import javax.swing.JOptionPane;

public class OperacionEmpresa implements IOperacionEmpresa {

private ArrayList<Empresa> empresas = new ArrayList<Empresa>();

@Override
public void crearEmpresa() {
String nit = JOptionPane.showInputDialog(null, "NIT:", "Crear Empresa", 3);
String nombre = JOptionPane.showInputDialog(null, "Nombre:", "Crear Empresa", 3);
String direc = JOptionPane.showInputDialog(null, "Direccion:", "Crear Empresa", 3);
String ciudad = JOptionPane.showInputDialog(null, "Ciudad:", "Crear Empresa", 3);

empresas.add(new EmpresaDesarrollo(nit, nombre, direc, ciudad));

}

@Override
public void asignarEmpleado(Empleado emp) {
String nit = JOptionPane.showInputDialog(null, "Indique NIT de la empresa:", "Asignar Empleado", 3);
//Buscamos empresa
Empresa buscar = null;
for (Empresa empre: empresas)
if (empre.getNit().equals(nit))
buscar = empre;
//Comprobamos
if (buscar == null)
JOptionPane.showMessageDialog(null, "No hay empresas con ese NIT", "Asignar Empleado", 0, null);
else {
buscar.asignarEmpleado(emp);
JOptionPane.showMessageDialog(null, "Empleado asignado", "Asignar Empleado", 1, null);
}
}

@Override
public void listarEmpresas() {
JOptionPane.showMessageDialog(null, "Se mostrará un listado en la consola", "Listar Empresas", 1, null);
System.out.println("\n\t\tLISTA EMPRESAS");
System.out.println("\t\t----- --------\n");
for (Empresa empre: empresas)
System.out.println(empre);
}

@Override
public void contarEmpleadosdeEmpresa() {
String nit = JOptionPane.showInputDialog(null, "Indique NIT de la empresa:", "Contar Empleados", 3);
//Buscamos empresa
Empresa buscar = null;
for (Empresa empre: empresas)
if (empre.getNit().equals(nit))
buscar = empre;
//Comprobamos
if (buscar == null)
JOptionPane.showMessageDialog(null, "No hay empresas con ese NIT", "Contar Empleados", 0, null);
else
JOptionPane.showMessageDialog(null,
String.format("Empleados contados: %d", buscar.contarEmpleados()), "Contar Empleados", 1, null);
}

}

Y con esto ya podemos crear la clase Main.

Usamos tu menú, habrá que añadir objetos de las clases OperacionEmpleado y OperacionEmpresa y ya prácticamente solo será necesario invocar a los métodos necesarios para cada opción:

Código: [Seleccionar]
public class Main {

private static OperacionEmpleado empleados = new OperacionEmpleado();
private static OperacionEmpresa empresas = new OperacionEmpresa();

public static void main(String[] args) {
int op = 0;
        String menu = "Bienvenido, por favor ingrese la información solicitada: \n";
        menu += "1. Ingresar Empresa: \n";
        menu += "2. Ingresar datos del Empleado\n";
        menu += "3. Consular información del Empleado: \n";
        menu += "4. Consultar todas las empresas: \n";
        menu += "5. Consultar todos los empleados: \n";
        menu += "6. Calcular sueldo de empleado: \n";
        menu += "7. Cantidad de empleados en la empresa: \n";
        menu += "8. Salir \n";
        menu += "Selecciona una de las opciones del menú \n";
        do {
            op = Integer.parseInt(JOptionPane.showInputDialog(menu));
            switch (op) {
                case 1:
                empresas.crearEmpresa();
                    break;
                case 2:
                //Creamos empleado y lo recogemos
                Empleado emp = empleados.crearEmpleado();
                //Y ahora lo asignaremos a una empresa
                empresas.asignarEmpleado(emp);
                    break;
                case 3:
                empleados.consultarEmpleado();
                    break;
                case 4:
                empresas.listarEmpresas();
                    break;
                case 5:
                empleados.listarEmpleados();
                    break;
                case 6:
                empleados.calcularSueldoEmpleado();
                    break;
                case 7:
                empresas.contarEmpleadosdeEmpresa();
            }
        } while (op != 8);
    }

}

Pruébalo, y pregunta lo que no entiendas.
Un saludo.


Páginas: 1 ... 7 8 9 10 11 [12] 13 14 15 16 17 ... 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".