Оптимизация кода для вычисления номера дня по введенной полной дате - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Есть задача: ввести дату в формате дд.мм.гггг и напечатать номер дня года, соответствующий этой дате (1 января – 1-й день и т.д.). Собственно, я написал программу, которая исправно работает:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
 
int main()
{
    int x, y, z;
    int leap;
 
    system("chcp 1251 > nul");
 
    printf("Введите дату в формате дд:мм:гггг :\n");
 
    scanf("%2d:%2d:%4d", &x, &y, &z) == 3
        && x >= 0 && x <= 31
        && y >= 1 && y <= 12
        && z >= 0 && z <= 9999
        && printf("Спасибо за корректный ввод!\n") || printf("Формат не тот.\n");
 
    leap = z % 4 == 0 && (z % 100 != 0 || z % 400 == 0);
 
    puts("===============================================================================");
 
    printf("%04d - %s високосный год\n", z, leap == 1 ? "" : "не"); 
    
        printf("Это %03d-й день %04d года\n", 
        y == 1 ? x : 
        y == 2 ? (x + 31) : 
        y == 3 ? leap == 1 ? (x + 60) : (x + 59) :
        y == 4 ? leap == 1 ? (x + 91) : (x + 90) :
        y == 5 ? leap == 1 ? (x + 121) : (x + 120) :
        y == 6 ? leap == 1 ? (x + 152) : (x + 151) :
        y == 7 ? leap == 1 ? (x + 182) : (x + 181) :
        y == 8 ? leap == 1 ? (x + 213) : (x + 212) :
        y == 9 ? leap == 1 ? (x + 244) : (x + 243) :
        y == 10 ? leap == 1 ? (x + 274) : (x + 273) :
        y == 11 ? leap == 1 ? (x + 305) : (x + 304) :
        y == 12 ? leap == 1 ? (x + 335) : (x + 334) :
        0, z);
 
    system("pause");
}
Как видите, код получился у меня уж слишком громоздким, притом я, как говорится, носом чую, что чересчур много лишних действий совершил. Не могли бы вы мне рассказать/показать, как оптимизировать данный код? Существуют ли более простые алгоритмы решения данной задачи? Если да, то не могли бы вы мне их написать, пожалуйста?

Решение задачи: «Оптимизация кода для вычисления номера дня по введенной полной дате»

textual
Листинг программы
#include<stdio.h>
#include<stdlib.h>
 
int main()
{
    int x, y, z;
    int leap;
    int monthdiff[] = { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
 
    system("chcp 1251 > nul");
 
    printf("Введите дату в формате дд:мм:гггг :\n");
 
    scanf("%2d:%2d:%4d", &x, &y, &z) == 3
        && x >= 0 && x <= 31
        && y >= 1 && y <= 12
        && z >= 0 && z <= 9999
        && printf("Спасибо за корректный ввод!\n") || printf("Формат не тот.\n");
 
    leap = z % 4 == 0 && (z % 100 != 0 || z % 400 == 0);
 
    puts("===============================================================================");
 
    printf("%04d - %s високосный год\n", z, leap == 1 ? "" : "не"); 
    
    printf("Это %d-й день %04d года\n", x + monthdiff[y] + leap, z);
 
    system("pause");
}

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

  1. Объявлены переменные x, y, z, leap и массив monthdiff.
  2. Производится установка локали в русскую.
  3. Выводится приглашение для ввода даты.
  4. Происходит попытка чтения даты с помощью функции scanf.
  5. Выполняются проверки на корректность введенных данных.
  6. Вычисляется значение переменной leap, которая определяет, является ли год високосным.
  7. Выводится сообщение, информирующее о формате введенных данных.
  8. Выводится информация о введенной дате.
  9. Завершается работа программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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