【问题标题】:Integrating a 2D Array into a Calendar Printing Program将二维阵列集成到日历打印程序中
【发布时间】:2022-01-06 19:45:45
【问题描述】:

我决定从 C++ 教科书开始自学编码,其中一个挑战是创建一个程序,以这种风格为每个月打印给定年份的日历:

-------------January-------------

Sun  Mon  Tue  Wed  Thu  Fri  Sat
                          1    2
 3    4    5    6    7    8    9
10   11   12   13   14   16   17
18   19   20   21   22   23   24
25   26   27   28   29   30   31

我已经在 Microsoft Visual Studio 中编写了整个程序,但另一个挑战是然后将来自 getMonthName 和 dayNumber 函数的两个 1D 数组的数据转换为一个具有 2D 数组的函数,该函数收集两个月份名称和日期编号,使用此数组:

// the first number is the month and second number is the last day of the month. 
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}}; 

教科书没有很好地解释二维数组,但我知道基础知识。我只是不知道如何去引用数组的内容。我可以将数组的所有“月份编号”值分配给一个变量,就像我在这里为变量monthNumber设置的一样,然后从那里开始吗?如果有人可以提供一个如何做到这一点的例子,我将不胜感激。我正在尽可能多地吸收信息,所以如果你能解释你的例子是如何工作的,我会欣喜若狂。

#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[] = { "January", "February", "March",
                       "April", "May", "June",
                       "July", "August", "September",
                       "October", "November", "December"};

    return (months[monthNumber]);
}

//number of days in month
int numberOfDays(int monthNumber, int year)
{
    // january
    if (monthNumber == 0)
        return (31);

    // february
    if (monthNumber == 1)
        return (28);

    // march
    if (monthNumber == 2)
        return (31);

    // april
    if (monthNumber == 3)
        return (30);

    // may
    if (monthNumber == 4)
        return (31);

    // june
    if (monthNumber == 5)
        return (30);

    // july
    if (monthNumber == 6)
        return (31);

    // august
    if (monthNumber == 7)
        return (31);

    // september
    if (monthNumber == 8)
        return (30);

    // october
    if (monthNumber == 9)
        return (31);

    // november
    if (monthNumber == 10)
        return (30);

    // december
    if (monthNumber == 11)
        return (31);
}

// display calendar function
void printCalendar(int year)
{
    printf ("         Calendar - 2021", year);
    int days;

    // day from 0 - 6
    int current = dayNumber(1, 1, year);


    for (int i = 0; i < 12; i++)
    {
        days = numberOfDays(i, year);

        // current month display
        printf("\n  ------------%s-------------\n",
               getMonthName(i).c_str());

        //columns
        printf("  Sun  Mon  Tue  Wed  Thu  Fri  Sat\n");

        // spaces
        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;
}

// main function
int main()
{
    int year = 2021;
    printCalendar(year);

    return (0);
}

如果您需要更多信息,请告诉我,我很乐意提供更多信息。

【问题讨论】:

  • 什么是t?为什么是static?你认为year -= month &lt; 3; 这条线在做什么?您是否验证了 return 表达式按您希望的顺序执行操作?我猜我对您的第一个函数中的几乎每一行都有疑问。
  • @sweenish 这是计算日期的算法。我找到了相关的描述。 In 1970, John Horton Conway came up with an algorithm, often termed the “Doomsday Algorithm.” This algorithm uses the formula: (d+m+y+[y/4]+c ) mod 7

标签: c++ arrays visual-studio-2019


【解决方案1】:

我声明了一个全局变量int yearly[12][2];

sn-p 第 90 行:

for (int i = 0; i < 12; i++)
    {
        days = numberOfDays(i, year);
        yearly[i][0] = i; //month
        yearly[i][1] = days;//days
        ... ...

for循环执行12次,每个i对应一个月。

Yearly [i][0] 是月份,yearly [i][1] 是月份中的天数。

二维数组是什么样子的:

          column
   Row 0 [0][1]
       1 [0][1]
       2 [0][1]
        ... ...
       11[0][1]

打印二维数组示例:

 for (int Row= 0; Row< 12; Row++)
    {
        std::cout << "{";
        for (int column= 0; column< 2; column++)
        {
            std::cout << yearly[Row][column]<<",";
        }
        std::cout << "}"<<std::endl;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2016-07-20
    • 1970-01-01
    • 2022-08-07
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多