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.


Temas - Kabuto

Páginas: [1]
1
Se propone el siguiente ejercicio de programación en Java:

Citar
Caso Universidad: Haciendo uso de la programación orientada a objetos complete el ejercicio propuesto sobre el registro de notas de los estudiantes de la universidad que brinde las funcionalidades de:

  • registrar la nota de 5 estudiantes en 5 asignaturas diferentes
  • Obtenga una nota definitiva de cada asignatura para cada estudiante se tienen 3 notas parciales en cada asignatura (todas con igualdad de valor)
  • Un promedio general de cada estudiante en todas sus asignaturas.
  • Un promedio de la nota definitiva de todos los estudiantes por cada asignatura

Este ejercicio ya fue resuelto en un mensaje anterior hace tiempo, pero por si quizás no quedó claro, lo resolvemos de nuevo.

Se pide resolver mediante POO, así que lo primero es identificar la entidades que intervienen y podrían requerir ser modeladas mediante clases.
Normalmente, modelaremos como clases aquellas entidades que se componen de "otras cosas" y/o tienen algunas funcionalidades concretas que conviene que las resuelvan ellas mismas.

Nos dicen que hay Estudiantes, que tienen Asignaturas. Y que cada Asignatura tendría 3 notas parciales, a partir de las cuales se podría calcular la nota definitiva para dicha Asignatura.

Estudiante y Asignatura es evidente que serán clases, ya que están compuestas de "otras cosas".
Un Estudiante se compone de Asignaturas y de al menos un nombre, aunque no se indique en el enunciado.
Además sería útil que un Estudiante, por si solo, tenga funcionalidades como darnos el promedio de las notas de sus Asignaturas

Una Asignatura se compone de tres notas parciales y también habría que darle un nombre.
Y también interesa que por si sola sepa hacer cosas como calcular su nota definitiva mediante las tres notas parciales que la componen

Una nota parcial no se compone de nada, es simplemente un valor int, o double si lo preferimos. Ni requiere poseer ninguna funcionalidad especial, así que no será una clase.

Una nota definitiva sí se compone de tres notas parciales. ¿Debería ser una clase?
Podría serlo... Quizás si el ejercicio fuera más avanzado y las notas definitivas tuvieran un tratamiento más especial, entonces interesaría modelarlo como una clase.

Pero en este caso no sería necesario, aquí la nota definitiva en realidad es un mero cálculo aritmético que lo único que ha de hacer es mostrarse en pantalla cuando se requiera. Y para resolver eso basta con usar un método, no hace falta modelar una clase.

Así que tendríamos la clase Asignatura.
Se compone de un nombre y tres notas parciales, que las podemos agrupar en un array
Mediante constructor le damos un nombre.
Luego con métodos, podemos registrar una nota en una posición concreta del array.
Y también calcular y retornar la nota definitiva. (por eso no requiere modelarse como una clase)
Código: [Seleccionar]
public class Asignatura {
//Cada asignatura tiene tres notas parciales
private int[] parciales = new int[3];
private String nombre;

public Asignatura(String nombre) {
this.nombre = nombre;
}

public String getNombre() {
return nombre;
}

/*
* Registra una nota parcial en la posición del array que
* se indique.
*/
public void registrarNotaParcial(int nota, int posicion) {
parciales[posicion] = nota;
}

/*
* Todas las notas tienen el mismo peso para calcular la nota
* definitiva. Así que basta con calcular el valor medio de las tres.
*/
public int getNotaDefinitiva() {
int sumaNotas = parciales[0] + parciales[1] + parciales[2];
return sumaNotas / 3;
}
}

Luego tendríamos la clase Estudiante.
Se compone de nombre, que recibe por constructor, y 5 objetos Asignatura, que también agruparemos en un array.

Con métodos podemos registrar una Asignatura en una posición concreta del array.
También podemos obtener la nota definitiva de una Asignatura concreta, indicando la posición del array que se quiere consultar.

Y también podemos obtener el "promedio general" de este Estudiante, es decir, sumar las notas definitivas de todas sus Asignaturas y calcular el promedio de dicha suma.
Código: [Seleccionar]
public class Estudiante {

//Cada Estudiante tiene 5 asignaturas
private Asignatura[] asignaturas = new Asignatura[5];
private String nombre;

public Estudiante(String nombre) {
this.nombre = nombre;
}

public String getNombre() {
return nombre;
}

/*
* Registra una Asignatura en la posicion del array que
* se le indique
*/
public void registrarAsignatura(Asignatura asign, int posicion) {
asignaturas[posicion] = asign;
}

/*
* Retorna la nota definitiva de la asignatura que se encuentra
* en la posicion del array indicada.
*/
public int getNotaDeAsignatura(int posicion) {
return asignaturas[posicion].getNotaDefinitiva();
}

/*
* Hace un promedio general de todas las asignaturas
* de este estudiante
*/
public int getPromedioGeneral() {
//Sumamos las notas definitivas de sus asignaturas
int sumaNotas = 0;
for (Asignatura asig: asignaturas)
sumaNotas += asig.getNotaDefinitiva();
//Retornamos el promedio
return sumaNotas / 5;
}

}

