Autor Tema: DiscMan 2. Ejemplo código Java con menú e introducir datos por consola.  (Leído 41906 veces)

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Buenas tardes

Esta vez no he venido a resolver un ejercicio, sino que vine a resolver una metida de pata del pasado (Que fue bastante grande creo xD). Hace aproximadamente 26 días, escribí un código sobre el Ejercicio CU00630B (Que por cierto, también no tenia que escribir nada de codigo.) que presentaba varios problemas.

Para los curiosos que quieran saber sobre esta metida de pata, aquí esta:

https://www.aprenderaprogramar.com/foros/index.php?topic=2090.msg10282#msg10282

He creado la versión 2 de "DiscMan", y lo presento aquí, para saber en que mejorar y demás. Es lo mismo que antes... 3 discos, hasta 20 temas musicales, etc. Aun no termino el curso, estoy en el punto 62, tomen en cuenta esto por si cometí otra vez una metida de pata por favor! Jajaja!

Primero, les comparto lo que hice. Basándome en el pensar "Divide y vencerás.",cree 4 clases en total:

1. La clase DiscosMusicales que usaremos para crear los 3 objetos Disco o "DiscosMusicales".

Código: [Seleccionar]
package Discos;
public class DiscosMusicales {
    private String nombreDisco, autor, formato, nombreCancion[]= new String[19];
    private double duracion, duracionCancion[] = new double[19];
    private int numeroCanciones;
   
    public DiscosMusicales(){
        nombreDisco = "";
        autor = "";
        formato = "";
        duracion = 0;
        numeroCanciones = 0;
        nombreCancion = new String[]{"","","","","","","","","","","","","","","","","","","",""};
        duracionCancion = new double[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};     
    }   
   
     public void setNombreDisco(){
        System.out.println("--------------------------------------------");
        Lectores leer = new Lectores();
        System.out.println("Ingrese el nombre del disco: ");
        nombreDisco = leer.LeerCadena();
    }
     
     public void setAutor(){
         Lectores leer = new Lectores();
         System.out.println("Ingrese el nombre del autor de este disco: ");
         autor = leer.LeerCadena();
     }
     
     public void setFormato(){
         Lectores leer = new Lectores();
         System.out.println("Ingrese el formato del disco: ");
         formato = leer.LeerCadena();
     }
     
     public void setCanciones(){
         Lectores leer = new Lectores();
         do{
         System.out.println("¿Cuantas canciones son?: ");
         numeroCanciones = leer.LecturaEntero();
         if(numeroCanciones > 20){System.out.println("Solo se pueden ingresar hasta 20 temas musicales. \nIntente de nuevo.");
         System.out.println("                                     ");
         }
         }while(numeroCanciones > 20);
         for (int i = 0, j = 1; i < numeroCanciones; i++, j++){
         System.out.println("Ingrese el nombre de la cancion numero " + j + ": ");
         nombreCancion[i] = leer.LeerCadena();       
         System.out.println("Ingrese la duracion de la cancion numero " + j + ": ");
         duracionCancion[i] = leer.LecturaDecimal();
         duracion = duracion + duracionCancion[i];
     }
         System.out.println("Datos Listos!.");
         System.out.println("--------------------------------------------");
     }
             
     public String getNombreDisco(){
         return nombreDisco;
     }
     
     public String getAutor(){
         return autor;
     }
     
     public String getFormato(){
         return formato;
     }
     
     public void getCanciones(){
         for (int i = 0, j = 1; i < numeroCanciones; i++, j++){
             System.out.println(j + ". " + nombreCancion[i] + " (Duracion: " + duracionCancion[i] + ").");
         }
         System.out.println("*************************************************************************");
         System.out.println("Duracion total del disco: " + duracion);
         System.out.println("-------------------------------------------------------------------------");
     }
}

2. La clase Lectores que se utilizara para leer los datos que el usuario ingrese.

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

public class Lectores {   
   
    public Lectores(){}
   
    public String LeerCadena(){
        Scanner in = new Scanner(System.in);       
        return in.nextLine();
    }
   
    public Double LecturaDecimal(){
        Scanner in = new Scanner(System.in);
        return in.nextDouble();
    }
   
    public int LecturaEntero(){
        Scanner in = new Scanner(System.in);
        return in.nextInt();
    }
   
    public char LecturaChar(){
        Scanner in = new Scanner(System.in);
        return in.next().charAt(0);
    }
}

3. La clase Menu en donde vamos a ejecutar diferentes menús de operaciones. Me lo imagine así: Como el sirviente, recepcionista, mesero, etc... que te pregunta que deseas hacer, ejecutar, que quieres ver y demás.

