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 2 3 4 5 [6] 7 8 9 10 11 ... 50
101
Mmmhh... no me ha quedado claro lo que necesitas hacer. Quizás si publicas el código completo pueda entender en que consiste tu ejercicio.

En cualquier caso, la clase String ya incorpora su propio método equals.

Código: [Seleccionar]
String a = ...
String b= ...

if (a.equals(b) {
    //iguales
}
else {
    //diferentes
}

Comprueba si de esta manera te da mejor resultado.

102
Mira, como dije antes, en tu ejercicio se puede simplificar el proceso ya que hay que traducir TODOS los caracteres.

Hacemos una tabla matriz similar a la de mi ejercicio, solo que de tipo char.

Pedimos una cadena por teclado y a continuación recorremos con un bucle la matriz.
En cada repetición del bucle, aplicamos un replace() usando como argumentos las "parejas" de la matriz.

Y listo, nombre traducido.

Código: [Seleccionar]
public class Reemplazar {

private final static char[][] TABLA = new char[][] {
{'a','!'},{'b','"'},{'c','#'},{'d','$'},
{'e','%'},{'f','&'},{'g','´'},{'h','('},
{'i',')'},{'j','*'},{'k','+'},{'l',','},
{'m','-'},{'n','.'},{'o','/'},{'p','0'},
{'q','1'},{'r','2'},{'s','3'},{'t','4'},
{'u','5'},{'v','6'},{'w','7'},{'x','8'},
{'y','9'},{'z',':'}
};

public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
System.out.print("Introduce nombre: ");
String nombre = teclado.nextLine();
teclado.close();

for (int i = 0; i < TABLA.length; i++) {
nombre = nombre.replace(TABLA[i][0], TABLA[i][1]);
}

System.out.println("Nombre traducido: " + nombre);

}

}

Al ejecutarlo, parece funcionar bien:
Citar
Introduce nombre: juan antonio
Nombre traducido: *5!. !.4/.)/

103
Mmmhh.., no lo veo claro lo de hacerlo con un array / ArrayList....

Hace poco hice un ejercicio similar y lo hice usando una matriz donde tenía "parejas" de caracteres, es decir, el carácter "normal" junto con el carácter/cadena que lo sustituye.

Código: [Seleccionar]
public class Ofuscar {
 
private final static String[][] TABLA = new String[][] {
{"A","4"},{"a","@"},{"B","8"},{"C","(("},
{"D","))"},{"E","3"},{"e","?"},{"G","6"},
{"H","#"},{"I","|"},{"i","1"},{"J","!"},
{"O","0"},{"o","*"},{"P","9"},{"S","$$"},
{"s","2"},{"T","7"},{"t","+"},{"V","\\/"},
{"Y","&"}
};
 
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
System.out.print("Introduce password: ");
String pass = teclado.nextLine();
teclado.close();
 
//Construiremos un nuevo String con las letras originales y las ofuscadas
StringBuilder passOfuscado = new StringBuilder();
 
for (int i = 0; i < pass.length(); i++) {
//Seleccionamos letra original
String letra = pass.substring(i, i+1);
//Con un boolean controlamos si la letra sera ofuscada o no
boolean ofuscada = false;
//Recorremos la TABLA
for (int j = 0; j < TABLA.length; j++) {
if (letra.equals(TABLA[j][0])) {
//Letra existe en la TABLA, agregamos su equivalente ofuscado
passOfuscado.append(TABLA[j][1]);
ofuscada = true; //La letra ha sido ofuscada
break; //Ya no es necesario seguir recorriendo la TABLA para la letra actual
}
}
//Si la letra NO ha sido ofuscada, debemos agregar la letra original
if (!ofuscada)
passOfuscado.append(letra);
}
 
//Proceso de ofuscacion terminado
System.out.println("\nPassword ofuscado: " + passOfuscado.toString());
 
}
 
}



Se podría adaptar cambiando las "parejas" de la TABLA para que sean como las del "abecedario" de tu ejercicio.

El resto del código podría quedarse igual, aunque de hecho, se podría simplificar porque en tu ejercicio se han de sustituir todas los caracteres y en el que yo hice algunos se sustituían y otros no.

Usando un ArrayList, no veo cómo almacenar las "parejas".
A no ser que en el ArrayList guardemos pequeños arrays de 2 elementos para tener las parejas.
Aunque eso sería precisamente crear una matriz...

Mira a ver si lo de la matriz te sirve e intenta adaptar mi código para tu ejercicio. Si no lo consigues, dilo y te ayudamos.

Un saludo.

104
Hola.

Lo que necesitas es crear lo que se llama una matriz escalonada.
Es decir, una matriz cuyas filas tienen distinto número de columnas.

Normalmente usamos matrices cuyas filas tienen todas las mismas columnas. Una matriz de 3x20 por ejemplo, significa que tendrá 3 filas, y cada fila tendrá 20 columnas.

Eso es lo habitual, pero no tiene por qué ser siempre así.

Para este ejercicio necesitarás una matriz de 3 filas, pero cada fila tendrá distinto número de columnas.
La 1ª fila tendría 200 columnas (el aforo de la sala A)
La 2ª tendría 150 columnas (aforo sala B)
Y la 3ª será de 125 columnas (sala C)

En este enlace tienes una explicación de como crear una matriz escalonada.

El tipo de dato de la matriz lo escoges tú. La idea es que cada elemento de la matriz representa una butaca en una de las salas y necesitas marcar cuáles están ocupadas (porque se han vendido entradas) y cuáles están libres.

Puedes usar el tipo int por ejemplo. A las butacas libres le das valor 0 y a las ocupadas le das valor 1.
O puedes usar el tipo bool y marcar las libres como false y las ocupadas como true

Elige la que te parezca más fácil.


Entonces, en el programa cuando se pulse la opción "Vender entradas" tendrás que preguntar cuántas entradas quieren comprar y para cuál sala.
Y entonces compruebas si en la fila que corresponde a esas sala, quedan suficientes "butacas libres" (columnas con valor 0 o false)

