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 - toni_apr

Páginas: [1] 2 3 4 5 6 ... 25
1
Hola

Documento muy interesante.

Al leerlo me ha hecho recordar otros escritos donde se recomendaba crear estructuras de clases que resistan el paso del tiempo, que permitan la ampliación de la estructura sin desmontarla.

Esto hace que mis comentarios en hilos precedentes sean inadecuados.
Me refiero a la creación de estructuras de clases organizadas por atributos comunes descartando la clasificación de los objetos en el mundo real (que es lo que en definitiva queremos meter en nuestra estructura de clases)

Erróneamente creia que la compactación de clases y atributos tenía un valor positivo.

Así pues, descarto la compactación y abogo por la modularidad y reutilización en la creación de una estructura de clases.

Saludos

2
Hola fedegaray

Si, respuestas correctas.

Es de destacar que esta interface proporciona este método solamente. En cambio es implementada en un montón de clases.

Saludos

3
Hola Dan

No sé si has empezado la codificación como dices al final. Aprovecho para hacer mis comentarios a tu esquema/diagrama.

Respecto a tu esquema.
En tu mensaje das razones para hacer tus cambios
1º ProductoFresco no tiene atributos porque los hereda todos de Producto.
Tiene su lógica, viendo los nombres, si, ProductoFresco es un nivel inferior a Producto. Pero en el enunciado no se pide crear la clase Producto.
Yo creo que si a tu clase Producto le cambias el nombre por ProductoFresco y eleminas la clase sin parámetros, tu estructura de clases se mantiene.
Este cambio hará que el resto del productos hereden de ProductoFresco (cosa que no sucede en el mundo real). Pero yo pienso que mientras nuestro proyecto discrimine cada objeto de los demás tendrá una estructura consistente.
Nuestra relación de herencia se basa en los atributos compartidos, no en el nombre que damos a las clases. Tal como interpreto yo en esta parte del enunciado
Citar
b) Crear superclases intermedias (aunque no se correspondan con la descripción dada de la empresa) para agrupar atributos y métodos cuando sea posible. Esto corresponde a "realizar abstracciones" en el ámbito de la programación, que pueden o no corresponderse con el mundo real.

2º Y siguiendo la premisa anterior yo conservaría a la clase ProductoRefrigerado subclase de ProductoCongelado (atendiéndome siempre a los atributos compartidos)

Lo anterior es opinión mía, la herencia la deciden los atributos no la vida real.

Saludos

4
Hola Dan

La estructura de las clases es correcta.
Pero no se aprovecha la relación de herencia al no disponer las clases de un método para mostrar la información de cada producto como se pide en el enunciado.

Este método es el que se usará para mostrar los datos en lugar de los getters de cada producto (tarea más farragosa)

En los métodos de las clases hijas usando la palabra clave 'super' invocaremos el método para mostrar información de la clase padre.

Saludos

5
Hola fedegaray

Ejercicio correcto. Bien

Citar
¿Es posible crear un método en la clase Circulo para establecer el valor de numeroPi? ¿Por qué?
Supongo que no has visto esta pregunta en el enunciado.

Como ya sabrás no se puede cambiar el valor del atributo PI porque se lo ha declarado constante al usar la palabra clave 'final' en su declaración.

Saludos

6
Hola fedegaray, hoy estamos todos contigo

Comprueba que la instrucción:
    int randomInt = randomGenerator.nextInt(100);
genera un entero pseudoaleatorio en un rango que va desde 0 a 99

En cuanto al código hace su función perfectamente.
Buena idea eso de probar el juego de nuevo.
Hecho en falta que si se sobrepasan los 10 intentos no se informe al usuario del programa del número que no ha sabido encontrar.
Algo como:
    System.out.println ("Se acabaron tus opciones. El numero era el: " + randomInt);

Saludos

7
Hola Lorenzo

Como veo que estás preparado. Voy al ataqueeee.