Código: [Seleccionar]
package Discos;
public class Menu {
    DiscosMusicales Disco1 = new DiscosMusicales();
    DiscosMusicales Disco2 = new DiscosMusicales();
    DiscosMusicales Disco3 = new DiscosMusicales();
    int elige;
    boolean sal1 = false, sal2 = false;
    public char opcion;
   
    public Menu(){opcion = ' ';}
   
     public void MenuPrincipal(){
        Lectores leer = new Lectores(); 
        sal1 = false;
        do{
        System.out.println("Bienvenido a la nueva actualizacion de DISCMAN! \nPara salir del programa, aprete 4. \nElige uno de los 3 discos para empezar: ");
        elige = leer.LecturaEntero();
        if (elige <= 3){ MenuDisco();}
        else if (elige == 4) { System.out.println("Nos vemos pronto!!!"); sal2 = true;}
        else
            System.out.println("Opcion desconocida. Intente de nuevo.");
            System.out.println("                                     ");
        }while(sal2 == false);
    }
   
    public void MenuOperaciones(){   
    Lectores leer = new Lectores();
    System.out.println("Elige una opcion que desees ejecutar en el menú: ");
    System.out.println("Ingrese A para agregarle datos al disco.");
    System.out.println("Ingrese B para imprimir todos los datos del disco.");
    System.out.println("Ingrese C para volver al menu de elegir disco.");
    System.out.print("Opcion: ");
    opcion = leer.LecturaChar();
}
   
   
    public void MenuDisco(){       
        do{
        switch(elige){
                case 1:
                    System.out.println("--------------------------------------------");
                    System.out.println("Has elegido el disco 1!: ");
                    MenuOperaciones();
                    if(opcion == 'A'||opcion == 'a'){Disco1.setNombreDisco(); Disco1.setAutor(); Disco1.setFormato(); Disco1.setCanciones();}
                    else if(opcion == 'B'||opcion == 'b'){
                    System.out.println("Nombre del disco: " + Disco1.getNombreDisco());
                    System.out.println("Nombre del autor: " + Disco1.getAutor());
                    System.out.println("Nombre del formato: " + Disco1.getFormato());
                    System.out.println("Canciones: ");
                    Disco1.getCanciones();}
                    else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
                    else
                        System.out.println("Opcion desconocida. Intente de nuevo.");
                        System.out.println("                                     ");
                    System.out.println("--------------------------------------------");
                break;
                case 2:
                    System.out.println("--------------------------------------------");
                    System.out.println("Has elegido el disco 2!: ");
                    MenuOperaciones();
                    if(opcion == 'A'||opcion == 'a'){Disco2.setNombreDisco(); Disco2.setAutor(); Disco2.setFormato(); Disco2.setCanciones();}
                    else if(opcion == 'B'||opcion == 'b'){
                    System.out.println("Nombre del disco: " + Disco2.getNombreDisco());
                    System.out.println("Nombre del autor: " + Disco2.getAutor());
                    System.out.println("Nombre del formato: " + Disco2.getFormato());
                    System.out.println("Canciones: ");
                    Disco2.getCanciones();}
                    else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
                    else
                        System.out.println("Opcion desconocida. Intente de nuevo.");
                        System.out.println("                                     ");
                    System.out.println("--------------------------------------------");
                break;
                case 3:
                    System.out.println("--------------------------------------------");
                    System.out.println("Has elegido el disco 3!: ");
                    MenuOperaciones();
                    if(opcion == 'A'||opcion == 'a'){Disco3.setNombreDisco(); Disco3.setAutor(); Disco3.setFormato(); Disco3.setCanciones();}
                    else if(opcion == 'B'||opcion == 'b'){
                    System.out.println("Nombre del disco: " + Disco3.getNombreDisco());
                    System.out.println("Nombre del autor: " + Disco3.getAutor());
                    System.out.println("Nombre del formato: " + Disco3.getFormato());
                    System.out.println("Canciones: ");
                    Disco3.getCanciones();
                    }
                    else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
                    else
                        System.out.println("Opcion desconocida. Intente de nuevo.");
                        System.out.println("                                     ");
                    System.out.println("--------------------------------------------");
                break;
                default:
                    System.out.println("No se reconoce la opcion insertada. Intente de nuevo.");
                    System.out.println("                                                     ");
                break;
            }
        }while(sal1 == false);
        MenuPrincipal();
        }
    }   

4. La ultima clase, en donde ejecutaremos el programa, la que va a contener el método main.

Código: [Seleccionar]
package Discos;
public class Main {
    public static void main(String[]args){
        Menu main = new Menu();
        main.MenuPrincipal();
    }
}

