11.07.2015 Views

Выпуск 1 - Российский государственный профессионально ...

Выпуск 1 - Российский государственный профессионально ...

Выпуск 1 - Российский государственный профессионально ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

может надеяться только на ошибку соперника.Пример 2. Пусть задан массив A длиныn. Найдем инвариант цикла в программесуммирования элементов массива:S := 0нц для i от 1 до nS := S + A[i]кцЗдесь на каждом шаге к переменной Sдобавляется элемент массива A[i], такчто при любом i после окончания очередногошага цикла в S накоплена суммавсех элементов массива с номерами от 1 до i. Это иесть инвариант цикла. Поэтому сразу можно сделатьвывод о том, что после завершения цикла в переменнойS будет записана сумма всех элементов массива.Аналогично можно показать, что в алгоритмепоиска наименьшего значения в массивеmin := A[1]нц для i от 2 до nесли A[i] < min тоmin:= A[i]всекцинвариант формулируется так: после выполнениякаждого шага цикла в переменной min записан минимальныйиз первых i элементов. Отсюда сразу следует,что после завершения цикла (при i = n) в этойпеременной будет минимальный из всех элементов.Пример 3. Для того же массива найдем инвариантцикла в программе сортировки элементов массиваметодом “пузырька”:нц для i от 1 до n-1нц для j от n-1 до i шаг -1если A[j] > A[j+1] тоc:= A[j]; A[j]:= A[j+1]; A[j+1]:= c;всекцкцДо начала алгоритма элементы расположеныпроизвольно. На каждом шаге внешнего циклана свое место “всплывает” один элемент массива.Поэтому инвариант этого цикла можно сформулироватьтак: “после выполнения i-го шага цикла первыеi элементов массива отсортированы и установленына свои места”.Теперь построим инвариант внутреннего цикла.В этом цикле очередной “легкий” элемент поднимаетсявверх к началу массива. Перед первым шагомвнутреннего цикла элемент, который будет стоятьна i-м месте в отсортированном массиве, можетнаходиться в любой ячейке от A[i] до A[n]. Послекаждого шага его “зона нахождения” сужаетсяна одну позицию, так что инвариант внутреннегоцикла можно сформулировать так: “элемент, которыйбудет стоять на i-м месте в отсортированноммассиве, может находиться в любой ячейке от A[i]А.П. Ершов (1931–1988)(inf.1september.ru)Рис. 18до A[j]”. Очевидно, что когда в концеэтого цикла j = i, элемент A[i] встаетна свое место.В предыдущих примерах мы определялиинвариант готового цикла.Теперь покажем, как можно строитьцикл с помощью заранее выбранногоинварианта.Пример 4. Рассмотрим алгоритмбыстрого возведения в степень, основанныйна использовании операцийвозведения в квадрат и умножения. Ониспользует две очевидные формулы:(1) a k = a k–1 ⋅ a при нечетной степени kи (2) a k = (a 2 ) k/2 при нечетной степени k.Покажем, как работает алгоритм на примеревозведения числа a в степень 7:7 6 2 3 2 2 2a a a a a a a a= ⋅ [ ] = ( ) ⋅ [ ] = ( ) ⋅[ ⋅ ] == ⋅ ⋅ = ⋅ ⋅ ⋅ = ⋅ ⋅4 1 2 4 0 4 2 4 2( a ) [ a a] ( a ) [ a a a] [ a a a].Здесь поочередно применяются первая и втораяформулы. Заметим, что на каждом этапе выражениеa n можно представить в виде a n = b k ⋅ p, где через pобозначена часть, взятая выше в квадратные скобки.Если нам каким-то образом удастся уменьшить kдо нуля, сохранив это равенство, то мы получимa n = p, то есть задача будет решена, а результат будетнаходиться в переменной p.Таким образом, равенство a n = b k ⋅ p можно использоватькак инвариант цикла. Для того чтобыобеспечить выполнение этого равенства в начальныймомент, можно принять, например, b = a,k = n и p = 1. Далее в цикле применяются формулы(1) и (2) (в зависимости от четности k на данномшаге). Цикл заканчивается, когда k = 0. В результатеполучаем следующее решение:b:= a; k:= n; p:= 1нц пока k 0если mod(k,2) = 0 тоk:= div(k,2)b:= b*bиначеk:= k-1p:= b*pвсекцвывод pЗаметим, что инвариант цикла a n = b k ⋅ p выполняетсядо начала цикла, после каждого шага, атакже после завершения цикла. Таким образом, мынаписали код программы и одновременно доказалиправильность этого блока.Доказательное программированиеДля доказательства правильности программынеобходимо иметь спецификацию — точное описаниетого, что должно быть сделано в результатеработы программы.19январь 2012 / ИНФорматика

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!