Todo el código que has enviado, lo he visto siempre muy bien.
Has usado control de excepciones, has creado clases con métodos estáticos que se usan sin instanciar.
Y tu código por decirlo de alguna manera, es ligero, no resulta empalagoso. Es fácil de leer y de seguir. Esto último seguramente gracias a tu experiencia codificando y codificando.

En este ejercicio también aportas cosas nuevas.
Con dos clases (Recoger y EntradaDatos) tienes solucionada la 'recogida' de datos.

Todo esto era para ver si te pillo desprevenido.


Mis comentarios:
Hacer una adaptación del ejercicio anterior, está bien, pero hay que seguir las nuevas condiciones.

Si a tu clase Producto le cambias el nombre y le pones ProductoFresco, tu estructura de clases se mantiene y además el atributo (boolean frescoOno) no parece ser necesario -yo por lo menos no se la veo-.

En el ejercicio anterior no me di cuenta, pero la clase PRefrigerado tiene un atributo igual que el de la clase PCongelado. Para evitar esa duplicidad, hacemos que PRefrigerado herede de PCongelado.

La idea de gestinonar los tres tipos de congelados con la misma clase, es buena. Dices que has simplificado la información de esos productos.
En una de las clases simplificas tres atributos numéricos, en otra dos un String y un valor numérico y en la tercera otro numérico.
Eso es una buena simplificación y una buena abstracción.

Si, esto es una práctica. Pero con los productos congelados en clases individuales y con todos sus atributos este ejercicio sería un buen ejemplo de herencia de clases.

Eso es todo. Se que en otro momento, a este ejercicio o a otro como este le meterás caña y harás una virguería.

Hasta entonces, mis saludos.

PD: Adjunto clase de mi cosecha.
Código: [Seleccionar]
import java.util.Calendar;
/**
 * Detalles de la clase.
 * @author (Toni)
 * @version (0)<br>
 * La clase devuelve con el metodo <b>in</b> una fecha de tipo Calendar aportando dicha fecha en formato String<br>
 * Y con el metodo <b>out</b> devuelve una fecha en formato String aportando la fecha de tipo Calendar
 */
public class Fecha {   
/**
 * @param ddmmaa <br>Este String debe recibir una fecha valida en los formatos: <br>
 * <b>dia/mes/anno</b>, o <b>dia mes anno</b>, o <b>dia-mes</b>, o <b>dia</b>, o una cadena vacia <br>
 * con cualquier caracter separador no numerico entre dia mes y anno
 * @return Y devuelve una fecha de tipo Calendar
 */
    public static Calendar in(String ddmmaa) { //dd-mm-aa  dd/mm/aa
        Calendar fecha1 = Calendar.getInstance();
        String dd="",mm="",aa="";
        int d=0,m=0,a=0;
        char c = ' ';
        ddmmaa = ddmmaa.trim() + " ";
        if (ddmmaa.equals(" ")) {
            // se tomara la fecha de hoy
        } else {
            for (int i = 0; i < ddmmaa.length(); i++) {
                c = ddmmaa.charAt(i);
                if (c==48 || c==49 || c==50 || c==51 || c==52 || c==53 || c==54 || c==55 || c==56 || c==57) {  // solo dígitos del 0 al 9
                    if (d == 0) {        // tomar día
                        dd = dd + c;
                    } else if (m == 0) { // tomar mes
                        mm = mm + c;
                    } else {             // tomar año
                        aa = aa + c;
                    }
                } else    {  // ha aparecido un caracter no dígito
                    if (d == 0) { // tomar día
                        if (!dd.isEmpty()) d = Integer.valueOf(dd);
                    } else if (m == 0) { // tomar mes
                        if (!mm.isEmpty()) m = Integer.valueOf(mm);
                    } else { // tomar año
                        if (!aa.isEmpty()) a = Integer.valueOf(aa);
                    }
                }
            }
        }
//        System.out.println("dd -" + dd + "- mm -" + mm + "- aa -" + aa + "-");
        Calendar fechaHoy = Calendar.getInstance();
        if (a == 0) { // si no hay año se tomam el actual
            a = fechaHoy.get(Calendar.YEAR);
        } else if(a < 1000) { // si el año tiene dos cifras, se le suma 2000
            a = (a % 100) + 2000;
        }
        if (m == 0) { // si no hay mes se toma el actual
            m = fechaHoy.get(Calendar.MONTH);
        } else {
            m = m - 1;
        }
        if (d == 0) { // si tampoco hay dia, se toma el de hoy
            d = fechaHoy.get(Calendar.DATE);
        }
        fecha1.set (a,m,d);
        return fecha1;
    }
/**
 * @return
 * El String devuelto tiene el formato <b>dia/mes/anno</b> tras recibir una fecha de tipo Calendar
 */
    public static String out(Calendar fecha1) {
        int d=0,m=0,a=0;
        d = fecha1.get(Calendar.DATE);
        m = fecha1.get(Calendar.MONTH);
        a = fecha1.get(Calendar.YEAR);
        return d + "/" + (m+1) + "/" + a;
    }
} // Fin de la clase Fecha

