Определение следующего дня и дня недели по дате - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д