4 WRITE (6,5) IQ, IR (Операторы WRITE … FORMAT производят вывод
5 FORMAT (2I10) информации по соответствующему формату)
С J1 .EQ. IQ*J2 + IR AND 0.LE. IR AND
С IR. LT. J2
STOP
END
Приведенная программа на Фортране – это некоторый вариант программы, блок-схема которой приведена на рис. 4.1. (Правильность этой блок-схемы доказана в [1]). Программа вычисляет целое частное IQ и остаток IR от деления целого J1 на целое J2. Мы уже включили в качестве комментариев в программу индуктивные утверждения, необходимые для доказательства правильности. Например, комментарий, помещенный сразу после оператора с меткой 2, нужно рассматривать как комментарий, связанный с точкой, расположенной перед выполняемой в этом операторе проверкой. Таким образом, предполагается, что в момент прихода в точку, находящуюся непосредственно перед проверкой в операторе с меткой 2, справедливы утверждения J1 = IQ⋅ J2 + IR и 0 ≤ IR. Отметим, что в доказательствах мы используем « = » как символ равенства, а не присваивания.
Доказательство конечности программы на Фортране идентично доказательству конечности для блок-схем. Для доказательства конечности программы необходимо только показать, что при выполнении программы мы в конце концов выйдем из единственного в программе цикла. Следовательно, надо показать, что проверка IR. LT. J2, управляющая циклом, когда-нибудь даст положительный результат. Так как значение IR при каждом прохождении цикла уменьшается на величину J2, a J2 остается без изменений и, кроме того, 1 ≤ J2, то можно заключить, что IR уменьшается каждый раз по крайней мере на 1 и когда-нибудь станет меньше J2. В этот момент условие
IR < J2 станет справедливым и мы выйдем из цикла, т. е. программа закончится.
После этого доказательство правильности данной программы почти идентично доказательству правильности для блок-схемы на рис. 4.1. При этом необходимо рассмотреть следующие пути:
1. Путь от оператора READ до оператора с меткой 2. Предположим, что только что выполнился оператор READ и справедливо утверждение, записанное сразу после него. Теперь последовательно выполняются операторы до оператора с меткой 2. Нам нужно показать, что справедливо утверждение, записанное после этого оператора. Если мы дошли до этой точки, то имеем IQ=0, IR = J1,
0 ≤ J1 и 1 ≤ J2. Таким образом,
J1=IQ⋅J2 + IR=0⋅J2 + J1=J1
и 0≤ J1= IR.
Следовательно, наше утверждение справедливо.
2. Путь от оператора с меткой 2 до оператора с меткой 3 и опять к оператору с меткой 2 (основной цикл программы). Предположим, что мы выполняем оператор 2 (мы перестаем говорить «оператор с меткой 2» и начинаем употреблять «оператор 2». Здесь уместно отметить, что если убрать из языка программирования метки, то идентифицировать оператор станет весьма затруднительно) и справедливо записанное после него утверждение, затем выполняем цикл и возвращаемся к метке 2. Необходимо показать, что указанное утверждение снова будет справедливо. Пусть IQ и IR до выполнения цикла принимают значения IQn и IRn. Тогда J1 =IQn ∙ J2 + IRn и 0 ≤ IRn. При возврате к метке 2 после прохождения цикла значения IQ и IR будут IQn+1 = IQn + 1 и
IRn+1 = IRn – J2, а значения J1 и J2 останутся без изменений. Таким образом, после возврата к метке 2 имеем
IQn+1 ∙ J2 + IRn+1 = (IQ + 1)⋅ J2 + (IRn – J2) =
= IQn ⋅J2 + J2 + IRn – J2 = IQn ∙ J2 + IRn = J1.
Кроме того, известно, что если мы проходили по циклу, то проверка
IRn. LT. J2 дала отрицательный результат, т. е. J2 ≤ IRn. Отсюда следует, что при возврате к метке 2 имеем 0 ≤ IRn – J2 = IRn+1.
3. Путь от оператора 2 к оператору 4. Предположим, что мы выполнили оператор 2, справедливо соответствующее утверждение и переходим к оператору 4. Нужно показать, что справедливо утверждение, записанное ниже этого оператора. Оператор 2 передаст управление на оператор 4 только при положительном результате проверки IR. LT. J2. При переходе от оператора 2 к оператору 4 ни одно из значений переменных не изменяется, и, следовательно, при достижении метки 4 мы имеем J1 = IQ⋅J2 + IR, 0≤IR и, кроме того, IR < J2. Таким образом, мы доказали правильность программы.
Упражнения
1. На одном из языков программирования напишите программу вычисления произведения M на N при условии, что знак умножения использовать нельзя, M и N имеют целые значения и M ≥ 0 (блок-схема программы приведена на рис. 2.3). Докажите правильность написанной программы.
2. На одном из языков программирования напишите программу вычисления и печати значения M N при условии, что M и N имеют целые значения и M ≥ 1, N ≥ 1, (блок-схема программы приведена на рис. 2.4). Докажите правильность написанной программы.
3. На одном из языков программирования напишите программу вычисления и печати значения M! = 1 ⋅ 2 ⋅ 3 ⋅ ... ⋅ (M – 1) ⋅ M при условии, что в качестве M вводится положительное целое, (блок-схема программы приведена на рис. 2.5). Докажите правильность написанной программы.
4. Докажите правильность программного фрагмента, считая, что он присваивает переменной XSMLST значение наименьшего элемента массива X(N).
С1 Х – ВЕЩЕСТВЕННЫЙ МАССИВ, ЕГО РАЗМЕР N. GE. 2
XSMLST = X(1)
DO 10 I = 2, N
C2 XSMLST РАВНО МИНИМАЛЬНОМУ ИЗ Х(1), ..., Х(I – 1)
С2 КРОМЕ ТОГО, 2 .LE. I И I. LE. N
IF (XSMLST. LE. X(I)) GO TO 10
XSMLST = X(I)
C3 XSMLST РАВНО МИНИМАЛЬНОМУ ИЗ Х(1), ..., X(I – 1)
C3 КРОМЕ ТОГО, 3 .LE. I И I. LE. N + 1
10 CONTINUE
C4 XSMLST РАВНО МИНИМАЛЬНОМУ ИЗ Х(1),..., X(N)
Замечание: в Фортране цикл строится по следующей основной схеме, приведенной на рис. 4.2, которая работает аналогично приведенной на рис. 4.3 блок-схеме.
DO метка I = M, N
С ПРИМЕЧАНИЕ 1
Тело цикла
С ПРИМЕЧАНИЕ 2
метка CONTINUE
Рис. 4.2 Рис. 4.3
Здесь Примечание 1 (комментарий), связанное с таким циклом и стоящее непосредственно за оператором DO, нужно рассматривать как связанное с некоторой точкой утверждение 1 на блок-схеме, а примечание 2, стоящее перед концом цикла, нужно рассматривать как утверждение 2 для некоторой точки программы, соответствующей точке на блок-схеме.
5. На языке Си напишите программу поиска минимального элемента одномерного массива, соответствующую программе задачи 4, написанной на языке Фортран. Расставьте индуктивные утверждения и докажите правильность написанной программы.
6. На языке Си напишите программу вычисления целого частного IQ и остатка IR от деления целого J1 на целое J2, соответствующую программе примера 1, написанной на языке Фортран, и блок-схеме на рис. 4.1. Расставьте индуктивные утверждения и докажите правильность написанной программы.
7. На одном из языков программирования напишите программу вычисления значения определенного интеграла по формуле (считая Δt = (q – p) / (n – 1))