8
Hola RaGa

La estructura de clases de este ejercicio, está muy bien.
Realmente has distribuido a la perfección los atributos a sus clases tal como se pedía en el enunciado.

Y el esquema que has enviado se confirma en BlueJ al compilar tu proyecto. Bien.

El código en las clases también lo veo correcto. Y mostrando cada clase sus atributos propios y los de su clase padre. Muy bien.

Realmente este ejercicio se las traía. Te ha salido muy bien.

Y aunque has cumplido todo lo que se pide para este ejercicio, te habría quedado muy bien un menú en el main para poder añadir productos a discrección. Espero que no descartes en el futuro añadir ese menú, tu proyecto quedará perfecto.

Ah, un buen truco la clase Exibidor. Los métodos que tiene son sencillos pero facilitan adornar la salida por consola.
Por cierto el método 'mostrarEncabezadoProductoTipo' no lo has utilizado. Tal vez lo aprovecharás en otra versión futura.

Saludos.

9
Hola Lorenzo

Si. En tu código muestras los datos propios de la clase y los de la padre. Es correcto.

Y no me refiero al nombre que das a los métodos, sino a que los cambios que te propongo tienen dos ventajas:

1ª El mismo nombre en todas las clases. Evita recordar nombres diferentes para diferentes clases.

2ª Al llamar al método para mostrar sus datos, es el propio método el que llama al método padre para mostrar todos los datos siguiendo el árbol de herencia. Esta ventaja es más evidente cuando el árbol de herencia tiene más de un grado/nivel como el actual.


Citar
Efectivamente funciona perfectamente, le cambie el int de tamaño al for por un listaProductos.size() y perfecto, por lo que habia leido solo array guarda objetos de diferentes clases, ArrayList tambien lo hace o es que leí mal y LinkedList TreeSet etc tb lo hacen?

Limitar el fin del for con el tamaño de la lista listaProductos.size() es ideal. Respeté la variable 'indice' para no trastocar demasiado tu código.


Ya sabes que la principal diferencia entre array y ArrayList es que:

array puede contener tanto primitivos como objetos, pero solo un tipo cada vez, o un conjunto de primitivos, o uno de objetos, es decir todos los elementos del mismo tipo.

Y ArrayList solo puede contener objetos, no primitivos y también objetos del mismo tipo.

El ArrayList del ejemplo solo guarda objetos de un tipo, el tipo 'Producto'. Es gracias a la herencia, que Java puede distinguir que subclase de 'Producto' está manipulando, ya sea PFresco o PCongelado, etc.

Ya hemos visto en ejercicios anteriores sobre polimorfismo (CU00678B), que se pueden guardar objetos de distinto tipo sin relación de herencia en una colección, cuando todos los objetos pertenecen a la misma interface.


