f.f.o. :: /add

Александр Фенстер

add@fenster.name fenster.name

Все записи

[772] 23 мая 2011; 22:00

Близится сессия, а значит, у нас в ближайшей программе новые истории студенческих фэйлов. Stay tuned!

И вот одна из них. Пришлось мне в этом году принимать зачёт на первом курсе ФИТа у всего потока (60+ человек). Понятно, что когда студентов много, а я один, зачёт является некоторой формальностью: нельзя же за несколько минут заглянуть человеку прямо в душу и понять, действительно ли он выучил Си или умело притворяется. Задаю пару вопросов, даю пару простых задачек и отпускаю студента, если он адекватно отвечает, с автографом в зачётке. А из формальностей — необходимость сдать одиннадцать «пятиминуток», которые (по идее) пишутся прямо в конце лекции, но если пропустил занятие или написал чушь — надо сделать и сдать.

Вот сдаёт, значит, девушка одну такую пятиминутку. На листочке (хотя разрешено было долги высылать по email) написана программа на Си, функция main которой выглядит ровно следующим образом:

int main()
{
    f(1);
    getchar();
    getchar();
}

Забудем даже про отсутствие return 0 в конце, речь не о нём. Речь о гетчарах.

Практика ставить один (не два!) вызов getchar() в конце программы сложилась у нерадивых студентов, которые в Visual Studio запускают программу кнопкой F5 (режим отладки). При этом окошко программы закрывается сразу после выполнения, и посмотреть, что программа напечатала, не удаётся. Правильное решение проблемы — запускать программу при помощи Ctrl+F5, тогда после окончания работы программы появится надпись Press any key to continue и окно не закроется, пока эникей не нажат. Ну либо вообще работать в линуксе, где такая проблема вообще не возникает. Однако правильное решение некоторым студентам неизвестно или кажется слишком сложным, поэтому они втыкают в конце программы getchar(), требуя тем самым от пользователя нажать Enter перед автоматическим закрытием окошка.

Но в нашем случае есть целых две проблемы. Во-первых, гетчара два. Во-вторых, программа написана ручкой на листочке. Я никогда не видел человека, который при написании программы ручкой на листочке заботился бы о том, чтобы если написанная программа будет запущена кнопкой F5, пользователь увидел бы результат вычисления и нажал бы Enter для закрытия окошка. Причём для гарантии (а вдруг не сработает, на листочке-то!) вызов getchar() лучше повторить, чтобы уж точно не ошибиться.

Спросил громко у студентки, зачем ей на листочке два гетчара. Аудитория посмеялась, но девушка не смутилась и попыталась придумать какое-то сбивчивое объяснение — я помню что-то про «чтобы файл закрылся» и какой-то ещё бред из этой же серии. Казалось, можно смело говорить классическое «ну вот, списали программу и не разобрались», но захотелось поставить следственный эксперимент.

Взял у другого студента ноутбук со студией и предложил студентке написать там Hello World. Она написала программу, причём безо всяких getchar(), и совершенно машинально запустила её, нажав Ctrl+F5. Из чего следует, что привычки нажимать F5 и писать в конце getchar у неё нет в принципе. О чём она думала, когда переписывала эти строчки, остаётся непонятным.

Зачёт, кстати, в итоге всё равно поставил.