Si no hay suficientes, la venta no es posible.
Si las hay, pues marcas esas "butacas" como ocupadas y terminas la venta.

105
Buenas.

Pues es cierto, no funciona en Windows 10, al menos no en la versión 64 bit.

Quizás la solución sea crear una máquina virtual con VirtualBox o similar, e instalar MS-DOS o incluso Win98.



106
Acabo de probar y sí funciona.

¿Quizás es cosa de tu navegador bloquea descargas y/o ventanas emergentes?


Por si a caso, lo pongo también en este enlace de Google Drive

107
¿Cuál es la clase Fecha?
Obviamente no es una clase de la API oficial de Java. Supongo que es una clase escrita por tu profesor o centro educativo y que te han proporcionado para realizar este ejercicio.

Comparte aquí esa clase para que podamos decirte cómo usarla.

Pero vamos, se supone que ya te habrán explicado cómo se usa.
El programa consistiría en preguntarle a un objeto de esa clase Fecha qué día es.
Y según el día, aplicar un descuento o el otro.


En cualquier caso, no podemos ayudarte si no disponemos de esa clase Fecha

108
De todo un poco... / Re: como cambiar formatos de horas?(reedición)
« en: 25 de Noviembre 2022, 20:28 »
A ver, en el case 6.

Hay dos cosas mal.


Estás llamando al método impHora24(), y cuando lo llamas no puedes decirle el tipo de parámetro que recibe:
Citar
                case 6:
                    ingreso.impHora24(String str);
                    break;

Simplemente, le has de decir el nombre del parámetro:
Citar
                case 6:
                    ingreso.impHora24(str);
                    break;

Segunda cosa mal.
A ese método, le estás dando un String.

Pero, en tu programa.., no hay ningún String por ningún sitio.
No estás trabajando con Strings, estás trabajando con tres enteros:
Código: [Seleccionar]
public class P33 {
    int hora;
    int minutos;
    int segundos;

Así que,
 o cambias el programa main principal para que por algún sitio le pidas un String al usuario....
 o reescribes el método impHora24() (supongo lo copiaste de algún sitio) para que trabaje con los tres enteros en lugar de con un String.


En cualquier caso, sigues teniendo el mismo problema que te comenté en el otro mensaje:
Necesitas conocer el meridiano para identificar la hora correctamente cuando está en formato 12 horas

El método impHora24() que has usado, utiliza un String precisamente para poder manejar el dato del meridiano. Está diseñado para recibir toda la información de la hora en un solo String, sin enteros, incluyendo el meridiano.

Pero si usas solamente los 3 enteros: horas, minutos y segundos, jamás podrás saber el meridiano.

Así que has de cambiar el diseño del programa. O usas un único String con todo, o como hice yo, usas enteros + 1 String para el dato del meridiano.

109
De todo un poco... / Re: como cambiar formatos de horas?
« en: 24 de Noviembre 2022, 20:54 »
Hola.

Aquí la cuestión es que el usuario, además de las horas y minutos, tiene que proporcionarte el meridiano

Es decir, si yo en formato 12 horas te digo que son las 04:00, pues solo con eso tú no puedes saber si son las cuatro de la mañana, o son las cuatro de la tarde.

Necesariamente tengo que decirte si esa hora es "anterior al meridiano"(am) o posterior(pm) para poder hacer la conversión al formato militar.

Entonces, si te digo que son las 04:00pm, ahora sí sabes perfectamente que son las cuatro de la tarde y que por tanto en hora militar serían las 16:00.

Así que ese dato has de pedirlo al usuario y así poder convertir a hora militar.

Si te dice que es am, entonces solo tienes que cambiar la hora si es valor 12, porque en formato militar será las 00.

Si te dice que es pm, entonces es al contrario. La única hora que no cambiará es el valor 12.
A todas las demás, habrá que sumarle +12 para hacer la conversión.

Prueba de nuevo a crear un método teniendo en cuenta este valor, a ver si se te ocurre la lógica necesaria.

Yo igualmente te dejo aquí un ejemplo resuelto, por si quieres consultarlo. Pero mejor si primero haces tú un intento, te salga bien o no.
Un saludo.

Código: [Seleccionar]
public class Main {

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

System.out.println("Introduzca tiempo en formato 12 horas");
System.out.print("Horas: ");
int hora = Integer.parseInt(teclado.nextLine());
System.out.print("Minutos: ");
int min = Integer.parseInt(teclado.nextLine());
System.out.print("Meridiano(am/pm): ");
String merid = teclado.nextLine();
teclado.close();

System.out.println();
imprimirHoraMilitar(hora, min, merid);

}

private static void imprimirHoraMilitar(int horas, int minutos, String meridiano) {

if(meridiano.toLowerCase().equals("am")) {
if (horas == 12)
horas = 0; //Son las 00 horas
}
else { //PM
if (horas != 12)
horas += 12;
}

//Resultado
System.out.printf("Hora militar: %02d:%02d", horas, minutos);
}

}

110
Hola.

El principal error es usar un boolean para leer la calificación.
Código: [Seleccionar]
Boolean calificacion;Un boolean solo tiene dos valores posibles: true o false (verdadero o falso)

No nos sirve para leer calificaciones. En este caso, debemos usar el tipo double o float, ambos sirven para leer números naturales con decimales que es lo apropiado para leer calificaciones.

Luego, no se por qué hay tantos métodos y en cualquier caso no tienen una buena lógica.
Ejemplo:
Código: [Seleccionar]
    public void estado3()
    {
            if(calificacion=3.5<=4.0)
        {
            JOptionPane.showMessageDialog(null,"Nota: R");
        }
            else
        {
            JOptionPane.showMessageDialog(null,"Nota: E");
            JOptionPane.showMessageDialog(null,"Nota: B");
            JOptionPane.showMessageDialog(null,"Nota: M");
            JOptionPane.showMessageDialog(null,"Nota: L");
           
           
        }
    }
Ahí la lógica seguida dice:

Si se cumple la condición,
mostramos mensaje que la nota es R,
si no se cumple,
mostramos un mensaje que la nota es E, otro mensaje que la nota es B,
otro mensaje que la nota es M y otro mensaje que la nota es L