En cuanto a los métodos estáticos en la clase del main.
Me lo has puesto muy fácil, todos esos métodos empiezan por el prefijo 'recoger'.
Pues es una buena idea colocarlos en una clase aparte 'Recoger' tal vez, y dentro de ella los métodos pierden el prefijo 'recoger' y los llamas desde el main por ejemplo así:
    Recoger.menu();
    Recoger.año(boolean envaseOCaducidad);
etc. tal como haces con la clase EntradaDatos.

Si solo fueran dos o tres métodos, tal vez no haría falta, pero ahora tienes unos cuantos y como resultado la clase del main parece más ligera.

Aprovecho la ocasión para apuntar.
BlueJ acepta la 'ñ' en el código, pero no sé otros IDEs o sistemas. De la misma forma que no usamos acentos en el código, es mejor no usar los acentos ni eñes y usar palabras que no incorporen esos signos de puntuación.

Saludos

10
Hola Lorenzo

La estructura de clases en tu ejercicio es correcta. OK.
Y gestionas las fechas con la clase Calendar. Bien.

Solo he visto un pequeño defecto inducido tal vez por las prisas.
En el constructor de la clase PFresco la instrucción:
        fechaEnvasado.set(yearEnvasado, monthEnvasado,dayEnvasado);
debería ser:
        fechaEnvasado.set(yearEnvasado, monthEnvasado-1,dayEnvasado);

Tu nueva clase testHerencia2 está muy bien, permitiendo añadir productos de varios tipos.
Aunque el uso de un array limitado a 10 elementos necesitaría código suplementario para ampliar su tamaño.
Se puede usar la clase ArrayList para guardar los productos y ella misma ampliará su tamaño cuando lo necesite en forma transparente para nosotros. Adjunto versión modificada con ArrayList


En este ejercicio se puede usar la herencia de las clases a la hora de mostrar la información de cada producto.
En lugar de que cada producto tenga un método de nombre único para mostrar los atributos de la clase, se puede crear en cada clase el método por ejemplo mostrarDatos() que contendrá en cada clase las intrucciones necesarias para mostrar dichos atributos, resultando así que el método en la clase Producto sería:
Código: [Seleccionar]
    public void mostrarDatos(){
        System.out.println("El número de lote es: "+ numeroLote +
        "\n su fecha de caducidad es: " + getFecha() );
    }
y en la clase PFresco:
Código: [Seleccionar]
    public void mostrarDatos(){
        super.mostrarDatos();
        System.out.println("su origen es: " + origen +
        "\n y su fecha de envasado es: " + getFechaEnvasado() + "\n" );
    }

