У меня проблемы с повторением двух значений вместе. У меня есть программа, которую я пишу, в которой мне нужно найти определенный праздник для каждого года в течение следующих 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

Desired Output

Day: 15 and Year: 2015

Day: 16 and Year: 2015

Day 17: and Year: 2015

Day...24 and Year...2035

Таким образом, программа должна отсчитывать от 15 до 24 дней для всех лет до 20 лет после введенного года, но в настоящее время учитывается только один день до 2024 года.

0
misfit 9 Окт 2021 в 21:48

2 ответа

Лучший ответ

Это должны быть вложенные петли. Внешний цикл повторяется годами, внутренний цикл - днями.

С 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++;
}
1
Barmar 9 Окт 2021 в 18:59

Чтобы развить отличный ответ @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);
    }
}
0
Chris 9 Окт 2021 в 20:06