Voy citando cada punto del error que me comentaron en el post pasado. Y hay uno que me deja en duda (quizá el que me corrigió lo volvió a notar):

Citar
. La clase DiscoMusical incluye el main. Ineficiente.
En Java, cualquier proyecto consta de varias clases. Solo una de ellas tendrá el main, las otras son usadas por el main para llevar a cabo la tarea.

Como se puede ver, el main ahora en este código nuevo, tan solo va a citar una clase (Menu). La clase Menu utiliza a la clase Lectores y DiscosMusicales. Por ejemplos que he visto y demás, es valido que una clase llegue a utilizar otra clase.


Citar
Creas un main extenso. Ineficiente. El director de una empresa no se pone a fabricar componentes o envasar el producto. El director, da órdenes y controla el funcionamiento general.

Totalmente arreglado este detalle. Mi antiguo método main tenia alrededor de 234 lineas de código. Ahora... mi método main tan solo lleva 7 lineas. No se pone a hacer absolutamente nada, digamos que esta vez el director contrato a un  sirviente, recepcionista, mesero, etc, y solo es necesario darle la orden al que contrato.. ya lo demás se encarga el Sr sirviente o no se como le llamen jajaja

Citar
. Creas atributos de la clase sin métodos set y get. Como el main está en la misma clase, manipulas los atributos directamente.
Bajo este concepto tampoco debías crear los métodos set y get del resto de los atributos.

Clase con el metodo main aparte separado.

Citar
. El método next() de la clase Scanner toma el espacio en blanco como separador de las entradas. Eso te obliga a escribir RamonRamirez o Ramon_Ramirez  en lugar de Ramon Ramirez.
Si no, lo toma como dos entradas del teclado distintas.
El método nextLine() acepta el espacio en blanco y usa la tecla ENTER como separador de las entradas desde teclado.

Esto fue lo que utilize para los lectores. En vez de next(); ahora es nextLine();... Hubo algo que me sucedio anteriormente con el nextLine();, con esto, llegue a la conclusión que como programaba todo en el main, era por eso que me tomaba los espacios....


Citar
. Hay código repetido. Ineficiente. Si en tu clase vas a trabajar con tres discos, repites el código una vez para cada disco.

Ok, aquí si puede que patine un poco. De esa forma es la única que se me ocurrió para el menú.

Citar
switch(elige){
                case 1:
                    System.out.println("--------------------------------------------");
                    System.out.println("Has elegido el disco 1!: ");
                    MenuOperaciones();
                    if(opcion == 'A'||opcion == 'a'){Disco1.setNombreDisco(); Disco1.setAutor(); Disco1.setFormato(); Disco1.setCanciones();}
                    else if(opcion == 'B'||opcion == 'b'){
                    System.out.println("Nombre del disco: " + Disco1.getNombreDisco());
                    System.out.println("Nombre del autor: " + Disco1.getAutor());
                    System.out.println("Nombre del formato: " + Disco1.getFormato());
                    System.out.println("Canciones: ");
                    Disco1.getCanciones();}
                    else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
                    else
                        System.out.println("Opcion desconocida. Intente de nuevo.");
                        System.out.println("                                     ");
                    System.out.println("--------------------------------------------");
                break;
                case 2:
                    System.out.println("--------------------------------------------");
                    System.out.println("Has elegido el disco 2!: ");
                    MenuOperaciones();
                    if(opcion == 'A'||opcion == 'a'){Disco2.setNombreDisco(); Disco2.setAutor(); Disco2.setFormato(); Disco2.setCanciones();}
                    else if(opcion == 'B'||opcion == 'b'){
                    System.out.println("Nombre del disco: " + Disco2.getNombreDisco());
                    System.out.println("Nombre del autor: " + Disco2.getAutor());
                    System.out.println("Nombre del formato: " + Disco2.getFormato());
                    System.out.println("Canciones: ");
                    Disco2.getCanciones();}
                    else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
                    else
                        System.out.println("Opcion desconocida. Intente de nuevo.");
                        System.out.println("                                     ");
                    System.out.println("--------------------------------------------");
                break;
                case 3:
                    System.out.println("--------------------------------------------");
                    System.out.println("Has elegido el disco 3!: ");
                    MenuOperaciones();
                    if(opcion == 'A'||opcion == 'a'){Disco3.setNombreDisco(); Disco3.setAutor(); Disco3.setFormato(); Disco3.setCanciones();}
                    else if(opcion == 'B'||opcion == 'b'){
                    System.out.println("Nombre del disco: " + Disco3.getNombreDisco());
                    System.out.println("Nombre del autor: " + Disco3.getAutor());
                    System.out.println("Nombre del formato: " + Disco3.getFormato());
                    System.out.println("Canciones: ");
                    Disco3.getCanciones();
                    }
                    else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
                    else
                        System.out.println("Opcion desconocida. Intente de nuevo.");
                        System.out.println("                                     ");
                    System.out.println("--------------------------------------------");
                break;
                default:
                    System.out.println("No se reconoce la opcion insertada. Intente de nuevo.");
                    System.out.println("                                                     ");
                break;
            }