No tiene sentido, y de todos modos, hay un error de sintaxis en la condición:
Citar
if(calificacion=3.5<=4.0)
Eso no es interpretable por el compilador, debería ser:
Citar
if(calificacion >= 3.5 && calificacion <= 4.0)


Este ejercicio, puede resolverse con el siguiente código.
Lo he hecho directamente dentro de un método main(), no veo la necesidad de crear una clase con multitud de métodos.

Código: [Seleccionar]
import javax.swing.JOptionPane;

public class Datos_alumno{

public static void main(String[] args) {

//Peticion datos
String nombre = JOptionPane.showInputDialog(null, "Nombre Alumno:");
double calificacion = Double.parseDouble(JOptionPane.showInputDialog(null, "Calificacion:"));

//Evaluacion
char letra = ' ';
if (calificacion > 4.5)
letra = 'E';
else if (calificacion >= 4.0)
letra = 'B';
else if (calificacion >= 3.5)
letra = 'R';
else if (calificacion >= 3.0)
letra = 'M';
else
letra = 'I';

//Resultado
JOptionPane.showMessageDialog(null, "Alumno: " + nombre + "\nNota: " + letra);
}
}

Fíjate en como evaluamos la nota para decidir la letra.
Empezamos preguntando si la nota es mayor que 4.5
Código: [Seleccionar]
if (calificacion > 4.5)Si se cumple, pues la letra es 'E'.

Si no se cumple, pues de momento ya sabemos que la nota es menor o igual que 4.5, así que esto no hace falta preguntarlo en la siguiente condición. Solo preguntaremos si es mayor o igual que 4.0.
Si se cumple, pues letra es 'B'.

Si no se cumple, ya sabemos que es menor que 4.0, así que en la siguiente condición solo es necesario preguntar si es mayor o igual que 3.5.

Y así sucesivamente.

Pruébalo y pregunta lo que no entiendas.

Un saludo.

111
Hola.

Se requiere una matriz de nx5, es decir, por cada empleado (el usuario decidirá al principio cuántos quiere introducir) se introducirán 5 montos de ventas.

Luego habrá que recorrer la matriz buscando el día con más ventas.

Bien, comienza el código, si quieres olvida de momento lo de buscar el día mayor.

Haz un programa donde preguntes al usuario cuántos empleados quiere introducir, declara una matriz de nx5 usando ese dato y luego mediante dos bucles anidados pide los montos de venta por teclado.
La matriz puede ser de tipo int o double, como prefieras.

Haz esa parte, la consigas o no, publica aquí lo que tengas, corregimos si hace falta y continuamos a partir de ahí.

Saludos.

112
Hola.
No lo he ejecutado, pero así a ojo, creo que hay un problema en este método.
Por argumentos recibes un array que es quien contiene las notas (lo marco en azul).
Pero luego, no lo usas para comparar las notas, si no que usas el array FrecuenciaNota (marco en rojo), quien en realidad lo que tiene que hacer es contar la frecuencia de cada nota

Citar
static void FrecuenciaNotas(int[] Array)
{
int[] FrecuenciaNota = new int[11];
int i, j;
for (i = 0; i < 11; i++)
{
for (j = 0; j < Array.Length; j++)
{
if (i ==FrecuenciaNota[j])
{
FrecuenciaNota[ i ]++;
}

}
Console.WriteLine($"Nota {i}, {FrecuenciaNota[j]} veces.");
}
}

Entiendo que en realidad deberías estar usando el array Array.

Citar
static void FrecuenciaNotas(int[] Array)
{
int[] FrecuenciaNota = new int[11];
int i, j;
for (i = 0; i < 11; i++)
{
for (j = 0; j < Array.Length; j++)
{
if (i ==Array[j])
{
FrecuenciaNota[ i ]++;
}

}
Console.WriteLine($"Nota {i}, {FrecuenciaNota[j]} veces.");
}
}


Comprueba si así te funciona.
Es que yo ahora estoy escribiendo desde un smartphone y no puedo probar  :P

