【发布时间】: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 < 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