Java - Tabla de días de la semana por mes

 
Vista:
Imágen de perfil de Javier

Tabla de días de la semana por mes

Publicado por Javier (18 intervenciones) el 15/12/2022 01:42:05
Buenas noches compañeros. Estamos en el tema de los arrays.
En este ejercicio nos piden que construyamos una tabla en la que por cada mes pongamos el número de los días que fueron lunes, martes , miércoles, etc.

Os pongo el enunciado y un ejemplo. A ver si me podéis echar una mano.
Gracias

vamos a construir ahora una tabla o array de tres dimensiones donde las dos primeras (filas y columnas) sean las mismas (doce meses/filas y siete días de la semana/columnas). Sin embargo, ahora en cada coordenada de fila y columna (mes y día), en lugar de almacenar un entero (cantidad de días) se enlazará con un array de enteros (la tercera dimensión), que contendrá la lista de días del mes que coinciden con ese día de semana.

Por ejemplo, para el año 2022, los días de enero que caen en lunes son 3, 10, 17, 24, 31, mientras que los días de enero que caen en martes son 4, 11, 18, 25, o los días de febrero que caen en lunes son 7, 14, 21, 28. Puedes observar que la tercera dimensión es "irregular", pues no siempre los elementos tienen el mismo tamaño (unas veces serán subarrays de cinco elementos y otras veces de cuatro).

Aquí tienes un ejemplo completo para el año 2022:

L M X J V S D
Mes 1 [3, 10, 17, 24, 31] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30]
Mes 2 [7, 14, 21, 28] [1, 8, 15, 22] [2, 9, 16, 23] [3, 10, 17, 24] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27]
Mes 3 [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24, 31] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27]
Mes 4 [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24]
Mes 5 [2, 9, 16, 23, 30] [3, 10, 17, 24, 31] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29]
Mes 6 [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24] [4, 11, 18, 25] [5, 12, 19, 26]
Mes 7 [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24, 31]
Mes 8 [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24, 31] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28]
Mes 9 [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24] [4, 11, 18, 25]
Mes 10 [3, 10, 17, 24, 31] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30]
Mes 11 [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27]
Mes 12 [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24, 31] [4, 11, 18, 25]
Para implementar este programa en Java tendrás que:

Reservar espacio en memoria para la tabla. Se trata de un array tridimensional donde conocemos el tamaño de las dos primeras dimensiones (12x7) pero no de la tercera porque a veces será cuatro y otras veces será cinco. No vamos a reservar espacio 12x7x5 con new porque malgastaríamos espacio, así que reservaremos inicialmente para las dos primeras dimensiones (doce meses y siete días de la semana), y dejaremos la tercera dimensión (lista de días) sin indicar tamaño. Más tarde, iremos reservando espacio de manera específica para el subarray que representa cada día de la semana de cada mes.
Solicitar por teclado el año para el cual se quiere calcular la tabla. Debe ser un año entre 1900 y 2100, ambos incluidos. Si no se introduce un año correcto, deberá volverse a pedir hasta que sea correcto. Igual que en el ejercicio anterior.
Una vez conocido el año, podemos calcular cuántos días de la semana hay en cada mes, es decir, cuántos lunes hay en enero, cuántos en febrero, etc. De hecho, es exactamente lo que hiciste en el ejercicio anterior: una tabla bidimensional de contadores. Si repites aquí ese cálculo, ya tendrás para cada coordenada (mes, día) la información que necesitas para hacer los new de la tercera dimensión.
Una vez conocido el dato anterior, podrás reservar espacio para la tercera dimensión para cada par de coordenadas. A cada día de la semana de cada mes le corresponderá un subarray (tercera dimensión) de cuatro o cinco elementos.
A partir de ahí, habrá que idear un mecanismo para recorrer cada día del año y, en función del mes y del día de la semana que se trate, incluir ese día en el subarray (tercera dimensión) correspondiente en la posición apropiada.
Una vez la tabla esté completamente rellena (se han recorrido todos los días del año), habrá que mostrarla por pantalla con un formato apropiadamente tabulado y con una cabecera para las filas (número de mes) y otra para las columnas (una letra para cada día de la semana) de manera similar al ejemplo que hemos mostrado anteriormente.
Resultado del ejercicio
Aquí tienes algunos posibles ejemplos de ejecución del programa.

