Оптимизация кода для вычисления номера дня по введенной полной дате - 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"); }
Объяснение кода листинга программы
- Объявлены переменные x, y, z, leap и массив monthdiff.
- Производится установка локали в русскую.
- Выводится приглашение для ввода даты.
- Происходит попытка чтения даты с помощью функции scanf.
- Выполняются проверки на корректность введенных данных.
- Вычисляется значение переменной leap, которая определяет, является ли год високосным.
- Выводится сообщение, информирующее о формате введенных данных.
- Выводится информация о введенной дате.
- Завершается работа программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д