Предполагается, что программа вернет, какой день недели для введенной даты. Одна из дат, которая не работает, - 01012000. Ничего не возвращается вообще. Но в некоторые другие високосные годы можно вычислить первый день марта. Также иногда кажущиеся случайными даты не работают. Я не знаю, как это исправить. Также я должен написать часть, которая вычисляет «daynumber», а затем вызывает ее позже, поэтому я не уверен, что я делаю это правильно.Моя программа C, использующая алгоритм Целлера, очень неспособен на високосные годы, не уверена, почему?
Извините за начальные вопросы, это моя первая программа на C.
#include<stdio.h>
#include<math.h>
int main()
{
int day, month, year, lastday, dayname, daynumber, input, d;
//Determine the last day of user specified month
printf("Enter date: ddmmyyyy:\n");
scanf("%d", &input);
day = input/1000000;
month = (input/10000) % 100;
year = input % 10000;
if (month == 1 || month == 3 || month == 5 || month == 7 ||
month == 8 || month == 10 || month == 12)
lastday = 31;
else if (month == 4 || month == 6 || month == 9 || month == 11)
lastday = 30;
else if ((year%4 == 0 && year%100 !=0) || year%400 == 0)
lastday = 29;
else
lastday = 28;
//Verify the date
if (year < 0)
return 1;
if (month < 1 || month > 12)
return 2;
if (day < 1 || day > lastday)
return 3;
//Algorithm
{
int m, d, y, c, daynumber;
if (month > 3)
m = month - 2;
else
m = month + 10;
if (m == 11 || m == 12)
year = year - 1;
else
year = year;
d = day;
y = year % 100;
c = year/100;
daynumber = (((13*m - 1)/5) + d + y + (y/4) + (c/4) - 2*c) % 7;
if (daynumber == 0)
printf("Sunday\n");
if (daynumber == 1)
printf("Monday\n");
if (daynumber == 2)
printf("Tuesday\n");
if (daynumber == 3)
printf("Wednesday\n");
if (daynumber == 4)
printf("Thursday\n");
if (daynumber == 5)
printf("Friday\n");
if (daynumber == 6)
printf("Saturday\n");
}
}
Используйте 'ctime' библиотеку для управления датами. Переход на летнее время, високосные и скачкообразные секунды затрудняют запись собственного алгоритма, если вы заботитесь о точности. – IceArdor
@IceArdor: конгруэнтность Целлера уже составляет високосные годы. Поскольку это вопрос новичка, может быть предпочтительнее помочь им, а не научить их, как сшивать библиотеки вместе. ;) –
Не месяцы в конгруэнции Целлера считаются с 3 = с марта по 14 = февраль? Вы не должны вычитать из «месяца», добавляя «+ 12» за январь и февраль и, следовательно, только декрементируя год, когда 'm == 13 || m == 14', правильно? –