使用 while 循环循环访问两个值

Using While Loop To Iterate Through Two Values

提问人: 提问时间:10/10/2021 最后编辑:Chris 更新时间:10/10/2021 访问量:474

问:

我无法同时迭代两个值。我正在编写一个程序,其中我需要从输入的任何年份开始,在未来 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 循环中的地方,我尝试在第一个 while 循环中将年份 (y) 条件移动到另一个 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

因此,该计划应从第 15 天计算到第 24 天,适用于输入年份后 20 年的所有年份,但目前只计算到 2024 年之前的一年中的一天。

C 数学 while-loop printf std

评论


答:

1赞 Barmar 10/10/2021 #1

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

它比 .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++;
}
0赞 Chris 10/10/2021 #2

为了建立在@Barmar的出色答案之上,我们可以消除内部循环,并通过抽象出日子的循环在一个循环中做到这一点。

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

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

现在,我们可以创建一个函数,它需要 a 和 int 来递增。如果将周期递增该值将超过范围的末尾,我们将当前值设置为周期的开始。否则,我们只是递增它。advancecycle

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

现在,在函数中,我们可以创建一个范围来表示您想要循环的天数,而 for 循环的更新可以将周期提前一天。main

因此,具有天数和年硬编码值的程序的简单版本如下所示。

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);
    }
}