и докажите ее правильность.
8. На одном из языков программирования напишите программу вычисления значения функции f(x)=3 sin x для х=π/2, используя для вычисления приближенные выражения
с точностью ε=0,1. (Суммирование членов ряда прекратить, если очередной член ряда, прибавляемый к сумме, будет меньше ε). Расставьте индуктивные утверждения и докажите правильность написанной программы.
9. На одном из языков программирования напишите программу вычисления суммы членов ряда
с точностью ε = 0,1. (Суммирование членов ряда прекратить, если очередной член ряда, прибавляемый к сумме, будет меньше ε). Расставьте индуктивные утверждения и докажите правильность программы.
10. На одном из языков программирования напишите программу вычисления суммы членов ряда
с точностью ε=0,1, но вычисление факториала оформите в виде подпрограммы. Докажите правильность программы.
11. На одном из языков программирования напишите программу вычисления суммы элементов двумерного массива AM×N и докажите ее правильность.
12. На одном из языков программирования напишите программу вычисления суммы элементов двумерного массива AM×N, но вычисление суммы элементов каждого столбца матрицы оформите в виде подпрограммы. Докажите правильность написанных программ.
13. На одном из языков программирования напишите программу вычисления наибольшего произведения элементов строк матрицы AM×N. Рекомендация: постройте блок-схему, расставьте индуктивные утверждения на блок-схеме, а затем введите их в текст программы в качестве комментариев и докажите правильность написанной программы.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 |