Y con esto ya podemos componer la clase principal donde se pondrán en marcha todas las funcionalidades de la aplicación.
Lo vemos en el siguiente mensaje.

3
Intentando mover el mensaje de un forero a esta sección, parece que se ha perdido por el camino. Pero he podido recuperar el texto de su consulta:


TEXTO DE LA CONSULTA

Qué tal, estoy empezando a ver el tema de Java con Netbeans y estamos con JOption y los recuadros de dialogo este es mi programa que hice casi todo compila bien sale el recuadro excepto el ultimo que me tiene que mostrar los datos que se ingresan y de echo me sale el siguiente mensaje

reference to format is ambiguous
both method format(String,Object...) in String and method format(Locale,String,Object...) in String match

Código: [Seleccionar]
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package estructuradatos;

import javax.swing.JOptionPane;

/**
 *
 * @author wordl
 */
public class SistemaINE {
    public static void main (String[] args, String String) {
    int edad, Nocalle, cp;
    String nom, apellidopaterno, apellidomaterno, fechanacimiento, nomcalle, municipio, estado;
   
   String n = JOptionPane.showInputDialog ("Ingrese su edad");
   edad = Integer.parseInt(n);
   
    if (edad >17) {
       
    String mensaje = String.format("Si puede votar", edad);
    JOptionPane.showMessageDialog(null,mensaje);
   
     String a = JOptionPane.showInputDialog ("Ingrese Nombre del ciudadano");
    nom=(a);
   
    String b = JOptionPane.showInputDialog ("Ingrese Apellido Paterno");
    apellidopaterno= (b);
   
    String c = JOptionPane.showInputDialog ("Ingrese Apellido Materno");
    apellidomaterno= (c);
   
    String d = JOptionPane.showInputDialog ("Ingrese su edad");
    edad= Integer.parseInt(d);
   
    String e = JOptionPane.showInputDialog ("Ingrese su fecha de nacimiento");
    fechanacimiento= (e);
   
    String f = JOptionPane.showInputDialog ("Ingrese el nombre de su calle");
    nomcalle= (f);
   
    String g = JOptionPane.showInputDialog ("Ingrese el numero de su vivienda");
    Nocalle= Integer.parseInt(g);
   
    String h = JOptionPane.showInputDialog ("Ingrese su codigo postal");
    cp= Integer.parseInt(h);
   
    String i = JOptionPane.showInputDialog ("Ingrese el municipio");
    municipio= (i);
   
    String j = JOptionPane.showInputDialog ("Ingrese estado al que pertenece");
    estado= (j);
   
    String mensaje3 = String.format(null,"Nombre del ciudadano:   %s\n Apellido Paterno:   %s\n Apellido Materno:   %s\n edad:   %s\n Fecha de nacimiento:   %s\n Nombre de la calle:   %s\n Numero de la calle:   %s\n Codigo Postal:   %s\n Municipio:   %s\n Estado:   %s\n",nom,apellidopaterno,apellidomaterno,edad,fechanacimiento,nomcalle,Nocalle,cp,municipio,estado);
    JOptionPane.showMessageDialog(null,mensaje3);
   
    }
    else {
   
    String mensaje2 = String.format("No puede votar");
    JOptionPane.showMessageDialog(null,mensaje2);
   
   
   
           
    }
    }
   
}



Gracias

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

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

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

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

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

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

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

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

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

Estoy siguiendo una estructura Modelo-Vista-Controlador:

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

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

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

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

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

Al boton Eliminar de cada PanelEncargo, le agrego este ActionListener

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

int numeroPanel;

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

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

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

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

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

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

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

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

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

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

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

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

5
Hola a todos,

vereis, a modo de práctica, me he propuesto hacer un especie de jueguecito de rol por turnos en Java, donde desplazo a un personaje por un tablero y puedes encontrar muros, agujeros, cofres y, por supuesto,  enemigos.
No es nada serio, el motivo es más bien practicar y aprender nuevas cosas de la libreria Swing y tal...aunque obviamente para hacer juegos hay otras herramientas más adecuadas.

Voy bastante avanzado y seguramente más adelante iré pidiendo cierta ayuda. Pero ahora mismo tengo un problemita de escasa importancia.

Cuando se inicia un combate por turnos, aparede un JDialog con imagenes del jugador y el enemigo, botones.. y abajo un JTextArea donde se va mostrando la información del proceso del combate: Quien ataca, que daños ha causado, si ha fallado el ataque.. etc...