113
Siento no poder ayudar, esto me supera  :(

Si finalmente llegas a resolverlo, será interesante si lo compartes por aquí.

Suerte y un saludo.

114
Comunidad / Re: Soy nuevo en esto de la programación
« en: 02 de Noviembre 2022, 18:30 »
Bienvenido.

En este enlace tienes acceso a cursos para iniciarse HTML, CSS y JavaScript.
Bueno, están esos y muchos otros más.

Un saludo.

115
Apoyar ya lo estoy haciendo.

Pero deberías hacerlos tú, ¿de qué sirve presentar unos ejercicios que no has hecho tú?
¿Los estás entendiendo?

Ya te dije lo que has de hacer para Prueba03
Citar
Para esta prueba, no será necesario ordenar los eventos de ninguna manera.
Solamente hacer una lista con los títulos de los eventos y el total recaudado.

El total recaudado sería el resultado de multiplicar el precio (monto - descuento) por la cantidad de asistentes a dicho evento. La cantidad de asistentes la sabemos por el tamaño que tenga el ArrayList, y esto nos lo dice su método size()

En este caso, si podrías hacer un nuevo método para la clase Evento que se ocupe de hacer el cálculo de la recaudación.

Pues eso, a la clase Evento le damos un método que nos calcule el total recaudado según la cantidad de asistentes:
Código: [Seleccionar]

public double getTotalRecaudado() {
//Cada asistente paga el total - descuento
return (getMontoTotal() - getDescuento()) * asistentes.size();
}

Y ya luego en Prueba03, solo hay que recorrer el array y mostrar el título y el resultado que nos da ese método:
Código: [Seleccionar]
public class Prueba03 {

private static ArrayList<Evento> eventos = new ArrayList<Evento>();

public static void main(String[] args) {
//Agregamos eventos para pruebas
        Evento.cargarDatosPruebas(eventos);

        System.out.println("\t\tTOTAL RECAUDADO POR CADA EVENTO\n");
       
        for (Evento even: eventos)
        System.out.printf("--> Titulo: %-35s --> Recaudacion: %.2f\n",
        even.getTitulo(), even.getTotalRecaudado());
}

}

Resultado en pantalla:
Citar
      TOTAL RECAUDADO POR CADA EVENTO

--> Titulo: Impacto Guerra Ucrania              --> Recaudacion: 531,53
--> Titulo: Arte Textil Africano                --> Recaudacion: 212,99
--> Titulo: Recuperacion Fauna Iberica          --> Recaudacion: 319,66
--> Titulo: Nuevas Tecnicas Marketing           --> Recaudacion: 201,78
--> Titulo: Presentacion Novela Historica       --> Recaudacion: 561,06
--> Titulo: Descifrando Codigo Ensamblador      --> Recaudacion: 337,42

No había ninguna dificultad, creo yo.
Siguientes pruebas:

Prueba04
Citar
Genera una clase Prueba04 que muestre la lista asistentes que hayan pagado en Platinum, Gold y VIP.
Es casi lo mismo que Prueba02.
Ordenar el ArrayList por ubicación y mostrar los nombres de los asistentes que han ido a evento Platinum, luego los que han ido a Gold y luego los VIP

Prueba05
Citar
Genera una clase Prueba05 que muestre el sueldo a apagar a todos los expositores que dieron charlas en VIP.
Hay que recorrer el ArrayList y busca los eventos que sean VIP (codigoUbicacion == 'V')
De dichos eventos, podemos mostrar el nombre del Expositor y su sueldo.
Ese sueldo, se puede ir sumando en una variable para que luego al terminar de mostrar el listado, podamos indicar también la suma total de todos esos sueldos.

Tienes que intentar hacerlas tú.
No te sirve de nada que los vaya haciendo yo, eso no te está ayudando me temo.

116
Hola.
Se poco (más bien nada) de programación Android.

Sin embargo, viendo la línea que dices que te da error, he curioseado la documentación del método putString() y veo que dicho método solo acepta dos parámetros: una "clave" y un "valor"

Pero tú le estás pasando tres parámetros:
Código: [Seleccionar]
obj_editor.putString(nombre, datos, numerovalor);
Hay otro método, el putStringSet(), que admite una "clave" y un conjunto(Set) de valores. Ahí si tendrías posibilidad de  incluir todos los valores que quieras.

117
Si ejecutas tu código, verás que no salen agrupados por ubicación.

La idea sería que primero se mostrasen por ejemplo los eventos Gold y el precio de cada evento. El precio se podría mostrar completo, con el impuesto y el descuento, que puede variar según si es temporada alta o baja.

Luego, lo mismo con los Platinum y por último los VIP.

Esto lo podríamos hacer con tres bucles, o tres métodos, donde cada uno se ocupe de mostrar los eventos de una ubicación concreta.

Pero si previamente ordenamos los eventos por ubicación, podremos hacerlo con un único bucle.

Para ordenarlos así, a la clase MisComparadores podemos añadir un nuevo Comparator, el cuál simplemente tiene que retornar el resultado de comparar el carácter que representa el código de ubicación de los eventos.

Citar
public class MisComparadores {
   
   public static final Comparator<Evento> TITULO_EVENTO_DESCENDENTE = new Comparator<Evento>() {
      @Override
      public int compare(Evento evento1, Evento evento2) {
         /*
          * Los titulos son cadenas String.
          * La clase String ya sabe como ha de compararse ella misma,
          * así que podemos retornar directamente el resultado de
          * comparar los títulos de los eventos.
          * Sin embargo, por defecto, la comparación de la clase String
          * nos daría un orden ASCENDENTE (de A a Z) y nosotros queremos
          * un orden DESCENDENTE (de Z a A).
          * Podemos revertir ese orden simplemente multiplicando por -1
          * el resultado que da la comparación de la clase String
          */
         return (evento1.getTitulo().compareTo(evento2.getTitulo())) * -1;
      }
   };
   
   public static final Comparator<Evento> UBICACION_ASCENDENTE = new Comparator<Evento>() {
      @Override
      public int compare(Evento evento1, Evento evento2) {
         return Character.compare(
evento1.getCodigoUbicacion(), evento2.getCodigoUbicacion());
      }
   };


}

Con este comparador, y sin necesidad de cambiar nada en la clase Evento ya podemos desarrollar la clase Prueba02 para que haga el listado.
Primero ordenaremos según ubicación.
Y luego al listar, haremos que el sistema detecte cuándo ha terminado con los eventos de una ubicación y va a comenzar con otros, para que lo muestre en pantalla.
Código: [Seleccionar]
package pruebas;

import java.util.ArrayList;

import entidades.Evento;
import util.MisComparadores;

public class Prueba02 {

private static ArrayList<Evento> eventos = new ArrayList<Evento>();

public static void main(String[] args) {
//Agregamos eventos para pruebas
        Evento.cargarDatosPruebas(eventos);

        //Listar los Eventos
        eventos.sort(MisComparadores.UBICACION_ASCENDENTE); //Ordenamos por ubicacion
        System.out.println("\n\t\tLISTADO DE EVENTOS AGRUPADOS POR UBICACION");
       
        char ubicacion = ' ';
        for (Evento even: eventos) {
        //Comprobamos si el evento actual es de distinta ubicacion, y por tanto comienza nuevo grupo
        if (even.getCodigoUbicacion() != ubicacion) { //Ubicacion distinta
        System.out.println(textoUbicacion(even.getCodigoUbicacion())); //Iniciamos nuevo grupo
        ubicacion = even.getCodigoUbicacion(); //Actualizamos la ubicacion actual
        }
        //Mostramos datos del evento
        System.out.printf("--> Titulo: %-35s --> Precio: %.2f\n",
        even.getTitulo(), even.getMontoTotal() - even.getDescuento());
     
        }

}

/*
* Devuelve un texto descriptivo para el codigo de ubicacion.
* Lo usaremos como cabecera para cada grupo de eventos.
*/
private static String textoUbicacion(char codigo) {
switch(codigo) {
case 'G':
return "\n\t---EVENTOS Gold---";
case 'P':
return "\n\t---EVENTOS Platinum---";
default:
return "\n\t---EVENTOS VIP---";
}
}

}

Al ejecutarlo, en pantalla vemos como los eventos quedan visiblemente agrupados.
Citar
      LISTADO DE EVENTOS AGRUPADOS POR UBICACION

   ---EVENTOS Gold---
--> Titulo: Recuperacion Fauna Iberica          --> Precio: 159,83
--> Titulo: Descifrando Codigo Ensamblador      --> Precio: 168,71

   ---EVENTOS Platinum---
--> Titulo: Impacto Guerra Ucrania              --> Precio: 265,77
--> Titulo: Presentacion Novela Historica       --> Precio: 265,77

   ---EVENTOS VIP---
--> Titulo: Arte Textil Africano                --> Precio: 106,49
--> Titulo: Nuevas Tecnicas Marketing           --> Precio: 106,49


En los precios vemos que solo hay variedad en los Gold, porque uno es "temporada alta" y el otro no.
En los otros no hay variación porque resulta que los hemos creado bajo la misma temporada.

Opcionalmente, podemos modificar el código de creación de estos eventos para que no coincidan sus temporadas, y así reflejar más variedad en los precios.
Citar
      LISTADO DE EVENTOS AGRUPADOS POR UBICACION

   ---EVENTOS Gold---
--> Titulo: Recuperacion Fauna Iberica          --> Precio: 159,83
--> Titulo: Descifrando Codigo Ensamblador      --> Precio: 168,71

   ---EVENTOS Platinum---
--> Titulo: Impacto Guerra Ucrania              --> Precio: 265,77
--> Titulo: Presentacion Novela Historica       --> Precio: 280,53

   ---EVENTOS VIP---
--> Titulo: Arte Textil Africano                --> Precio: 106,49
--> Titulo: Nuevas Tecnicas Marketing           --> Precio: 100,89



Venga, que ya queda menos.
Sigue adelante con la siguiente prueba:
Citar
clase Prueba03 que muestre la lista de eventos y el total recaudado por cada evento.
Para esta prueba, no será necesario ordenar los eventos de ninguna manera.
Solamente hacer una lista con los títulos de los eventos y el total recaudado.

El total recaudado sería el resultado de multiplicar el precio (monto - descuento) por la cantidad de asistentes a dicho evento. La cantidad de asistentes la sabemos por el tamaño que tenga el ArrayList, y esto nos lo dice su método size()

En este caso, si podrías hacer un nuevo método para la clase Evento que se ocupe de hacer el cálculo de la recaudación.

Un saludo.

118
La primera prueba tendría dos partes:
  • Creación de Eventos
  • Listar Eventos creados

Centrémonos en la primera parte.
Hay que pedir datos al usuario para crear eventos, los cuáles podemos añadirlos a un ArrayList para luego poder mostrar un listado.
Por cada evento, hay que crear además un expositor y uno o más asistentes.

Este proceso podemos separarlo en tres métodos:
  • para crear y retornar un Expositor
  • para crear y retornar un Asistente
  • para crear y retornar un Evento, donde invocaremos a los métodos que crean Expositores y Asistentes

Combinando esos tres métodos, podemos hacer un bucle while donde vayamos creando y añadiendo Eventos al ArrayList, hasta que el usuario decida terminar.

Código: [Seleccionar]
package pruebas;

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

import entidades.*;

public class Prueba01 {

private static ArrayList<Evento> eventos = new ArrayList<Evento>();
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

//Creacion de Eventos
char terminar = 'N';
while (terminar != 'S') {
eventos.add(crearEvento());
System.out.println("\nEvento añadido. ¿Desea TERMINAR?(S/N): ");
terminar = teclado.nextLine().toUpperCase().charAt(0);
}


}

private static Expositor crearExpositor() {
System.out.println("\n\tDATOS DEL EXPOSITOR");
System.out.print("Codigo: ");
String codigo = teclado.nextLine();
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Apellidos: ");
String apellidos = teclado.nextLine();
System.out.print("Sueldo: ");
double sueldo = Double.parseDouble(teclado.nextLine());
System.out.print("Correo: ");
String correo = teclado.nextLine();

return new Expositor(codigo, nombre, apellidos, sueldo, correo);
}

private static Asistente crearAsistente() {
System.out.println("\n\tDATOS DEL ASISTENTE");
System.out.print("Codigo: ");
String codigo = teclado.nextLine();
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Apellidos: ");
String apellidos = teclado.nextLine();
System.out.print("Correo: ");
String correo = teclado.nextLine();
System.out.print("Telefono: ");
String telef = teclado.nextLine();
System.out.print("Direccion: ");
String direcc = teclado.nextLine();

return new Asistente(codigo, nombre, apellidos, correo, telef, direcc);
}

private static Evento crearEvento() {
System.out.println("\n\tDATOS DEL EVENTO");
System.out.print("Titulo: ");
String titulo = teclado.nextLine();
System.out.print("Duracion(en minutos): ");
int duracion = Integer.parseInt(teclado.nextLine());
System.out.print("Hora ingreso: ");
String ingreso = teclado.nextLine();
System.out.print("Hora salida: ");
String salida = teclado.nextLine();
System.out.print("Temporada Alta?(S/N): ");
boolean temporadaAlta = teclado.nextLine().toUpperCase().charAt(0) == 'S';
System.out.println("Indique codigo ubicacion");
System.out.println("[P] -> Platinum / [G] -> Gold / [V] -> VIP");
System.out.print("Codigo: ");
char ubicacion = teclado.nextLine().toUpperCase().charAt(0);

//Necesitamos un Expositor
Expositor expo = crearExpositor();

//Podemos crear el Evento
Evento evento = new Evento(titulo, duracion, expo, ingreso, salida, temporadaAlta, ubicacion);

//Ahora hay que añadir Asistentes al Evento
char terminar = 'N';
while (terminar != 'S') {
Asistente nuevo = crearAsistente();
evento.addAsistente(nuevo);
System.out.println("\nAsistente añadido. ¿Desea TERMINAR?(S/N): ");
terminar = teclado.nextLine().toUpperCase().charAt(0);
}

return evento;
}

}

