- •Аннотация
- •Условия использования
- •Оглавление
- •Содержание
- •Только для взрослых
- •Десять лет спустя
- •Чему нас учат семья и школа?
- •Крошка сын к отцу пришел
- •Азбучные истины
- •Что я могу еще сказать?
- •Благодарности
- •Детям до 16-ти
- •Глава 1 Путь далек у нас с тобою…
- •Компьютер
- •Компилятор
- •Личный багаж
- •Компьютерная литература
- •В здоровом теле – здоровый дух
- •Вместе весело шагать по просторам!
- •Повторение – мать учения
- •Соглашения
- •Итоги
- •Глава 2 Вместо теории
- •Миф о думающих машинах
- •Загадочные коды
- •Языки программирования и компиляторы
- •Следующий шаг –
- •Итоги
- •Глава 3 Консольный интерфейс
- •Что такое интерфейс?
- •Консольный интерфейс
- •Прикосновение к консольному интерфейсу
- •А почему не «окна»?
- •Итоги
- •Глава 4 Оружие – к бою!
- •Оружейный прилавок
- •Free Pascal
- •Настройка ярлыка
- •Free Pascal
- •Установка справочной системы
- •Итоги
- •Глава 5 Программа номер один
- •Постановка задачи
- •Создание файла
- •Наполнение файла
- •Компиляция
- •Процедура вывода (печати)
- •Запуск программы
- •Итоги
- •Глава 6 Подготовка к следующему штурму
- •Еще об исходных файлах
- •Управление окном редактора
- •Борьба с ошибками
- •Итоги
- •Глава 7 Развиваем успех
- •Операторы и разделители
- •Программа, стой!
- •Алгоритмы
- •Блок-схемы
- •Итоги
- •Глава 8 Постоянные и переменные
- •Константы
- •Идентификаторы
- •Переменные
- •Ввод и вывод данных
- •Итоги
- •А слабо?
- •Глава 9 Переменные: продолжение знакомства
- •Представьтесь, пожалуйста!
- •Из пустого в порожнее
- •Сцепление строк
- •Инициализация переменных
- •Типизированные константы
- •Итоги
- •А слабо?
- •Глава 10 Условный оператор
- •Стой! Кто идет?
- •Вопрос ребром
- •Пост номер один
- •Неполный условный оператор
- •Пост номер два
- •Итоги
- •А слабо?
- •Глава 11 Операторный блок
- •Операторные скобки
- •Красиво жить не запретишь
- •Комментарии
- •Итоги
- •Глава 12 Цикл с проверкой в конце
- •Подтянем дисциплину
- •Нанимаем репетитора
- •Вежливый часовой
- •Досрочный выход из цикла
- •Итоги
- •Глава 13 Правда и кривда
- •Есть ли жизнь на Марсе?
- •Информация и её мерило
- •Булевы переменные
- •Ввод и вывод булевых данных
- •Логические выражения
- •С высоты птичьего полета
- •Парад логических операций
- •Итоги
- •А слабо?
- •Глава 14 Дважды два – четыре
- •Поможем братьям нашим меньшим
- •Числа и действия с ними
- •Алгоритм экзаменатора
- •Экзаменатор, первый вариант
- •Итоги
- •А слабо?
- •Глава 15 Айда в Монте-Карло!
- •Куда ни глянь – то процедура, то функция!
- •Госпожа удача
- •Итоги
- •А слабо?
- •Глава 16 Делу время, а потехе час
- •Потемкинская лестница
- •Итоги
- •А слабо?
- •Глава 17 И вновь за парту
- •Цикл со счетчиком
- •Итоги
- •Глава 18 Аз, Буки
- •Символьный тип данных
- •Индексация
- •Длина строки
- •Распечатка строки
- •Итоги
- •Глава 19 Процедуры и функции: разделяй и властвуй
- •Снежный ком
- •Описание процедур
- •Процедуры с параметрами
- •Итоги
- •Глава 20 Процедуры: первый опыт
- •Мухи – налево, котлеты – направо!
- •Сверху вниз
- •Первые раны
- •Глобальные и локальные
- •Локально – это разумно!
- •Неподдающаяся строка
- •Итоги
- •Глава 21 Отладка
- •Отладчик
- •Жучки, вылезайте!
- •Ссылка на переменную
- •Итоги
- •Глава 22 О передаче параметров
- •Процедура обмена
- •Замена символов в строке
- •О передаче строк
- •Итоги
- •Глава 23 Функции
- •Объявление функции
- •Пример функции
- •Подсчет символов в строке
- •Возврат строк
- •Когда результат не важен
- •Неявная переменная Result
- •Итоги
- •Глава 24 Криптография
- •Секреты Юлия Цезаря
- •Суть проблемы
- •О кодировании символов
- •Чудесные превращения
- •Шифрование символа
- •Расшифровка символа
- •Итоги
- •А слабо?
- •Глава 25 Текстовые файлы
- •Файлы хорошие и разные
- •Формат текстовых файлов
- •Доступ к текстовым файлам
- •Чтение из файла
- •Последовательный доступ к файлу
- •Самореклама
- •Цикл с проверкой в начале
- •Итоги
- •Глава 26 Я не читатель, — я писатель!
- •Запись в текстовый файл
- •Пример записи в файл
- •Завершение шпионского проекта
- •Итоги
- •А слабо?
- •Глава 27 Дайте кораблю минутный отдых!
- •Ошибка ошибке рознь
- •Фатальные ошибки
- •«Простительные» ошибки
- •Опции компилятора
- •Обработка ошибок ввода-вывода
- •Директивы компилятора
- •Директиву – в студию!
- •Парад директив
- •Итоги
- •А слабо?
- •Глава 28 Редактор и справочная система
- •Небьющиеся окна
- •Буфер обмена
- •Справочная система
- •Итоги
- •Глава 29 Читайте по-новому
- •Полицейская база данных, версия 1
- •Полицейская база данных, версия 2
- •Итоги
- •Глава 30 Журнальная история
- •Статистика знает все?
- •Строим планы
- •Барабаним по клавишам
- •Первый блин
- •Блин второй
- •Спецификатор ширины поля
- •«Развесные» числа
- •Итоги
- •Глава 31 Финал журнальной истории
- •Буква за буквой
- •Нелишняя предосторожность
- •Достройка программы
- •Испытание
- •Итоги
- •Глава 32 Порядковые типы данных
- •Типы данных: простые и сложные
- •Целое братство
- •Капля, переполняющая чашу
- •Инкремент и декремент
- •Диапазоны
- •Перечисления
- •Порядковые типы
- •Разумный контроль
- •Итоги
- •Глава 33 Вещественные числа
- •Изображение вещественных чисел
- •Вывод вещественных чисел
- •Типы вещественных чисел
- •Сравнение вещественных чисел
- •Типы данных пользователя
- •Совместимость и преобразование типов
- •Размеры переменных и типов данных
- •Итоги
- •Глава 34 Структура программы
- •Управляющие структуры
- •Структура программы
- •Структура процедур и функций
- •Обмен данными с подпрограммами
- •Встроенные процедуры и функции
- •Что дальше?
- •Итоги
- •А слабо?
- •Глава 35 Множества
- •В директорском кабинете
- •Первым делом, первым делом – оцифровка
- •Множества глазами математика
- •Числовые множества
- •Мощность множества, полные и неполные множества
- •Итоги
- •Глава 36 Множества в Паскале
- •Объявление множеств
- •Присвоение значений множествам
- •Операции с множествами
- •Сравнение множеств
- •Проверка на вхождение элемента в множество (операция IN)
- •Решение директорской задачи
- •Итоги
- •А слабо?
- •Глава 37 Ввод и вывод множеств
- •Вывод множества в текстовый файл
- •Ввод множества из текстового файла.
- •Директорская задача, первый вариант
- •Директорская задача, второй вариант
- •Итоги
- •Глава 38 Множества «в бою»
- •Активисты, шаг вперед!
- •Подвиг контрразведчика
- •В тридевятом царстве
- •Решето Эратосфена
- •Мелочь, а приятно
- •Итоги
- •А слабо?
- •Глава 39 Командная игра (массивы)
- •Снежная лавина
- •А где же волшебная палочка?
- •Массивы вокруг нас
- •Объявление массивов
- •Доступ к элементам (индексация)
- •Ввод и вывод массивов
- •Ошибки индексации
- •Итоги
- •Глава 40 Пристрелка на знакомых мишенях
- •Вопрос-ответ – добиваемся гибкости
- •Полицейская база данных – ускоряем поиск
- •Еще раз о статистике
- •Итоги
- •Глава 41 По порядку, становись!
- •Пиратская справедливость
- •Пузырьковая сортировка
- •Электронная делёжка
- •Возвращение на футбольное поле
- •Итоги
- •Глава 42 Кто ищет, тот всегда найдет
- •Где эта улица, где этот дом?
- •Последовательный поиск
- •Двоичный поиск
- •Исследование двоичного поиска
- •Ах, время, время!
- •Логарифмы? Это просто!
- •Итоги
- •Глава 43 Сортировка по-взрослому
- •Сортировка выбором
- •Быстрая сортировка
- •Процедура быстрой сортировки
- •О рекурсии и стеке
- •Алгоритмы, на старт!
- •Итоги
- •Глава 44 Строки
- •Строка – особый род массива
- •Укороченные строки
- •Операции со строками
- •Подсчет слов в строке
- •Контекстная замена
- •Итоги
- •Глава 45 Очереди и стеки
- •Вовочка в потоке событий
- •Танцевальный кружок
- •Скитания товарного вагона
- •Сортировочная горка
- •Итоги
- •Глава 46 Огромные числа
- •Сколько звезд на небе?
- •Сложение «в столбик» никто не отменял
- •Великая стройка
- •Длинная арифметика
- •Итоги
- •А слабо?
- •Глава 47 Системы счисления
- •Из тьмы веков
- •Число и его изображение
- •Десятичная система
- •Двоичная система
- •Шестнадцатеричная система
- •Другие системы счисления
- •Изображение числа в заданной системе счисления
- •Обратное преобразование
- •Итоги
- •Глава 48 Железная логика
- •Два взгляда на компьютерные «кирпичики»
- •Логические операции в регистрах
- •Сдвиги влево и вправо
- •Итоги
- •Глава 49 Сложные массивы
- •На поклон к Науке
- •Имперское строительство
- •Крестики-нолики
- •Итоги
- •А слабо?
- •Глава 50 Неспортивные рекорды (записи)
- •Кушать подано!
- •Записи
- •Второй тайм
- •Дополнительное время
- •Итоги
- •Глава 51 Указатели в море памяти
- •Погружение в оперативную память
- •«Планировка» памяти
- •Указатели, первое знакомство
- •Объявление указателей
- •Копирование указателей, пустой указатель
- •Сравнение и проверка указателей
- •Разыменование указателей
- •Нетипичный указатель
- •Примеры с указателями
- •Итоги
- •Глава 52 Динамические переменные
- •Аппетит является к обеду
- •Одолжите памяти немножко!
- •Выделение памяти
- •Освобождение памяти
- •Предупреждён – значит, вооружен
- •Итоги
- •Глава 53 Массив указателей
- •Базу данных – в кучу
- •Сортировка массива указателей
- •Итоги
- •А слабо?
- •Глава 54 Односвязные списки
- •Чудесное сочетание
- •Проблема курицы и яйца
- •Вяжем список
- •Распечатка списка
- •Поиск в несортированном списке
- •Сортированные списки
- •Поиск в сортированном списке
- •Итоги
- •Глава 55 Слова, слова, слова…
- •Частотный анализ текста
- •Слово за слово
- •Структура записи
- •Алгоритм
- •А слабо?
- •Глава 56 И снова очереди, и снова стеки…
- •Шутить изволите?
- •Танцуют все!
- •Итоги
- •Глава 57 Графомания
- •Видимое представление графа
- •Внутреннее представление графа
- •Ввод и вывод графа
- •Итоги
- •Глава 58 По графу шагом марш!
- •Империя номер два
- •Структура узла
- •В рассыпную!
- •Аты-баты
- •Итоги
- •Глава 59 Крупные проекты
- •О модулях и разделении труда
- •Модули
- •Дробление модуля – «смертельный» номер
- •Компиляция проекта
- •Инициализация модуля
- •Структура модуля
- •О совпадении имен
- •Сборочный цех
- •Фирменные библиотеки
- •Динамически загружаемые библиотеки (DLL)
- •Итоги
- •Глава 60 Мелкие хитрости
- •Включаемые файлы
- •Условная компиляция
- •Итоги
- •Глава 61 «Кубики» программиста (ООП)
- •Фокус-покус
- •Вместо паяльника
- •На трех китах
- •Инкапсуляция
- •Наследование
- •Приборостроение
- •Гражданское строительство
- •Динамические объекты
- •Полиморфизм
- •Сокрытие полей и методов
- •Итоги
- •Глава 62 Самое интересное только начинается!
- •Крупицы мастерства
- •Программисты, на старт!
- •Приложение А Установка и настройка IDE Borland Pascal
- •Borland Pascal, состав дистрибутива
- •Borland Pascal
- •Установка
- •Организация рабочей папки
- •Создание и настройка ярлыка
- •Пробный запуск
- •Предварительная настройка
- •Русификация консольного окна
- •Turbo Pascal School Pak
- •Приложение Б Консольная программа в среде Delphi
- •Создание пустого консольного приложения
- •Настройка и сохранение консольного приложения
- •Русификация консольного приложения
- •Приложение В Особенности IDE Pascal ABCNet
- •Приложение Ж Директивы управления компиляцией
- •Приложение З Назначение пунктов меню
- •Приложение И Стандартная кодировка символов MS-DOS
- •Приложение К Некоторые встроенные процедуры и функции
- •Приложение М Пример олимпиадной задачи
- •Библиография
Глава 62 Самое интересное только начинается!
Мы у финишной черты, где принято подводить итоги. Нет, друзья, повременим с итогами, ведь для вас все только начинается, — лучше обсудим ваши планы на будущее.
Крупицы мастерства
Чем зарабатывает программист? — создает программы. У хорошего мастера дело спорится, и товар его добротен. Как скорее достичь мастерства? За что браться, с чего начать? Вот несколько советов.
Постигайте языки программирования
Первым делом хорошенько оседлайте Паскаль — один из лучших языков программирования. Даже школьник, владеющий
Паскалем, — это наполовину инженер, ведь мощная система программирования Delphi построена на этом языке. Часть пути к вершинам Паскаля мы преодолели вместе, но освоили далеко не все его возможности. Дальше ступайте сами: преодолев робость и сомнения, откройте «взрослый» учебник по Паскалю, — некоторые из таких учебников найдете в списке рекомендуемой литературы. Там вас ждет немало открытий!
А что другие языки? Среди них отметим Си — один из самых используемых. Но почему не Паскаль?
Языки Паскаль и Си — ровесники, они родились в начале 70-х годов прошлого века. Паскаль был задуман как строгий язык для надежного программирования, но на первых порах применялся лишь в образовании. Создатели языка Си преследовали иную цель, — им срочно понадобился незатейливый язык для появившихся в ту пору мини-ЭВМ. Надо заметить, что программы, написанные на Паскале, эти слабенькие ЭВМ переваривали с трудом, а строгие ограничения надежного Паскаля по рукам и ногам вязали ретивых системщиков. Потому сработанный на скорую руку простенький и ненадежный Си вдруг вынырнул вперед и захватил лидерство. А что было дальше? — об этом нельзя промолчать.
По мере того, как компьютеры становились мощнее, а программы сложнее, требования к их надежности возросли — ошибки программистов крайне дороги! Сторонники Си осознали необходимость типизации данных и прочих мер повышения надежности и позаимствовали эти идеи из Паскаля. С другой стороны слишком суровый контроль типов в Паскале был слегка ослаблен — в разумных пределах. Это и другие новшества, добавили языку гибкости, и Паскаль пробился в области, где безраздельно хозяйничал Си. Нынешние потомки Паскаля — языки Ada и Modula — применяют для создания надежных, ответственных программ (авиация, космос, вооружения). Но это секрет, о котором «настольные»
520
Глава 62 Самое интересное только начинается!
программисты не знают, поэтому для них C/C++ — «языки профессионалов». Впрочем, в «настольном» программировании эти языки еще востребованы, хотя и вытесняются где-то более современными Java и C#.
Ещё одна популярная сфера — разработка сайтов. Тем, кто углубится в WEBпрограммирование, пригодятся PHP, Perl, JavaScript, Pyton и другие WEB-языки (они все плодятся и плодятся!).
Особняком от «толпы» языков программирования держится Ассемблер (Assembler переводится как «сборщик»). Его относят к языкам низкого уровня, — в отличие от Паскаля, Си и многих других, причисляемых к языкам высокого уровня. За что же так «унижен» Ассемблер? За то, что оперирует с потрохами процессора: адресами памяти, регистрами, флагами. Программирующий на Ассемблере должен хорошо представлять устройство компьютера и процессора, — на низком уровне нужна высокая квалификация! Ассемблер — удел профессионалов, и к нему прибегают там, где другие языки не годятся.
Технологии – не упускайте их из виду!
Изучая современные языки, вы постигните и технологии разработки крупных проектов: модульное и объектное программирование. И это не все. Технологии не стоят на месте, и новинки стремительно сменяют одна другую. Держите «руку на пульсе», следите за развитием технологий, — кто зазевался, тот отстал!
Изучайте типовые алгоритмы и структуры данных
Вам надо хорошо овладеть языками, но это не все. Любой проект начинают с разработки алгоритмов. Многие типовые задачи давным-давно решены, и для них созданы эффективные алгоритмы. Не изобретайте велосипед, изучайте типовые алгоритмы и структуры данных. Некоторые из них вам уже знакомы: это сортировка, двоичный поиск, списки, графы, стеки и очереди. И, хотя нерешенным задачам счету нет, в основе их решений лежат типовые алгоритмы и структуры данных.
Расширяйте кругозор
Программист, не «въезжающий» в решаемую задачу, — самое жалкое существо на свете! Увы, такие бедолаги — не редкость, и на то есть причины, — ведь компьютеры распространились повсеместно, где их только нет!
Принимаясь за очередной проект, поневоле вникаешь в премудрости той сферы, для которой он предназначен. Это может быть электроника, механика, химия или экономика — всего не перечислить. И всякий раз ищешь общий язык с экспертами в данной области. Ведь постановка задачи — это результат встречного движения программиста и заказчика. Значит, программист должен знать все? Но это невозможно! Да, всезнайкой вам не быть, но понемногу обо всем знать необходимо. Школяр! не пренебрегай науками, тебе сгодится все!
521
Глава 62 Самое интересное только начинается!
Угождайте пользователю
Программы для персональных компьютеров, как правило, общаются с людьми напрямую. А утомленному человеку свойственно ошибаться. Радейте о пользователе, — удобный и понятный интерфейс вашей программы должен радовать глаз, ограждая человека от возможных ошибок.
Проверяйте входные данные
Удобный и надежный интерфейс — это прекрасно, но даже он не гарантирует верного ввода исходных данных. Ошибки более вероятны, когда данные читаются из подготовленного вручную файла. Неверные данные могут «уронить» программу (например, при попытке деления на ноль). Громкое «падение» программы, сопровождаемое английскими «ругательствами», устрашит пользователя и породит в его душе сомнение в вашем мастерстве. Проверяйте вводимые данные на допустимость и непротиворечивость. Обнаружив ошибку, ваша программа должна вразумительно сообщить об этом пользователю и подсказать пути решения проблемы.
Тщательно тестируйте свои творения
Ошибки проявляются иногда так редко, что автор программы за это время несколько раз сменяет работу. Чем раньше вы обнаружите слабости своей поделки, тем лучше. Испытайте ее на самых разных наборах исходных данных — и правильных, и неправильных.
Комментируйте свои действия
В борьбе с ошибками не гнушайтесь ничем. Даже комментарии помогают. Поясняйте каждый крупный фрагмент: процедуру, блок операторов, а то и отдельный оператор. Если комментарий говорит о вашем намерении, то операторы показывают, что вы действительно сделали. Ошибка порождает противоречие между комментарием и оператором. Будучи незамеченным в первый момент, это несоответствие будет обнаружено вами или другими при повторном чтении программы.
Мы нередко возвращаемся к готовой программе спустя месяцы и годы после ее внедрения. За это время забывается почти все, что придумали. А если вашу программу будет править кто-то другой... — я не завидую этому парню! И здесь вновь выручат комментарии.
Роль комментариев выполняют и выразительные имена, облегчающие понимание программы. Обычно программисты придумывают их на основе английских слов — ведь это международный язык. Следуйте некоторой системе в назначении имен, например, той, которая предложена в этой книге. Напомню о некоторых наших договоренностях. Имена для типов данных, констант и переменных начинаем с определенных букв, а именно:
522
Глава 62 Самое интересное только начинается!
∙C – для констант;
∙T – для типов данных;
∙a – для аргументов процедур и функций;
∙m – для полей записей и объектов.
Переменным лучше давать имена существительных, а для процедур и функций подходят глаголы. Глобальным переменным предпочтительно давать длинные развернутые имена. Наоборот, локальные переменные, назначение которых очевидно (счетчики циклов, временные значения и тому подобное), лучше называть коротко — одной-двумя буквами.
«Вылизывайте» структуру программы
Мастерское владение языком программирования и ясное понимание поставленной задачи — вот основа вашего успеха. Но что отличает профессионала? Умение распределять сложность в пространстве программы. Ваша процедура или функция вышла громоздкой и запутанной? Так разбейте её на ряд простых. Не увлекайтесь глобальными переменными, — для их объявления нужны веские основания. Лучше, когда процедуры и функции принимают данные через параметры.
Программисты, на старт!
По многим школьным предметам проводят олимпиады, в том числе по информатике. Цель этих олимпиад — выявить самых способных. Профильные факультеты ВУЗов с удовольствием принимают победителей олимпиад на льготных условиях. Ради этого можно постараться, не так ли? Если вам это интересно, я открою некоторые тайны олимпиад по информатике.
Этапы и участники олимпиад
Олимпиады по информатике (программированию) проводят в несколько этапов, — на школьном, районном, областном, зональном, всероссийском и международном уровнях. Разумеется, что в следующий этап выходят победители предыдущего.
Участники соревнуются в двух возрастных группах: старшей (11-й класс), и младшей (10-й класс и моложе). В отличие от олимпиад по прочим предметам, программисты обеих возрастных групп решают одни и те же задачи. На ранних этапах каждая возрастная группа оценивается отдельно. А вот на всероссийском и международном этапах все возрасты оценивают вместе, и чемпионом может стать любой. Не смущайтесь своих юных лет. Чуете в себе силы? Так смело врубайтесь в скопище бойцов!
523
Глава 62 Самое интересное только начинается!
Определение победителей и призеров
Обычно «олимпийцам» предлагают решить несколько задач, и для каждой из них следует написать программу. Разумеется, что время на решение ограничено (обычно это от 3 до 5 часов на все задачи). По истечении этого времени судьи приступают к тестированию программ. Тесты приготовлены заранее, но неизвестны участникам. Каждую программу проверяют на нескольких тестах, а баллы начисляют за каждый успешно выполненный тест. Щедрость теста зависит от его сложности и сложности решаемой задачи. В конце концов, побеждает тот, кто наберет больше баллов.
Олимпиады программистов отличает еще одна особенность: для проверки решений здесь применяют тестирующие программы. Они автоматически компилируют исходный текст, а затем несколько раз запускают исполняемый файл, передавая ему всякий раз условия очередного теста. Это ускоряет проверку работ и придает ей объективность. Тестирующие программы применяют на областном и последующих этапах.
Организация туров
Тур — это один соревновательный день. Школьный и районный этапы, где количество решаемых задач невелико, проводят в один тур, а последующее — в два тура. Обычно в одном туре предлагается от двух до четырех задач, после чего подводятся и оглашаются его итоги.
Перед началом соревнований организаторы знакомят участников с правилами проведения этапа. Каждому участнику дают компьютер, а для приема решений выделяют сетевую папку. На всероссийском и международном этапах проводят предварительный пробный тур, где участники, решая простенькую задачу, знакомятся с рабочими местами и тестирующей системой. Пробный тур не оценивают.
И вот соревновательный тур настал: билеты с условиями задач розданы, часы включены. В течение тура участник может задавать жюри вопросы для устранения неясностей в условиях задач. Вопросы задают только в письменной форме (другие участники их слышать не должны!) и формулируют так, чтобы ответом было «да» или «нет». Нельзя, например, спросить, в каких пределах находится число N, но можно выяснить, является ли это число положительным («да» или «нет»?).
По окончании тура, участники покидают рабочие места, и начинается официальное тестирование их решений. Решение задачи — это исходный файл на выбранном языке (обычно на Паскале или Си). Тесты запускают в присутствии участника с использованием упомянутой тестирующей системы. Успешное решение должно компилироваться и выдавать правильные решения на предлагаемые тесты. Если тест не проходит, соответствующие ему баллы не начисляются. Жюри не рассматривает исходный текст как таковой, его интересуют лишь правильность прохождения тестов. Участник вправе опротестовать результат
524
Глава 62 Самое интересное только начинается!
тестирования, если, по его мнению, на это есть основания (например, ошибка в тестовых данных). Протест подается в жюри в письменной форме. Жюри рассматривает все протесты и принимает своё решение. По окончании тестирования и рассмотрения протестов, жюри подводит официальные итоги, объявляя победителей и призеров олимпиады.
Олимпиадные задачи
Как выглядит олимпиадная задача? — пример найдете в приложении М. В чем особенности таких задач?
Прежде всего, отметим способ ввода и вывода данных. То и другое выполняется только через текстовые файлы, которым присваивают заранее оговоренные имена. Так, если для файла с решением оговорено имя «ABC.PAS», то входной файл будет называться «ABC.IN» а выходной — «ABC.OUT». На эти расширения имен рассчитаны упомянутые тестирующие системы.
Входные данные олимпиадных задач считаются корректными. Это избавляет участника от их проверки и позволяет сосредоточиться на решаемой проблеме.
Упомяну о некоторых ограничениях. В решениях задач нельзя использовать внешние библиотечные модули (фирменные библиотеки), каждое решение представляется одним исходным файлом. Существуют ограничения и по времени исполнения программы (например, 5 секунд). Это побуждает участника искать быстрые, эффективные алгоритмы.
Таковы особенности олимпиад по информатике, теперь обсудим подготовку к
ним.
Подготовка к олимпиаде
Предметные олимпиады — это ступень на лестнице профессионального роста. Советы программисту-ремесленнику отчасти годятся и «спортсмену». И все же в олимпиадном программировании есть свои особенности.
Олимпийцы — всего лишь школьники, им хватит базовых средств выбранного языка. Применительно к Паскалю, участнику вполне достаточно того, что изложено в этой книге. Но владеть этим надо твердо. Вас не должен смущать ввод-вывод через текстовые файлы. Орудовать сложными типами данных надо так же свободно, как вилкой и ложкой. То же самое относится к процедурам и функциям. И в основных алгоритмах надо разбираться. Но, поскольку библиотечные модули правилами олимпиад запрещены, модульные технологии вам здесь не пригодится.
Итак, владение основами языка — безусловное требование к соискателям олимпийских лавров. Но этих знаний хватит лишь на первых порах — на школьном и районном этапах. Плюс природная смекалка. На последующих
525
Глава 62 Самое интересное только начинается!
уровнях смекалки уже мало, — нужна целенаправленная подготовка. В чем она состоит? Изучайте основные алгоритмы (в этом помогут книги, предложенные в библиографическом списке). Потренируйтесь в решении олимпиадных задач, — их полно в Сети, ссылки на некоторые ресурсы вы найдете в табл. 13.
Табл. 13 – Некоторые ресурсы Сети по олимпиадному программированию
Ресурс |
|
Ссылка |
||||||||
|
|
|
|
|
|
|
|
|
|
|
Алгоритмы |
|
http://algolist.manual.ru |
||||||||
|
|
|
|
|
|
|
|
|
|
|
Алгоритмы |
|
http://bestalgorithm.ru |
|
|||||||
|
|
|
|
|
|
|
|
|||
Олимпиады по программированию |
|
http://www.olympiads.ru |
||||||||
|
|
|
|
|
|
|
|
|
|
|
Олимпиады по информатике |
|
http://neerc.ifmo.ru/school |
||||||||
(редактор – Андрей Станкевич) |
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Разбор олимпиадных задач |
|
http://g6prog.narod.ru |
||||||||
(редактор – Михаил Густокашин) |
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Олимпиады по информатике |
|
http://www.informatics.ru |
||||||||
(сайт мытищинской школы программистов) |
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
Уральские олимпиады по программированию |
|
http://contest.ur.ru |
||||||||
|
|
|
|
|
|
|
|
|
|
|
Спортивное программирование |
|
|
|
|
|
|
|
|
|
|
(соревнования «онлайн» с дистанционным |
|
http://acm.timus.ru |
||||||||
тестированием) |
|
|
|
|
|
|
|
|
|
|
Командные олимпиады |
|
http://de.ifmo.ru/cyber-net |
||||||||
|
|
|
|
|
|
|
|
|
|
|
Олимпиадные хитрости
Теперь о том, как биться на олимпиаде. На бой выходите со свежей головой, что называется в здравом уме и крепкой памяти. Ударные занятия перед олимпиадой только навредят, — лучше на пару дней забудьте о Паскале, погуляйте на воздухе и хорошенько отоспитесь.
Явитесь на олимпиаду без опоздания. Не тревожьтесь, ведь коленки дрожат не только у вас. Волнение — это нормальная реакция на опасность, оно мобилизует организм, но все хорошо в меру.
Внимательно выслушайте предполетный инструктаж, в котором организаторы объяснят правила олимпиады. Получив условия задач, обязательно прочитайте их
526
Глава 62 Самое интересное только начинается!
все и оцените сложность. Не хватайтесь за первую попавшуюся задачу, начинайте с самой легкой на ваш взгляд. Действуйте по принципу «лучше синица в руке, чем журавль в небе». Одолев легкую задачу, беритесь за самую простую из оставшихся. Так вы наберете часть баллов, и настроитесь на решение трудных задач.
А если все решить невмоготу? Тогда примените разрешенную правилами хитрость: выдайте хотя бы одно или два частных решения. Что это такое? Это решение, удовлетворяющее одному из тестов. Предположим, что по условию задачи вы должны вычислить факториал числа. Но вы напрочь забыли о факториале все, кроме того, что факториалы для нуля и единицы равны единице. Тогда выдавайте единицу как решение для всех входных данных. Составители тестов наверняка проверят эти точки, и тогда ваша программа пройдет, по крайней мере, пару тестов.
Олимпиада быстротечна, и время надо беречь. А потому не пишите комментариев, не измышляйте слишком длинных имен. Но основными правилами оформления программ не пренебрегайте (логическими отступами, например), — они избавят вас от путаницы в собственном творении.
Ваше время сэкономит шаблон будущих программ. Вот пример такого шаблона, его можно напечатать в начале тура и сохранить в отдельном файле. И тогда не придется повторно набивать одни и те же операторы в разных задачах.
const CTask = 'Name'; CIn = CTask+'.in';
COut = CTask+'.out'; procedure ReadData;
var F: text; begin
Assign(F, CIn); Reset(F);
Close(F);
end;
procedure WriteData; var F: text;
begin
Assign(F, COut); Rewrite(F);
Close(F);
end;
527
Глава 62 Самое интересное только начинается!
begin
ReadData;
WriteData;
end.
Взяв за основу шаблон, и определив константу CTask для имен файлов, вы получите отчасти готовую программу.
Организаторы гарантируют правильность входных данных в своих тестах. Если в условии сказано, что число лежит в пределах от 1 до 10, то так оно и будет. Но это не значит, что вы введете его таким, — ошибка может затаиться в процедуре ввода. Она сведет на нет последующие правильные действия, и вы не получите нужный ответ. Так проверяйте ввод данных (отладчиком или выводом на экран). Разумеется, что для проверки решения вам придется выдумать свои тесты, поскольку тесты жюри участникам неизвестны.
Когда пыль уляжется…
И вот тестирование завершено, и результаты оглашены. Где мы с вами? Впереди на белом коне? Поздравляю! Искупайтесь в лучах славы, и, обсохнув на лаврах, начинайте готовиться к следующему этапу.
Аесли неудача? Каждый переживает ее по-своему. Кто-то даст волю чувствам
иразмажет слезы по щекам. Но вы не из тех, — я знаю. Поражение закаляет упорных. Внимательно прослушайте разбор задач, — его устраивают по окончании туров. Разберитесь в своих ошибках, решите задачи дома. А может, вам просто не хватило времени? — не беда, ведь и среди великих встречались тугодумы. Не опускайте рук, работайте, и обязательно добьетесь успехов. В конце концов, олимпиада — это всего лишь ступенька, которую можно... перепрыгнуть. Все еще впереди!
528