Определение следующего дня и дня недели по дате - 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
  2. Объявляем перечисление для использования в операторе switch
  3. Объявляем переменные для ввода даты
  4. Устанавливаем локальную настройку для ввода русских символов
  5. Задаем значение переменной b равное TRUE для дальнейшего использования в условных операторах
  6. Выводим приглашение для ввода дня и запускаем функцию scanf для считывания значения переменной d
  7. Аналогично для ввода месяца и года
  8. Используем оператор switch для определения следующего дня и дня недели
  9. В случае если месяц равен 1, 3, 5, 7, 8, 10, 12 и день меньше 31, увеличиваем значение дня на единицу
  10. Если месяц равен 1, 3, 5, 7, 8, 10, 12 и день равно 31, то присваиваем дню значение 1, месяцу значение 1 (или 2, 3, 4, 6, 9, 11 в зависимости от года) и увеличиваем значение года на единицу
  11. Если месяц равен 4, 6, 9, 11 и день меньше 30, увеличиваем значение дня на единицу
  12. Если месяц равен 4, 6, 9, 11 и день равно 30, то присваиваем дню значение 1, месяцу значение 2 и увеличиваем значение года на единицу
  13. Если месяц равен 2 и год делится на 4 без остатка, то выполняем пункты 9 и 10
  14. Если месяц равен 2 и год не делится на 4 без остатка, то выполняем пункты 11 и 12
  15. Если месяц не соответствует ни одному из указанных значений, то устанавливаем значение переменной b равное FALSE
  16. Выводим сообщение о следующем дне и дне недели, если значение переменной b равно TRUE
  17. Выводим сообщение об ошибке, если значение переменной b равно FALSE
  18. Возвращаем NULL для завершения работы функции main

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы