Определение следующего дня и дня недели по дате - C (СИ)
Формулировка задачи:
На страницах форума нашел программу на паскале, мне нужна помощь в ее переводе на язык С.
Программа должна считывать введенный день , а выводить следующий, учитывая високосные года.
Еще должна выводить что это за день недели.(временные сроки программы : 1940-2040 года)
var d,m,g:integer;
b:boolean;
begin
write('Введите день ');
readln(d);
write('Введите месяц ');
readln(m);
write('Введите год ');
readln(g);
b:=true;
case m of
1,3,5,7,8,10,12: if d<31 then d:=d+1 else
if d=31 then
begin
d:=1;
if m<12 then m:=m+1 else
begin
m:=1;
g:=g+1;
end;
end
else b:=false;
4,6,9,11: if d<30 then d:=d+1 else
if d=30 then
begin
d:=1;
m:=m+1;
end
else b:=false;
2:if g mod 4=0 then
if d<29 then d:=d+1 else
if d=29 then
begin
d:=1;
m:=m+1;
end
else b:=false
else
if d<28 then d:=d+1 else
if d=28 then
begin
d:=1;
m:=m+1;
end
else b:=false;
else b:=false;
end;
if b then writeln('Следующий день ',d,'.',m,'.',g)
else writeln('Неверно введена дата');
end.Решение задачи: «Определение следующего дня и дня недели по дате»
textual
Листинг программы
#include <stdio.h>
#include <locale.h>
enum { FALSE = 0, TRUE = 1 };
int main() {
int d, m, g;
setlocale(LC_ALL, "");
char b = TRUE;
printf("Введите день: ");
scanf("%d", &d);
printf("Введите месяц: ");
scanf("%d", &m);
printf("Введите год: ");
scanf("%d", &g);
switch (m) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
if (d < 31) d++;
else if (d == 31) {
d = 1;
if (m < 12) m++;
else {
m = 1;
g++;
}
}
else b = FALSE;
break;
case 4: case 6: case 9: case 11:
if (d < 30) d++;
else if (d == 30) {
d = 1;
m++;
}
else b = FALSE;
break;
case 2:
if (!(g % 4)) {
if (d < 29) d++;
else if (d == 29) {
d = 1;
m++;
}
else b = FALSE;
}
else if (d < 28)
d++;
else if (d == 28) {
d = 1;
m++;
}
else b = FALSE;
break;
default:
b = FALSE;
}
if (b)
printf("Следующий день %i.%i.%i\n", d, m, g);
else
printf("Неверно введена дата\n");
return NULL;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Объявляем перечисление для использования в операторе switch
- Объявляем переменные для ввода даты
- Устанавливаем локальную настройку для ввода русских символов
- Задаем значение переменной b равное TRUE для дальнейшего использования в условных операторах
- Выводим приглашение для ввода дня и запускаем функцию scanf для считывания значения переменной d
- Аналогично для ввода месяца и года
- Используем оператор switch для определения следующего дня и дня недели
- В случае если месяц равен 1, 3, 5, 7, 8, 10, 12 и день меньше 31, увеличиваем значение дня на единицу
- Если месяц равен 1, 3, 5, 7, 8, 10, 12 и день равно 31, то присваиваем дню значение 1, месяцу значение 1 (или 2, 3, 4, 6, 9, 11 в зависимости от года) и увеличиваем значение года на единицу
- Если месяц равен 4, 6, 9, 11 и день меньше 30, увеличиваем значение дня на единицу
- Если месяц равен 4, 6, 9, 11 и день равно 30, то присваиваем дню значение 1, месяцу значение 2 и увеличиваем значение года на единицу
- Если месяц равен 2 и год делится на 4 без остатка, то выполняем пункты 9 и 10
- Если месяц равен 2 и год не делится на 4 без остатка, то выполняем пункты 11 и 12
- Если месяц не соответствует ни одному из указанных значений, то устанавливаем значение переменной b равное FALSE
- Выводим сообщение о следующем дне и дне недели, если значение переменной b равно TRUE
- Выводим сообщение об ошибке, если значение переменной b равно FALSE
- Возвращаем NULL для завершения работы функции main