- •Тема 3. Технология разработки алгоритмов и программ.
- •3.1. Основные этапы разработки программного обеспечения.
- •3.2. Проектирование алгоритмов.
- •3.2.1. Требования к алгоритмам.
- •3.2.2. Временная и емкостная сложность алгоритмов.
- •3.2.3. Алгоритмы полиномиальной сложности и np-полные алгоритмы.
- •3.2.4. Эвристические алгоритмы.
- •3.2.5. Итеративные и рекурсивные алгоритмы.
- •3.2.6. Восходящий и нисходящий методы проектирования алгоритмов.
- •3.2.7. Базовые управляющие структуры алгоритмов и структурное прог-
- •3.2.8. Модульный метод разработки алгоритмов.
- •3.3. Проектирование данных.
- •3.3.1. Типы данных и объекты данных.
- •3.3.2. Классификация типов данных в системе программирования Turbo
- •Integer -32768 .. 32767 16 битов со знаком
- •3.3.3. Основные структуры данных и их представления.
- •3.4. Отладка и тестирование программ.
- •3.4.1. Классификация ошибок в программах.
- •3.4.2. Цели и задачи отладки и тестирования.
- •3.4.3. Основные возможности интегрированного отладчика системы
3.4.1. Классификация ошибок в программах.
Существует три основных типа ошибок в программах:
- ошибки этапа компиляции (или синтаксические ошибки);
- ошибки этапа выполнения или семантические ошибки);
- логические ошибки.
Cинтаксические ошибки происходят из-за нарушений правил синтаксиса
языка программирования. Когда компилятор обнаруживает синтаксическую
ошибку, то отмечает место (позицию или строку) ошибки и выводт сообщение
об ошибке.
Наиболее распространенными синтаксическими ошибками являются:
- ошибки набора (опечатки);
- пропущенные точки с запятой;
- ссылки на неописанные переменные;
- передача неверного числа (или типа) параметров процедуры или
функции;
- присваивание переменной значений неверного типа.
После исправления cинтаксической ошибки компиляцию можно выполнить
заново. После устранения всех синтаксических ошибок и успешной компиля-
ции программа готова к выполнению и поиску ошибок этапа выполнения и ло-
гических ошибок.
Семантические ошибки происходят, когда программа компилируется, но
при выполнении операторов что-то происходит неверно. Например, программа
пытается открыть для ввода несуществующий файл или выполнить деление на
ноль. При обнаружении семантических ошибок выполнение программы заверша-
ется и выводится сообщение об ошибке. Например, в системе Turbo Pascal
выводится сообщение следующего вида:
Run-time error ## at seg:ofs
По номеру ошибки (##) можно установить причину ее возникновения.
Логические ошибки - это ошибки проектирования и реализации програм-
мы. Логические ошибки приводят к некорректному или непредвиденному зна-
чению переменных, неправильному виду графических изображений или невы-
полнению кода, когда это ожидается. Эти ошибки часто трудно отслежива-
ются, поскольку ни компилятор, ни исполняющая система не обнаруживают их
автоматически, как синтаксические и семантические ошибки. Обычно системы
программирования включает в себя средства отладки, помогающие найти ло-
гические ошибки.
3.4.2. Цели и задачи отладки и тестирования.
Многие программисты путают отладку программ с тестированием, пред-
назначенным для проверки их работоспособности. Отладка имеет место тог-
да, когда программа со всей очевидностью работает неправильно. Поэтому
отладка начинается всегда в предположении отказа программы. Если же ока-
зывается, что программа работает верно, то она тестируется. Часто случа-
ется так, что после прогона тестов программа вновь должна быть подверг-
нута отладке. Таким образом, тестирование устанавливает факт наличия
ошибки, а отладка выявляет ее причину, и эти два этапа разработки прог-
раммы перекрываются.
3.4.3. Основные возможности интегрированного отладчика системы
программирования Turbo Pascal.
Основной смысл использования встроенного отладчика состоит в управ-
ляемом выполнении программы. Отслеживая выполнение каждой инструкции,
можно легко определить, какая часть программы вызывает проблемы. В от-
ладчике предусмотрено шесть основных механизмов управления выполнением
программы, которые позволяют:
- выполнять инструкции по шагам(Run|Step Over или F8);
- трассировать инструкции (Run|Trace Into или F7);
- выполнять программы до позиции курсора (Run|Go to Cursor или F4);
- выполнять программу до заданной точки (Toggle Breakpoint или
Ctrl+F8);
- находить определенную точку (Search|Find Procedure...);
- выполнять сброс программы (Run¦Reset Program или Ctrl+F2).
Выполнение программы по шагам (команда Step Over меню выполнения
Run) и трассировка программы (команда Trace Into меню выполнения Run)
дают возможность построчного выполнения программы. Единственное отличие
выполнения по шагам и трассировки состоит в том, как они работают с вы-
зовами процедур и функций. Выполнение по шагам вызова процедуры или
функции интерпретирует вызов как простой оператор и после завершения
подпрограммы возвращает управление на следующую строку. Трассировка
подпрограммы загружает код этой подпрограммы и продолжает ее построчное
выполнение.
Выполнение программы до заданной точки (команда Toggle Breakpoint
локального меню редактора) - более гибкий механизм отладки, чем исполь-
зование метода выполнения до позиции курсора (команда Go to Cursor меню
выполнения Run), поскольку в программе можно установить несколько точек
останова.
Интегрированная среда разработки программы предусматривает несколь-
ко способов поиска в программе заданного места. Простейший способ пре-
доставляет команда Search|Find Procedure..., которая запрашивает имя
процедуры или функции, затем находит соответствующую строку в файле, где
определяется эта подпрограмма. Этот подход полезно использовать при ре-
дактировании, но его можно комбинировать с возможностью выполнения прог-
раммы до определенной точки, чтобы пройти программу до той части кода,
которую надо отладить.
Чтобы сбрасить все ранее задействованные отладочные средства и
прекратитьт отладку программы необходимо выполнить команду Run|Program
reset или нажать клавиши Ctrl+F2.
При выполнении программы по шагам можно наблюдать ее вывод несколь-
кими способами:
- переключение в случае необходимости экранов (Debug|User screen
или Alt+F5);
- открытие окна вывода (Debug¦Output);
- использование второго монитора;
Выполнение программы по шагам или ее трассировка могут помочь найти
ошибки в алгоритме программы, но обычно желательно также знать, что про-
исходит на каждом шаге со значениями отдельных переменных. Например, при
выполнении по шагам цикла for полезно знать значение переменной цикла.
Встроенный отладчик имеет два инструментальных средства для проверки со-
держимого переменных программы:
- окно Watches (Просмотр);
- диалоговое окно Evaluate and Modify (Вычисление и модификация).
Чтобы открыть окно Watches, необходимо выполнить команду
Debug|Watch. Чтобы добавить в окно Watches переменную, необходимо выпол-
нить команду Debug¦Watch¦Add Watch... или нажать клавиши Ctrl+F7. Если
окно Watches является активным окном, то можно добавить выражение
просмотра, нажав клавишу Ins. Отладчик открывает диалоговое окно Add
Watch, запрашивающее тип просматриваемого выражения. По умолчанию выра-
жением считается слово в позиции курсора в текущем окне редактирования.
Просматриваемые выражения, которые отслеживались ранее, сохраняются в
списке протокола. Последнее добавленное или модифицированное просматри-
ваемое выражение является текущим просматриваемым выражением, которое
указывается выводимым слева от него символом жирной левой точки. Если
окно Watches активно, можно удалить текущее выражение, нажав клавишу Del
или Ctrl+Y. Чтобы удалить все просматриваемые выражения, необходимо вы-
полнить команду Clear All локального меню активного окна Watches. Чтобы
отредактировать просматриваемое выражение, нужно выполнить команду
Modify... или нажать клавишу Enter локального меню активного окна
Watches. Отладчик открывает диалоговое окно Edit Watch, аналогичное то-
му, которое используется для добавления просматриваемого выражения, ко-
торое позволяет отредактировать текущее выражение.
Чтобы вычислить выражение, необходимо выполнить команду
Debug¦Evaluate/Modify... или нажать клавиши Ctrl+F4. Отладчик открывает
диалоговое окно Evaluate and Modify. По умолчанию слово в позиции курсо-
ра в текущем окне редактирования выводится подсвеченным в поле
Expression. Можно отредактировать это выражение, набрать другое выраже-
ние или выбрать вычисленное ранее выражение из списка протокола.
Даже если не установлены точки останова, можно выйти в отладчик при
выполнении программы, нажав клавиши Ctrl+Break. Отладчик находит позицию
в исходном коде, где прервалась программа. Затем, как и в случае обычной
точки останова, можно выполнить программу по шагам, трассировать ее,
отследить или вычислить выражения.
Иногда в ходе отладки полезно узнать, как вы попали в данную часть
кода. Окно Call Stack показывает последовательность вызовов процедур или
функций, которые привели к текущему состоянию (глубиной до 128 уровней).
Для вывода окна Call Stack необходимо выполнить команду Debug¦Call Stack
или нажать клавиши Ctrl+F3.