Estos cambios permiten sustituir la siguiente línea en la opción 4 del main:
Código: [Seleccionar]
    if (listaProductos.get(x) instanceof PFresco) { System.out.println("Producto Fresco \n"); PFresco temp = (PFresco)listaProductos.get(x); temp.mostrarFechaYLote(); temp.mostrarFechaEnvasadoYOrigen(); por la línea:
Código: [Seleccionar]
    if (listaProductos.get(x) instanceof PFresco) { System.out.println("Producto Fresco \n"); PFresco temp = (PFresco)listaProductos.get(x); temp.mostrarDatos();
Clase testHerencia3
Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;

public class testHerencia3{

    public static void main(String[] args){

//         int tamaño = 10;
        int numeroMenu;
//         Producto [] listaProductos = new Producto [tamaño];
        ArrayList<Producto> listaProductos = new ArrayList<Producto>();
        int indice = 0;

     
        do{

            System.out.println(" 1.- Introducir nuevo producto FRESCO \n 2.- Introducir nuevo producto CONGELADO \n 3.- Introducir nuevo producto REFRIGERADO \n 4.- Mostrar productos \n 5.- Salir ");
            numeroMenu = recogerMenu();
           
           
            switch(numeroMenu){
                case 1: System.out.println("Creando nuevo producto fresco... \n ");  //los true, false de los métodos es un boolean para distinguir si es fecha caducidad o fecha envase
//                 listaProductos [indice] = new PFresco(recogerAño(true),recogerMes(true),recogerDia(true),recogerOrigen(),recogerAño(false),recogerMes(false),recogerDia(false),recogerNumeroLote() );
                listaProductos .add( new PFresco(recogerAño(true),recogerMes(true),recogerDia(true),recogerOrigen(),recogerAño(false),recogerMes(false),recogerDia(false),recogerNumeroLote() ));
                indice++; break;

                case 2: System.out.println("Creando nuevo producto congelado... \n ");     
//                 listaProductos [indice] = new PCongelado(recogerAño(false),recogerMes(false),recogerDia(false), recogerTemperatura(), recogerNumeroLote() );
                listaProductos  .add( new PCongelado(recogerAño(false),recogerMes(false),recogerDia(false), recogerTemperatura(), recogerNumeroLote()) );
                indice++; break;

                case 3: System.out.println("Creando nuevo producto refrigerado... \n ");
//                 listaProductos [indice] = new PRefrigerado(recogerAño(false),recogerMes(false), recogerDia(false), recogerCodigoSupervisor(), recogerNumeroLote() );
                listaProductos  .add( new PRefrigerado(recogerAño(false),recogerMes(false), recogerDia(false), recogerCodigoSupervisor(), recogerNumeroLote() ));
                indice++; break;
               
                case 4: System.out.println("La lista es \n");
                   for(int x = 0; x < indice; x++){
                      if (listaProductos.get(x) instanceof PFresco) { System.out.println("Producto Fresco \n"); PFresco temp = (PFresco)listaProductos.get(x); temp.mostrarFechaYLote(); temp.mostrarFechaEnvasadoYOrigen();
                    }else if (listaProductos.get(x) instanceof PRefrigerado){System.out.println("Producto Refrigerado \n"); PRefrigerado temp = (PRefrigerado)listaProductos.get(x); temp.mostrarFechaYLote(); temp.mostrarCodigoSupervidor();
                    } else if(listaProductos.get(x) instanceof PCongelado) { System.out.println("Producto Congelado \n"); PCongelado temp = (PCongelado)listaProductos.get(x); temp.mostrarFechaYLote(); temp.mostrarTemperaturaRecomendada();
                    }
                     } break;
               

            }
        }while(numeroMenu != 5);
    }

    public static int recogerMenu(){ //método que controla la seleccion del menú
        int numero = 0;   
        do{
            System.out.println(" Elige una opción entre 1 y 5 \n ");
            numero = EntradaDatos.recogerEntero();   
        } while (numero < 1 || numero > 5);
        return numero;
    }

    public static int recogerAño(boolean envaseOCaducidad){
        int numero = 0;   

        do{

            if (envaseOCaducidad){ System.out.println(" Introduce el año de envase ");
            }else { System.out.println(" Introduce el año de caducidad:"); }

            numero = EntradaDatos.recogerEntero();   
        } while (numero < 2015 || numero > 2100);
        return numero;
    }

    public static int recogerMes(boolean envaseOCaducidad){
        int numero = 0;   

        do{
            if (envaseOCaducidad){ System.out.println(" Introduce el mes de envase ");
            }else { System.out.println(" Introduce el mes de caducidad:"); }

            numero = EntradaDatos.recogerEntero();   
        } while (numero < 1 || numero > 12);
        return numero;
    }

    public static int recogerDia(boolean envaseOCaducidad){
        int numero = 0;   

        do{
            if (envaseOCaducidad){ System.out.println(" Introduce el dia de envase ");
            }else { System.out.println(" Introduce el dia de caducidad:"); }

            numero = EntradaDatos.recogerEntero();   
        } while (numero < 1 || numero > 31);
        return numero;
    }

    public static int recogerNumeroLote(){ System.out.println(" Introduce el número de Lote "); return EntradaDatos.recogerEntero(); }

    public static int recogerTemperatura() {
        int numero = 80;
        System.out.println("Introduce la temperatura");
        do{
            numero = EntradaDatos.recogerEntero();
        } while ( numero < -40 || numero > 50 );
        return numero;
    }
    public static String recogerOrigen(){ System.out.println("Introduce el país de origen del producto "); return EntradaDatos.recogerCadena(); }
   
    public static String recogerCodigoSupervisor(){ System.out.println("Introduce el código de supervisor del producto "); return EntradaDatos.recogerCadena(); }
}

Saludos y adelante

11
Hola Lorenzo

Iba a comentar tu mensaje previo, pero al ver tu nueva versión, me tomo mi tiempo para mi nuevo comentario

Saludos y hasta pronto

12
Hola arcanFAC

Me ha gustado tu versión para este ejercicio. OK
Y has añadido la clase Intermedio que controla las listas de los productos. Bien.

Aquí van mis comentarios a tu código con posibles mejoras.

Todos tus productos tienen el método imprimirInformacion() excepto la clase Producto. Si esta clase también lo tubiera, sería mas o menos:
Código: [Seleccionar]
    public void imprimirInformacion(){
    System.out.println("\nNombre del producto: " + getNombreProducto() + "\nFecha de caducidad: " + getFechaDeCaducidad()+ "\nNumero de lote: ");

Y luego en los productos que heredan de esta clase, el método imprimirInformacion() quedaría más o menos así para la clase ProductoCongelado:
Código: [Seleccionar]
    public void imprimirInformacion(){
        super.imprimirInformacion();
        System.out.println( "\nTemperatura de congelación recomendada: " + getTempCongelacionR());
    }
Como ves, invocamos el método imprimirInformacion() de la clase padre y luego presentamos los atributos propios de la clase actual.

Luego en la clase Intermedio en el método imprimirProductos(), con un condicional, si tu lista de productos está vacía, en lugar de mostrar el mensaje:
    Los productos frescos que han sido guardados son:
seguido de una lista en blanco.
Mostrar otro como:
    No hay productos fescos guardados.

Como ves no son grandes mejoras, pero ayudan en el primer caso a no repetir código (si hubiera que modificarlo bastaría con hacerlo en la clase Producto, no en cada una de las clases herederas) y en el segundo a no mostrar mensajes inexactos.

Saludos

13
Hola Dan

Aquí tienes un enlace al mismo ejercicio hecho por otro usuario del foro.
Si quieres hacer tu propia versión para este ejercicio, estudia el código y adáptalo a tu gusto.

https://www.aprenderaprogramar.com/foros/index.php?topic=2229.msg10737#msg10737

Saludos

14
Hola Dan

Citar
Busca información en la documentación oficial de Java sobre la interface Iterable. ¿Qué clases de las que conoces implementan esta interface? ¿Qué método han de tener disponible las clases que implementan esta interface? ¿Para qué sirve este método?

El siguiente enlace muestra la información a buscar
    http://docs.oracle.com/javase/6/docs/api/java/lang/Iterable.html

En la página anterior bajo en rótulo 'All Known Implementing Classes' se muestran todas las clases que implementan la interface Iterable (aquí estarán algunas de las que conoces)

Bajo el rótulo 'Method Summary' están todos los métodos de esta Interface

Ya te hemos hechado una mano.

Saludos.

15
Hola Dan

Ejercicio correcto. OK

En las preguntas del ejercicio:
Citar
¿Qué tipo de datos almacena el array? ¿Qué tipo de datos almacena el ArrayList?

Se pregunta sobre 'el array' y 'el ArrayList' del ejercicio actual, no a 'cualquier array o ArrayList' en el lenguaje de Java.

En la lección CU00669B se explica que un array puede contener tanto primitivos como objetos de cualquier tipo como:
int, double, Integer, Double, Persona, Taxi, etc.

En cambio un ArrayList solo puede contener objetos como:
Integer, Double, Persona, Taxi, etc.

Está bien que juegues con el código probando cosas. Se aprende así.
Pero también se aprende teniendo en cuenta las enseñanzas que recibimos en las clases teóricas.

Saludos

16
Hola Dan

Presentación correcta para este ejercicio.

Tus exposiciones son muy visuales, sueles incluir imágenes de tu ejercicio.
En el caso actual la vista del árbol de proyectos es ilustrativo de tu trabajo colocando las clases en el package adecuado.

Para este ejercicio, también habría valido presentar las clases (vacías de código como de indica en el enunciado) teniendo el cuidado de que cada clase incluya en su cabecera el package al que pertenece.

Saludos y adelante.

17
Hola Dan

Ejercicio correcto. Y el main con su menú. OK

La respuesta:
Citar
No. Porque el static no se puede declarar en un método. Solo cabecera. Lo unico valido es el final.

Es cierta. Tal como dices no se puede declarar una variable static en un método.

Pero la pregunta era si se puede crear un método (setter) para modificar el valor de numeroPi.
Y la respuesta sigue siendo 'No' porque la palabra clave 'final' convierte el valor en 'constante' que por definición no se puede modificar.

Saludos

18
Hola Dan

En tu ejercicio cumples las peticiones del enunciado gestionando la lista de cantantes famosos. Bien.

Dan, voy a comentar detalles de tu código para que puedan mejorar si cabe.

Tu clase Lector, es sencilla y operativa al 100%, no tiene ningún defecto. Es posible que hayas oido hablar de las convenciones a la hora de bautizar los métodos en Java.
Siguiendo esa convención tu método:
    LeerCadena()
debería llamarse:
    leerCadena()
----
En tu clase ListaCantantesFamosos la siguiente instrucción:
    cantantes = new <String> ArrayList(2);
provoca un warning, que se elimina al remodelarla así:
    cantantes = new  ArrayList<String>(2);

Tienes en esta clase un método:
    setCantante(String name)
que parece un setter cuando no lo es, sería mejor llamarlo
    añadirCantante, addCantante, incluirCantante, o algo por el estilo indicando que su tarea es esa, añadir un nuevo cantante.
----
En la clase Test creas la instancia 'Lista' de tipo ListaCantantesFamosos que siguiendo la convención camelCase debería llamarse 'lista'

El siguiente código:
Código: [Seleccionar]
            int i = 0;
            for(String data: Lista.cantantes){
                System.out.println(i+1 + ". " + data + ".");
                i++;
            }
aunque escueto, debería formar parte de la clase ListaCantantesFamosos pues manipula datos de esa clase. Por cierto el atributo de esa clase 'cantantes' debería ser private y no ser accesible directamente desde la clase Test.

En esta clase, la variable 'si' se inicializa en cada bucle y no toma parte en ninguna decisión del código, si fuera eliminada, el programa funcionaria exactamente igual.

Saludos

19
Hola Alberto

Tu ejercicio con el bucle for está bien.

Aunque me pregunto porque creas el contador 'a' si ya tienes el contador del bucle for 'i'
Por otra parte la siguiente instrucción
    a = (0 + a);
no tiene ninguna utilidad
    a++;
esta sí

Este ejercicio es bastante sencillo. Quiero proponerte que lo reformes, para quitar código y variables innecesarias. Y ya puestos conseguir una salida del tipo:

Letra 1: a
Letra 2: v
Letra 3: e

Saludos

20
Hola Andromon

Estas en lo cierto. Cuando tienes que crear un nuevo objeto basado en una clase existente, puedes usar cualquiera de los constructores que tiene la clase.
Si tienes varios constructores con distinto número de parámetros, usa el que te convenga según la ocasión.

Otra forma de decirlo.
Si en un supermercado tienes varias ofertas de ahorro. Escoge la que sea más adecuada a tu necesidad. Elige la más ventajosa para tí.

Saludos

Páginas: [1] 2 3 4 5 6 ... 25

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