На днях мне довелось провести практическое занятие по программированию для учеников десятого класса одного из харьковских лицеев. Шесть лет назад я читал курс программирования в политехе, но тогда на посвящение студентов в эту, не побоюсь сказать, науку у меня было целых два семестра времени на лекционные и лабораторные занятия. А здесь было всего от силы полтора часа, да и с таким юным контингентом я ещё не работал. «Ладно», сказал я себе. И приступил к подготовке. Мне дали несколько задач, которые можно было бы порешать со школьниками. Первая из них занимала аж 70 строк индусского кода. Подготовил своё решение из 10 строк. Думал, «Сначала дам одно решение, потом покажу другое». Ещё одну задачу переписал для того, чтобы сместить акценты с программистских особенностей в предметную область (задача была геометрическая). Третья задача была наиболее простой – один человек вводит с клавиатуры число, другой отгадывает. Неинтересно. Пусть лучше компьютер загадывает и даёт подсказки. Для каждой задачи придумал последовательность подачи материала. Когда пришло время, а школьники расселись за компьютеры, я их спросил: «Кто-нибудь из вас имеет опыт программирования? Какие-то языки программирования уже изучали?». Получив отрицательный ответ, мысленно сказал себе «Печально», отложил в сторону два листа с распечаткой кода из трёх и сделал заявление: «Ну, что ж… Тогда начнём программировать!».
Для кодеров данная статья, наверняка, интереса не представляет. Мой рассказ будет о методике преподавания в условиях ограниченного времени для людей с неокрепшей детской психикой на примере всего одного урока. Всех желающих приглашаю под кат!
Вводное слово о программировании началось примерно так. «Компьютеры сейчас применяются практически в любой сфере человеческой жизни. Поэтому неважно, какой путь вы выберете, на кого станете учиться, уметь программировать достаточно важно. С помощью этой науки можно получить существенную выгоду». Далее я привёл пример «задаче о коммивояжёре», сформулировав её следующим образом: «Представьте, что вы работаете в Новой Почте. Вам нужно доставить множество посылок в разные города. Хорошо бы выбрать путь, чтобы был бы как можно короче. Это сэкономит деньги – курьер работать будет меньше часов, бензина потратите меньше литров». И небольшой переход: «Но, к сожалению, компьютер сам не умеет решать такие задачи. Он умеет выполнять лишь арифметические и логические операции» (ну, и другие, но не будем сейчас об этом). «Причём делает он это над числами в виде нулей и единиц» (не будем тратить время, рассказывая о двоичной системе счисления – надеюсь, в школьной программе она есть). «Команды компьютеру (машинные инструкции) тоже даются в виде чисел. Но обычно программисты пишут программы на языках, понятных человеку – например, C, Java, C++». Услышав «си-плюс-плюс», дети оживились. «Чтобы преобразовать код программы в команды компьютеру есть несколько видов программ, например, компиляторы. Чтобы более удобно с ним работать будем использовать другую программу – среду разработки, которая также включает текстовый редактор и много других полезных инструментов. Найдите на рабочем столе ярлык программы Code::Blocks и запустите его».
Потом я рассказал, как создать новый проект и подробно, строчка за строчкой, описал содержимое файла с программой. Нумерация строк очень помогла. А вот трактовки терминов получились довольно вольными.
«Итак, можно увидеть, что в коде программы встречаются английские слова. Это и include, и using, и main, и return. В первой строке мы включаем, т.е. используем, некую библиотеку. Обычно программисты используют код, написанный другими программистами. Он включается во всевозможные библиотеки. В данном случае мы используем библиотеку iostream. Здесь i – это input (ввод), o – output (вывод), stream – поток. Т.е. библиотека содержит код для ввода с клавиатуры и вывода на экран» (перегружать школьников информацией о перенаправлении потоков ввода-вывода не стоит). «Если библиотек много, между ними могут возникнуть конфликты, поэтому код обычно размещают в разных пространствах. using namespace std нужно для того, чтобы выбрать пространство имён (namespace) std – сокращение от standard (стандартный). int говорит, что идёт речь о целых числах, об их хранении и передаче» (т.е. я имел в виду объявление переменных и возвращаемое функцией значение; о явном приведении типов рассказывать не стал) «main – имя функции. Функция – это какой-то логически завершённый участок кода, который возвращает какое-то значение. cout… c – console (консоль – клавиатура и экран), out – вывод, endl – end of line, конец строки. В седьмой строке происходит вывод текста, заключённого в двойные кавычки, на экран. return 0 в данном случае говорит операционной системе об успешном завершении программы».
После этого предложил нажать F9, чтобы скомпилировать программу («преобразовать текст программы в машинные инструкции»). «Поздравляю! Вы написали свою первую программу!», сказал я, когда увидел, что на мониторах появились консоли с текстом. Потом уточнил: «Ну, не совсем написали – за вас это уже сделали другие. Поэтому давайте внесём изменения в код. Измените в двойных кавычках текст Hello world! на какой-нибудь другой на английском языке и ещё раз нажмите F9. Вот теперь другое дело!». Кто-то не закрыл окно запущенной программы, поэтому компиляция не прошла. Пришлось помогать. «Теперь замените текст на какой-нибудь другой, на русском языке. И удивитесь.» Те, кто написал «Привет», увидели следующее:
«Всё дело в том, что текст тоже преобразуется в нули и единицы. И как именно будет происходить это преобразование, зависит от кодировки. Кто-нибудь сталкивался с этим понятием?» В ответ – неуверенное мычание… «Давайте зададим кодировку для кириллицы. Установим (set) соответствующую локаль (locale). Для этого седьмую строку опустим вниз (поставим курсор в начале строки и нажмём Enter). И в пустой седьмой строке введём setlocale(LC_ALL, "rus"); А во второй строке введём #include <locale>». Кто-то LC_ALL написал строчными буквами (пришлось объяснить, что строчные и заглавные буквы отличаются), кто-то списал с доски L.C.A.L.L. (да, доска в ужасном состоянии), кто-то написал «russ» и не получил должного результата. Но в большинстве случаев я увидел положительный исход. Немного опечалил текст, который написала одна девочка, «хочу кушать». В таком состоянии восприятие информации довольно сильно страдает.
Пришло время сформулировать школьникам условия задачи. «Теперь давайте напишем программу. Пусть компьютер загадает число от 0 до 99, а мы с его подсказками будем это число отгадывать». Да, это третья задача.
«Для генерации случайного числа используется функция rand, сокращение от слова random – случайный. Чтобы её использовать, нужно подключить библиотеку cstdlib. Для генерации числа от 0 до 99 нужно взять остаток от деления результата, который возвращает функция, на 100. Операция получения остатка от деления записывается символом процента». Тут пришлось напомнить школьникам, что такое остаток от деления. Привёл пример «5%2», и им стало ясно, что я имел в виду. «Результат выполнения операции взятия остатка от деления (т.е. случайное число от 0 до 99) нужно куда-то записать. Это число целое. Странно было бы, если бы мы пытались угадать какое-нибудь вещественное число, например, 2.584 или 35.763. Для хранения результата будем использовать переменную. Переменная – это область памяти компьютера (нам пока неважно, где эта память находится), к которой можно обращаться по имени». Да, с переменными различных типов можно выполнять определённый набор операций, но это сейчас не имеет значения. «Назовём переменную u (от слова unknown). Для объявления переменной целого типа используется слово int. Такая область памяти на этих компьютерах занимает 4 байта и может вместить число примерно от минус двух до плюс двух миллиардов. Этого достаточно?» Получив утвердительный ответ, написал на доске недостающий код. Получилось следующее (вместе с исправлением вывода – теперь на экране будет не текст, а значение переменной):
Запустив программу, школьники, все до одного, увидели число 41. Не 42, но тоже сойдёт. Причём результат не изменялся от запуска к запуску. «Итак, мы получили случайное число. Действительно, кто бы мог подумать, что компьютер выдаст 41? Число 41 удовлетворяет условиям, которые мы поставили. Оно находится в интервале от 0 до 99. Но как его сделать действительно случайным? Для этого нужно задать так называемое зерно генератора случайных чисел, например, текущим временем. Добавьте перед десятой строкой строку srand(time(0)); Если программа не компилируется – добавьте библиотеку ctime»
Теперь программа выдавала действительно случайные (ну, на самом деле не случайные, но это для этой задачи значения не имеет) числа. Исходник программы на данный момент был таким:
Осталось написать код, отвечающий за его угадывание.
«Не думаю, что вы сможете угадать число от 0 до 99 с первого раза» Школьники улыбнулись. «Если мы будем делать какие-то одни и те же действия несколько раз, то это можно оформить в виде цикла» Так как рассказать на словах, как реализовать цикл, сложно, сначала я записал соответствующие строки на доске.
«В тринадцатой строке мы объявили переменную i (от input), аналогичную переменной u. В ней мы будем хранить введённое число. Собственно ввод осуществляется в 16-й строке. Цикл объявляется ключевым словом do. Всё, что заключено в фигурные скобки, будет повторяться пока (while) значение переменной i не равно u». Что касается этого участка кода, то типичные ошибки учеников были такие. Во-первых, они ставили вместо фигурных скобок круглые. Во-вторых, операцию сравнения «!=» писали раздельно. После компиляции программы дети настойчиво пытались отгадать число u. Меня поразило, что девочка, которая ранее написала «хочу кушать» делала это весьма успешно. Из ошибок времени исполнения я был рад увидеть следующую:
Это позволило мне объяснить, что в программе нет проверки корректности входных данных, и вводить буквы, когда от нас ожидают лишь цифры – не самая лучшая идея.
Мы подошли к финишной прямой. Осталось добавить подсказки. Я написал на доске два «if-а» и пояснил. «Если введённое число больше загаданного, выводим соответствующее сообщение (строка 17). Если введённое число меньше загаданного – делаем так же (строка 18).» Плюс ко всему я расширил вывод сообщения о завершении «игры».
Это был окончательный текст программы, которую набрал на первом уроке программирования 10-в класс. Программа далеко не идеальна. В частности, мне не нравятся сообщения «Ваше число больше!» и «Ваше число меньше!». Они реально запутывают. Если бы у меня был второй шанс провести подобный урок, сформулировал бы по-другому.
На этом уроке я также хотел показать ученикам алгоритм быстрого поиска загаданного числа (бинарный поиск), но оказалось, что они сами интуитивно пришли к этому решению, что не могло меня не порадовать.
Итоги подведём.
1. Урок прошёл успешно. Все ученики справились с заданием. Задача решена. Всего одна, но решена. Не без трудностей, конечно.
2. Я получил новый опыт преподавания. Последние два года читаю лекции и провожу лабораторные работы только студентам пятого курса, а работать с ними – совершенно иное дело. У них уже есть какая-то база, отношение к учёбе (да и к жизни в целом) другое, а мои предметы узко специализированные – материал, который я даю, в будущем пригодится от силы 2–3 нашим выпускникам из каждой группы. Здесь же есть надежда, что именно этот урок вызовет интерес к программированию у одного-двух учеников.
3. Школьная учебная программа совершенно иная, нежели та, по которой учился я. Да, я ходил не в простую школу. В седьмом классе мы изучали Logo, в восьмом – BASIC, а в девятом – Pascal. Но, тем не менее, даже тем моим одноклассникам, которые не блистали знаниями по другим предметам (а ведь и я тоже не блистал!), информатика нравилась. Я уверен, что давать программирование в школе нужно обязательно. Оно отлично развивает
4. Язык C++ имеет высокий порог вхождения. Одного урока, чтобы раскрыть основы этого языка программирования, явно недостаточно. Да, я не знаю C++. Я обожаю C, а когда мне нужно ООП, я пишу на Java. Но изучать C++ в вузе скорее всего нужно (C по моему скромному мнению – обязательно). Опять же многое зависит от вуза и специальности.
Спасибо за внимание всем, кто прочёл до конца! Буду рад ответить на ваши вопросы.
P.S. Есть идея написать ещё одну статью об информатике в школе. Если поддержите в комментариях, статья, скорее всего (не буду обещать), увидит свет.
Автор: Александр