C++ 我怎样才能知道13号星期五在一年中出现了多少次?

C++ 我怎样才能知道13号星期五在一年中出现了多少次?,c++,algorithm,C++,Algorithm,正如标题所说,我试图找出在一年中13号星期五出现了多少次。我必须使用date类并以某种方式编写代码来解决它 日期:h 我期望tmp.display()行显示2013年1月13日(以2013年为年份),但++tmp行给出了相同的结果。我还认为我必须以某种方式找到对应于星期五的日期代码(现在的dc为0),但我想不出来 另外,另一篇与同一问题相关的帖子说,从周日开始的每个月都会有13号周五,所以我试着思考如何实现这一点。也许在for的第一个循环中的某个地方(在switch语句上方),我可以检查类似if

正如标题所说,我试图找出在一年中13号星期五出现了多少次。我必须使用
date
类并以某种方式编写代码来解决它

日期:h 我期望
tmp.display()行显示2013年1月13日(以2013年为年份),但
++tmp
行给出了相同的结果。我还认为我必须以某种方式找到对应于星期五的日期代码(现在的
dc
为0),但我想不出来


另外,另一篇与同一问题相关的帖子说,从周日开始的每个月都会有13号周五,所以我试着思考如何实现这一点。也许在
for
的第一个
循环中的某个地方(在
switch
语句上方),我可以检查类似
if(firstDay=Sunday){cout的内容……对于初学者来说,如果您使用
标题和包含在其中的内容,那么创建
Date
类就容易多了

其次,您得到了一个重载函数:
int get\u day\u code(int year,int month,int day)
。如果它做了它应该做的事情(或者更像:描述所说的),为了检查一年中13号星期五有多少次,您可能会做:

int howManyFridays = 0;
for(int i=0;i<12;i++)
   if(get_day_code(year,i,13)==CODE_FOR_FRIDAY) howManyFridays++;
return howManyFridays;
int howmanyfriday=0;

对于(int i=0;i你可以这样做,而不必对获取一年中某一天的函数进行大量调用。如果你知道一月份第一个星期日的日期,那就没什么了。只需要一些基本的数学知识

2013年,1月的第一个星期日是6号。因此,13号是星期日。我们知道,如果1月的第一个星期日是6号,那么2月的第一个星期日是3号。加上10天,13号是星期三

我怎么知道2月的第一个星期日是3号?因为日历就是这样工作的。如果你取1月的第一个星期日的日期,加上4和mod 7,这将给出2月的第一个星期日的日期。日历是这样固定的;给定1月的第一个星期日,你可以很容易地计算出任何一个星期日的第一个星期日使用模7算法的月份

偏移量为:

Normal Year: 0 4 4 1 6 3 1 5 2 0 4 2 
Leap Year:   0 4 3 0 5 2 0 4 1 6 3 1 
如果你想知道星期五在哪几个月是13号,那么下一个星期天是15号,这意味着一个月的第一个星期天必须是1号

根据上表,如果1月的第一个星期日是1号,那么在正常年份中,你将有两个月的时间,星期五是13号:1月和10月。如果是闰年,那么你将有1月、4月和7月。今年的第一个星期日是6号,所以你需要有2个月的偏移量。所以9月和12月

如果月份偏移量加上1月第一个星期日的日期等于8,则该月的星期五为13日


不久前,我将此作为一种记忆技巧来使用。请参阅以获得更详细的解释。

使用这种方法,我很难确定星期五的代码是什么。因为我有
dayofweek[]
array,也许我可以通过某种方式计算它们,使星期五等于6,然后我可以做
dc=6
?我很确定你应该知道星期五的代码是什么,因为你自己写了代码,对吧?你可以通过做
日期星期五(11,2222013);
并调用
dayOfWeek()
。您可以在一些不需要的地方使用
new
,这样做很可能会导致内存泄漏。如果您按值返回,只需返回一个对象,对于返回引用的运算符,您可能希望返回
*此
。您的数据成员也没有任何理由成为指针。仅供参考:如果您想要精确的对于未来的日历,请连续400年(如2000年至2399年)确定您的答案。公历中400年的天数是7的倍数。因此,该模式每400年重复一次。
Date tmp(1, 13, year);
int dc = tmp.dayOfWeek(); // return day code

tmp.display();
cout << endl;
++tmp;
tmp.display();
cout << endl;
int howManyFridays = 0;
for(int i=0;i<12;i++)
   if(get_day_code(year,i,13)==CODE_FOR_FRIDAY) howManyFridays++;
return howManyFridays;
Normal Year: 0 4 4 1 6 3 1 5 2 0 4 2 
Leap Year:   0 4 3 0 5 2 0 4 1 6 3 1