Integrando una Matriz 2D en un Programa de Impresión de Calendarios.
He decidido empezar a aprender a programar por mi cuenta a partir de un libro de C++, y uno de los desafíos es crear un programa que imprima el calendario de un año determinado, en este estilo para cada mes:
-------------Enero-------------
Dom Lun Mar Mié Jue Vie Sáb
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
Tengo todo el programa escrito aquí en Microsoft Visual Studio, pero uno de los desafíos luego es convertir los datos de los dos arrays 1D de las funciones getMonthName y dayNumber en una sola función con un array 2D que reúna tanto el nombre del mes como el número del día, utilizando este array:
// el primer número es el mes y el segundo número es el último día del mes.
int yearly[12][2] =
{{1,31},{2,28},{3,31},{4,30},{5,31},{6,30},{7,31},{8,31},{9,30},{10,31},{11,30},{12,31}};
El libro no explica muy bien los arrays 2D, pero conozco lo básico. Simplemente no sé cómo hacer referencia al contenido del array. ¿Puedo asignar todos los valores de “número de mes” del array a una variable, como he hecho aquí con la variable monthNumber, y partir de ahí? Si alguien pudiera proporcionar un ejemplo de cómo se haría esto, lo agradecería muchísimo. Estoy tratando de absorber tanta información como sea posible, así que si pudiera explicar cómo funciona su ejemplo, estaría encantado.
#include <iomanip>
#include <string>
#include <iostream>
using namespace std;
int dayNumber(int day, int month, int year)
{
static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1,
4, 6, 2, 4 };
year -= month < 3;
return (year + year / 4 - year / 100 +
year / 400 + t[month - 1] + day) % 7;
}
string getMonthName(int monthNumber)
{
string months[] = { "Enero", "Febrero", "Marzo",
"Abril", "Mayo", "Junio",
"Julio", "Agosto", "Septiembre",
"Octubre", "Noviembre", "Diciembre"};
return (months[monthNumber - 1]);
}
// número de días en el mes
int numberOfDays(int monthNumber, int year)
{
// enero
if (monthNumber == 1)
return (31);
// febrero
if (monthNumber == 2)
{
if (year % 400 == 0 ||
(year % 4 == 0 && year % 100 != 0))
return (29);
else
return (28);
}
// marzo
if (monthNumber == 3)
return (31);
// abril
if (monthNumber == 4)
return (30);
// mayo
if (monthNumber == 5)
return (31);
// junio
if (monthNumber == 6)
return (30);
// julio
if (monthNumber == 7)
return (31);
// agosto
if (monthNumber == 8)
return (31);
// septiembre
if (monthNumber == 9)
return (30);
// octubre
if (monthNumber == 10)
return (31);
// noviembre
if (monthNumber == 11)
return (30);
// diciembre
if (monthNumber == 12)
return (31);
}
// función para mostrar el calendario
void printCalendar(int year)
{
printf(" Calendario - %d", year);
int days;
// día de 0-6
int current = dayNumber(1, 1, year);
for (int i = 1; i <= 12; i++)
{
days = numberOfDays(i, year);
// muestra del mes actual
printf("\n ------------%s-------------\n",
getMonthName(i).c_str());
// columnas
printf(" Dom Lun Mar Mié Jue Vie Sáb\n");
// espacios
int k;
for (k = 0; k < current; k++)
printf(" ");
for (int j = 1; j <= days; j++)
{
printf("%5d", j);
if (++k > 6)
{
k = 0;
printf("\n");
}
}
if (k)
printf("\n");
current = k;
}
return;
}
// función principal
int main()
{
int year = 2021;
printCalendar(year);
return (0);
}
Por favor, háganme saber si necesitan más información, estaré encantado de proporcionársela.
davy.ai
Solución para crear una matriz 2D para el programa de calendario
Para crear una matriz 2D que contenga tanto el nombre del mes como el último día del mes, podemos utilizar el arreglo
anual
proporcionado en la pregunta. Para acceder a los valores del arreglo, podemos utilizar la sintaxisanual[i][j]
, dondei
es el índice de la fila yj
es el índice de la columna.Para hacer que esta matriz sea más utilizable para crear el programa de calendario, podemos cambiar el segundo valor en el arreglo al número de días en el mes en lugar del último día del mes. Luego podemos usar este arreglo actualizado en la función
numberOfDays()
en lugar de usar una serie de declaracionesif
.Aquí está el código actualizado con la matriz 2D y la función actualizada
numberOfDays()
:“`c++
int anual[12][2] =
{{1, 31},{2, 28},{3, 31},{4, 30},{5, 31},{6, 30},
{7, 31},{8, 31},{9, 30},{10, 31},{11, 30},{12, 31}
};
//número de días del mes
int numberOfDays(int numeroMes, int anio)
{
// obtener el número de días del mes desde el arreglo anual
int dias = anual[numeroMes][1];
}
Aquí usamos la matriz
anual
para obtener el nombre del mes y el número de días para cada mes. Restamos 1 del número de mes para obtener el índice correcto en la matriz.¡Espero que esto ayude! Hazme saber si tienes alguna pregunta.