Mi intención es que tras cada linea de información, que agrego al area de texto, haya una pequeña pausa temporal (un delay) hasta que ocurra la siguiente acción.

Lo he intentado con un pequeño método que he llamado delay(), al cual le paso un tiempo en milisegundos y uso el método Thread.sleep() para que se detenga la acción.

Código: [Seleccionar]
private void delay(long milis)
{
try {
Thread.sleep(milis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

Así, lo que hago es llamarlo varias veces en determinados momentos para pausar "la acción" del combate. Os pongo un método en donde lo llamo, a modo de ejemplo (es un método incompleto, aun en construcción..)

Citar
@Override
      public void actionPerformed(ActionEvent arg0) {
         pJugador.pBotones.ataque.setEnabled(false);
         pJugador.pBotones.huida.setEnabled(false);
         delay(1000l);
         pInfo.addTexto("\n\t************************\n");
         pInfo.addTexto(jugador.getNombre() + " ataca con " + jugador.getInventario()[0].getNombre());
         delay(1000l);
         int ataqueJugador = atacar(jugador);
         int defensaCPU = defender(CPU);
         int resultado = ataqueJugador - defensaCPU;
         if  (resultado <= 0)
         {
            pInfo.addTexto("Daños causados: 0");
            delay(1000l);
            pInfo.addTexto("¡¡Tu ataque ha fallado!!");
         }
         else
         {
            CPU.pierdeVida(resultado);
            pCPU.setVida(CPU.getVida());
            pInfo.addTexto("Daños causados: " + resultado);
            delay(1000l);
            if (ataqueJugador > jugador.getAtaque())
               pInfo.addTexto("¡¡Has causado daños críticos!!");
         }
         
         if (CPU.getVida() <= 0)
         {
            delay(1000l);
            pInfo.addTexto("Has derrotado a " + CPU.getNombre());
         }
         else
         {
            delay(1000l);
            pInfo.addTexto("Es el turno de " + CPU.getNombre());
            delay(250l);
            int ataqueCPU = atacar(CPU);
            int defensaJugador = defender(jugador);
            resultado = ataqueCPU - defensaJugador;
            if  (resultado <= 0)
            {
               pInfo.addTexto("Daños causados: 0");
               delay(500l);
               pInfo.addTexto("¡¡" + CPU.getNombre() + " ha fallado!!");
            }
            else
            {
               jugador.pierdeVida(resultado);
               pJugador.setVida(jugador.getVida());
               pInfo.addTexto("Daños causados: " + resultado);
               delay(500l);
               if (ataqueCPU > CPU.getAtaque())
                  pInfo.addTexto("¡¡Has recibido daños críticos!!");
            }
         }
         
         if (jugador.getVida() == 0)
         {
            delay(1000l);
            pInfo.addTexto("Has muerto. FIN DE LA PARTIDA");
         }
         else if (CPU.getVida() == 0)
         {
            delay(1000l);
            pInfo.addTexto("¡¡Enhorabuena!! Has derrotado a tu enemigo.");
         }
         else
         {
            pJugador.pBotones.ataque.setEnabled(true);
            pJugador.pBotones.huida.setEnabled(true);
         }
            
         
      }

Este es el método que se ejecuta cuando se pulsa el botón "Atacar" y como veis llamo a mi método delay() en varios sitios.
Pero no está funcionando como yo esperaba. Parece como si, a pesar de que lo llamo en distintos sitios, al comenzar el método se crea un pausa muy larga, como si se sumasen todos los delays en uno solo.... y tras esta "macropausa" sale de golpe todas las lineas de texto en el JTextArea.... cuando mi idea es que vayan saliendo poco a poco, con distintas pausas repartidas a lo largo de la ejecución del código.

Ni siquiera se percibe la desactivación de los botones, y posterior reactivación al final del método.
Como digo, se hace un "macrodelay" inicial y luego pum, se ejecuta todo el código seguido.

¿Cómo podría conseguir lo que quiero hacer...? si es que es posible....

Espero haberme explicado bien.... gracias  y un saludo.

6
Pues eso, tras haber actualizado a Windows Creator Update, me he dado cuenta de que cuando lanzo alguna aplicacion Java que use Swing, se produce un error y no funciona.

Ocurre igual si la lanzo desde Eclipse que desde un .jar ejecutable.

Al hacerlo, la app no funciona y se crea un .log de error donde el JRE advierte de problemas con frame problemático y la libreria D3d que ha fallado.

No soy el único, veo gente reportando el mismo problema que yo, tanto con libreria D3d como con OpenGl, pero sin respuesta útil.

¿Alguien sabe algo?
He probado a actualizar el JDK (y el JRE) pero sin éxito.

**************
Copón, acabo de postear el problema y ya he dado con la solución...
Me ocurría porque tenía activo en segundo plano el MSI Afterburner+RivaTurner... ha sido cerrarlos y ya funciona..., el caso es que antes no me ocurría, algo ha cambiado este Creator Update respecto a la aceleración 3D en el escritorio.
Por ejemplo también me he percatado que si abro LibreOffice, me muestra en pantalla lel overlay de estadisticas de RivaTurner como si se tratase de un juego 3D..., cuando estoy abriendo un simple Excel por ejemplo..

7
Hola gente, es ya consábido el problema de los objetos Scanner para leer Strings tras haber leido números previamente.

Supuestamente se puede solucionar "limpiando" el buffer haciendo una llamada al método nextLine() sin asignarlo a ninguna variable.

Pero tengo aquí un caso, donde quiero leer un char tras leer números y nada, no hay manera.

Abajo os adjunto el código completo, por si alguien quiere compilarlo sin tener que cambiar nada.

Tiene muchas líneas porque hay varios métodos, pero tan solo hay que fijarse en la línea 39.

Ahí es donde leo un char para evaluar si finalizamos o no el bucle, pero al llegar ahí, peta el programa.

En la línea anterior intento lo de limpiar el buffer, pero no parece tener ningún efecto.

¿Alguna idea?


Código: [Seleccionar]
package estructura_modular;

import java.util.Scanner;

public class Ej12 {

public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
char opcion;
char salir = 'n';

do
{
System.out.println("\nCONVERSOR DE TEMPERATURAS");
System.out.println("-------------------------\n");
System.out.println("Indique tipo de magnitud que va a introducir.");
System.out.println("Opciones: (c)Celsius // (f)Farenheit // (k)Kelvin");
System.out.print("Su opcion(c/f/k): ");
opcion = teclado.next().toLowerCase().charAt(0);

switch(opcion)
{
case 'c':
menuCelsius();
break;
case 'f':
menuFarenheit();
break;
case 'k':
menuKelvin();
break;
default:
System.out.println("No se reconoce magnitud introducida.");
break;
}

System.out.print("¿Desea terminar? (S/N): ");
teclado.nextLine();//Limpiamos buffer de entrada
salir = teclado.next().toLowerCase().charAt(0);
}while (salir != 's');

System.out.println("\n\nFin de programa...");
teclado.close();
}

public static double celAFar(double m)
{
return ( 9 * m / 5) + 32;
}

public static double celAKel(double m)
{
return m + 273.15;
}

public static double farACel(double m)
{
return (m - 32) * 5 / 9;
}

public static double farAKel(double m)
{
return (m - 32) / 1.8 + 273;
}

public static double kelACel(double m)
{
return m - 273.15;
}

public static double kelAFar(double m)
{
return 1.8 * (m - 273) + 32;
}

public static void menuCelsius()
{
Scanner teclado = new Scanner(System.in);
int opcion;
System.out.print("\nIntroduzca la magnitud en Celsius: ");
double magnitud = teclado.nextDouble();

System.out.println("\nConversiones disponibles");
System.out.println("(1) Celsius a Farenheit");
System.out.println("(2) Celsius a Kelvin");
System.out.print("Su opcion (1/2): ");
opcion = teclado.nextInt();

switch(opcion)
{
case 1:
System.out.println(magnitud + "ºC equivalen a " + celAFar(magnitud) + "ºF");
break;
case 2:
System.out.println(magnitud + "ºC equivalen a " + celAKel(magnitud) + "K");
break;
default:
System.out.println("ERROR: No se reconoce opcion seleccionada.");
break;
}
teclado.close();
}

public static void menuFarenheit()
{
Scanner teclado = new Scanner(System.in);
int opcion;
System.out.print("\nIntroduzca la magnitud en Farenheit: ");
double magnitud = teclado.nextDouble();

System.out.println("\nConversiones disponibles");
System.out.println("(1) Farenheit a Celsius");
System.out.println("(2) Farenheit a Kelvin");
System.out.print("Su opcion (1/2): ");
opcion = teclado.nextInt();

switch(opcion)
{
case 1:
System.out.println(magnitud + "ºF equivalen a " + farACel(magnitud) + "ºC");
break;
case 2:
System.out.println(magnitud + "ºF equivalen a " + farAKel(magnitud) + "K");
break;
default:
System.out.println("ERROR: No se reconoce opcion seleccionada.");
break;
}
teclado.close();
}

public static void menuKelvin()
{
Scanner teclado = new Scanner(System.in);
int opcion;
System.out.print("\nIntroduzca la magnitud en Kelvin: ");
double magnitud = teclado.nextDouble();

System.out.println("\nConversiones disponibles");
System.out.println("(1) Kelvin a Celsius");
System.out.println("(2) Kelvin a Farenheit");
System.out.print("Su opcion (1/2): ");
opcion = teclado.nextInt();

switch(opcion)
{
case 1:
System.out.println(magnitud + "K equivalen a " + kelACel(magnitud) + "ºC");
break;
case 2:
System.out.println(magnitud + "K equivalen a " + kelAFar(magnitud) + "ºF");
break;
default:
System.out.println("ERROR: No se reconoce opcion seleccionada.");
break;
}
teclado.close();
}
}

8
Hola compis, estoy inciándome con C++, haciendo cosicas en modo consola y tal...

Se me ha propuesto el siguiente ejercicio. El enunciado está en inglés pero no creo que requiera traducción:

Citar
2. Design and implement a Name_pairs class holding (name,age) pairs where name is a string and age is a double.
Represent that as a vector<string> (called name) and a vector<double> (called age) member.
 Provide an input operation read_names() that reads a series of names.
 Provide a read_ages() operation that prompts the user for an age for each name.
 Provide a print() operation that prints out the (name,age) pairs (one per line) in the orderdetermined by the name vector.
 Provide a sort() operation that sorts the name vector in alphabetical order and reorganizes the age vector to match.
 Implement all “operations” as member functions.

Ok, esto lo puedo hacer sin demasiado problema. Pongo el código a continuación.
Si alguien quiere compilarlo, necesitará esta librería: std_lib_facilities.h

Código: [Seleccionar]
#include "..\..\..\..\lib\std_lib_facilities.h"

namespace Nombres {
class Name_pairs
{
public:
void read_names();
void read_ages();
void print();
void sort();
private:
vector <string> name;
vector <double> age;
};

void Name_pairs::read_names()
{
string nombre;
do
{
cout << "\nIntroduzca nombre(*=FIN): ";
cin >> nombre;
if (nombre != "*") name.push_back(nombre);

} while (nombre != "*");
}

void Name_pairs::read_ages()
{
int t = name.size();
double edad;
if (t == 0)
{
cout << "\nPrimero hay que introducir nombres...\n";
}
else
{
for (int i = 0; i < t; i++)
{
cout << "\nIntroduzca la edad de: " << name[i] << " --> ";
cin >> edad;
age.push_back(edad);
}
}
}


void Name_pairs::print()
{
int t = name.size();
if (t == 0)
{
cout << "\nNo hay datos que mostrar.\n";
}
else
{
for (int i = 0; i < t; i++)
{
cout << "\nNombre: " << name[i] << " Edad: " << age[i];
}
}
}

void Name_pairs::sort()
{
int t = name.size();
if (t == 0)
{
cout << "\nNo hay datos que ordenar.\n";
}
else
{
vector <string> name_temp;
vector <double> age_temp;
for (int i = 0; i < t; i++)
{
name_temp.push_back(name[i]);
age_temp.push_back(age[i]);
}

std::sort(name.begin(), name.end());//Recalco que este sort() pertenece a std, y no a mi clase Name_pairs.

//Busca coincidencias entre los vectores de nombres original y ordenado para "copiar" el mismo orden en el vector de edad.
//Esta funcion podria ser errónea si hubieran nombres repetidos en el vector.
for (int i = 0; i < t; i++)
{
for (int j = 0; j < t; j++)
{
if (name_temp[i] == name[j]) age[j] = age_temp[i];
}
}
}

}
}//namespace Nombres

int main()
{
using namespace Nombres;

cout << system("cls");
Name_pairs listado;

listado.read_names();
listado.read_ages();
listado.print();
listado.sort();
listado.print();
cout << endl;

return 0;
}

Todo esto compila bien y compruebo con un pequeño main()  que todo furrula: pide nombres hasta meter un asterisco, puego pide edades para cada nombre, luego los muestra, los ordena alfabéticamente, ordena también el vector edades según se ordenó el vector de nombres y vuelve a mostrarlos tras los cambios.

Ahora viene la segunda parte, que es la que se me atraganta:
Citar
3. Replace Name_pair::print() with a (global) operator << and define == and != for Name_pairs.*/

Bien, de momento solo he intentado hacer que el operador << haga lo que hace print().... pero no lo consigo.

En print(), lo primero que hago es obtener el tamaño del vector de nombres, para comprobar si hay algo que mostrar y si lo hay, pues lo uso para el contador del bucle.

Intento hacer lo mismo en la funcion donde modifico el operador << , pero me da error pues no reconoce el vector name.
Código: [Seleccionar]
/*
//Sustituimos esta funcion con la siguiente donde modificamos el operador <<
void Name_pairs::print()
{
int t = name.size();
if (t == 0)
{
cout << "\nNo hay datos que mostrar.\n";
}
else
{
for (int i = 0; i < t; i++)
{
cout << "\nNombre: " << name[i] << " Edad: " << age[i];
}
}
}*/

ostream& operator<<(ostream& os, const Name_pairs& np)
{
int t = name.size();

                //Falta código por escribir....

}

Vale, tiene sentido, pues no indico a que objeto me refiero y tal.
Pruebo a dar un palo de ciego con esto, que no se por qué, ya imaginaba que tampoco iba a servir:
Código: [Seleccionar]
ostream& operator<<(ostream& os, const Name_pairs& np)
{
int t = np.name.size();

                //Falta código por escribir....

}

Y me digo, pues oye, hacemos una nueva funcion en public: que devuelva el tamaño del vector. Que además, es un dato que estoy necesitando en el resto de funciones.

Código: [Seleccionar]
namespace Nombres {
class Name_pairs
{
public:
void read_names();
void read_ages();
void sort();
int name_size();//devuelve el tamaño del vector de nombres
private:
vector <string> name;
vector <double> age;
};

int Name_pairs::name_size()
{
return name.size();
}

[.....]

ostream& operator<<(ostream& os, const Name_pairs& np)
{
int t = np.name_size();
                 
                //Falta código por escribir....

}

Y nada, tampoco furrula, obtengo estos errores al compilar:

Citar
Error   C2662   'int Nombres::Name_pairs::name_size(void)': no se puede convertir el puntero 'this' de 'const Nombres::Name_pairs' a 'Nombres::Name_pairs &'   235_03   e:\programación\c++\consola\libro\235_03\235_03\235_03.cpp   81


Error (activo)      el objeto tiene calificadores de tipo que no son compatibles con la función "Nombres::Name_pairs::name_size" miembro   235_03   e:\Programación\C++\Consola\Libro\235_03\235_03\235_03.cpp   81

Y me he quedado sin ideas....
Si el parámetro np se supone que representa un objeto de clase Name_pairs, ¿donde está el problema? ¿Qué hago mal?

Espero haberme explicado más o menos claro, a ver si podeis guiarme...
Gracias por adelantado

9
Hola, a ver quien me puede echar una mano.

Estoy con este ejercicio:

Citar
Amplía el código del programa Java que planteamos como ejercicio en la entrega CU00687 de este curso, relativo a la gestión de una empresa agroalimentaria, teniendo en cuenta que la empresa gestiona envíos a través de diferentes medios, y un envío puede contener cierto número de productos frescos, refrigerados o congelados. Añade al código:

a) Una clase EnvioDeProductos que represente un envío de productos como colección de objetos que admite el polimorfismo.

b) Crear una clase testHerencia4 con el método main donde se creen: dos productos frescos, tres productos refrigerados y cinco productos congelados (2 de ellos congelados por agua, otros 2 por agua y 1 por nitrógeno). Crear un envío que represente la agrupación de los anteriores productos. Mostrar por pantalla la información del número de productos que componen el envío y recorrer los productos del envío usando iterator para mostrar la información (valor de los atributos) de cada uno de ellos.

Bien, esta de abajo es mi clase EnvioDeProductos. Se deja compilar y funciona correctamente.
El último método, listarEnvio(), lo escribí y lo dejé escrito ya sabiendo que no iba a servir para lo que propone el ejercicio, ya que lo único que hace es mostrar los nombres de los objetos incorporados en el ArrayList, pero no sus atributos.
Aquí el método iterator() si funciona. (luego veréis porque hago este apunte)

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

/**
 * Clase para definir envios de productos mediante una colección polimórfica.
 *
 * @author Kabuto
 * @version 1.0
 */
public class EnvioDeProductos{
   
    private List<Producto> envioProductos;
   
    public EnvioDeProductos(){
        envioProductos = new ArrayList<Producto>();
    }
   
    //Método para obtener un determinado producto pasando un indice como parámetro
    public Producto getEnvioDeProductos(int i){return envioProductos.get(i);}
   
    //Método para modificar un produto de la lista indicando el producto y un indice
    public void setEnvioDeProductos(Producto nombreProducto, int i){envioProductos.add(i, nombreProducto);}
   
    //Método para añadir nuevos productos a la lista
    public void addEnvioDeProductos(Producto nombreProducto){envioProductos.add(nombreProducto);}
   
    //Para consultar cuantos objetos componen la lista
    public int longitudLista(){return envioProductos.size();}
   
    /*Método para listar los productos del envío.
     *Tan solo muestra el nombre de cada objeto, no sus atributos
     */
    public void listarEnvio(){
        Iterator<Producto> it = envioProductos.iterator();
        Producto producTmp;
        while (it.hasNext()) {
            producTmp = it.next();
            System.out.println(producTmp);
        }
    }
}

Bien, ahora viene el main donde creo los distintos productos y los meto juntitos en el ArrayList de EnvioDeProducto.
Todo este proceso furula correctamente.
Al final pretendo hacer lo que propone el ejercicio: Recorrer los productos con un iterador y mostrar toda la información de cada producto.

Pero aquí es donde me da un error al compilar. Me dice que no puedo aplicarle el método iterator() a nuevoEnvio, que es el objeto de la clase GestionDeEnvios, vamos un ArrayList.
¿Por qué aquí no me permite aplicárselo y sin embargo si puedo hacerlo en el código que define la clase?

Os adjunto un zip con todas las clases que componen el proyecto

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

/**
 * Programa para testear la creacion de productos con herencias
 * dos productos frescos, tres productos refrigerados y cinco productos congelados (2 de ellos congelados
 * por aire, otros 2 por agua y 1 por nitrógeno). Crear un envio y mostrar datos.
 *
 * @author Kabuto
 * @version 1.0
 */
public class TestEnvioProducto {
    public static void main (String[] args){
        Calendar fechaCaducidad = Calendar.getInstance();
        Calendar fechaEnvasado = Calendar.getInstance();
       
        fechaCaducidad.set(2015,11,25);
        fechaEnvasado.set(2015,5,25);//Por comodidad pasaremos las mismas fechas a todos los contructores.
       
        //Creamos varios productos
        Fresco fresco1 = new Fresco(fechaCaducidad, fechaEnvasado, "España", 224);
        Fresco fresco2 = new Fresco(fechaCaducidad, fechaEnvasado, "España", 227);
       
        Refrigerado refri1 = new Refrigerado(fechaCaducidad, fechaEnvasado, "Alemania", 124);
        refri1.setCodigoSuperVision(123); refri1.setTemperaturaConservacion(20);
        Refrigerado refri2 = new Refrigerado(fechaCaducidad, fechaEnvasado, "Brasil", 132);
        refri2.setCodigoSuperVision(120); refri2.setTemperaturaConservacion(18);
        Refrigerado refri3 = new Refrigerado(fechaCaducidad, fechaEnvasado, "China", 114);
        refri3.setCodigoSuperVision(113); refri1.setTemperaturaConservacion(21);
       
        Aire congeladoAire1 = new Aire(fechaCaducidad, fechaEnvasado, "EEUU", 285);
        congeladoAire1.setComposicionAire(25, 25, 25, 25);
        Aire congeladoAire2 = new Aire(fechaCaducidad, fechaEnvasado, "Perú", 034);
        congeladoAire1.setComposicionAire(20, 10, 30, 40);
       
        Agua congeladoAgua1 = new Agua (fechaCaducidad, fechaEnvasado, "España", 112);
        congeladoAgua1.setSalinidad(12);
        Agua congeladoAgua2 = new Agua (fechaCaducidad, fechaEnvasado, "Japón", 123);
        congeladoAgua2.setSalinidad(18);
       
        Nitrogeno congeladoNitrogeno = new Nitrogeno(fechaCaducidad, fechaEnvasado, "Rusia", 155);
        congeladoNitrogeno.setMetodoCongelacion("Soplando muy fuerte");
        congeladoNitrogeno.setTiempoExposicion(500);
       
        //Creamos un envio con todos estosproductos
        EnvioDeProductos nuevoEnvio = new EnvioDeProductos();
        nuevoEnvio.addEnvioDeProductos(fresco1); nuevoEnvio.addEnvioDeProductos(fresco2);
        nuevoEnvio.addEnvioDeProductos(refri1);nuevoEnvio.addEnvioDeProductos(refri2);nuevoEnvio.addEnvioDeProductos(refri3);
        nuevoEnvio.addEnvioDeProductos(congeladoAire1);nuevoEnvio.addEnvioDeProductos(congeladoAire2);
        nuevoEnvio.addEnvioDeProductos(congeladoAgua1);nuevoEnvio.addEnvioDeProductos(congeladoAgua2);
        nuevoEnvio.addEnvioDeProductos(congeladoNitrogeno);
       
        //Mostramos el número de productos en el envío
        System.out.println("El envío está compuesto por " + nuevoEnvio.longitudLista() + " productos.");
        System.out.println("Listado de productos actuales");
        System.out.println("-----------------------------");
        System.out.println("");
               
        //Mostramos los datos de los productos a enviar
        Iterator<Producto> it = nuevoEnvio.iterator();//Iterator da error "cannot find symbol method .iterator()
        Producto producTmp;
        while (it.hasNext()) {
            producTmp = it.next();
            producTmp.mostrarDatos();
        }
    }
}

10
Hola, estoy empezando a aprender Java y de momento no tengo categoría ni de novato xD.

El caso es que para ir practicando lo poquito que llevo aprendido (aprendido, y no del todo entendido...), se me ha ocurrido desempolvar unos ejercicios prácticos que tengo de un curso anterior que hice de JavaScript, para intentar hacerlos ahora en Java.
Pues el primero de todos, ya se me ha atragantado  :o

Os publico el enunciado:

Citar
1) Realizar una serie de operaciones con la siguiente matriz:

