структурировать время;против тм времени = {}.Тот же вывод, но не тот же? - PullRequest
0 голосов
/ 30 мая 2018

Я занимался вопросами программирования на этом сайте под названием Kattis.Вот ссылка на вопрос, который я делал: https://open.kattis.com/problems/datum

Пока я пытался решить эту проблему, я обнаружил что-то очень, очень, очень странное.

Прежде чем я начну, здесьдва кода:

Первый:

#include <iostream>
#include <ctime>
#include <string>

using namespace std;

int main()
{
    //a = day, b = month
    string days[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    struct tm time;

    cin >> time.tm_mday >> time.tm_mon;

    time.tm_year = 2009-1900;
    time.tm_mon--;

    mktime(&time);

    cout << days[time.tm_wday] << endl;

    return 0;
}

Второй:

#include <iostream>
#include <ctime>
#include <string>

using namespace std;

int main() {
    //a = day, b = month
    string days[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    tm time = {};

    cin >> time.tm_mday >> time.tm_mon;

    time.tm_year = 2009-1900;
    time.tm_mon--;

    mktime(&time);

    cout << days[time.tm_wday] << endl;

    return 0;
}

Это ТОЧНЫЙ ЖЕ код, кроме единственной разницы в этих двух кодах:

struct tm time; // first code

против

tm time = {}; // second code

СЕЙЧАС, это то, что я нашелочень запутанноПервый код и второй код дают точно такой же ответ на моей консоли.Я проверил тип результата (days [time.tm_wday]), выполнив typeid (days [time.tm_wday]). Name (), и оба ответа кажутся абсолютно одинаковыми.

Однако, при отправке на веб-сайт Kattis, он принимает только второй и не принимает первый.

Теперь, кто-нибудь может сказать мне, что мне здесь не хватает?Почему он принимает только одно против другого?Большое спасибо!

РЕДАКТИРОВАТЬ: Некоторая информация о Kattis: Возникнет вопрос, где вам придется решать ее с помощью программирования.Затем он проверяет ваш ответ с их.Если ваша программа выдает одинаковые ответы, она «принимает» ваше решение.Если он отличается, то это не так.

Например, предположим, что задача состоит в том, чтобы вычислить площадь квадрата.Это дает пару примеров со значениями.

ex) Случай 1: (вход: 5 Выход: 25).

Если ваша консоль выдает 25 при вводе 5, то она «принимает» ваше решение.Если он выводит случайное число, например, 10, то он не принимает.

Дело в том, что моя программа выводит точно такие же значения:

Вывод первого кода: четверг.Вывод второго кода: четверг и т. Д. Однако только один считается «правильным».

1 Ответ

0 голосов
/ 30 мая 2018

Есть два отличия в игре:

struct tm time; // (1)

против

tm time = {}; // (2)

1 struct

В C название составного типа включает в себя:struct ключевое слово, "struct tm" здесь.В C ++ имя типа достаточно само по себе, здесь "tm";но это может быть префикс struct для совместимости.Подробнее об этом: Разница между 'struct' и 'typedef struct' в C ++?

Итак, что касается ключевого слова struct, на самом деле есть только косметическое различие.

2.Инициализация

(1) определяет переменную time типа tm.Поскольку tm является POD , он не инициализируется.Использование неинициализированного значения обычно приводит к неопределенному поведению.
(2) определяет и инициализирует список переменной time типа tm.Это, в свою очередь, инициализирует нулями tm, и поведение программы четко определено.

Подробнее об этом: Что означают следующие фразы в C ++:, инициализация по умолчанию и значение?

Почему это важно?

Не полная инициализация time, а затем вызов mktime(&time); приводит к Неопределенное поведение ,Все может случитьсяОн может отличаться при каждом запуске вашей программы, это может зависеть от используемого компилятора, библиотек, с которыми он связан, ОС, оборудования, чего угодно, всего, всего.Это может также работать как ожидалось.Подробнее об этом: Неопределенное, неопределенное и определяемое реализацией поведение .

Я подозреваю, что программа работает случайно в вашей среде, но не работает на цели.

...