提问人: 提问时间:10/10/2021 最后编辑:Chris 更新时间:10/10/2021 访问量:474
使用 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 循环中的地方,我尝试在第一个 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 年之前的一年中的一天。
答:
1赞
Barmar
10/10/2021
#1
它应该是嵌套循环。外循环迭代数年,内循环迭代数天。
它比 .for
while
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 来递增。如果将周期递增该值将超过范围的末尾,我们将当前值设置为周期的开始。否则,我们只是递增它。advance
cycle
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);
}
}
下一个:MSVC 手动链接 stdlib
评论