Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
posobie.doc
Скачиваний:
27
Добавлен:
31.03.2015
Размер:
1.43 Mб
Скачать

2.3. Общая схема перехода от метода к алгоритму решения

Увы, строго формальных правил здесь привести нельзя, как нельзя провести четкую границу между этапами «метод-алгоритм-программа». Однако можно выделить некую общую схему действий и предложить правила для ее описания. Для этого иногда нам придется возвращаться к самому началу разработки.

Исходная посылка вполне тривиальна: прежде чем описывать алгоритм (формальную схему), надо по меньшей мере на неформальном уровне знать, как решить предъявленную задачу. Критерий такого знания – умение вручную получить результаты для конкретного примера. Пока этот уровень понимания не достигнут, следует терпеливо постигать смысл задачи. Это положение справедливо для решения любой задачи, но при обучении программированию его приходится подчеркивать особо. В силу многих обстоятельств часто господствует установка, предписывающая задачу сразу программировать на языке компьютера, оставив чтение условия «на потом» (т.е. до процесса отладки получившейся «программы»).

Деятельность по разработке будущей программы начинается, только когда смысл задачи понят и определены ее входы-выходы. Итак, мы можем решить задачу, и надо теперь это умение выразить четким языком. Для этого и предназначен пункт «Метод», и главным образом к нему относятся приводимые рекомендации.

Цель их – помочь описать схему решения задачи без многократного переписывания максимально точно, с минимальными усилиями и так, чтобы получившийся текст был читабелен. Если это удается, то перейти к алгоритму – дело техники. Приведем рекомендации по ряду основных моментов, являющихся общими для большинства задач.

Промежуточные данные

В процессе решения задачи может потребоваться использование вспомогательных переменных.

В отличие от входных и выходных данных, состав которых определяется задачей, а по воле программиста выбираются только их имена (возможно, структура), состав этих вспомогательных переменных может бесконечно варьироваться в зависимости от способа решения задачи и соображений (даже вкуса) программиста. Это – промежуточные данные. Они появляются по ходу решения задачи. Однако описание таких переменных сразу же, как только в них появляется необходимость, позволяет формализовать и более компактно описать дальнейший ход решения.

Чтобы разделить описания промежуточных данных и метода решения и в то же время получить текст метода, где все обозначения уже определены, удобно для описания промежуточных данных в самом начале текста метода отвести поле (сначала пустое) и заполнять это поле по мере появления необходимости в промежуточных данных.

Воспользуемся здесь традициями точных наук и будем начинать это поле со слова «Пусть» (т.е. «далее я хочу и буду использовать для решения задачи следующие переменные»).

Если более естественным получается текст, где промежуточные данные вводятся несколько раз по ходу описания, то ключевое слово «Пусть» должно предшествовать каждой группе промежуточных данных. Так сделано, например, при раскрытии абстракции А0.2 задачи «Точки в круге» (см. § 2.4).

Все промежуточные данные обязательно должны быть описаны в пункте «Метод».

В любом случае при переходе к методу сразу напишите слово «Пусть», пропустите 1/3 – 1/4 страницы и приступайте к поиску пути решения задачи.

Формулы и другие взаимосвязи между данными

Если в Вашей задаче есть формулы или какие-либо общие закономерности, связывающие данные, выпишите их сразу же, введя, если надо, промежуточные обозначения и вписав их в соответствующий раздел.

Это могут быть:

  • геометрические и тригонометрические формулы (вычисление расстояний для точек; формулы для треугольников и других фигур и т.д.);

  • формулы для вычисления процентов, средних величин;

  • многое другое, зависящее от содержания конкретной задачи.

Пронумеруйте формулы. Далее в ходе описания метода можно повторно выписать эти формулы, а можно сослаться на них. Пример – та же абстракция А0.2 из § 2.4.

Выявление и запись возможных закономерностей как можно раньше уже неявно разбивает Вашу задачу на подзадачи и направляет ход решения в нужное русло.

Альтернативные ситуации

Если в задаче требуется найти среди множества объектов какой-либо объект, удовлетворяющий некоторому условию, необходимо предусмотреть ситуацию, когда искомого объекта может не быть. Это – не аномалия, а вариант решения задачи.