¿Como podría entonces, crear un menú en donde yo elija cual objeto quiero controlar sin repetir un código? Si es que esta incorrecto como lo maneje?.

Citar
. Por último, cuando usas la opción C para mostrar los datos, sucede lo siguiente.
Si tu disco tiene 3 canciones, en el contador vas desde 0 hasta 3, que son 4 pasos. El último dato siempre sera null, pues ese elemento del array no se ha inicializado.

Los dichosos arreglos pude repararlos, ya sueltan toda su informacion, no sale ni un Null.
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Aquí su ejecución:

El menu principal del programa de la clase Menu (Se ejecuta el método MenuPrincipal();). Se nos da la bienvenida y se nos pide cual disco deseamos modificar su información:


Esto es lo que ocurrirá cada vez que ingresemos una opción fuera del rango que da el programa:


Ahora elegimos el disco 1. Se nos ejecutara el método MenuOperaciones de la clase Menu.


Vamos a ingresarle datos al archivo (La clase Menu, utiliza a la Clase DiscoMusical para modificar datos). Para no ser chafas y comprobar que funciona bien, les vamos a ingresar datos de un disco real. En el primer objeto Disco 1 vamos a ingresarle el album Plastic Beach de Gorillaz. Son 16 temas (cabe bajo el limite que tiene el programa.)


Cuando terminamos de agregar los temas musicales y su duración. Pasara esto:


Ya se ha cargado los datos al primer objeto Disco1. Ahora para comprobar que los arreglos funcionen bien y estén recogiendo los datos de cada objeto, vamos a salir al menú principal del programa (Se vuelve a ejecutar el método MenuPrincipal( );  ):


Elegimos al objeto dos, disco2 e ingresamos datos (Volvemos al método MenuOperaciones(); ). Esta vez le toca a Skrillex y su álbum Recess con 11 temas musicales:


Al terminar de agregar datos, como comprobación, volvemos al menú principal y elegimos el primer objeto disco1:


Apretamos B para consultar los datos del objeto... y enhorabuena:



Ahora consultemos el álbum de Skrillex del objeto dos...



Ya pudimos comprobar que todos los datos se registraron en cada objeto correctamente. Que tal del objeto, Disco3?


Esta vació, ya que nunca elegí al objeto 3 para ingresarle información.

Me siento bastante satisfecho hasta ahora, gracias a ustedes por cierto  ;). Se ve asi en duracion total porque aun no se como redondear en java. Cuando aprenda, en la proxima version de DiscMan lo incluyo. Tambien incluire cualquier cosa o bicho feo que encuentren en el codigo!

Mil gracias por su ayuda chicos, esperare con ansias sus comentarios en que puedo mejorar  :)
« Última modificación: 04 de Abril 2015, 01:36 por Dan_SB »
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Hola, primero mi enhorabuena porque has desarrollado un gran trabajo. Cosas que te puedo comentar para mejorar. Las clases nómbralas siempre en singular. En vez de DiscosMusicales sería DiscoMusical. Ten en cuenta que cuando hables con otro programador dirás: "he creado un objeto DiscoMusical" pero no sonará bien "He creado un objeto DiscosMusicales".

En el menún efectivamente patinas un poco ¿Por qué? Por la repetición de código. Para evitar esa repetición puedes usar colecciones de objetos ó arrays, pero esto se ve más adelante en el curso, así que ahora no te diría que corrijas nada, sino que esperes a avanzar en el curso y dentro de un tiempo revises este ejercicio para eliminar la repetición de código, seguro que un poco más adelante ya vas a ser capaz de ver cómo.

Lo importante ahora es que has sido capaz de mejorar tu código, corregir muchas cosas defectuosas y aplicar muchos conceptos que se han estudiado y lo has hecho correctamente, así que otra vez mi enhorabuena y a seguir así.

Salu2!

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Bien! Apunto todas esas observaciones!! Cuando aprenda sobre colecciones colecciones de objetos, lo mejorare!, ademas del cambio del nombre de la clase. Todo el crédito se lo llevan ustedes por enseñarme y ayudarme.

Muchas gracias por comentar!
"Luchar por tus sueños y cumplirlos... eso es vivir.."

 

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