es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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 sintaxis anual[i][j], donde i es el índice de la fila y j 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 declaraciones if.

    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];

    // agregar un día extra para febrero si es un año bisiesto
    if (numeroMes == 1 && anio % 4 == 0 && (anio % 100 != 0 || anio % 400 == 0))
    {
        dias++;
    }
    
    return dias;
    

    }


    Para utilizar esta matriz `anual` actualizada, podemos modificar la función `printCalendar()` para utilizar los valores del arreglo en lugar de calcular el número de días de cada mes. Aquí está la función `printCalendar()` actualizada: ```c++ // función para mostrar el calendario void printCalendar(int anio) { printf(" Calendario - %d\n", anio); int dias; // día del 0 - 6 int actual = dayNumber(1, 1, anio); for (int i = 0; i < 12; i++) { // obtener el nombre del mes y el número de días del arreglo anual string nombreMes = getMonthName(anual[i][0] - 1); // restar 1 para obtener el índice de mes correcto dias = numberOfDays(anual[i][0] - 1, anio); // restar 1 por la misma razón // visualización del mes actual printf("\n ------------%s-------------\n", nombreMes.c_str()); // columnas printf(" Dom Lun Mar Mie Jue Vie Sab\n"); // espacios int k; for (k = 0; k < actual; k++) printf(" "); for (int j = 1; j <= dias; j++) { printf("%5d", j); if (++k > 6) { k = 0; printf("\n"); } } if (k) printf("\n"); actual = k; } return; }

    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.

Comments are closed.