Member 14030709 Ответов: 3

Как я могу закодировать, сколько недель в году?


Я начал программу 1 января 1900 года. Каждый год есть 52 недели или 53 недели. Я не знаю, как подсчитать, сколько недель. Помогите мне! Большое спасибо!

Пример: Входные Данные 18-09-1999
-> вывод: Сегодня суббота.
Это 261 день в году.
Это 38 - я неделя года.

На самом деле, это была бы 37-я неделя.

Что я уже пробовал:

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include <time.h>
int main(int argv, char** arv) {
    int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    char *day[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    int d, m, y, i;
    int temp;
    printf("Fill in a date after 01-01-1900 as dd-mm-yyyy: ");
    scanf("%d-%d-%d",  &d, &m, &y);
    temp=d;
    // correction for leap year
    if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0))
        month[1] = 29;
    if (y < 1900 || m < 1 || m > 12 || d < 1 || d > month[m - 1]) {
        printf("This is an invalid date.\n");
        return 1;
    }
    for (i = 1900; i < y; i++){
        if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0))
            d += 366;
        else
            d += 365;
    }
    for (i = 0; i < m - 1; i++){
        d += month[i];
    }
    printf("This is %s.\n", day[d % 7]);
    // day of year.........................
    int DayofYear=temp;
    for(i=0;i<(m-1);i++)
    	DayofYear = Dayofyear +month[i];
    printf("This is %d day of the year\n", DayofYear);
    //week of year.
    printf("This is week %d of the year", (DayofYear/7)+1);
}

3 Ответов

Рейтинг:
5

KarstenK

Проблема немного больше, потому что вы должны относительно високосных годов тоже. Тогда у вас есть все дни года и вы можете начать вычислять день недели 01.01. и 31.12. каждого года и, наконец, получить недели.

Я думаю, что первый шаг-это вычислить будний день 01.01. желаемого года и затем получить неделю от этой "движущейся цели".


Рейтинг:
25

Richard MacCutchan

В году нет ни 52, ни 53 недель. Есть 365 или 366 дней, что приравнивается к 52 неделям и 1 или 2 дням. Как и вы, включая время.h в вашем коде вы должны использовать функции системного времени, чтобы получить ответ. И ваш вопрос не совсем ясен о том, чего вы пытаетесь достичь. Возможно, Вам понравится смотреть на Номера недель в соответствии с ISO8601[^] для получения дополнительной информации.


Рейтинг:
18

OriginalGriff

Это сложно: есть не "только 52 или 53 недели в году", может быть и 51. Проблема в том, что Стандарт ISO 8601[^] определяет первую неделю как начинающуюся в понедельник недели с первого четверга года - так что 1 января может быть на первой или второй неделе, или на 51, 52 или 53 неделе предыдущего года ...

Это может помочь: Метод расширения даты и времени для получения номера недели[^] это на C#, но код довольно очевиден. Помните, что стандартные недели ISO начинаются в понедельник, а не в воскресенье!

Есть еще одна морщина, в том, что високосные годы означают, что есть два различных определения "дня года": в одном 1 марта-это день 60 или 61 в зависимости от високосного года, в другом это всегда день 60, а 29 февраля-день 366 в течение високосного года (последний иногда используется в пищевой промышленности для дат производства, чтобы сохранить другие номера дней одинаковыми).