Para el año 1900.


LISTA DE DÍAS DE LA SEMANA POR MES
----------------------------------
Introduzca año (1900-2100): x
Error de lectura: no es un número entero válido.
Introduzca año (1900-2100): 1899
Introduzca año (1900-2100): 2101
Introduzca año (1900-2100): 1900

RESULTADO: AÑO 1900

L M X J V S D
Mes 1 [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24, 31] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28]
Mes 2 [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22] [2, 9, 16, 23] [3, 10, 17, 24] [4, 11, 18, 25]
Mes 3 [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24, 31] [4, 11, 18, 25]
Mes 4 [2, 9, 16, 23, 30] [3, 10, 17, 24] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29]
Mes 5 [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24, 31] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27]
Mes 6 [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24]
Mes 7 [2, 9, 16, 23, 30] [3, 10, 17, 24, 31] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29]
Mes 8 [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24, 31] [4, 11, 18, 25] [5, 12, 19, 26]
Mes 9 [3, 10, 17, 24] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30]
Mes 10 [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24, 31] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28]
Mes 11 [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30] [3, 10, 17, 24] [4, 11, 18, 25]
Mes 12 [3, 10, 17, 24, 31] [4, 11, 18, 25] [5, 12, 19, 26] [6, 13, 20, 27] [7, 14, 21, 28] [1, 8, 15, 22, 29] [2, 9, 16, 23, 30]
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Tabla de días de la semana por mes

Publicado por Kabuto (1381 intervenciones) el 15/12/2022 11:25:58
El programa podría comenzar de esta manera.
Declaramos matriz tridimensional de 12 x 7 x n y pedimos un año válido
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Main {
 
	//Matriz 3D de 12x7xn
	private static int[][][] tabla = new int[12][7][];
 
	public static void main(String[] args) {
		//Pedimos año
		Scanner teclado = new Scanner(System.in);
		int anio = 0;
		while (anio < 1900 || anio > 2100) {
			try {
				System.out.print("Introduzca año (1900-2100): ");
				anio = Integer.parseInt(teclado.nextLine());
				if (anio < 1900 || anio > 2100)
					System.out.println("Error de lectura: valor ha de ser entre 1900 y 2100");
			}
			catch(Exception ex) {
				System.out.println("Error de lectura: no es un número entero valido.");
			}
		}
		teclado.close();
 
		//Ya tenemos año
	}
 
}


Pero ahora nos falta saber esto:
1
2
3
4
5
Una vez conocido el año, podemos calcular cuántos días de la semana hay en cada mes, es decir,
cuántos lunes hay en enero, cuántos en febrero, etc.
 De hecho, es exactamente lo que hiciste en el ejercicio anterior: una tabla bidimensional de contadores.
 Si repites aquí ese cálculo, ya tendrás para cada coordenada (mes, día) la información que necesitas para
 hacer los new de la tercera dimensión.

¿Cómo se hicieron los cálculos en ese ejercicio que se menciona? ¿Con la clase LocalDate o de otra forma?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Javier

Tabla de días de la semana por mes

Publicado por Javier (18 intervenciones) el 15/12/2022 11:31:16
Pues tienes toda la razón Kabuto (es para matarme)
Nos lo pedían así

Nos han pedido que generemos una tabla en forma de array bidimensional donde las filas sean los meses del año (doce) y las columnas los días de la semana (siete). De este modo, para un año concreto, en cada casilla de la tabla habrá que almacenar, para cada mes, cuántos lunes tiene, cuántos martes, cuántos miércoles, etc.

Para ello habrá que escribir un programa en Java que:

Reserve espacio en memoria para la tabla (array bidimensional de 12x7). Podemos imaginar ese array como una tabla de contadores donde inicialmente cada contador estará a cero.
Solicite por teclado el año para el cual se quiere calcular la tabla. Debe ser un año entre 1900 y 2100, ambos incluidos. Si no se introduce un año correcto, deberá volverse a pedir hasta que sea correcto.
A partir de ahí, habrá que idear un mecanismo para recorrer cada día del año y, en función del mes y del día de la semana que se trate, incrementar el contador (celda de la tabla) correspondiente.
Una vez la tabla esté completamente rellena (se han recorrido todos los días del año), habrá que mostrarla por pantalla con un formato apropiadamente tabulado y con una cabecera para las filas (número de mes) y otra para las columnas (una letra para cada día de la semana). Por ejemplo, para el año 2022 podríamos obtener algo así:
L M X J V S D
Mes 1 5 4 4 4 4 5 5
Mes 2 4 4 4 4 4 4 4
Mes 3 4 5 5 5 4 4 4
Mes 4 4 4 4 4 5 5 4
Mes 5 5 5 4 4 4 4 5
Mes 6 4 4 5 5 4 4 4
Mes 7 4 4 4 4 5 5 5
Mes 8 5 5 5 4 4 4 4
Mes 9 4 4 4 5 5 4 4
Mes 10 5 4 4 4 4 5 5
Mes 11 4 5 5 4 4 4 4
Mes 12 4 4 4 5 5 5 4
Como puedes observar, todo mes tiene siempre entre cuatro y cinco lunes, martes, miércoles,


Que por cierto yo lo he hecho así el ejercicio anterior pero no se por que me sale todo a cero:


package tarea04;

import java.util.Scanner;
import java.util.Calendar;

/**
* Ejercicio 4. Tabla de días de la semana por mes: cantidad.
* @author Nombre alumno/a
*/
public class Ejercicio04 {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
//----------------------------------------------
// Declaración de variables
//----------------------------------------------
// Constantes



// Variables de entrada

int year=0;

// Variables de salida
// 1. Declaramos la tabla para almacenar el resultado (array de int de tamaño 12x7)

int[][] tabla = new int[12][7];

// Variables auxiliares

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, Calendar.JANUARY);
calendar.set(Calendar.DAY_OF_MONTH, 1);

// Objeto Scanner para lectura desde teclado
Scanner teclado = new Scanner(System.in);

//----------------------------------------------
// Entrada de datos
//----------------------------------------------
System.out.println("NÚMERO DE DÍAS DE LA SEMANA POR MES");
System.out.println("-----------------------------------");

// 2. Solicitamos por teclado el año
// Leer y comprobar el año (1900 y 2023), ambos incluidos



while (year < 1900 || year > 2100) {
System.out.println("Introduce el año (1900-2100):");
year = teclado.nextInt();
}


//----------------------------------------------
// Procesamiento
//----------------------------------------------
// 3. Recorremos todos los días del año (bucle) y calculamos cuántos días de semana (L,M,X, etc.) hay por mes

while (calendar.get(Calendar.YEAR) == year) {
int month = calendar.get(Calendar.MONTH);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
tabla[month][dayOfWeek]++;

calendar.add(Calendar.DAY_OF_MONTH, 1);
}



//----------------------------------------------
// Salida de resultados
//----------------------------------------------
System.out.println();

// 4. Mostramos el contenido de la tabla resultado de manera tabulada
// 4.1. Cabecera de la tabla
System.out.printf(" L M X J V S D\n");

// 4.2. Filas repetitivas (una por mes)

for (int mes = 0; mes < 12; mes++) {
System.out.print("Mes " + (mes+1) + " ");


// 4.2.1. Columnas repetititvas (una por día de la semana)

for (int diaSemana = 0; diaSemana < 7; diaSemana++) {
System.out.print(tabla[mes][diaSemana] + " ");
}
System.out.println();
}




}

}


Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Tabla de días de la semana por mes

Publicado por Kabuto (1381 intervenciones) el 15/12/2022 20:06:24
OK, con clase Calendar.

Podemos hacer un método que reciba el número de mes y el número que representa un día de la semana(lunes, martes, etc...) que queremos consultar.
Y que sea este método quién elabore un array con los números de mes que coincide con ese día de la semana.

Estos arrays completarán la tercera dimensión de la matriz.

Te dejo aquí una solución.
Parece que son muchas líneas de código pero no son tantas, lo que pasa es que he puesto muchos comentarios explicando los pasos.
Especialmente un tema sobre como enumera Calendar los días de la semana, que es distinto a como lo vamos a hacer nosotros.

