материалы занятия

advertisement
Методика и содержание подготовки учащихся к олимпиадам по программированию.
Дистанционный курс.
Тексты задач
Как уже говорилось, преподаватель, который занимается олимпиадной подготовкой
школьников должен уметь составлять задачи и составлять комплекты тестов к ним.
Рассмотрим этот процесс более подробно на примере.
Пусть требуется написать программу, вычисляющую площадь треугольника, заданного
координатами своих вершин. Напишем ее подробное условие.
В черновом варианте формулировка задачи может быть такой: «Напишите программу,
вычисляющую площадь треугольника ABC. Точки A, B и C задаются своими координатами».
Несмотря на то, что суть задачи передана верно, такое маленькое условие может вызвать у
школьников следующие вопросы (с точки зрения школьника, который хочет решить задачу на
полный балл, чтобы она прошла все тесты, вполне естественно поинтересоваться деталями)
1.
В каком порядке на вход программы подаются координаты точек? (да, вполне
естественно предположить что сначала идут координаты точки A, в общепринятом
порядке (x,y), затем точки B и так далее, но возможны и другие варианты – например
сначала все x-координаты, а потом – все y).
2.
В каком диапазоне лежат исходные данные? (какие типы данных стоит использовать
для хранения)
3.
Не может ли случиться такого, что все три точки лежат на одной прямой, или этот
случай необходимо предусмотреть (и что при этом надо вывести: сообщение что
треугольник не существует или число 0, которое является формальным ответом)
4.
Площадь, очевидно, может быть дробным числом. С какой точностью необходимо ее
вычислить? (какие типы данных необходимо использовать внутри программы?)
Таким образом, черновая формулировка должна быть дополнена:
«Напишите программу, вычисляющую площадь треугольника ABC с точностью до
третьего знака после запятой. Точки A, B и С задаются своими координатами. Все координаты –
целые числа, по модулю не превышающие 100. Гарантируется, что точки не лежат на одной
прямой.
Входные данные: с клавиатуры через пробел вводятся координаты точки A, затем – точки
B, затем – точки C.
Результат: выведите на экран единственное число – площадь треугольника, с точностью
до третьего знака после запятой».
Существенным дополнением является также источник данных (клавиатура) и направление
вывода (экран). Если задачи проверяются вручную, то данное уточнение будет излишним, но если
используется тестирующая система, то это примечание очень важно.
Задачу также принято снабжать примерами тестов, чтобы ученик имел возможность
проверить работоспособность своей программы по каким-то заготовкам. Также тесты в условии
задач часто помогают лучше понять условие, особенно в более сложных случаях.
Добавим в нашу формулировку еще примеры входных и выходных данных:
Входные данные
Результат
0 0 10 0 0 10
50.000
0 -1 1 0 0 1
1.000
Приступим теперь к составлению комплекта тестов. Для этого нужно представить, какой
алгоритм решения скорее всего применят школьники и какие особенности того или иного языка
программирования могут вызвать трудности с реализацией этого алгоритма.
Представим, что ученик будет использовать такой алгоритм:
1. найдем длины всех сторон;
МЦНМО, 2007/08 учебный год
Методика и содержание подготовки учащихся к олимпиадам по программированию.
Дистанционный курс.
2. вычислим площадь по формуле Герона.
То есть с точки зрения математики решение задачи сводится к формулам:
a  ( xb  xa ) 2  ( yb  y a ) 2 - длина отрезка AB, здесь xa, ya – координаты точки A, xb, yb –
координаты точки B.
b  ( xb  xc ) 2  ( yb  yc ) 2 - длина отрезка BC
c  ( xc  xa ) 2  ( yc  y a ) 2 - длина отрезка AC
Уже на этом этапе возможно возникновение арифметического переполнения, при
использовании типа Integer (Паскаль) или int (Си). Дело в том, что максимально возможная
разность (xb- xa) при данных ограничениях на исходные данные равна 200 (xb=100, xa= -100). Тогда
квадрат этой разности равен 40000, что превышает допустимый диапазон для этих типов. То есть
для проверки полноты решения необходимо написать тест с максимальной разностью координат
точек.
Далее, формула Герона требует вычисления полупериметра:
abc
p
2
На этом этапе переполнения возникнуть не может, так как a, b и с – действительные числа
(так как получены путем извлечения корня). Здесь никаких специальных тестов не добавляется.
Последний этап
S  p( p  a)( p  b)( p  c)
Поскольку треугольник гарантировано существует, все величины в этой формуле –
действительные, то никаких особых случаев не ожидается.
Отсюда следует вывод, что достаточно небольшого комплекта тестов, в котором
большинство тестов будут с «небольшими» сторонами (не вызывающими переполнения) и еще 1-2
теста на проверку умения анализировать диапазон исходных данных. Разумеется, ни один тест не
должен противоречить условию задачи1.
Такое иногда случается на олимпиадах разного уровня. В случае обнаружения такой ситуации проводится апелляция
с тестированием работ всех участников для этой задачи заново.
1
МЦНМО, 2007/08 учебный год
Download