Введите дату в 8-значном цифровом формате и отобразите на английском языке - PullRequest
0 голосов
/ 22 сентября 2019

Ниже приведена проблема с ++, которую я должен решить, и у меня возникли некоторые проблемы из числа 2)

1) Предложите пользователю ввести дату в 8-значной числовой форме (MMDDYYYY) ex.04221970

2) Показать дату на английском языке напр.22 апреля 1970

3) Если день, в который пользователь ввел номер, составляет 01,21,31, добавьте "st" после дня

4) Иначе, если день, в который пользователь ввел номер, составляет 02,22добавьте «nd» после дня

5) Elae, если введенный пользователем день - 03,23, добавьте «rd» после дня

6) Иначе добавьте «th» после дня

1 Ответ

0 голосов
/ 22 сентября 2019

Все шаги довольно просты.Но даты всегда сложно, так как есть много правил.Но только пара подает заявку на синтаксический анализ.

Определите структуру для хранения проанализированного значения и анализа входных данных.

[EDIT] Ценность использования структуры в том, что может быть полезно иметь промежуточную функцию, которая будет возвращать этот многоразовый бит двоичных данных.

struct date_s
{
    unsigned int day;
    unsigned int month;
    unsigned int year;
};

// parsing 
date_s date = {};
if (strlen(input) != 8 || sscanf(input, "%2u%2u%4u", &date.month, &date.day, &date.year) != 3)
{
    // handle error
}

Проверка годадовольно просто, тут нечего делать, если только вы не хотите ограничиться определенным диапазоном.Например, поскольку мы используем григорианский календарь, вы можете ограничиться годами после 1582 года включительно.

Проверка месяца также очень проста, мы проверим это вместе с количеством дней вмесяц, который является самой сложной частью из-за февраля.

unsigned int day_max = 0;
switch (date.month)
{
case 1: case 3: case 5; case 7: case 8: case 10: case 12:
     day_max = 31;
     break;

case 4: case 6: case 9: case 11:
      day_max = 30;
    break;

case 2:
     if (date.year % 4 != 0)
         day_max = 28;
     else if (date.year % 100 != 0)
         day_max = 29;
     else if (date.year % 400 != 0)
         day_max = 28;
     else
         day_max = 29;
     break;

// else day_max stays 0, of course
}

if (date.day < 1 || day_max < date.day)
{
    // error
}

После того, как все проверки завершены, все, что вам нужно сделать, это напечатать.

В течение месяцев, которые вам понадобятсяопределить таблицу строк для отображения.

const char* MONTH[12] = { "January", /* etc... */ };

Суффикс даты.

const char* SUFFIX[4] = { "st", "nd", "rd", "th" };

Теперь у нас есть все данные, которые нам нужно распечатать, и все в пределах диапазона.

const char* suffix = SUFFIX[std::min(date.day, 4) - 1];

printf("%d%s %s %d", date.day, suffix, MONTH[date.month - 1], date.year);

// or, for US format
printf("%s %d%s, %d", MONTH[date.month - 1], date.day, suffix, date.year);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...