Por cierto, aún no he descubierto por qué, pero mi solución falla con el mes de diciembre. Los otros 11 meses parecen estar bien, pero en el último no muestra los resultados correctos.
Y no lo entiendo, porque si funciona bien en los otros meses, también debería funcionar con este... ...misterio total...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
public class Main {
 
	//Matriz 3D de 12x7xn
	private static int[][][] tabla = new int[12][7][];
	private static Calendar calendario = Calendar.getInstance();
 
	public static void main(String[] args) {
 
		System.out.println("\tLISTA DE DÍAS DE LA SEMANA POR MES");
		System.out.println("\t----- -- ---- -- -- ------ --- ---\n");
 
		//Pedimos año
		Scanner teclado = new Scanner(System.in);
		int anio = 0;
		while (anio < 1900 || anio > 2100) {
			try {
				System.out.print("Introduzca año (1900-2100): ");
				anio = Integer.parseInt(teclado.nextLine());
				if (anio < 1900 || anio > 2100)
					System.out.println("Error de lectura: valor ha de ser entre 1900 y 2100");
			}
			catch(Exception ex) {
				System.out.println("Error de lectura: no es un número entero valido.");
			}
		}
		teclado.close();
 
		//Ya tenemos año para el calendario
		calendario.set(Calendar.YEAR, anio);
 
		/*
		 * Ahora recorremos los meses, y por cada mes, los dias de semana.
		 * Mediante un método, obtendremos la lista de dias de mes que coinciden
		 * con cada dia de semana, de cada mes.
		 * Esa lista, será un array que completará la tercera dimensión
		 * de nuestra matriz
		 */
		for (int mes = 0; mes < 12; mes++)
			for (int dia = 0; dia < 7; dia++)
				tabla[mes][dia] = getDiasDeSemana(mes, dia);
 
		//Listo, solo queda mostar en pantalla la tabla
		System.out.println("\n\tRESULTADO AÑO: " + anio);
		System.out.println("\n\t\tLUNES\t\tMARTES\t\t\tMIERCOLES\tJUEVES\t\t\tVIERNES\t\tSABADO\t\t\tDOMINGO");
		for (int mes = 0; mes < 12; mes++) {
			System.out.printf("Mes %2d", mes+1);
			for (int dia = 0; dia < 7; dia++)
				System.out.printf(" %-20s",Arrays.toString(tabla[mes][dia]));
			System.out.println();
		}
	}
 
 
	/*
	 * Recibe un mes y un dia de la semana.
	 * Retorna un array con los dias del mes que coinciden
	 * con el dia de la semana recibido.
	 */
	private static int[] getDiasDeSemana(int mes, int dia) {
		//Lista con números de mes que coinciden con el dia indicado.
		int[] diasSemana = null; //¡¡Aún no sabemos que tamaño tendrá!!, puede oscilar entre 4 y 5
 
		//Seteamos el mes que vamos a consultar
		calendario.set(Calendar.MONTH, mes);
 
		/*
		 * Ahora hay que buscar los dias de este mes que coinciden
		 * con el dia de semana indicado.
		 *
		 * En Calendar los dias de la semana se enumeran de 1 a 7
		 * comenzando por el domingo y acabando en sábado.
		 * Sin embargo, nosotros los ordenamos de lunes a domingo
		 * y además los vamos a enumerar de 0 a 6, que son los valores
		 * posibles para la segunda dimensión de la matriz 3D, ya que es
		 * la que representa los dias de semana.
		 *
		 * Es decir, para nosotros el domingo tendría valor 6,
		 * pero para Calendar su valor sería 1.
		 * Para nosotros el valor 0 representa el lunes,
		 * pero para Calendar ese valor ni siquiera existe, el lunes sería 2.
		 *
		 * Esta discrepancia podemos resolverla con un switch para hacer las equivalencias y
		 * asegurarnos de que estamos consultando el dia correcto.
		 */
		int diaCalendar = 0;
		switch (dia) {
		case 0:
			diaCalendar = Calendar.MONDAY;
			break;
		case 1:
			diaCalendar = Calendar.TUESDAY;
			break;
		case 2:
			diaCalendar = Calendar.WEDNESDAY;
			break;
		case 3:
			diaCalendar = Calendar.THURSDAY;
			break;
		case 4:
			diaCalendar = Calendar.FRIDAY;
			break;
		case 5:
			diaCalendar = Calendar.SATURDAY;
			break;
		case 6:
			diaCalendar = Calendar.SUNDAY;
			break;
		}
 
		/*
		 * Ahora Calendar puede saber que dia buscamos.
		 * Para hacer la lista de dias de mes, primero tenemos que saber
		 * cuántos vamos encontrar (4 ó 5).
		 * Así que habrá que hacer dos consultas:
		 * - una para contar cuántos días hay
		 * - otra para saber cuáles son sus números de mes.
		 */
		//Contamos dias
		int contador = 0;
		calendario.set(Calendar.DAY_OF_MONTH, 1); //Empezamos desde el dia 1
		while (calendario.get(Calendar.MONTH) == mes) {
			if (calendario.get(Calendar.DAY_OF_WEEK) == diaCalendar)
				contador++;
			calendario.add(Calendar.DAY_OF_MONTH, 1);
		}
		//Conteo finalizado, inicializamos lista
		diasSemana = new int[contador];
		//Creamos un indice para recorrer la lista e ir añadiendo números de mes.
		int indice = 0;
		//Reiniciamos el calendario al primer dia de este mes
		calendario.set(Calendar.MONTH, mes);
		calendario.set(Calendar.DAY_OF_MONTH, 1);
		//Volvemos a recorrer el mes para anotar los números de mes
		while (indice < contador) {
			if (calendario.get(Calendar.DAY_OF_WEEK) == diaCalendar) {
				diasSemana[indice] = calendario.get(Calendar.DAY_OF_MONTH);
				indice++;
			}
			calendario.add(Calendar.DAY_OF_MONTH, 1);
		}
 
		//Lista confeccionada, la retornamos.
		return diasSemana;
	}
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Javier

Tabla de días de la semana por mes

Publicado por Javier (18 intervenciones) el 15/12/2022 23:35:50
Como siempre, decirte que eres un grande Kabuto. te voy a poner en mi carta de los Reyes Magos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Javier

Tabla de días de la semana por mes

Publicado por Javier (18 intervenciones) el 19/12/2022 00:03:29
Buenas noches Kbuto. Pues nada, parece ser que este año se estan poniendo exquisitos y mira lo que me comenta mi profesora;

De hecho me dice lo siguiente:

Con respecto a la actividad 5, aquí tenemos un problema: no puedes utilizar métodos (a parte del main) puesto que estos contenidos no los trabajamos hasta la próxima unidad. Y es vital que utilicemos los recursos que hemos trabajado hasta este momento. Si me entregas la actividad tal y como la tienes (aunque funcione) tu calificación puede bajar bastante...

Javier, te aconsejo que cambies el planteamiento del ejercicio y también es recomendable que utilices la clase LocalDate en vez de la clase Calendar.y no quisiera que tuvieras una baja calificación.

Que se te ocurre que podría hacer?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Tabla de días de la semana por mes

Publicado por Kabuto (1381 intervenciones) el 19/12/2022 18:11:28
1
Que se te ocurre que podría hacer?
Dale un beso a tu profesora de mi parte ja ja...

A ver, lo de no usar Calendar estoy de acuerdo. Lo vi en tu código y precisamente pensé que era esa la clase que te habían propuesto que usaras, así que no dije nada.

Calendar es una clase muy usada y verás por la red montones de ejercicios y tutoriales usándola. Pero lo cierto es que tuvo un mal diseño desde su concepción, resultando ser incómoda de usar en cuanto se quería hacer algo medianamente avanzado con ellas.
Surgieron clases alternativas hechas por la comunidad mejor diseñadas, hasta el punto que Oracle decidió "adoptarlas" y hacerlas oficiales lanzando el paquete de clases java.time.* hace ya unos 8 años.
Ahí es donde disponemos de clases como LocalDate para el manejo de fechas.


Sobre lo de no usar métodos..., entiendo que no es "lo correcto" si aún no se ha llegado a esa parte en el temario.
Lo que no entiendo es que se propongan ejercicios de cierta complejidad, sin antes haber explicado los métodos/funciones.

Se puede hacer todo en el main, sí, queda un poco más "sucio", pero bueno.

Por otra parte, si ahora usamos LocalDate, ahorraremos algo de código respecto a Calendar, ya no hay que hacer la movida esa de usar un switch para determinar que día de la semana buscamos.

La lógica es exactamente la misma que antes. El código quedaría así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Scanner;
 
public class Main {
 
