Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Библиотека / POSIBNIK / Проектирование цикла с помощью инварианта.doc
Скачиваний:
35
Добавлен:
23.03.2015
Размер:
89.09 Кб
Скачать

Проектирование цикла с помощью инварианта

Задача 1. Найти такое i, при котором сумма величин 1 + ½ + 1/3 + … + 1/i впервые станет больше некоторого наперед заданного числа a.

АНАЛИЗ ЗАДАЧИ. Прежде всего выясним, что дано (предусловие P) и, что надо получить (постусловие Q).

  1. P: Подготовить вещественное число a.

  2. Q: 1 + ½ + 1/3 + … + 1/i > a & 1 + ½ + 1/3 + … + 1/(i-1)  a .

Разработаем стратегию решения задачи: будем последовательно накапливать n-ые частичные суммы, начиная от n=1.

  1. СТРАТЕГИЯ РЕШЕНИЯ ЗАДАЧИ: Последовательное получение величин Sn = 1 + ½ + 1/3 + … + 1/n, начиная от n=1.

Ясно, что решение задачи будет представлять собой цикл с неопределенным количеством повторений. В этом цикле будут последовательно формироваться n-ые частичные суммы Sn. Номер частичной суммы будет определяться величиной n. Сформулируем инвариант цикла.

4) ИНВАРИАНТ ЦИКЛА I: <Частичная сумма Sn> = 1 + ½ + 1/3 + … + 1/n.

Будем искать решение нашей задачи в виде цикла, имеющего следующий вид:

5) СТРУКТУРА ЦИКЛА:

Нет

Да

ВЫХОД

Компоненты цикла будем искать, исходя из стратегии задачи и условия истинности инварианта:

А) перед первым входом в цикл;

Б) после завершения очередного цикла;

В) после выхода из цикла.

Введем величину n – номер уже полученной частичной суммы. Частичную сумму обозначим переменной S. Исходя из стратегии решения задачи (суммирование от начала последовательности) присвоим n значение 0. Чтобы сохранить истинность инварианта необходимо переменной S также присвоить значение 0.

6) ПОДГОТОВКА ЦИКЛА: n:=0; S:=0;

Условие продолжения цикла (обозначим B) найдем, принимая во внимание постусловие Q.

7) УСЛОВИЕ ПРОДОЛЖЕНИЯ ЦИКЛА B: Sa.

Здесь S – параметр цикла (Величина, изменение которой влияет на значение условия цикла).

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

8) МОДИФИКАТОР ЦИКЛА (Действие, меняющее значение параметра цикла): S:=S+1/(n+1).

Заметим, что в этот момент условие инварианта цикла I нарушилось (величину частичной суммы Sn мы увеличили, а значение номер частичной суммы S осталось прежним. Восстановим это соответствие, увеличив величину n.

9) ТЕЛО ЦИКЛА (Действие, многократное выполнение которого позволит решить поставленную задачу): inc(n)..

Теперь инвариант цикла восстановлен и можно вернуться к заголовку цикла с целью проверить условие выхода из цикла.

Соберем наши элементы программы вместе. Получим программу:

10) ТЕКСТ ПРОГРАММЫ:

<< Подготовить a (например, ввести) >>

n:=0; S:=0;

while Sa do begin

S:=S+1/(n+1);

inc(i);

end;

Теперь докажем правильность этой программы (ее соответствие спецификации).

11) ЧАСТИЧНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Это следует из того, что мы выйдем из цикла только тогда, когда нарушится условие B, т.е. S станет больше a. Из условия истинности инварианта (он будет справедлив при выходе из цикла), учитывая стратегию решения задачи (последовательное получение всех частичных сумм) можно заключить, что это произойдет впервые (т. е. предыдущая частичная сумма еще была меньше a). А это и есть требования постусловия Q – ч.т.д.

12) ПОЛНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Из теории рядов известно, что наш ряд расходится, т.е. последовательность частичных сумм стремится к бесконечности. Поэтому обязательно наступит такой момент, когда при некотором n наша частичная сумма станет больше любого наперед заданного числа a, что означает нарушение условия продолжения цикла – ч.т.д.

Таким образом доказательство полной корректности цикла гарантирует, что цикл обязательно завершится, а доказательство частичной корректности показывает, что цикл завершится именно в состоянии Q. Итак, мы доказали, что наша программа решает поставленную задачу.

Задача 2. Найти количество значащих цифр в натуральном числе n.

  1. P: Подготовить натуральное число n.

  2. Q: k = <Количество значащих цифр в числе n>.

  3. СТРАТЕГИЯ РЕШЕНИЯ ЗАДАЧИ: Будем обрезать младшие цифры числа. Текущее обрезаемое число обозначим C, а количество уже отрезанных цифр будем хранить в переменной k.

  4. ИНВАРИАНТ ЦИКЛА I:

< Количество значащих цифр в числе n> = < Количество значащих цифр в числе C> + < количество уже отрезанных цифр, т.е. k>.