Например, в задаче «Точки в круге» могут быть заданы такие точки, что одного из искомых результатов (точек внутри круга, расположенных к тому же в первой четверти координатной плоскости – см. тест 2) нет.

Такая ситуация должна быть предусмотрена уже на уровне определения выходных данных как возможный вариант решения и зафиксирована в описании выходных данных, выходной форме и тестах.Реально это не всегда отслеживается и перетекает в пункт «Метод», а то и пропускается вообще.

Если Вы пропустили подобную ситуацию, анализируя выходные данные, и обнаружили ее только при переходе к методу, вернитесь к выходным данным и скорректируйте их описание и особенно – выходную форму: при отсутствии искомого должен быть соответствующий вывод.

Следующие рекомендации позволят Вам учесть альтернативные варианты решения уже на этапе анализа задачи.

Возможные варианты описываемой ситуации:

А) частный случай: все получается автоматически, само собой, например, когда мы ищем числообъектов, которые могут быть среди заданных, а могут и не быть; в одном случае получим ненулевое значение искомого числа, в другом – нулевое (объектов нет); именно так и получается в задаче «Точки в круге»;

Б) общий случай: необходимо разделить ситуации наличия и отсутствия искомого и обрабатывать их по-разному.

Вариант Б более универсален и в итоге более четок и нагляден, но требует более тонкой работы.

Так, при анализе выходных данных в выходной форме следует предусмотреть два варианта вывода:

  • вывод искомого значения результата, если искомые объекты есть;

  • вывод сообщения об их отсутствии – в противном случае.

В решении задачи обязательно должна быть величина, по значению которой определяется ситуация. Это – промежуточная величина, зависящая от смысла задачи. Она должна быть обязательно описана в пункте «Метод».

Общая схема решения в таком случае приобретет следующий вид:

  • ввод – вывод входных даных;

  • поиск упомянутой «управляющей» величины;

  • ее анализ;

  • если искомое найдено, то поиск значения результата и его вывод;

  • если искомое отсутствует, то вывод предусмотренного сообщения.

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

В выходной форме достаточно предусмотреть сообщение «Искомых точек нет». Очевидно, что величиной, определяющей наличие этих точек, будет их количество. Поскольку по условию задачи это значение не требуется, оно – промежуточное.

Эту схему легко применить и к нашей задаче.

Далее, в гл. 4 пособия, предложенный прием используется везде, где это необходимо.

Собственно решение

Приводимые далее рекомендации являются универсальными, хотя исходно были сформулированы как рекомендации для успешного применения нисходящего подхода.

1. Ключом к успеху является формализованное и строгое описание входов, функций и выходов всех абстракций, т.е. спецификация соответствующих подзадач.

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

3. Следует точно, кратко, емко формулировать подзадачи: должно быть ясно, какие величины обрабатываются и что должно получиться. Это – критерий правильности выделения подзадач.

4. Если на каком-либо шаге встретились непредвиденные проблемы, не надо бояться пересмотреть неудачный проект.

5. На каждом уровне раскрывайте очередную абстракцию так, чтобы не терять контроля над структурой алгоритма. Для этого можно действовать по следующей схеме:

Абстракцию можно раскрыть как последовательность действий?

Да: раскрыть, довести до программы на этом жеуровне и отладить.

Нет: можно ли раскрыть абстракцию как условное действие?

Да: четко сформулировать условие и соответствующие действия; раскрыть, довести до программы на этом жеуровне и отладить.

Нет: раскрыть абстракцию как повторяющееся действие. Четко сформулировать условия начала, продолжения и окончания повторений и повторяющиеся действия; раскрыть, довести до программы на этом жеуровне и отладить.

6. Реализацию каждой из абстракций (спецификация - алгоритм-программа) следует записывать на одном листе. Это обеспечит наглядность разработки.

Учитывая требование 2, на первом этапе проектирования целесообразно (если это возможно) разделить ввод данных, обработку и вывод результатов. Следующим этапом будет анализ аномалий, т.е. разбиение обработки данных на подзадачи, решаемые в случае нормальных данных и в случае аномалий. При этом анализ аномалий как самостоятельная подзадача может быть достаточно сложным и, в свою очередь, требовать нисходящего подхода.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]