Con esto tendríamos la primera parte.
Ahora hay que ver cómo hacemos la segunda parte.
Nos piden un listado de los Eventos, incluyendo su Expositor(que es uno) y Asistentes(que pueden ser muchos)
Y además el listado ha de estar ordenado por título y de manera descendente, es decir, de Z a A.

Bien, para facilitar esto, primero deberíamos añadir un nuevo método a la clase Evento que se encargue de mostrar detalladamente todos sus datos, incluyendo expositor y asistentes.
Código: [Seleccionar]

public void mostrarEvento() {
System.out.println("\n\t\t" + titulo.toUpperCase());
System.out.print("\t\t");
for (int i = 0; i < titulo.length(); i++)
System.out.print("-");
System.out.printf("\nExpositor: %s %s", expositor.getNombre(), expositor.getApellidos());
System.out.printf("\nDuracion: %d Ingreso: %s Salida: %s\n", duracion, horaIngreso, horaSalida);
System.out.println("Temporada: " + (esTemporadaAlta?"Alta":"Baja"));
System.out.print("Ubicacion: ");
switch(codigoUbicacion) {
case 'P':
System.out.println("Platinum");
break;
case 'G':
System.out.println("Gold");
break;
default:
System.out.println("VIP");
}

System.out.println("\n\t---Lista de Asistentes---\n");
for (Asistente asis: asistentes)
System.out.printf("-> %s %s\n", asis.getNombre(), asis.getApellidos());
}