var valores = [true, 5, false, "hola", "adios", 2]

a) Concatenar ambas cadenas y presentar resultado
b) Comparar los números entre sí con todos los operadores de comparación.
c) Comparar todos los valores de la matriz entre sí de dos en dos y ver el resultado
d) Realizar diferentes operaciones aritméticas con los valores numéricos

En JavaScript no hay mayor problema ya que se pueden mezclar tipos de datos en una matriz. Pero no en Java....

Bueno, pensando como resolver esto, he probado creando un set a partir de 3 matrices con distintos tipos de datos. Es lo único que se me ha ocurrido para crear  algo similar a una matriz como esa.

Tal como lo he hecho, los datos/objetos no quedan en el mismo orden que el propuesto en el enunciado, pero eso es irrelevante.

El caso es que consigo juntarlos y mostrarlos uno a uno en pantalla.

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Iterator;

public class OperacionesMatriz{
    public static void main (String[] args){
        ArrayList<Set> matrizVariada = new ArrayList <Set>();

        //Creacion de matriz con datos Boolean
        Boolean [] matrizBool = {true, false};
        HashSet<Boolean> datosBool = new HashSet<Boolean> (Arrays.asList(matrizBool));

        //Creacion de matriz con Integer       
        Integer [] matrizInt = {5, 2};
        HashSet<Integer> datosInt = new HashSet<Integer> (Arrays.asList(matrizInt));

        //Creacion de matriz de Strings
        String [] matrizString = {"hola", "adios"};
        HashSet<String> datosString = new HashSet<String> (Arrays.asList(matrizString));

        //Juntamos las tres matrices
        matrizVariada.add(datosBool); matrizVariada.add(datosInt); matrizVariada.add(datosString);

        //Recorremos y mostramos en pantalla para comprobar resultado
        for (Set tmp: matrizVariada){
            Iterator it = tmp.iterator();
            int i=0;
            while (it.hasNext()){
                System.out.println("i: " + (i++) + " - " + it.next());
            }
        }
    }
}


