Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: momo en 19 de Septiembre 2014, 05:41
-
Bueno aquí dejo el ejercicio creo que le faltan algunos detalles . al ejercicio le añadí una clase aparte que es donde va a pedir la entrada del teclado . espero a ver cumplido con lo requerido del ejercicio.
Si tiene Errores y Necesita Modificaciones por favor me lo dicen lo tomare en cuenta para llegar a tener un mayor aprendizaje.
Muchas Gracias...
EJERCICIO:
/* Crea una clase denominada ListaCantantesFamosos que disponga de un atributo ArrayList
* listaCantantesFamosos que contenga objetos de tipo CantanteFamoso. La clase debe tener
* un método que permita añadir objetos de tipo CantanteFamoso a la lista. Un objeto de tipo
* CantanteFamoso tendrá como atributos nombre (String) y discoConMasVentas (String), y los métodos
* para obtener y establecer los atributos. Crea una clase test con el método main que inicialice un objeto
* ListaCantantesFamosos y añade manualmente dos objetos de tipo CantanteFamoso a la la lista. Usando
* iterator muestra los nombres de cada cantante y su disco con más ventas por pantalla. Se debe pedir
* al usuario un nombre y disco con más ventas de otro cantante famoso, y una vez introducidos los datos
* mostrar la lista actualizada usando iterator. Una vez mostrada la lista actualizada, se debe dar opción
* a elegir entre volver a introducir los datos de otro cantante o salir del programa (se podrán introducir
* tantos datos de cantantes como se desee. Para ello usa un bucle while que dé opción a elegir al usuario).
* Puedes comprobar si tu código es correcto consultando en los foros aprenderaprogramar.com.
TESTLISTACANTANTEFAMOSO...
import java.util.Scanner;
import java.util.Iterator;
public class TestListaCantanteFamoso
{
public static void main(String [] args)
{
Scanner entrada=new Scanner(System.in);
ListaCantanteFamoso lista=new ListaCantanteFamoso(" Madonna","All I want is you");
boolean otroCantante =true;
while(otroCantante==true)
{
lista.agregar();//Este Metodo Agrega a los Cantantes con los discos mas vendidos
lista.mostrarLista();
System.out.println("Deceas Agregar otro Cantante :");
System.out.println("Si: s o No: n");
String resp=entrada.nextLine();
//Se Hace la condicion para saber si queremos agregar otro cantante si la letra es "s" o "S" lo agrega si la letra es "n" o "N" no lo agrega,
//y pasa a mostrar el tamaño de la lista y lista con el nombre de todos los cantantes
if(resp.equals("s")==true || resp.equals("S")==true)
{
otroCantante=true;//se iguala a True para que inicie de nuevo a agregar al cantante
}else if(resp.equals("n")==false || resp.equals("N")==false)
{break;//Rompe la condicion del IF
}//Fin If Anidado
}
System.out.println("Tamaño De La Lista : "+lista.tamañoLista());
System.out.println("ADIOS....!! ");
}//Fin while
}//fin main
LISTACANTANTEFAMOSO...
import java.util.ArrayList;
import java.util.Iterator;
public class ListaCantanteFamoso
{
private ArrayList<CantanteFamoso>listaCantanteFamoso;
public ListaCantanteFamoso(String nombre,String disco)
{
listaCantanteFamoso=new ArrayList<CantanteFamoso>();
addCantante(nombre,disco);
}
public void addCantante(String valorNombre,String valorDiscoConMasVentas)
{
listaCantanteFamoso.add(new CantanteFamoso(valorNombre,valorDiscoConMasVentas));
}
public void agregar()
{
System.out.println("Nombre :");
EntradaTeclado primeraEntrada=new EntradaTeclado();
System.out.println("Disco Con Mas Ventas :");
EntradaTeclado segundaEntrada=new EntradaTeclado();
listaCantanteFamoso.add(new CantanteFamoso(primeraEntrada.getEntrada(),segundaEntrada.getEntrada()));
}
public void mostrarLista()
{
Iterator<CantanteFamoso>it=listaCantanteFamoso.iterator();
CantanteFamoso analizador;
while(it.hasNext())
{
analizador=it.next();
System.out.println("Nombre : "+analizador.getNombre()+" "+"Disco Con Mas Ventas :"+analizador.getDiscoConMasVentas());
}
}
public int tamañoLista()
{ return listaCantanteFamoso.size();}
}
CANTANTEFAMOSO.
import java.util.Scanner;
public class CantanteFamoso
{
private String nombre,discoConMasVentas;
private String teclado;
public CantanteFamoso(String valorNombre,String valorDiscoConMasVentas)
{
nombre=valorNombre;
discoConMasVentas=valorDiscoConMasVentas;
}
public String getNombre(){return nombre;}
public String getDiscoConMasVentas(){return discoConMasVentas;}
}
ENTRADATECLADO..
import java.util.Scanner;
public class EntradaTeclado
{
private String entradaTeclado;
public EntradaTeclado()
{
entradaTeclado="";
solicitarEntrada();
}
public void solicitarEntrada()
{
Scanner escanearEntrada=new Scanner(System.in);
entradaTeclado=escanearEntrada.nextLine();
}
public String getEntrada(){return entradaTeclado;}
}
-
Hola momo
Tu ejercicio es operativo y funciona, pero quiero señalarte varios puntos.
Tu clase CantanteFamoso, carece de métodos set.
Continúa siendo operativa, pero está coja, no se puede aprovechar su funcionalidad al 100%
Tienes que partir de la máxima de:
Un atributo, un método set y uno get. Sin excepción. Si no, serian unos atributos inamovibles, que no se pueden modificar.
Tampoco declaras un constructor sin parámetros.
Piensa que te puede interesar crear un CantanteFamoso ahora, para más tarde rellenar sus atributos (con los métodos set)
En tu clase ListaCantanteFamoso (era más adecuado ListaCantantesFamosos, ahora parece que tu lista solo tendrá un cantante)
Tienes este método
public void addCantante(String valorNombre,String valorDiscoConMasVentas)
Como argumentos le das al método los atributos del nuevo cantante, pero lo correcto es que le des un argumento solo, así:
public void addCantante(CantanteFamoso nuevoCantante)
Los atributos del cantante ya se gestionarán en la clase CantanteFamoso pues es su trabajo.
Además este código tiene la ventaja de trabajar con objetos.
Piensa que si más tarde añades un nuevo atributo a la clase CantanteFamoso. Tendrías que venir aquí y añadir el parámetro al método addCantante.
En cambio si le das como parámetro un objeto (CantanteFamoso) ya vendrá con sus atributos inicializados.
Otra cosa, este método addCantante no lo usas para añadir cantantes. Está creado, pero no lo usas en ningún momento.
Para añadir cantantes usas el método 'add', tal vez sin saberlo, de la clase importada ArrayList.
El método
public void agregar()
que colocas en esta clase, debería estar en la clase con main
El método main es el que se encarga de dirigir el trabajo, da instrucciones a las otras clases usando sus métodos, los métodos de ellas para realizar el trabajo.
Además, ya tienes un método para añadir cantantes (aunque no lo hayas usado)
El método
public void mostrarLista()
Es un método apropiado en la clase ListaCantanteFamoso para mostrar el contenido del ArrayList
Finalmente en la clase TestListaCantanteFamoso
Crea una clase test con el método main que inicialice un objeto ListaCantantesFamosos y añade manualmente dos objetos de tipo CantanteFamoso a la la lista. Usando iterator muestra los nombres de cada cantante y su disco con más ventas por pantalla. Se debe pedir al usuario un nombre y disco con más ventas de otro cantante famoso, y una vez introducidos los datos mostrar la lista actualizada usando iterator. Una vez mostrada la lista actualizada, se debe dar opción a elegir entre volver a introducir los datos de otro cantante o salir del programa (se podrán introducir tantos datos de cantantes como se desee. Para ello usa un bucle while que dé opción a elegir al usuario).
Se pide crear dos cantantes y mostrar sus atributos por pantalla
Tu creas un cantante, que por cierto no lo creas con su clase CantanteFamoso, sino con la clase ListaCantanteFamoso (incorrecto)
Luego pides los datos para un nuevo cantante para mostrar al fin los cantantes que tienes en la lista.
A partir de aquí el código cumple, mostrando cada vez que añades un cantante, la lista completa de cantantes hasta que escoges salir del bucle.
Te pongo un enlace para que tengas otras referencias.
https://www.aprenderaprogramar.com/foros/index.php?topic=1030.msg5823#msg5823
Saludos
-
Hola Toni como estas en realidad se que el ejercicio tiene muchos detalle . Me a costado un poco elaborar el ejercicio pero bueno lo termine elaborando cumpliendo con el funcionamiento mas no con el objetivo del enunciado.
Tomare en cuenta tus observaciones y lo arreglare de nuevo .
Gracias por tus Observaciones amigo .
-
NOTA: Ejercicio Modificado
Este Ejercicio que Esta Nueva Mente Subido es por que el anterior que esta mas abajo este mal elaborado aunque funciona..
Espero que este Ejercicio si de Con lo Cumplido..
Tomare en cuenta sus observaciones muchas gracias ...
CantanteFamoso
import java.util.Scanner;
public class CantanteFamoso
{
private String nombre,discoConMasVentas;//Atributos de la clase
private String entrada;//Atributo de la clase . Este es para la entrada del teclado
public CantanteFamoso()//Constructor sin parametro
{
nombre="";
discoConMasVentas="";
entrada="";
entradaTeclado();
}
public CantanteFamoso(String valorNombre,String valorDiscoConMasVentas)//Constructor con parametro
{
nombre=valorNombre;
discoConMasVentas=valorDiscoConMasVentas;
}
public void entradaTeclado()// Metodo para pedir la entrada de teclado
{
Scanner entradaTeclado= new Scanner(System.in);
entrada=entradaTeclado.nextLine();
}
//Comienzan los metodos Setter;
public void setNombre(String valorNombre)
{
nombre=valorNombre;
}
public void setDiscoConMasVentas(String valorDiscoConMasVentas)
{
discoConMasVentas=valorDiscoConMasVentas;
}//Fin setter
//Comienza los Metodos getter;
public String getNombre(){return nombre;}
public String getDiscoConMasVentas(){return discoConMasVentas;}
public String getEntrada(){return entrada;}
//fin getter
}
ListaCantanteFamoso
import java.util.ArrayList;
import java.util.Iterator;
public class ListaCantanteFamoso
{
private ArrayList<CantanteFamoso>listaCantanteFamoso;//Creamos el objeto ArrayList
public ListaCantanteFamoso()//Constructor de la Clase
{
listaCantanteFamoso=new ArrayList<CantanteFamoso>();//Inicializamos el objeto ArrayList
}
public void addCantante(CantanteFamoso valorCantante)//Almacenamos los Cantantes
{
listaCantanteFamoso.add(valorCantante);
}
public void mostrarLista()
{
Iterator<CantanteFamoso>it=listaCantanteFamoso.iterator();//Creamor el Objeto Iterador para
//Mostrar La lista
CantanteFamoso analizador;
//En este WHILE Se mhace el procedimiento para que se muestre la lista
while(it.hasNext())
{
analizador=it.next();
System.out.println("Nombre : "+analizador.getNombre()+" "+"Disco Con Mas Ventas :"+analizador.getDiscoConMasVentas());
}
}
public CantanteFamoso getCantante(int posicion)
{
if(posicion >= 0 && posicion < listaCantanteFamoso.size())
{
return listaCantanteFamoso.get(posicion);
}else{return null;}
}
public CantanteFamoso getRemoverCantante(int posicion)
{
if(posicion>=0 && posicion<listaCantanteFamoso.size())
{
return listaCantanteFamoso.remove(posicion);
}else {return null;}
}
public int getTamaño(){ return listaCantanteFamoso.size();}
}
TestListaCantanteFamoso
import java.util.Scanner;
public class TestListaCantanteFamoso
{
public static void main(String[] args)
{
ListaCantanteFamoso lista=new ListaCantanteFamoso();//Creamos un objeto ListaCantanteFamoso;
Scanner tecladoEscaner=new Scanner(System.in);
CantanteFamoso cantante=new CantanteFamoso("Madonna","All I want is you");//
lista.addCantante(cantante); // Se Ingresa los dos cantantes de forma automatica
cantante=new CantanteFamoso("Jorge Negrete","Jalisco"); //
lista.addCantante(cantante);// Se almacenan los dos cantantes en la lista
System.out.println("Lista Inicial :");
lista.mostrarLista(); //Muestra la lista inicial
System.out.println("Deceas Agregar otro Cantante");//
System.out.println("Si: s y No:n"); //Condicion para entrar al WHILE
String otroCantante=tecladoEscaner.nextLine(); //
while (otroCantante.equals("s"))
{
System.out.println("Nombre Del Cantante :");
CantanteFamoso entrada = new CantanteFamoso();//Creamos el objeto de Cantante Famoso --->Entrada Teclado
System.out.println("Disco Con Mas Ventas :");
CantanteFamoso entrada2 = new CantanteFamoso();//Creamos otro objeto de Cantante Famoso------->Entrada Teclado
CantanteFamoso cantante2=new CantanteFamoso(entrada.getEntrada(),entrada2.getEntrada());//Creamos un objeto de Cantante Famoso
//con dos parametros esos dos parametros seran las entrada de teclado
lista.addCantante(cantante2);//almacenamos el objeto. en la lista
System.out.println("ListaActualizada :");
lista.mostrarLista();//Muestra la lista Actualizada
System.out.println("Deceas Agregar otro Cantante");
System.out.println("Si: s y No:n");
String resp=tecladoEscaner.nextLine();
if(resp.equals("s")==true)//Condicion si deceamos ingresar de nuevo a otro Cantante
{
otroCantante.equals("s");//se iguala a True para que inicie de nuevo a agregar al cantante
}else
{break;//Rompe la condicion del IF
}
}
System.out.println("Tamaño de la lista :"+ lista.getTamaño());
System.out.println("Adios...");
}
}
-
Hola momo!
Tu ejercicio en algunas partes cumple con lo requerido en el enunciado, y en otras partes no.
Se debe pedir al
usuario un nombre y disco con más ventas de otro cantante famoso, y una vez introducidos los datos
mostrar la lista actualizada usando iterator. Una vez mostrada la lista actualizada, se debe dar opción a
elegir entre volver a introducir los datos de otro cantante o salir del programa (se podrán introducir
tantos datos de cantantes como se desee
Con relación a esta parte del ejercicio, cumples con la parte de dar la opción de agregar otro cantante famoso o salir del programa. Pero según lo que pide este párrafo del ejercicio, agregar un tercer cantante a la lista es un requisito y no una opción, en tu programa se puede terminar el programa solo con los 2 cantantes que tiene la lista por defecto, si así el usuario lo deseara. Si esto sucede pues incumples con lo que pide el ejercicio.
Por otra parte, en relación al diseño del código hay barios puntos a comentar.
1ro: public class CantanteFamoso
punto 1: Veo que has decidido que lo que en la versión anterior de este ejercicio fue public class EntradaTeclado pase a ser en esta nueva versión de tu ejercicio un método de la clase CantanteFamoso (mala decision). El nombre de una clase dice lo que es o lo que hace, añadir tareas como la de pedir una entrada por teclado a esta clase, no es algo apropiado, lo mas apropiado hubiese sido que el método entradaTeclado(); fuese una clase que se encargue de crear una entrada de texto para el usuario, y no un método de la clase CantanteFamoso.
2do: public class ListaCantanteFamoso
punto 1: public CantanteFamoso getCantante(int posicion)
{
if(posicion >= 0 && posicion < listaCantanteFamoso.size())
{
return listaCantanteFamoso.get(posicion);
}else{return null;}
}
Este metodo aparte de que no es necesario y nunca lo usas, tiene un if que no tiene mucha logica.
punto 2: public CantanteFamoso getRemoverCantante(int posicion)
{
if(posicion>=0 && posicion<listaCantanteFamoso.size())
{
return listaCantanteFamoso.remove(posicion);
}else {return null;}
}
Lo primero es el nombre del método, no es apropiado, lo segundo es que este método deberia de ser tipo procedimiento y no tipo funcion, la finalidad del método
remove(int index); es realizar una tarea (eliminar un objeto en la List) No es muy lógico que el método elimine un objeto y seguido devuelva el objeto que elimino, lo tercero es al igual que el anterior método la aparición de un if que no tiene mucho sentido y que podría dar lugar a confusión posteriormente a lo largo del desarrollo del programa, lo cuarto es que este método lo creas pero no lo usas en ninguna parte, por tanto y dada su utilidad creo que esta de mas.
3ro: public class TestListaCantanteFamoso
punto 1: la declaración en cabecera de clase, import java.util.Scanner; al ver esto se entiende que tu intención es crear un o varios objetos tipo Scanner a lo largo del desarrollo de esta clase, para crear entradas de teclado. Esto es contraproducente puesto que ya tienes el metodo entradaTeclado(); de la clase CantanteFamoso que se supone usarías para manejar todas las entradas de teclado del programa, a pesar de que esto esta mal, porque como ya te dije, debió de ser una clase y no un método en una clase que no concuerda, al tu no usar este método para pedir todas las entradas de teclado del programa (no digo que usarlo desde la clase en que esta sea correcto) estas cometiendo lo que yo llamaría un error doble. Imagínate que si as creado una clase que se encargue de crear una entrada de teclado, y que otras clases la pueden usar para pedir entradas de teclado, imagínate que en otra clase declaras en cabecera de clase:
import java.util.Scanner; con la intención de crear un objeto tipo Scanner y usarlo para pedir entradas de teclado. Para que entonces creaste la clase que se supone aria esta tarea? es algo similar lo que pasa con tu metodo entradaTeclado y la clase con main.
punto 2: if(resp.equals("s")==true)//Condicion si deceamos ingresar de nuevo a otro Cantante
{
otroCantante.equals("s");//se iguala a True para que inicie de nuevo a agregar al cantante
}else
{break;//Rompe la condicion del IF
}
El ==true dentro en este if, no es necesario, el bucle seguirá dando vueltas mientras otroCantante sea igual que "s" sin la necesidad de ==true.
De mi parte esos han sido los puntos mas necesarios a comentar, otros puntos o detalles los iras puliendo con el tiempo, por ejemplo yo en lo personal cambiaría tu linea de código en la clase con main:
System.out.println("Tamaño de la lista :"+ lista.getTamaño());
por:
System.out.println("Total de cantantes en la lista :"+ lista.getTamaño() + " cantantes");
Esto no surte ninguna variación en la funcionalidad del programa, pero muestra algo mas entendible para el usuario.
Saludos!
-
Hola Sniper Gracias Por tus observaciones bueno corregiré el ejercicio por tercera vez tomando en cuenta lo que me dijiste. Aunque esta vez ya no vuelvo a publicar el ejercicio
Muchas Gracias amigo poco a poco voy aprendiendo mas y con ayuda de ustedes que le pueden decir los detalles que tienen los ejercicio pues uno toma en cuenta eso y se va puliendo uno poco a poco .