尝试反向迭代时 for 循环中的变量未更新

问题描述 投票:0回答:1

我是 C 语言的初学者,需要帮助。我试图根据一个假日期(2007 年 1 月 1 日为星期六,指定为 5)计算出 2005 年 1 月 1 日是星期几。

当我运行代码时给出的答案是 3,而它应该是 6。当我仅迭代一年(2006 年)时,答案是正确的,但是当我将其更改为 2005 年时,变量 dayweek 没有更新并且而不是回到 5(在开始时分配的)。如何解决这个问题?

#include <stdio.h>

int dayofweek(void) {
  int monthdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  int dayweek = 5;
  int month;
  int year;

  for (year = 2006; year >= 2005; year--) {
    for (month = 12; month > 0; month--) {
      dayweek = (dayweek - (monthdays[month - 1] % 7));
      if (dayweek < 0)
        dayweek = (dayweek + 7);
    }
  }
  return dayweek;
}

int main() {
  int result = dayofweek();
  printf("Day of the week for January 1st: %d\n", result);
  return 0;
}
c for-loop variables
1个回答
0
投票

我认为它正在按预期工作,并且 3 是正确答案。 (可能有错误,如有需要欢迎指正)。

快速解释:我检查了日历,每年从+1天开始。 2021 年从星期五开始,2022 年从星期六开始,2023 年从星期日开始。向后移动意味着 -1 基础,因此从 2007 年的星期六 (5) 开始应该会导致 2005 年的星期四 (3)。

详细解释:我认为可以将代码减少到-1结果。

1°)在每一步中,我们计算每个月天数的模。这可以在这个数组中预先计算:

{3, 0, 3, 2, 3, 2, 3, 3, 2, 3, 2, 3}

2°)在每一步中,我们都会从当天的周中减去这些结果,然后我们将其保持为正值。我们可以通过将上面的数组打包为一个值来一次性完成这一切:29。所以一年意味着

dayweek -29

3°)那么我们需要保持这个正数,所以我们可以多次给这个结果加7,相当于减去29这个量,相当于计算

29 % 7
,就是一。

所以一年是

dayweek -1
,这证实了快速解释。

另外,我尝试一步步运行你的代码,没有发现任何错误,至少对我来说是这样。在我这边,当年份从 2006 年变为 2005 年时,变量 dayweek 并没有回到 5

我认为你的代码是正确的,并且运行良好,我想说只有你的期望误导了你。

© www.soinside.com 2019 - 2024. All rights reserved.