Autor Tema: Diferencia entre array o arreglo y matriz Java estilo de codificación limpio  (Leído 4126 veces)

CoduJ

  • Sin experiencia
  • *
  • Mensajes: 28
    • Ver Perfil
¡Muy buenas a todos!

Últimamente he estado buscando ejercicios para poder mejorar mi análisis y habilidades para programar, para busco páginas que me puedan ofrecer distintos ejercicios. En una de esas mismas, en la categoría de bucles, en un ejercicio dice lo siguiente:

Citar
Definir un array bidimensional para representar una agenda semanal, donde se contemplen los 7 días de la semana y las 24 horas de cada día. Utilizar bucles for anidados para inicializar la agenda a: "No tengo planes.". Añadir "planes" a la agenda y mostrar el resultado por pantalla.


Y esto fue lo que hice:

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

class Agenda{
   public static void main(String args[]){
      int AgendaDatos[][] = new int[7][24], hora = 12, OP = 0, HorasColumnas = 0, DiasFilas = 0, IndiceDia = 0;
      String DiasSemana[] = new String[7], DiasDatos[] = new String[168], Formato = "A.M";
      DiasSemana[0] = "Lunes";
      DiasSemana[1] = "Martes";
      DiasSemana[2] = "Miercoles";
      DiasSemana[3] = "Jueves";
      DiasSemana[4] = "Viernes";
      DiasSemana[5] = "Sabado";
      DiasSemana[6] = "Domingo";
      boolean prog = true;
      Scanner InputInt = new Scanner(System.in);
      Scanner InputStr = new Scanner(System.in);
     
     
      for(int i = 0; i < 168; i++){
         DiasDatos[i] = "(Vacio)";
      }
      while(prog == true){
         System.out.println("\t\t\t--- Agenda ---");
         System.out.println("Que desea hacer: 1: Ver mi agenda | 2: Agregar algo a la agenda | 3: Salir");
         OP = InputInt.nextInt();
         while(OP < 1 || OP > 3){
            System.out.println("No ha seleccionado de manera correcta. . .");
            System.out.println("Que desea hacer: 1: Ver mi agenda | 2: Agregar algo a la agenda | 3: Salir");
            OP = InputInt.nextInt();
         }
         switch(OP){
            case 1: //mostrar agenda
               System.out.println("1: Lunes | 2: Martes | 3: Miercoles | 4: Jueves | 5: Viernes | 6: Sabado | 7: Domingo");
               System.out.print("Dia: ");
               IndiceDia = InputInt.nextInt();
               while(IndiceDia < 1 || IndiceDia > 7){
                  System.out.println("No ha seleccionado correctamente. . .");
                  System.out.println("1: Lunes | 2: Martes | 3: Miercoles | 4: Jueves | 5: Viernes | 6: Sabado | 7: Domingo");
                  System.out.print("Dia: ");
                  IndiceDia = InputInt.nextInt();
               }
               switch(IndiceDia){
                  case 1: //lunes
                  for(int j = 0; j < 24; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);                       
                     hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
                 
                  case 2: //martes
                  for(int j = 24; j < 48; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);                       
                     hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }                     
                  }
                  break;
                 
                  case 3: //miercoles
                  for(int j = 48; j < 72; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);                       
                     hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
                 
                  case 4: //jueves
                  for(int j = 72; j < 96; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);                       
                     hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
                                       
                  case 5: //viernes
                  for(int j = 96; j < 120; j++){
                        System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);                       
                        hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
                 
                  case 6: //sabado
                  for(int j = 120; j < 144; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);
                     hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
                 
                  case 7: //domingo
                  for(int j = 144; j < 168; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);                       
                     hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
               }
            break;
           
            case 2: //agregar algo a la agenda
               System.out.println("1: Lunes | 2: Martes | 3: Miercoles | 4: Jueves | 5: Viernes | 6: Sabado | 7: Domingo");
               System.out.print("Dia: ");
               IndiceDia = InputInt.nextInt();
               while(IndiceDia < 1 || IndiceDia > 7){
                  System.out.println("No ha seleccionado de manera correcta. . .");
                  System.out.println("1: Lunes | 2: Martes | 3: Miercoles | 4: Jueves | 5: Viernes | 6: Sabado | 7: Domingo");
                  System.out.print("Dia: ");
                  IndiceDia = InputInt.nextInt();
               }
               switch(IndiceDia){
                  case 1: //lunes
                  for(int j = 0; j < 24; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);
                     DiasDatos[j] = InputStr.nextLine();
                     if (DiasDatos[j].equals("")){
                        DiasDatos[j] = "(Vacio)";
                     }
                     hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
                 
                  case 2: //martes
                  for(int j = 24; j < 48; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);                       
                     DiasDatos[j] = InputStr.nextLine();
                     if (DiasDatos[j].equals("")){
                        DiasDatos[j] = "(Vacio)";
                     }
                     hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }                     
                  }
                  break;
                 
                  case 3: //miercoles
                  for(int j = 48; j < 72; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);
                     DiasDatos[j] = InputStr.nextLine();
                     if (DiasDatos[j].equals("")){
                        DiasDatos[j] = "(Vacio)";
                     }
                     hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
                 
                  case 4: //jueves
                  for(int j = 72; j < 96; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);                       
                     DiasDatos[j] = InputStr.nextLine();
                     if (DiasDatos[j].equals("")){
                        DiasDatos[j] = "(Vacio)";
                     }
                     hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
                                       
                  case 5: //viernes
                  for(int j = 96; j < 120; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);
                     DiasDatos[j] = InputStr.nextLine();
                     if (DiasDatos[j].equals("")){
                        DiasDatos[j] = "(Vacio)";
                     }
                        hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
                 
                  case 6: //sabado
                  for(int j = 120; j < 144; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);
                     DiasDatos[j] = InputStr.nextLine();
                     if (DiasDatos[j].equals("")){
                        DiasDatos[j] = "(Vacio)";
                     }
                     hora++;
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
                 
                  case 7: //domingo
                  for(int j = 144; j < 168; j++){
                     System.out.println("El dia " + DiasSemana[IndiceDia-1] + " a las " + hora + " " + Formato + ": " + DiasDatos[j]);
                     DiasDatos[j] = InputStr.nextLine();
                     hora++;
                     if (DiasDatos[j].equals("")){
                        DiasDatos[j] = "(Vacio)";
                     }
                     if (hora == 13){
                        hora = 1;
                     }
                     if (Formato.equals("A.M") && hora == 12){
                        Formato = "P.M";
                     }else if (Formato.equals("P.M") && hora == 12){
                        Formato = "A.M";
                     }
                  }
                  break;
               }               
            break;
               
            case 3: //salir
               prog = false;
               System.out.println("Usted ha salido de su agenda. . .");
            break;           
         }
      }
   }
}
¿Cómo creen que está el código?, ¿necesita mejorar en algo?, ¿recomendacioens?
Además, ¿cómo lo harían ustedes?
(En caso de que quieran saber la página en donde estoy actualmente trabajando con ejercicios Java, es esta: https://www.arkaitzgarro.com/java/capitulo-20.html.)
« Última modificación: 29 de Octubre 2020, 17:49 por Alex Rodríguez »

daenius

  • Sin experiencia
  • *
  • Mensajes: 24
    • Ver Perfil
Re:Java - Opinión sobre código
« Respuesta #1 en: 09 de Julio 2020, 10:44 »
Hola, me ha gustado mucho tu forma de programar. Muy ordenada, limpia y entendible; te felicito! Sin embargo el programa no está del todo bien. Te pongo primero el código con algunas anotaciones y cambios:

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

class Agenda {
public static void main(String args[]) {
// int AgendaDatos[][] = new int[7][24]; No se ha usado nunca
Integer hora = 12;
Integer OP = 0;
/*
* Estas dos variables ya se han usado en "hora" y en "IndiceDia"
*
* Integer HorasColumnas = 0; Integer DiasFilas = 0;
*/
Integer IndiceDia = 0;
String DiasSemana[] = new String[7], DiasDatos[] = new String[168], Formato = "A.M";
DiasSemana[0] = "Lunes";
DiasSemana[1] = "Martes";
DiasSemana[2] = "Miercoles";
DiasSemana[3] = "Jueves";
DiasSemana[4] = "Viernes";
DiasSemana[5] = "Sabado";
DiasSemana[6] = "Domingo";
boolean prog = true;
Scanner InputInt = new Scanner(System.in);
Scanner InputStr = new Scanner(System.in);

for (int i = 0; i < 168; i++) {
DiasDatos[i] = "(Vacio)";
}
while (prog == true) {
System.out.println("\t\t\t--- Agenda ---");
System.out.println("Que desea hacer: 1: Ver mi agenda | 2: Agregar algo a la agenda | 3: Salir");
OP = InputInt.nextInt();
while (OP < 1 || OP > 3) {
System.out.println("No ha seleccionado de manera correcta. . .");
System.out.println("Que desea hacer: 1: Ver mi agenda | 2: Agregar algo a la agenda | 3: Salir");
OP = InputInt.nextInt();
}
switch (OP) {
case 1: // mostrar agenda
System.out.println(
"1: Lunes | 2: Martes | 3: Miercoles | 4: Jueves | 5: Viernes | 6: Sabado | 7: Domingo");
System.out.print("Dia: ");
IndiceDia = InputInt.nextInt();
while (IndiceDia < 1 || IndiceDia > 7) {
System.out.println("No ha seleccionado correctamente. . .");
System.out.println(
"1: Lunes | 2: Martes | 3: Miercoles | 4: Jueves | 5: Viernes | 6: Sabado | 7: Domingo");
System.out.print("Dia: ");
IndiceDia = InputInt.nextInt();
}

for (int j = 0; j < 24; j++) {
System.out.println("El dia " + DiasSemana[IndiceDia - 1] + " a las " + hora + " " + Formato + ": "
+ DiasDatos[j]);
hora++;
if (hora == 13) {
hora = 1;
}
if (Formato.equals("A.M") && hora == 12) {
Formato = "P.M";
} else if (Formato.equals("P.M") && hora == 12) {
Formato = "A.M";
}
}

break;

case 2: // agregar algo a la agenda
System.out.println(
"1: Lunes | 2: Martes | 3: Miercoles | 4: Jueves | 5: Viernes | 6: Sabado | 7: Domingo");
System.out.print("Dia: ");
IndiceDia = InputInt.nextInt();
while (IndiceDia < 1 || IndiceDia > 7) {
System.out.println("No ha seleccionado de manera correcta. . .");
System.out.println(
"1: Lunes | 2: Martes | 3: Miercoles | 4: Jueves | 5: Viernes | 6: Sabado | 7: Domingo");
System.out.print("Dia: ");
IndiceDia = InputInt.nextInt();
}

/*
* El sistema de agregado de tareas esta bien, pero ¿es
* necesario rellenar la agenda entera para todo un dia? Podria
* preguntarle al usuario que me diga que hora y horas desea
* agregar informacion.
*/
for (int j = 0; j < 24; j++) {
System.out.println("El dia " + DiasSemana[IndiceDia - 1] + " a las " + hora + " " + Formato + ": "
+ DiasDatos[j]);
DiasDatos[j] = InputStr.nextLine();
if (DiasDatos[j].equals("")) {
DiasDatos[j] = "(Vacio)";
}
hora++;
if (hora == 13) {
hora = 1;
}
if (Formato.equals("A.M") && hora == 12) {
Formato = "P.M";
} else if (Formato.equals("P.M") && hora == 12) {
Formato = "A.M";
}
}
break;

case 3: // salir
prog = false;
System.out.println("Usted ha salido de su agenda. . .");
break;
}
}

InputInt.close();
InputStr.close();
}

Voy a comentarte dos puntos solamente:

1.- Hay 3 variables que no se usan en todo el código, estas son, respectivamente "AgendaDatos", "HorasColumnas", y "DiasFilas". De hecho, fíjate que al quitarlas o comentarlas, no aparece ningún fallo y el programa sigue funcionando igual. Para un ejercicio donde te piden expresamente el uso de un array bidimensional y al final no usarlo... es un fallo grande, ya que no cumples con lo exigido. De hecho, en vez de usar el array has escogido una gran sentencia de switches con multitud de opciones.

2.- De cara sobretodo al futuro, ten presente una cosa: cuando te veas que haces varios casos para cada una de las posibilidades que se te presentan, piensa que no lo estás haciendo bien. Bueno, igual "no hacer bien" es falso, digamos que no estás programando de la mejor de las maneras. Una forma más genérica que aglutine todos los casos que quieres comprobar, o una simplificación del código a algo más simple e igual de válido no sólo te ahorrará tiempo, sino que también líneas y líneas de código.

Por ejemplo, para cada vez que querías mirar la agenda o modificarla, escribías los 7 case de la semana entera, ¿y si te pidieran hacer la agenda de un mes? ¿Escribirías 30 case? No, ¿verdad? A eso mismo me refería. Además de que dentro de cada case siempre hacías lo mismo, ya fuera para simplemente ver la agenda de ese día o para agregar entradas. Cuando te veas en estas circunstancias (de repetir lo mismo muchas veces) piensa en lo que te he comentado en el párrado anterior.
Si te fijas, he borrado todos los case dejando solamente lo que hacías dentro de uno, e igualmente funciona todo correcto.


Por último, y esto ya es una sugerencia para mejorar tu programa (independientemente de que te lo pida o no el ejercicio), me he fijado que cuando quiero agregar datos a un día en concreto, tengo que rellenar la agenda completa para ese día. ¿Crees que es realmente necesario? ¿Y si el usuario solamente quiere anotar lo que va a hacer un viernes a las 3 PM? ¿Tiene que recorrer la agenda entera? Resulta bastanta trabajoso. Te he puesto una anotación sobre ello en el código de arriba.


Para no terminar con un mal sabor de boca te digo lo que al principio, me ha gustado mucho tu manera de presentar el programa (al margen de que esté bien o no), y eso suma muchos puntos en cuando a calidad y entendimiento (igual algunas que otras anotaciones a los márgenes hubieran venido bien). Te animo a que sigas haciendo ejercicios y practicando, que es como mejor se aprende!

Y gracias por pasar la web, me la he guardado. Seguro que me servirá!

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Java - Opinión sobre código
« Respuesta #2 en: 09 de Julio 2020, 13:12 »
Hola.

A lo ya dicho por Daenius, quiero añadir que los nombres de variables, en Java por norma/convención, la primera letra se escribe en minúscula.
Da igual si es una variable simple o un array/matriz.

Los nombres de clases sí se escriben la primera letra en mayúscula. Supongo que ahora mismo no estás trabajando todavía con clases, ya las verás en su momento.

Ahora quiero compartir un código de cómo lo he hecho yo.
No tiene por qué ser una solución mejor o peor, es otra forma de hacerlo y punto.

Para añadir un plan pido al usuario un día entre 1 y 7 y una hora entre 0 y 23.
Con esos dos datos ya puedo apuntar directamente al elemento de la matriz donde se ha de guardar el nuevo plan.

Verás que para pedir datos solo uso un objeto Scanner, tanto para leer Strings como para valores numéricos como int.
En este caso, lo hago de esta manera:
Código: [Seleccionar]
dia = Integer.parseInt(teclado.nextLine());Ahí lo que hago es lees un dato String y automáticamente lo transformo a un int/Integer.

Como sabrás, cuando en un programa queremos leer datos String y también numéricos, el objeto Scanner puede hacer cosas raras. Por eso tú por ejemplo, estás usando dos Scanner diferentes.
Yo lo que hago es usar uno y leer siempre con nextLine(). Si lo que quiero es un valor numérico, lo parseo (transformo) usando los métodos de la clases que proporciona Java: Integer.parseInt(), Double.parseDouble(), Float.parseFloat(), etc...

Para mostrar la agenda, la muestro completa en pantalla.
Verás que uso la función printf() y quizás te parezca extraño.
Código: [Seleccionar]
System.out.printf("%18s %15s %16s %13s %14s %13s %15s\n","LUNES","MARTES",
"MIERCOLES","JUEVES","VIERNES","SÁBADO","DOMINGO");
Si lo desconoces, no le des demasiadas vueltas, es algo que también ya irás aprendiéndolo poco a poco.
Se usar para dar "formato" al texto que se muestra por consola para que quede medianamente presentable. Pero no es algo demasiado eficiente, si se introducen planes con demasiadas letras, todo el formato se va al carajo xD
Como digo, ahora no es importante centrar esfuerzos en manejar printf(), pero si quieres preguntar algo sobre ello, adelante.

Fíjate también que la matriz, en lugar de declararla de 7x24, que suena más lógico, la he declarado de 24x7.
Lo he hecho simplemente porque luego para mostrar la agenda en pantalla me resulta más sencillo así para anidar los bucles.
Al mostrar la agenda, sale algo parecido a una tabla donde las horas son las filas y los días son las columnas.
Por eso me interesa que sea 24x7, y no de 7x24.
De este modo, con muy poco código:
Código: [Seleccionar]
System.out.println("\n\t\t\t\t\tPLANNING SEMANAL");
System.out.println("\t\t\t\t\t-------- -------\n");
System.out.printf("%18s %15s %16s %13s %14s %13s %15s\n","LUNES","MARTES",
"MIERCOLES","JUEVES","VIERNES","SÁBADO","DOMINGO");
for (hora = 0; hora < 24; hora++) {
    System.out.printf("%02d:00 ", hora);
    for (dia = 0; dia < 7; dia++)
        System.out.printf("%15s", agenda[hora][dia]);

    System.out.println();
}
Consigo mostrar todos los planes en pantalla:
Código: [Seleccionar]
             LUNES          MARTES        MIERCOLES        JUEVES        VIERNES        SÁBADO         DOMINGO
00:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
01:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
02:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
03:00      Sin planes  Stream Twitch     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
04:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
05:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
06:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
07:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
08:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
09:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes    Lavar coche     Sin planes
10:00      Sin planes     Sin planes     Sin planes    Cita Médico     Sin planes     Sin planes     Sin planes
11:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
12:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
13:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
14:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Comer Luis
15:00     Lavar coche     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
16:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
17:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
18:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
19:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
20:00        Cine Ana     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
21:00      Sin planes     Sin planes       Cena Ana     Sin planes     Sin planes     Sin planes     Sin planes
22:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes
23:00      Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes     Sin planes


Y bueno, aquí te dejo mi código.
Pruébalo y pregunta lo que no entiendas o cualquier duda que te surja.
Y no dudes en seguir compartiendo tus códigos, una buena forma de aprender es comparar cómo cada persona soluciona un ejercicio.
Un saludo.

Código: [Seleccionar]
public class Agenda {

public static void main(String[] args) {

String[][] agenda = new String[24][7];
int dia = 0, hora = 0;
Scanner teclado = new Scanner(System.in);

//Inicializamos agenda "sin planes"
for (hora = 0; hora < 24; hora++)
for (dia = 0; dia < 7; dia++)
agenda[hora][dia] = "Sin planes";

//Comienza menú usuario
int opc = 0;
do {
System.out.println("\n\t\tMENU AGENDA");
System.out.println("\t\t---- ------\n");
System.out.println("(1) --> Añadir PLAN a la Agenda");
System.out.println("(2) --> Mostrar Agenda");
System.out.println("(3) --> FIN DEL PROGRAMA");
System.out.print("Elija opción: ");
opc = Integer.parseInt(teclado.nextLine());

switch(opc) {
//Añadir planes
case 1:
do {
System.out.print("\nEscoja DIA entre 1 y 7: ");
dia = Integer.parseInt(teclado.nextLine());
}while (dia < 1 || dia > 7);
do {
System.out.print("Escoja HORA entre 0 y 23: ");
hora = Integer.parseInt(teclado.nextLine());
}while (hora < 0 || hora > 23);
System.out.print("Escriba brevemente su PLAN: ");
agenda[hora][dia-1] = teclado.nextLine();
System.out.println("\nAgenda actualizada. Pulse ENTER para seguir...");
teclado.nextLine();
break;
//Mostrar agenda
case 2:
System.out.println("\n\t\t\t\t\tPLANNING SEMANAL");
System.out.println("\t\t\t\t\t-------- -------\n");
System.out.printf("%18s %15s %16s %13s %14s %13s %15s\n","LUNES","MARTES",
"MIERCOLES","JUEVES","VIERNES","SÁBADO","DOMINGO");
for (hora = 0; hora < 24; hora++) {
System.out.printf("%02d:00 ", hora);
for (dia = 0; dia < 7; dia++)
System.out.printf("%15s", agenda[hora][dia]);

System.out.println();
}
System.out.println("\nPulse ENTER para seguir...");
teclado.nextLine();
break;
case 3:
System.out.println("\n\t\tPROGRAMA TERMINADO");
break;
default:
System.out.println("Opción equivocada");
}

}while (opc != 3);
teclado.close();

}

}
« Última modificación: 09 de Julio 2020, 13:17 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

CoduJ

  • Sin experiencia
  • *
  • Mensajes: 28
    • Ver Perfil
Re:Java - Opinión sobre código
« Respuesta #3 en: 09 de Julio 2020, 23:32 »
A daenius:

¡Muchas gracias por tus comentarios!, en verdad había olvidado esas variables, y bueno, también me desvié del tema del ejercicio principal. La verdad tampoco pensé tanto en el usuario, de hecho, ahora que lo veo desde otro punto, sí es bastante incómodo hacer el proceso que realice, pero para la próxima veré mejor esos errores que cometí (que en este momento me parecen de los más obvios).
« Última modificación: 29 de Octubre 2020, 17:47 por Alex Rodríguez »

CoduJ

  • Sin experiencia
  • *
  • Mensajes: 28
    • Ver Perfil
Re:Java - Opinión sobre código
« Respuesta #4 en: 09 de Julio 2020, 23:40 »
A Kabuto:

Ja, que coincidencia, yo igual traté desde un principio hacer ese tipo de estilo con mi agenda, pero no se me ocurrió de que manera hacer que los datos queden así. Ahora todo está más claro.
En cuanto a mis dudas:
Citar
Código: [Seleccionar]
teclado.close();
Por lo que puedo inferir, supongo que eso hace que la entrada de datos se detenga o cierre, pero, ¿qué hace realmente?, ¿es recomendable usarlo?
Y acerca de las arrays bidimensionales, me compliqué un poco en cuanto a esto, esto es un tanto específico, pero, ¿hay manera de remplazar valores en un solo bloque? Es decir:
Código: [Seleccionar]
intArray[0 (solo quiero rellenar este)][0] = 14;Pienso que estaría remplazando el otro valor con el índice 0.
« Última modificación: 29 de Octubre 2020, 17:47 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Java - Opinión sobre código
« Respuesta #5 en: 10 de Julio 2020, 01:52 »
En cuanto a mis dudas:
Citar
Código: [Seleccionar]
teclado.close();
Por lo que puedo inferir, supongo que eso hace que la entrada de datos se detenga o cierre, pero, ¿qué hace realmente?, ¿es recomendable usarlo?
Pues hace precisamente lo que dices, cerrar el inputStream, o sea la entrada de datos.
Cuando instanciamos un objeto Scanner por primera vez en el programa, se abre un flujo por el que recibir datos.
No cerrarlo, implica que el flujo queda abierto, malgastando memoria.
En programas sencillos como estos, la verdad es que da igual cerrarlo o no. Cuando nuestro programa termina ya se encarga la máquina virtual de Java de "limpiar" los restos que haya podido dejar nuestro programa.

En programas más complejos, programas que se ejecutan las 24 horas del día, donde un subprograma llama a otro subprograma..., sí puede ser un problema ir dejando recursos abiertos consumiendo memoria.

Yo siempre lo cierro, más que nada, porque si lo dejo abierto mi IDE (uso Eclipse) me lanza un warning, un aviso, de "fuga de recursos".
El programa funciona igual, pero me molesta que marque mi programa con un signo de admiración amarillo a modo de advertencia je je.


Y acerca de las arrays bidimensionales, me compliqué un poco en cuanto a esto, esto es un tanto específico, pero, ¿hay manera de remplazar valores en un solo bloque? Es decir:
Código: [Seleccionar]
intArray[0 (solo quiero rellenar este)][0] = 14;Pienso que estaría remplazando el otro valor con el índice 0.

Mmhh, creo que aún no tienes claro en que consiste una matriz. O yo no he entendido bien tu duda.
Aunque usemos dos indices para una matriz, no significa que estemos apuntando a dos bloques o elementos distintos.
Estamos apuntando solo a uno, pero es que necesitamos los dos índices.

Podemos hacer una analogía con una calle con casas.
Un array de una dimensión, es una calle con casas unifamilares.
Para enviar una carta a una de estas casas, solo necesitamos el nombre de la calle (nombre del array) y el número del inmueble (indice que apunta al elemento)
Es decir, un nombre y un número.

Una matriz en cambio, sería una calle con edificios de varias plantas.
Para enviar una carta, también necesitamos nombre de la calle y número del inmueble.
Pero además necesitamos otro número, el número de piso ya que cada inmueble tiene varias viviendas distintas.
O sea que en este caso, un nombre y dos números.



Un array de una dimensión, también llamado vector o arreglo, ya sabes que es una estructura que contiene varios elementos.

Es como tener muchas variables diferentes, pero asociadas bajo un mismo nombre y usamos un índice, un valor numérico, para apuntar a una de estas variables asociadas en concreto.

Entonces, si un array es un conjunto de variables asociadas..., una matriz es un conjunto de arrays asociados.

Es decir, una matriz de 7x24 en realidad es un array, que contiene otros 7 arrays asociados bajo un mismo nombre. Cada uno de estos arrays asociados contiene 24 elementos .

Para acceder a un elemento de la matriz, necesitamos dos indices. El primer indice es para indicar a cuál array asociado queremos apuntar. El segundo indice concreta a que elemento, de ese array, queremos acceder.

Si yo digo:
Código: [Seleccionar]
agenda[0][2] = "Lavar Coche";Estoy modificando el tercer elemento (posición 2), del primer array(posición 0), de los que contiene la matriz.

Así que en una matriz, para modificar un elemento concreto, siempre vamos a usar dos indices.

Sin embargo, aunque es menos habitual, en una matriz podemos usar también solo un índice. Pero en este caso estaríamos apuntando a uno de sus arrays al completo.

Si yo intento esto, siendo agenda una matriz:
Código: [Seleccionar]
agenda[0] = "Lavar coche";El compilador dará un error.
Porque estoy diciendo que asigne al primer array (posición 0) un único valor String. Y esto no tiene sentido, a no ser que le específique con un segundo índice en que elemento del primer array quiero ponerlo.

Pero, si hago esto:
Código: [Seleccionar]
agenda[0] = new String[] {"Lavar Coche", "Sin planes", "Cita Médico", "Bañar Perro", "Sin planes", "Sin planes", "Estudiar Algebra"};
Sí es válido.
Estoy diciendo que al primer array de los que contiene la matriz, le asignemos un nuevo array, ya con todos los valores necesarios para construir dicho array.

Quizás esto último sirva para entender mejor que una matriz, es en realidad un array que contiene otros arrays.
Por eso a las matrices también se les llama "arrays bidimensionales", porque en realidad son eso, arrays.
« Última modificación: 10 de Julio 2020, 01:53 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

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