Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика учебное пособие часть2.doc
Скачиваний:
28
Добавлен:
16.09.2019
Размер:
1.14 Mб
Скачать

6.5 Основные подходы к разработке алгоритмов

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

Отметим основные походы к разработке алгоритма.

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

(Алгоритм сложения фигурок из листа бумаги – взять сложенную птицу и последовательно развернуть ее, чтобы понять, как сложить?)

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

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

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

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

6.6 Проверка правильности программы

Рассмотрим решение следующей задачи.

У путешественника есть золотая цепь, состоящая из 7 колец. Он должен остановиться в гостинице на несколько дней (но не более 7). Плата за сутки равна 1 кольцу цепочки. Каково наименьшее число колец, на которые нужно разрезать цепь, чтобы платить за гостиницу по одному кольцу каждое утро, не платя за ночлег заранее?

Решение. Можно догадаться, что разрезать нужно не каждое кольцо цепочки. Если мы разрежем 2-ое кольцо, то освобождается и первое, и второе. Следовательно, нужно разрезать только 2, 4, 6 кольца.

У меньшение числа разрезанных колец приводит к тому, что какие-либо 2 кольца становятся соединенными. Поэтому правильный ответ – 3 кольца.

Действительно ли это правильное решение задачи?

Можно предложить такой вариант решения: Если разрезать только третье кольцо, то мы будем иметь 3 части цепочки, состоящей из 1, 2 и 4 колец. Дальше можно действовать следующим образом:

Первое утро: отдать 1 кольцо.

Второе утро: забрать кольцо и отдать 2.

Третье утро: отдать 1 кольцо.

Четвертое утро: забрать все кольца (1 + 2) и отдать 4 кольца.

Пятое утро: отдать 1 кольцо.

Шестое утро: забрать одно кольцо и отдать 2.

Седьмое утро: отдать 1 кольцо.

Следовательно, первый ответ, который считали правильным, таковым не является. Можно ли быть уверенным, что найденное решение правильное? Меньше 1 кольца нельзя разрезать, следовательно, новое решение минимально.

Этот пример подчеркивает различие между решением, которое считается правильным, и решением, которое действительно является таковым. Не всегда это – одно и тоже. Известно большое количество историй о ПО, которое считалось правильным, однако переставало работать в критических ситуациях из-за возникновения каких-либо условий.

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

Формальные методы проверки правильности программ не разработаны настолько хорошо, чтобы их можно было с легкостью применять к общим прикладным задачам.

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

Проверка путем тестирования доказывает только то, что программа работает правильно в случае, предусмотренном тестированием. Любые дополнительные умозаключения – просто предположения.

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

Контрольные вопросы и задачи

1. Понятие алгоритма.

2. Перечислите основные свойства алгоритмов.

3. Почему естественный язык не может использоваться для представления алгоритмов для исполнителя «компьютер»?

4. Какие формы представления алгоритмов используются для исполнителя «человек»?

Задача 1. Постройте схему алгоритма и напишите его представление на псевдокоде для решения задачи: по координатам точки (x, y) определить номер координатной четверти, которой принадлежит точка.

Задача 2. Следующая программа вычисляет произведение двух неотрицательных целых чисел x и y, суммируя x раз число y (то есть 3*4 = 4+4+4). Является ли программа правильной?

А лг Mult (x, y);

произв := y; 0  4

Счетчик := 1; Произв.  4

Пока (счетчик < x) повторять Счетчик  1

(произв :=произв + y; Пока – не выполняется

счетчик := счетчик + 1)  результат Произв. = 4,

Вывод произв.; а должен быть 0

Конец.