使用 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 年之前的年份中计算一天。
应该是嵌套循环。外循环迭代数年,内循环迭代数天。
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++;
}
为了在@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);
}
}
我在同时迭代两个值时遇到问题。我有一个我正在编写的程序,我需要在接下来的 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 年之前的年份中计算一天。
应该是嵌套循环。外循环迭代数年,内循环迭代数天。
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++;
}
为了在@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);
}
}