Информатика

         

Основы безошибочного программирования


Основной недостаток традиционной практики

составления про­грамм для ЭВМ заключается в том, что при таком подходе никто не может гарантировать отсутствие в них ошибок. Особенностью традиционной практики является поиск ошибок в программах при их отладке на ЭВМ.

Однако, так как число ошибок в программах

заранее неизвестно, то неизвестна заранее и продолжительность отладки программ на ЭВМ. Более того даже после «завершения» отладки никто не может гарантировать отсутствие ошибок. Естественно, что использование таких программ, приводит к возникновению отказов, сбоев и полу­чению неверных результатов.

Структурный подход снижает количество ошибок в алгоритмах и программах. Однако и при этом подходе число ошибок также зара­нее неизвестно. Хотя структурная форма записи и упрощает поиск и исправление ошибок в текстах программ, гарантии отсутствия ошибок структурный подход не дает.

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

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

Более того, при систематическом использовании спецификаций

возможен не только анализ правильности алгоритмов и программ, но и становится возможным составление программ с одновремен­ным доказательством правильности.

Безошибочное программирование - это составление алгоритмов и программ с гарантиями отсутствия в них ошибок. А составление алгоритмов и программ с одновременным доказательством правиль­ности называется доказательным программированием. И в том и другом подходе необходимо составление спецификаций.

Для составления программ на любом языке программирования

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


Пример составления алгоритмов с использованием в качестве иллюстрации спецификаций сценария диалога с ЭВМ:

Сценарий «Галерея картинок»



Список картинок:

1. треугольник

2. прямоугольник

3. кольцо

номер = ? <N>

 n =1                                   n = 2                        n = 3

 

В соответствии с этими четырьмя картинками построим три вспо­могательных алгоритма рисования отдельных картинок из «Галереи» и общий алгоритм выбора картинок в соответствии с принятым сценарием:

алг «Галерея картинок»

нач                                                                  алг «рисуиок_треугольника»

вывод («Список картинок:»)                 нач

вывод («1. треугольник»)                           линия(150,50)-(100,100)

вывод («2. прямоугольник»)                       линия(150,50)-(200,100)

вывод («3. кольцо»)                                      линия(100,100)-(200,100)

запрос («номер=», п)                               кон

графический_экран

если п = 1 то                                            алг «рисунок_прямоугольника»

рисунок_треугольника                      нач

инес п

= 2 то                                                 рамка(50,50)-(150,100)


рисунок_прямоугольника                  кон

инес п = 3 то

рисунок_кольиа                                   алг «рисунок_кольца»

иначе                                                         нач

вывод («нет такого рисунка»)              окружность( 100,100),20

все                                                                   окружность(100,100),50

кон                                                                  кон

 

Правильность каждого из вспомогательных алгоритмов и подпро­грамм определяется сравнением с соответствующими фрагментами сценария, а правильность всего алгоритма и соответствующей про­граммы - со сценарием в целом.



Данный подход к составлению алгоритмов и программ с исполь­зованием спецификаций - позволяет реализовать основную идею безошибочного программирования - создание алгоритмов и про­грамм, правильных по построению. Такой подход может применяться к составлению алгоритмов и программ для любых современных языков программирования - Паскаль, Си, Ада, Модула, Бейсик и т. д.

Приведем примеры составления сложных алгоритмов и программ с циклами с использованием спецификаций. Первый пример - построение алгоритма и программы изображения на экране картинки «Звездное небо» из n случайных точек:



В приводимом ниже алгоритме для формирования и вывода по­следовательности случайных точек на экране используется цикл со счетчиком и датчик случайных чисел для генерации координат «звезд».

Алгоритм                                          Программа

алг «звездное небо»                          ' звездное небо

нач                                                      сls

запрос(«звезд=», п)                          input «звезд=», n

графический_экран                        screen 2,0

от k = 1 до п цикл                          for k = 1 to n

x:

= случайное [0:200]                     х = rnd*200


у: = случайное [0:200]                     у = rnd*200

точка (х,у)                                        pset (x,y),3

кцикл                                                next k

кон                                                      end

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

Сценарий «Угадай-ка»

Угадай число от 0 до 100

число = ? < х>

*

мало

много

молодец, умница

 

Для реализации этого сценария воспользуемся циклом с выхо­дом, в котором задается вопрос число=? и проверяются числа, вво­димые человеком.


Выход из цикла происходит после совпадения ответа с числом, задуманным ЭВМ:

Алгоритм                                          Программа

алг «угадай-ка»                                 ' угадай-ка

нач                                                      сls

вывод («Угадай число»)                 print «Угадай число»

вывод («от 1 до 100»)                     print «от 1 до 100»

z: = случайное [0:100]                     z = int (rnd* 100)

цикл                                                  do

запрос( «число=», х)                      input «число=», х

при х = z вых                                    if х = z then exit do

если х <

z то                                   if х < z then


вывод («мало»)                             print «мало»

инеc х > z то                                   elseif х > z then

вывод («много»)                            print «много»

все                                                    end if

кцикл                                               loop

вывод («молодец, умница»)          print «молодец, умница»

кон                                                      end

Сравнение алгоритма со сценарием показывает их полное соот­ветствие друг другу.

В о п р о с ы

 

1. Сколько ошибок содержится в программах?

2. Как долго длится отладка программ?

3. Что такое спецификации программ?

4. Зачем нужны спецификации?

5. Можно ли гарантировать отсутствие ошибок в программах?

6. Что такое систематический подход к алгоритмизации?

З а д а ч и

 

1. Составьте сценарий и алгоритм диалога «Распорядок дня», с по­мощью которого можно узнать, что запланировано на заданный час дня.

2. Составьте сценарий и алгоритм диалога с выбором по меню;

а) национальных флагов;

б) каталога строительных блоков;

в) набора рисунков;

г) каталога строений.

3. Предложите сценарии и алгоритмы рисования на экране абстракт­ных рисунков:

а) из случайных разноцветных точек;

б) из случайных разноцветных отрезков;

в) из случайных разноцветных рамок;

г) из случайных разноцветных окружностей;

д) из случайных разноцветных кругов;

е) из случайных разноцветных окошек.

4. Составьте сценарий и алгоритм, моделирующий на экране бро­уновское движение частиц.


Содержание раздела