Программа вывода дня недели по введенной дате - C (СИ)
Формулировка задачи:
Написал программу в которой вводишь дату а она выводит день недели прописью. Но она корректно выводит только с 1900 года. Как переделать так чтобы выводила правильный день недели раньше 1900 года?
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main() {
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char* day[] = {"Sanday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int d, m, y, i, f;
do{
printf("\n\nEnter date to 01-01-3000 of the form dd-mm-yyyy: ");
scanf("%d-%d-%d", &d, &m, &y);
fflush(stdin);
if (y < 1900 || y>3000 || m < 1 || m > 12 || d < 1 || d > month[m - 1]) {
printf("\nYou have entered an incorrect date!\nPlease rewrite date!\n\n");
} else{
if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) month[1] = 29;
for (i = 1; 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("\nThis day of the week is %s.\n", day[d % 7]);
printf("\nYou want to continue? If Yes, press any key, ESC - for exit");
if(getch()==27)break;
}
}while(f!=1);
return 0;
}Решение задачи: «Программа вывода дня недели по введенной дате»
textual
Листинг программы
#include <stdio.h>
void main () {
int d=29,m=2,year=2012;
if (m<3) { m+=12; year--; }
int c=year/100,y=year%100,wd;
wd=( (m+1)*26/10+d+y+y/4+c/4-2*c ) % 7;
char *days[]={"Sat","Sun","Mon","Tue","Wed","Thu","Fri"};
printf ("\n%s",days[wd]);
}
Объяснение кода листинга программы
- Подключение стандартной библиотеки ввода-вывода
- Объявление переменных:
- d (день) = 29
- m (месяц) = 2
- year (год) = 2012
- Если m меньше 3, то прибавляем 12 к m и вычитаем 1 из year (переход на григорианский календарь)
- Вычисление значения c (век) по делению года на 100
- Вычисление значения y (год) по остатку от деления года на 100
- Вычисление значения wd (день недели) по формуле:
- ( (m+1)26/10 + d + y + y/4 + c/4 - 2c ) % 7
- Вывод значения wd (день недели) с помощью функции printf и массива days (названия дней недели)
- В выводе используется символ перевода строки
\nдля перехода на новую строку