Ahora mi desconocimiento plantea estas dudas.
  • ¿Puedo operar con estos objetos tras haberlos unidos de este modo?
  • ¿Puedo hacer que al recorrer el set, el programa distinga si el objeto es (o era) un Integer, un String, un Boolean para almacenarlos en distintas variables según el tipo  y luego operar con ellas (concatenar, comparar, etc..)?
  • ¿Debería de haberlos juntado de otra manera para poder operar con ellos?

A la espera quedo de vuestros sabios consejos. Gracias y un saludo.  ;)

11
Hola,
abajo pongo el código que he usado para resolver el ejercicio.
Sé que funciona perfectamente, pero mirando las soluciones de otros compañeros, me he fijado que lo he resuelto de manera un pelín distinta.
No he visto ha nadie hacer lo mismo que yo, así que, aunque básicamente viene a ser lo mismo y el código funciona, me asalta la duda de si mi solución pudiera ser poco recomendable por algún motivo.

EDITO:Fallo mio! Acabo de darme cuenta de que mi código no funciona, bueno solo funciona si pasas un 2 como segundo parametro que es lo que probé je je.  Para números mayores la multiplicación resulta una burrada.....fallo matemático mío

Me refiero a la línea dentro del bucle for
Yo lo que hago es declarar previamente una variable con valor 10 y luego dentro del bucle la multiplico por sí misma tantas veces como nos hayan indicado con el segundo parámetro solicitado (y)
Para ello pongo una línea que a priori parece un poco rara pero que funciona:
potencia=potencia*potencia;

Otros compañeros lo que han hecho es declarar una variable con valor 1 y luego dentro del bucle multiplicarla por 10:
potencia=potencia*10;

A efectos prácticos viene a ser lo mismo, tan solo hay variar ligeramente la condición a cumplir para salir del bucle, puesto que ya partimos con valor 10 en la variable.
Pero no se si quizás resulta un poquito más confuso lo que yo hago y por ello pudiera ser poco recomendable.


Otra cosa distinta es que en lugar de poner un constructor vacío, he optado por un simple comentario indicando que no es necesario. De nuevo no se si esto pudiera considerarse una mala práctica.

Agradeceré cualquier comentario o consejo. Un saludo.

Código: [Seleccionar]
public class MultiplicadorDieces{

    //No se necesita constructor
   
   
    public double multiplicaPorDieces (double x, int y) {
        double potencia=10;
       
        for (int i=1; i<y; i++){
            potencia=potencia*potencia;
        }
       
       return Math.round(potencia*x);
    }
 }

Páginas: [1]

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".