	//Matriz 3D de 12x7xn
	private static int[][][] tabla = new int[12][7][];
	private static LocalDate calendario;
 
	public static void main(String[] args) {
 
		System.out.println("\tLISTA DE DÍAS DE LA SEMANA POR MES");
		System.out.println("\t----- -- ---- -- -- ------ --- ---\n");
 
		//Pedimos año
		Scanner teclado = new Scanner(System.in);
		int anio = 0;
		while (anio < 1900 || anio > 2100) {
			try {
				System.out.print("Introduzca año (1900-2100): ");
				anio = Integer.parseInt(teclado.nextLine());
				if (anio < 1900 || anio > 2100)
					System.out.println("Error de lectura: valor ha de ser entre 1900 y 2100");
			}
			catch(Exception ex) {
				System.out.println("Error de lectura: no es un número entero valido.");
			}
		}
		teclado.close();
 
		/*
		 * Ahora recorremos los meses, y por cada mes, los dias de semana.
		 * Mediante un método, obtendremos la lista de dias de mes que coinciden
		 * con cada dia de semana, de cada mes.
		 * Esa lista, será un array que completará la tercera dimensión
		 * de nuestra matriz
		 */
		for (int mes = 0; mes < 12; mes++) {
			for (int dia = 0; dia < 7; dia++) { //7 dias de la semana
				calendario = LocalDate.of(anio, mes + 1, 1);//Primer dia del mes actual
				/*
				 * LocalDate enumera los dias del 1 al 7 y
				 * los meses del 1 al 12
				 * Nosotros lo hacemos del 0 al 6 y del 0 al 11
				 * por conveniencia para recorrer la matriz.
				 * Basta con restar -1 a sus valores o sumar + 1 a los nuestros
				 * para entendernos con LocalDate.
				 */
				//Contamos cuantos dias de mes coinciden con el
				//dia de mes actual para saber el tamaño de la lista
				int contador = 0;
				while (calendario.getMonthValue() - 1 == mes) {
					if (calendario.getDayOfWeek().getValue() - 1 == dia)
						contador++;
					calendario = calendario.plusDays(1);//Pasamos al siguiente dia de mes
				}
				//Dias contados, iniciamos lista
				int[] diasMes = new int[contador];
				//Volvemos al primer dia de este mes
				calendario = LocalDate.of(anio, mes + 1, 1);
				//Y volvemos a recorrer este mes, ahora para añadir dias de mes a la lista
				contador = 0; //Reciclamos variable contador como indice para el array lista de dias
				while (calendario.getMonthValue() - 1 == mes) {
					if (calendario.getDayOfWeek().getValue() - 1 == dia) {
						diasMes[contador] = calendario.getDayOfMonth();
						contador++;
					}
					calendario = calendario.plusDays(1);//Pasamos al siguiente dia de mes
				}
 
				//Añadimos lista a la matriz
				tabla[mes][dia] = diasMes;
			}
		}
 
		//Listo, solo queda mostar en pantalla la tabla
		System.out.println("\n\tRESULTADO AÑO: " + anio);
		System.out.println("\n\t\tLUNES\t\tMARTES\t\t\tMIERCOLES\tJUEVES\t\t\tVIERNES\t\tSABADO\t\t\tDOMINGO");
		for (int mes = 0; mes < 12; mes++) {
			System.out.printf("Mes %2d", mes+1);
			for (int dia = 0; dia < 7; dia++)
				System.out.printf(" %-20s",Arrays.toString(tabla[mes][dia]));
			System.out.println();
		}
	}
 
}


Con LocalDate no solo hemos ahorrado código, si no que ahora sí me muestra bien los días para el mes de Diciembre.
No se por qué Calendar nos fallaba en ese mes concreto, pero ya no importa

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Javier

Tabla de días de la semana por mes

Publicado por Javier (18 intervenciones) el 19/12/2022 23:08:55
Como siempre a tus pies Kabuto. Y si, le mandaré tus "saludos" a mi profe. Y mil gracias, que "se" que en estas fechas con tus turnos no tendrás mucho tiempo. Ánimo, ya queda menos para las rebajas....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Tabla de días de la semana por mes

Publicado por Antonio (5 intervenciones) el 02/01/2023 13:42:39
Buenas puedes ayudar con el codigo por favor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Tabla de días de la semana por mes

Publicado por Antonio (5 intervenciones) el 27/12/2022 11:51:52
Buenas, yo también estoy un poco liado con este ejercicio... Habéis hecho la actividad 5, pero la 4 no. No comprendo como poder hacerla, como pasar de lista de días a cantidades con el array de dos. Pongo el enunciado anteriormente escrito por Javier. Muchas gracias y un saludo

Para ello habrá que escribir un programa en Java que:

Reserve espacio en memoria para la tabla (array bidimensional de 12x7). Podemos imaginar ese array como una tabla de contadores donde inicialmente cada contador estará a cero.
Solicite por teclado el año para el cual se quiere calcular la tabla. Debe ser un año entre 1900 y 2100, ambos incluidos. Si no se introduce un año correcto, deberá volverse a pedir hasta que sea correcto.
A partir de ahí, habrá que idear un mecanismo para recorrer cada día del año y, en función del mes y del día de la semana que se trate, incrementar el contador (celda de la tabla) correspondiente.
Una vez la tabla esté completamente rellena (se han recorrido todos los días del año), habrá que mostrarla por pantalla con un formato apropiadamente tabulado y con una cabecera para las filas (número de mes) y otra para las columnas (una letra para cada día de la semana). Por ejemplo, para el año 2022 podríamos obtener algo así:
L M X J V S D
Mes 1 5 4 4 4 4 5 5
Mes 2 4 4 4 4 4 4 4
Mes 3 4 5 5 5 4 4 4
Mes 4 4 4 4 4 5 5 4
Mes 5 5 5 4 4 4 4 5
Mes 6 4 4 5 5 4 4 4
Mes 7 4 4 4 4 5 5 5
Mes 8 5 5 5 4 4 4 4
Mes 9 4 4 4 5 5 4 4
Mes 10 5 4 4 4 4 5 5
Mes 11 4 5 5 4 4 4 4
Mes 12 4 4 4 5 5 5 4
Como puedes observar, todo mes tiene siempre entre cuatro y cinco lunes, martes, miércoles,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Tabla de días de la semana por mes

Publicado por Kabuto (1381 intervenciones) el 06/01/2023 11:34:42
Hola Antonio.
Esa parte está hecha también en el ejercicio 5, solo que ampliado con más cosas.

Te dejo una versión simplificada que resolvería el ejercicio 4.
Igual que antes con un bucle recorremos cada mes.
Para cada mes, vamos incrementando el calendario día a día y obteniendo el valor del día de la semana.
Ese valor nos va a decir que celda de la matriz hay que incrementar para contar.

Por ejemplo, si durante el mes 1 (Enero) para un día nos dice que el "día de semana" es 2 (Martes), entonces incrementamos la celda [0][1]
Ya que la fila 0 corresponde a Enero y la columna 1 corresponde a Martes.
Es decir, que la celda [0][1] cuenta los Martes que tiene Enero.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Main2 {
 
	public static void main(String[] args) {
 
		int[][] tabla = new int[12][7];
		int anio = 2022;
 
		for (int mes = 0; mes < 12; mes++) {
 
			LocalDate calendario = LocalDate.of(anio, (mes + 1), 1); //Comenzamos por el dia 1 de este mes
			//Mientras calendario siga en mes actual, incrementaremos contadores
			while (calendario.getMonthValue() == (mes+1)) { //+1 porque calendario enumera de 1 a 12 y bucle de 0 a 11
				//Consultamos el dia de semana para incrementar el contador correspondiente de la matriz
				int diaSemana = calendario.getDayOfWeek().getValue();
				//LocalDate nos da dias de semana entre 1 y 7.
				//Para incrementar contador, restamos -1 a diaSemana porque en la matriz los enumeramos de 0 a 6
				tabla[mes][diaSemana-1]++; //Incrementamos contador
 
				calendario = calendario.plusDays(1);//Pasamos al dia siguiente
			}
		}
 
		//Ya hemos recorrido los 12 meses, mostramos datos
		System.out.println("L M X J V S D");
		for (int mes = 0; mes < 12; mes++)
			System.out.printf("Mes %2d --> %s\n", mes+1, Arrays.toString(tabla[mes]));
 
 
	}
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Tabla de días de la semana por mes

Publicado por Profesor de Javier (1 intervención) el 14/01/2023 23:17:28
Que grande eres Javier!!.

Intentas hacer las tareas que os mandamos en en el ciclo?. Es que parece que ni lo intentes y que vengas aquí directamente...

De cara a los profesores crees que serás el crack de la clase, con todas la tareas perfectas... El día del examen a ver que tal te va...

Créeme que te haces un flaco favor, porque no estás aprendiendo nada si vienes aquí a que te hagan los deberes.

Dicho, eso, te voy a dejar una de las soluciones para el ejercicio 4 por si te sirve, aunque ya se agotó el plazo de entrega...

Te estaré vigilando en el examen, alumno

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public class Ejercicio4 {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        //----------------------------------------------
        //          Declaración de variables
        //----------------------------------------------
        // Constantes
 
 
 
        // Variables de entrada
 
        int anyo;
 
        // Variables de salida
        // 1. Declaramos la tabla para almacenar el resultado (array de int de tamaño 12x7)
 
        int[][] contadorDias = new int[12][7];
 
        // Variables auxiliares
 
        LocalDate anyoMuestra;
 
        // Objeto Scanner para lectura desde teclado
        Scanner teclado = new Scanner(System.in);
 
        //----------------------------------------------
        //                Entrada de datos
        //----------------------------------------------
        System.out.println("NÚMERO DE DÍAS DE LA SEMANA POR MES");
        System.out.println("-----------------------------------");
 
        // 2. Solicitamos por teclado el año
        // Leer y comprobar el año (1900 y 2023), ambos incluidos
 
        do{
            System.out.println("Introduzca año (1900-2100): ");
            anyo = teclado.nextInt();
        }while (anyo < 1900 || anyo > 2100);
 
        anyoMuestra = LocalDate.of(anyo, 1, 1);
 
 
 
 
 
        //----------------------------------------------
        //               Procesamiento
        //----------------------------------------------
        // 3. Recorremos todos los días del año (bucle) y calculamos cuántos días de semana (L,M,X, etc.) hay por mes
 
        for (int i=0; i<contadorDias.length; i++){
 
            for (int j=1; j<=anyoMuestra.lengthOfMonth(); j++){
 
                anyoMuestra = LocalDate.of(anyo, i+1, j);
 
                if (anyoMuestra.getDayOfWeek().equals(MONDAY))
                    contadorDias[i][0]++; //lunes++;
                else if (anyoMuestra.getDayOfWeek().equals(TUESDAY))
                    contadorDias[i][1]++;//martes++;
                else if (anyoMuestra.getDayOfWeek().equals(WEDNESDAY))
                    contadorDias[i][2]++;//miercoles++;
                else if (anyoMuestra.getDayOfWeek().equals(THURSDAY))
                    contadorDias[i][3]++;//jueves++;
                else if (anyoMuestra.getDayOfWeek().equals(FRIDAY))
                    contadorDias[i][4]++;//viernes++;
                else if (anyoMuestra.getDayOfWeek().equals(SATURDAY))
                    contadorDias[i][5]++;//sabado++;
                else
                    contadorDias[i][6]++;//domingo++;
            }
 
        }
 
 
        //----------------------------------------------
        //            Salida de resultados
        //----------------------------------------------
        System.out.println();
 
        // 4. Mostramos el contenido de la tabla resultado de manera tabulada
        // 4.1. Cabecera de la tabla
        System.out.printf("         L   M   X   J   V   S   D\n");
 
        // 4.2. Filas repetitivas (una por mes)
 
        for (int i=0; i<12; i++){
 
            System.out.printf("Mes%3d  ",i+1);
 
            // 4.2.1. Columnas repetititvas (una por día de la semana)
 
            for (int j=0; j<7; j++){
 
                System.out.print(" "+contadorDias[i][j]+"  ");
            }
 
            System.out.println();
        }
 
    }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar