使用 While 循环遍历两个值

Using While Loop To Iterate Through Two Values

我在同时迭代两个值时遇到问题。我有一个我正在编写的程序,我需要在接下来的 20 年中找到一个特定的假期,从输入的任何年份开始,我目前遇到了能够查看给定年份的指定日期的问题。我尝试在 while 循环中使用 while 循环,但它对我不起作用。

当前代码

#include <stdio.h>

#define SIZE 1000

int main() {
    // update date opposite of year so go through all the days first then the year
    // while loop that checks if the date was on a monday and gets all the mondays from the month then checks the second last one 
    int d = 15, m = 5, y, future, day, month, year, i = 0;
    char dates[SIZE];

    printf("Enter a year: ");
    scanf("%d", &y);
    future = y + 20;

    while (15 <= d && d < 25 && y <= future) {
        printf("\nDay: %d and Year: %d\n", d, y);
        d++;
        y++;
        // day = d;
        // printf("\nDay: %d and Year: %d\n",day,year);

        // while(y <= future){
            // printf("year: %d\n", y);
            //check dates in year from previous while loop 
            // y++;
            // year = y;
            // printf("\nDay: %d and Year: %d\n",day,year);
        // }
    }
    return 0;
}

此处的代码是两个条件都在一个 while 循环中的地方我尝试将年 (y) 条件移动到第一个 while 循环中的另一个 while 循环但无济于事。

当前输入和输出

Enter a year: 2015

Day: 15 and Year: 2015

Day: 16 and Year: 2016

Day: 17 and Year: 2017

Day: 18 and Year: 2018

Day: 19 and Year: 2019

Day: 20 and Year: 2020

Day: 21 and Year: 2021

Day: 22 and Year: 2022

Day: 23 and Year: 2023

Day: 24 and Year: 2024

期望输出

Day: 15 and Year: 2015

Day: 16 and Year: 2015

Day 17: and Year: 2015

Day...24 and Year...2035

因此,对于输入年份之后最多 20 年的所有年份,程序应该从第 15 天到第 24 天计算,但目前只在 2024 年之前的年份中计算一天。

应该是嵌套循环。外循环迭代数年,内循环迭代数天。

forwhile更简单。

for (int year = y; year <= y+20; year++) {
    for (int day = 15; day <= 24; day++) {
        printf("\nDay: %d and Year: %d\n",day,year);
    }
}

但如果出于学术原因必须使用while,只需转换它们:

int year = y;
while (year <= y + 20) {
    int day = 15;
    while (day <= 24) {
        printf("\nDay: %d and Year: %d\n",day,year);
        day++;
    }
    year++;
}

为了在@Barmar 的出色回答的基础上,我们可以 消除内部循环并通过抽象出日子的循环在单个循环中执行此操作。

为此,我们创建了一个结构 cycle,它将包含有关如何在范围内循环的所有相关信息:

  • 范围的开始。
  • 范围结束。
  • 当前值。
typedef struct cycle {
    int start;
    int end;
    int cur;
} cycle;

现在,我们可以创建一个 advance 函数,它接受一个 cycle 和一个 int 来递增。如果按该值增加循环将超过范围的末尾,我们将当前值设置为循环的开始。否则我们只是增加它。

void advance(cycle *c, int inc_by) {
    if (c->cur + inc_by > c->end) {
        c->cur = c->start;
    }
    else {
        c->cur += inc_by;
    }
}

现在,在main函数中我们可以创建一个范围来代表你想要循环的天数,for循环的更新可以提前一天循环。

因此,您的程序的简单版本具有日期和年份的硬编码值,如下所示。

int main() {
    cycle days = {.start = 15, .end = 24, .cur = 15 };

    for (int year = 2000; year <= 2020; year++, advance(&days, 1)) {
        printf("\nDay: %d and Year: %d\n", days.cur, year);
    }
}