Con esto ya podemos volver a la clase Prueba01 y añadir código para mostrar un listado tras la creación de los eventos:
Citar
   public static void main(String[] args) {
      
      //Creacion de Eventos
      char terminar = 'N';
      while (terminar != 'S') {
         eventos.add(crearEvento());
         System.out.println("\nEvento añadido. ¿Desea TERMINAR?(S/N): ");
         terminar = teclado.nextLine().toUpperCase().charAt(0);
      }
      
      //Listar los Eventos
      System.out.println("\n\t\tLISTADO DE EVENTOS");
      System.out.println("\t\t------- -- -------\n");
      for (Evento even: eventos) {
         System.out.println("\n\n\t\t*************************\n");
         even.mostrarEvento();
      }


   }


Bien, con esto listamos los eventos, pero aún no están ordenados como nos han solicitado.
Para poder ordenar a nuestro gusto los eventos contenidos en el ArrayList, podríamos implementarle la interfaz Comparable a la clase Evento y sobre escribir el método compareTo() para indicarle cómo se han de ordenar.

Pero, viendo lo que están solicitando en las siguientes clases de "pruebas", parece que nos va a convenir poder ordenar los eventos al menos de dos formas distintas.
Así que en lugar de usar la interfaz Comparable, podemos crear una serie de objetos Comparator, donde cada uno establecerá distintas reglas de ordenamiento y así podremos llamarlos según lo que necesitemos.

Parecido a lo que habíamos hecho con la clase MisConstantes, podemos hacer una clase MisComparadores donde definir unos objetos Comparator como unas constantes que puedan ser utilizadas en cualquier momento para decirle al ArrayList de Eventos cómo ha de ordenarse.

De momento, escribimos un comparador que permita ordenar por "título descendente".
Código: [Seleccionar]
package util;

import java.util.Comparator;

import entidades.Evento;

public class MisComparadores {

public static final Comparator<Evento> TITULO_EVENTO_DESCENDENTE = new Comparator<Evento>() {
@Override
public int compare(Evento evento1, Evento evento2) {
/*
* Los titulos son cadenas String.
* La clase String ya sabe como ha de compararse ella misma,
* así que podemos retornar directamente el resultado de
* comparar los títulos de los eventos.
* Sin embargo, por defecto, la comparación de la clase String
* nos daría un orden ASCENDENTE (de A a Z) y nosotros queremos
* un orden DESCENDENTE (de Z a A).
* Podemos revertir ese orden simplemente multiplicando por -1
* el resultado que da la comparación de la clase String
*/
return (evento1.getTitulo().compareTo(evento2.getTitulo())) * -1;
}
};

}

Con esto, en la clase Prueba01 podemos ordenar el ArrayList antes de mostrar el listado en pantalla.
Para ello, llamamos al método sort() que posee el ArrayList y le pasamos entre paréntesis el comparador que acabamos de escribir:
Citar
   public static void main(String[] args) {
      
      //Creacion de Eventos
      char terminar = 'N';
      while (terminar != 'S') {
         eventos.add(crearEvento());
         System.out.println("\nEvento añadido. ¿Desea TERMINAR?(S/N): ");
         terminar = teclado.nextLine().toUpperCase().charAt(0);
      }
      
      //Listar los Eventos
      eventos.sort(MisComparadores.TITULO_EVENTO_DESCENDENTE);
      System.out.println("\n\t\tLISTADO DE EVENTOS");
      System.out.println("\t\t------- -- -------\n");
      for (Evento even: eventos) {
         System.out.println("\n\n\t\t*************************\n");
         even.mostrarEvento();
      }

   }


Y con esto ya habríamos cumplido con lo que pide Prueba01: creación de eventos y mostrar listado ordenado descendente por título.


Antes de terminar, vamos a añadir una cosa.
Es tedioso, más bien terrible...., tener que crear eventos por teclado para poder comprobar si el listado sale ordenado o no.
Con las siguientes clases "pruebas", va a ocurrir lo mismo. Nos piden una serie de operaciones que para poder comprobar si funcionan, primero necesitamos tener eventos.

En lugar de estar creando eventos por teclado cada vez que ejecutamos una prueba, lo ideal es crear mediante código una serie de datos ya predefinidos para poder iniciar las pruebas con datos ya disponibles, sin tener que depende de introducirlos por teclado.

Para esto, en la clase Evento, podemos crear un método estático que reciba un ArrayList y lo cargue con una serie de datos: Expositores, Asistentes y Eventos listos para ser utilizados en las pruebas.
Código: [Seleccionar]


/*
* El siguiente método estático es para facilitar el "entorno de pruebas".
* Añade al ArrayList recibido por argumentos unos cuántos Eventos, con sus
* Expositores y Asistentes, para que las clases de prueba puedan comenzar
* con una serie de datos cargados con los que poder trabajar sin tener
* que introducirlos a mano
*/
public static void cargarDatosPruebas(ArrayList<Evento> eventos) {
//Expositores
Expositor ex1 = new Expositor("EXPO001", "Pedro", "Baños Lopez", 15000, "pedro@balo.com");
Expositor ex2 = new Expositor("EXPO002", "Ines", "Felisa Sanchez", 17000, "ines@fesa.com");
Expositor ex3 = new Expositor("EXPO003", "Ramon", "Lobo Maturana", 12000, "ramon@loma.com");
Expositor ex4 = new Expositor("EXPO004", "Luis", "Salvat Cami", 11000, "luis@saca.com");
Expositor ex5 = new Expositor("EXPO005", "Carmen", "Robledo Velez", 20000, "carmen@rove.com");
Expositor ex6 = new Expositor("EXPO006", "Felipe", "Moreno Reina", 16000, "feli@more.com");
//Asistentes
Asistente as1 = new Asistente("ASI001", "Jorge", "Morales Garcia", "jor@moga.com", "646578090", "C/Peru");
Asistente as2 = new Asistente("ASI002", "Laura", "Juan Moragas", "lalaura@jumo.com", "634588190", "C/Lima");
Asistente as3 = new Asistente("ASI003", "Sara", "Pelaez Tuna", "sarita@petu.com", "646578090", "C/Madrid");
Asistente as4 = new Asistente("ASI004", "Guadalupe", "Flores Flores", "lupe@floflo.com", "646578090", "C/Avestruz");
Asistente as5 = new Asistente("ASI005", "Antonio", "Paz Garcia", "toni@paga.com", "646578090", "C/Pelicano");
Asistente as6 = new Asistente("ASI006", "Antonia", "Perez Castillo", "anto@peca.com", "646578090", "C/Nutria");
Asistente as7 = new Asistente("ASI007", "Alicia", "Aloy Sanchez", "ali@alsa.com", "646578090", "C/Ibice");
Asistente as8 = new Asistente("ASI008", "Javier", "Barbudo Lopez", "javi@balo.com", "646578090", "C/Muflon");
Asistente as9 = new Asistente("ASI009", "Carla", "Bella Zapata", "carla@beza.com", "646578090", "C/Alce");
Asistente as10 = new Asistente("ASI010", "Federico", "Martin Vela", "fredy@mave.com", "646578090", "C/Ecuador");
Asistente as11 = new Asistente("ASI011", "Eva", "Santamaria Lopez", "eva@salo.com", "646578090", "C/Quito");
Asistente as12 = new Asistente("ASI011", "Mario", "Moreno Cantinflas", "mario@moca.com", "646578090", "C/Mexico");
//Eventos
Evento ev1 = new Evento("Impacto Guerra Ucrania", 90, ex1, "10:00", "11:30", true, 'P');
ev1.addAsistente(as1); ev1.addAsistente(as2);
Evento ev2 = new Evento("Arte Textil Africano", 60, ex2, "12:00", "13:00", false, 'V');
ev2.addAsistente(as3); ev2.addAsistente(as4);
Evento ev3 = new Evento("Recuperacion Fauna Iberica", 90, ex3, "14:00", "15:30", true, 'G');
ev3.addAsistente(as5); ev3.addAsistente(as6);
Evento ev4 = new Evento("Nuevas Tecnicas Marketing", 45, ex4, "10:00", "10:45", false, 'V');
ev4.addAsistente(as7); ev4.addAsistente(as8);
Evento ev5 = new Evento("Presentacion Novela Historica", 60, ex5, "17:00", "18:", true, 'P');
ev5.addAsistente(as9); ev5.addAsistente(as10);
Evento ev6 = new Evento("Descifrando Codigo Ensamblador", 120, ex6, "18:00", "20:00", false, 'G');
ev6.addAsistente(as11); ev6.addAsistente(as12);
//Añadimos los eventos creados
eventos.add(ev1); eventos.add(ev2); eventos.add(ev3);
eventos.add(ev4); eventos.add(ev5); eventos.add(ev6);
}

Así, en el main de nuestras pruebas, lo primero que haremos será invocar este método y pasarle nuestro ArrayList de eventos para que lo cargue con datos sin tener que hacerlo nosotros por teclado:
Citar
   
   private static ArrayList<Evento> eventos = new ArrayList<Evento>();
   private static Scanner teclado = new Scanner(System.in);

   public static void main(String[] args) {
      
      //Agregamos eventos para pruebas
      Evento.cargarDatosPruebas(eventos);

      
      //Creacion de Eventos
      char terminar = 'N';
      while (terminar != 'S') {
         eventos.add(crearEvento());
         System.out.println("\nEvento añadido. ¿Desea TERMINAR?(S/N): ");
         terminar = teclado.nextLine().toUpperCase().charAt(0);
      }
      
      //Listar los Eventos
      eventos.sort(MisComparadores.TITULO_EVENTO_DESCENDENTE);
      System.out.println("\n\t\tLISTADO DE EVENTOS");
      System.out.println("\t\t------- -- -------\n");
      for (Evento even: eventos) {
         System.out.println("\n\n\t\t*************************\n");
         even.mostrarEvento();
      }

   }

Y con esto ya podemos seguir con el resto de pruebas
Intenta Prueba02.

Recuerda que ya no tienes que introducir eventos por teclado, podemos cargar un ArrayList con eventos automáticamente llamando al método correspondiente.

Una vez cargado, haz un listado del arraylist mostrando:
- titulo del evento
- ubicación
- precio

Cuanto tengas el listado, ahora hay que ver como agrupar esos eventos por ubicación.
Para ello, intenta crear un nuevo comparador que se encargue de ordenar los eventos según la ubicación.
Una vez ordenados, ya podemos hacer una salida por pantalla en tres grupos

