Школа 21, Бассейн, день второй и третий

Во втором дне (day02) началось программирование на C.

Не буду сильно вдаваться в стандарты написания кода, лишь удивлюсь запрету switch и злорадно порадуюсь запрету for и do..while. В остальном, все в поря…

Да, нет. Давайте гореть вместе.

Начну с нашего внутренного линтера, великолепной Норминетты (norminnete). Она, в целом, довольно точно указывает на несовпадения кода указанному стандарту, однако в моем случае она внезапно отказалась воспринимать стандартный заголовок в кодовом файле. Да, нам нужно указывать красивый свег заголовок в каждом файле, создает он автоматически при помощи vim или emacs и все бы ничего, но Норминнета упорно заявляла, что заголовка в моих файлах нет. Сорок минут ушло на то, чтобы понять, что дело в том, что у меня вместо email указано /var/log/mail, тогда как у 99% остальных участников там указан какой-то внутренний email школы (причем у всех одинаковый). Предположительно, случилось это из-за того, что в нулевой день я решил, после выполнения задания на отправку письма, перестраховаться и отправить его еще из консоли, при помощи sendmail. Очередное горе от ума?

Вторая история дня второго заключалась в прошедшей инфе, что мы обязаны использовать одну функцию размером в 25 строк для решения всех задач. Норминетта действительно ругалась на функции длиннее 25 строк и поэтому все начали превращать нормальный код в, хм, тот, в котором сложнее разобраться, хм…

int i;

i = 0;
while (i < 10)
{
    i++;
}
везде стало превращаться в

int i;

i = -1
while (++i < 10)
{
}
А дальше там вложенные циклы, дополнительные условия и прочее. В результате этого код, как бы, перестал следовать Норму (название нашего code style), так как стал запутанным и плохо читаемым, зато прошел проверку Норминеттой.

Когда я стал делать задание последнего дня, я понял, что невозможно уместить этот код в 25 строк и решил, что сделаю его при помощи дополнительных функциё и буду таков. Пусть его не засчитают, зато я его решу. Дальше было часа четыре размышлений как решить задачу, закончившиеся эврикой после стояния у доски с маркером. Стоять у доски с маркером, вообще, очень полезно. Код написан, вывод верный, красота.

Решил я, однако, перечитать Норм и внезапно обнаружил в нем, что мы не можем использовать больше 5 функций на один C файл. “¯\(ツ)/¯”, – подумал я, и пошел переписывать все предыдущие задания с целью удобочитаемости.

Также где-то в середине ночи была забавная сессия объяснения вложенных циклов на основе парня, который хочет скосить траву на футбольном поле, также мы веселились с INT_MIN, также мы просто веселились всяким юморескам.

Не до смеха стало, правда, в тот момент, когда стало не ясно нужно ли оставить в коде для сдачи декларацию внешних функций или нет. Мое мнение за оставление было такое – мы не знаем в каком порядке подключаются файлы для компиляции и, соответственно, должны оставить декларацию внешних функций, чтобы компиляция не зафейлилась в случае, если наш файл подключается первым (или еще чего-нибудь там, gcc, я в тебе не силен). Также при компиляции обрезанного файла (согласно указаниям мы должны отдавать на проверку файл, который просто не компилится, в нем нет main()), если оставить декларацию, то произойдет ошибка времени линковки, а если убрать, то ошибка времени компиляции, и второе кажется гораздо хуже, чем первое. Мнение против – опять горе от ума, делают то, о чем нигде особо не сказано.

В целом, вторым днем я доволен, последнее задание заставило реально подумать над алгоритмом. Идем дальше.

Третий день (day03) был посвящен указателям.

Мне нечего особо сказать про указатели, ибо я ними более-менее разобрался когда мне это было надо. Единственное, что я забыл, так это то, как поменять местами данные по двум указателям. У меня почему-то постоянно вылетает из головы то, что надо менять местами разименованные указатели. Что ж, надеюсь теперь это я запомнил.

Также смешно было то, что когда пришли люди на третий день с утра и попросили дать наводку на последнее задание дня второго, я смог объяснить ключевую идею итерации массива по номеру позиции с оффсетом, но объяснить свой код, я не смог. Чем дольше я на него смотрел, тем меньше я понимал, что я написал и почему оно работает. Мы полезли дебажитьт это дело и оказалось, что я совершенно случайно вместо простой проверки условия в нужном месте написал сложный и странный гейт, который открывался, когда менялся номер позиции в массиве, и закрывался, когда накапливал в себе достаточно массы (однако это было неважно, потому что он после открытия редактировал данные в треш-регионе массива).

Черт знает, смогу ли я донести принцип работы этого магического кода до проверяющего, но он прекрасен в своей непонятности. Те, кто спишут его, уж точно не смогут. Так что вот вам листинг, а я поеду в школу, сегодня у нас там экзамен.

Комментарии

Популярные сообщения из этого блога

Школа 21, Бассейн, первый экзамен, четвертый день и Састантуа

Школа 21, Бассейн, день первый

Школа 21, до Бассейна, день первый