【问题标题】:Using While Loop To Iterate Through Two Values使用 While 循环遍历两个值
【发布时间】:2021-11-29 05:28:55
【问题描述】:

我无法同时遍历两个值。我有一个正在编写的程序,我需要从输入的任何年份开始为接下来的 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

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

【问题讨论】:

    标签: c math while-loop printf std


    【解决方案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++;
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 2011-05-25
        相关资源
        最近更新 更多