Inténtalo, llega hasta donde puedas, no importa si no lo consigues.
Atascarse en el intento es la mejor forma de aprender.
Comparte aquí lo que logres hacer y lo completamos.

Saludos

119
A ver, lo primero es identificar las principales entidades que intervienen.

Aquí se organizan Eventos.
En un Evento interviene un Expositor y van a acudir una cantidad indefinida de Asistentes

Evento, Expositor y Asistente serían las principales entidades.

Esta podría ser la clase Asistente
Código: [Seleccionar]
package entidades;

public class Asistente {

private String codigo;
private String nombre;
private String apellidos;
private String correo;
private String telefono;
private String direccion;

public Asistente(String codigo, String nombre, String apellidos, String correo,
String telefono, String direccion) {
this.codigo = codigo;
this.nombre = nombre;
this.apellidos = apellidos;
this.correo = correo;
this.telefono = telefono;
this.direccion = direccion;
}

public String getCodigo() {
return codigo;
}

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

public String getNombre() {
return nombre;
}

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

public String getApellidos() {
return apellidos;
}

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

public String getCorreo() {
return correo;
}

public void setCorreo(String correo) {
this.correo = correo;
}

public String getTelefono() {
return telefono;
}

public void setTelefono(String telefono) {
this.telefono = telefono;
}

public String getDireccion() {
return direccion;
}

public void setDireccion(String direccion) {
this.direccion = direccion;
}

}

Esta la clase Expositor
Código: [Seleccionar]
package entidades;

public class Expositor {

private String codigo;
private String nombre;
private String apellidos;
private double sueldo;
private String correo;

public Expositor(String codigo, String nombre, String apellidos, double sueldo, String correo) {
this.codigo = codigo;
this.nombre = nombre;
this.apellidos = apellidos;
this.sueldo = sueldo;
this.correo = correo;
}

public String getCodigo() {
return codigo;
}

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

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 double getSueldo() {
return sueldo;
}

public void setSueldo(double sueldo) {
this.sueldo = sueldo;
}

public String getCorreo() {
return correo;
}

public void setCorreo(String correo) {
this.correo = correo;
}

}

Y esta la clase Evento.
Además de los atributos que indica el enunciado, yo le he añadido un ArrayList para contener a los asistentes que acudirán a este evento.

Además incluye los métodos que pide el enunciado. Aunque no me queda claro si el descuento según la temporada, debería ir aplicado en el resultado que calcula el "monto total".

Código: [Seleccionar]
package entidades;

import java.util.ArrayList;
import util.MisConstantes;

public class Evento {

private String titulo;
private int duracion;
private Expositor expositor;
private String horaIngreso;
private String horaSalida;
private boolean esTemporadaAlta;
private char codigoUbicacion;
private ArrayList<Asistente> asistentes;

public Evento(String titulo, int duracion, Expositor expositor, String horaIngreso, String horaSalida,
boolean esTemporadaAlta, char codigoUbicacion) {
this.titulo = titulo;
this.duracion = duracion;
this.expositor = expositor;
this.horaIngreso = horaIngreso;
this.horaSalida = horaSalida;
this.esTemporadaAlta = esTemporadaAlta;
this.codigoUbicacion = codigoUbicacion;
asistentes = new ArrayList<Asistente>();
}

public String getTitulo() {
return titulo;
}

public void setTitulo(String titulo) {
this.titulo = titulo;
}

public int getDuracion() {
return duracion;
}

public void setDuracion(int duracion) {
this.duracion = duracion;
}

public Expositor getExpositor() {
return expositor;
}

public void setExpositor(Expositor expositor) {
this.expositor = expositor;
}

public String getHoraIngreso() {
return horaIngreso;
}

public void setHoraIngreso(String horaIngreso) {
this.horaIngreso = horaIngreso;
}

public String getHoraSalida() {
return horaSalida;
}

public void setHoraSalida(String horaSalida) {
this.horaSalida = horaSalida;
}

public boolean isEsTemporadaAlta() {
return esTemporadaAlta;
}

public void setEsTemporadaAlta(boolean esTemporadaAlta) {
this.esTemporadaAlta = esTemporadaAlta;
}

public char getCodigoUbicacion() {
return codigoUbicacion;
}

public void setCodigoUbicacion(char codigoUbicacion) {
this.codigoUbicacion = codigoUbicacion;
}

public void addAsistente(Asistente asis) {
asistentes.add(asis);
}

public double getCostoIngreso() {
switch(codigoUbicacion) {
case 'P':
return MisConstantes.COSTO_P;
case 'G':
return MisConstantes.COSTO_G;
default:
return MisConstantes.COSTO_V;
}
}

public double getMontoTotal() {
double ingreso = getCostoIngreso();
return ingreso + (ingreso*MisConstantes.IGV/100);
}

public double getDescuento() {
return esTemporadaAlta?getMontoTotal()*10/100:getMontoTotal()*5/100;
}

}

Para dichos cálculos, se usan una constantes que el enunciado pide declarar en un package separado:
Código: [Seleccionar]
package util;

public class MisConstantes {
//Costos de ubicacion
public final static double COSTO_P = 250.25;
public final static double COSTO_G = 150.5;
public final static double COSTO_V = 95;
//Impuesto general de ventas
public final static int IGV = 18; //% sobre precio base
}

Bien, esas podrían ser las clases. Luego puede que queramos añadir algún método más o modificar algo.

Pero en principio, con esto ya se podría comenzar a hacer las distintas clases de "prueba" que pide el enunciado.

Intenta comenzar tú la primera.
Se necesitará un ArrayList para almacenar los distintos Eventos que se vayan creando.
Estos eventos se tendrán que crear dentro de un bucle, pidiendo datos al usuario.
Y por cada Evento, habrá que crear también un Expositor y varios Asistentes (en un segundo bucle anidado)

Inténtalo y comparte por aquí lo que consigas.
Un saludo.

120
Me alegro.
Siempre que podamos ayudarte, aquí estaremos.

Saludos.

Páginas: 1 2 3 4 5 [6] 7 8 9 10 11 ... 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".