Термин «отладка» означает исправление ошибок в программе и обеспечение ее правильной работы. Возникающие в процессе создания программы ошибки классифицируются следующим образом:
1. Синтаксические ошибки.
2. Ошибки периода выполнения программы.
3. Логические ошибки.
Delphi позволяет легко найти и исправить ошибки, возникающие как во время компиляции (синтаксические ошибки), так и во время выполнения. В состав интегрированной среды разработчика Delphi входит мощный и гибкий отладчик, который позволяет построчно выполнять программу, анализируя при этом выражения и модифицируя значения переменных. Этот отладчик встроен в среду Delphi, благодаря чему можно редактировать, компилировать и отлаживать программы не выходя из Delphi.
Синтаксические ошибки
Ошибки на этапе компиляции (или синтаксические ошибки) возникают в том случае, если не описана переменная, передается неправильное количество параметров подпрограмме, не совпадают типы переменной и выражения в операторе присваивания, операторы не удовлетворяют требованиям языка Object Pascal и т.п.
Лекция о логических ошибках
Object Pascal имеет строгие правила по сравнению с другими языками, поэтому, исправив синтаксические ошибки, можно считать выполненной основную часть отладки.
На рисунке 4.1 изображено окно редактора кода в тот момент, когда программа была запущена на компиляцию и компилятор обнаружил синтаксические ошибки. Напомним, что запуск на компиляцию и выполнение программы осуществляется командой Выполнить/Выполнить (функциональная клавиша F9), а запуск программы только на компиляцию можно осуществить при помощи команды Проект/Компилировать < имя файла проекта >(комбинация клавиш Ctrl+F9). В нижней части редактора кода содержатся сообщения об ошибках. Сообщение начинается словом [Ошибка], заключенным в квадратные скобки, далее идет имя файла проекта, затем в круглых скобках указывается номер строки программы, где была допущена ошибка и, в заключение, после двоеточия идет текст, поясняющий смысл допущенной ошибки.
Рисунок 4.1 — Сообщение компилятора о синтаксической ошибке
Исправление ошибок следует начинать с первой, поскольку часто одна ошибка является причиной появления других ошибок. Исправив первую ошибку, следует снова запустить программу на компиляцию. Во многих случаях исправление только одной ошибки существенно уменьшает общее количество сообщений об ошибках.
Ошибки периода выполнения программы
Другой возможный тип ошибок — это ошибки этапа выполнения (или семантические ошибки). Это происходит в том случае, если транслируется корректная программа, а затем при ее выполнении предпринимается попытка выполнить недопустимое действие, например, открыть несуществующий файл для ввода или выполнить деление на 0. В этом случае Delphi генерирует так называемое исключение (Exception) — рисунок 4.2.
Как автоматически отслеживать ошибки в коде | Робот для анализа данных
Рисунок 4.2 — Сообщение о сгенерированном исключении
Сообщение, содержащееся в этом окне, информирует, что произошло деление на ноль, и выполнение программы приостановлено. Нажатие кнопки OK прерывает выполнение программы. Открывается окно редактора кода, в котором строка, содержащая ошибку, будет выделена синей полосой (рисунок 4.3).
Рисунок 4.3 — Строка кода, содержащая ошибку периода выполнения
Логические ошибки
Программа, содержит логические ошибки, если реализованный в ней алгоритм является неправильным. В этом случае программа работает, выдает результат, но этот результат неверен. Такое происходит если, например, в программе неправильно записана формула либо при поиске максимума из трех чисел сравнили между собой только два числа. Для поиска и устранения логических ошибок необходимо использовать тесты, — решенные каким-либо образом задачи, имеющие правильный ответ.
В больших и сложных программах логические ошибки и ошибки периода выполнения достаточно трудно отследить и обнаружить. В этих случаях вполне естественным является желание выполнить программу в интерактивном режиме, наблюдая за изменениями значений отдельных переменных или выражений.
При этом желательно иметь возможность останавливаться в определенном месте программы и смотреть, что там происходит. Часто бывает полезно изменять значения некоторых переменных при выполнении программы. Это позволит повлиять на ее поведение и увидеть, в какую сторону оно изменилось. Все эти возможности наряду с другими средствами предоставляет отладчик Delphi, являющийся составной частью интегрированной среды разработки.
Интегрированная среда Delphi предоставляет пользователю несколько команд пошаговой отладки доступных в меню Выполнить (рисунок 4.4).
Рисунок 4.4 — Команды отладки
В Delphi имеется два режима трассировки — без захода в подпрограмму и с заходом в неё.
Если необходимо выполнить трассировку части программы, то следует установить в редакторе кода указатель на тот оператор, с которого следует начать трассировку, и выполнить команду Выполнить/Выполнять до Курсора (функциональная клавиша F4). Затем можно продолжить трассировку, нажимая клавиши F7 или F8.
Кроме того, при отладке программы можно использовать точки останова программы. Это строки программы, помеченные особым образом. При достижении такой строки программа приостанавливает свою работу. В этот момент можно просмотреть значения наблюдаемых переменных или начать трассировку программы.
Для внесения новой точки останова выполняется команда Выполнить/Добавить Точку Останова или нажатие функциональной клавиши F5.
Источник: studbooks.net
Тестирование и отладка программ
При разработке программ наиболее трудоемким является этап отладки и тестирования программ. Цель тестирования, т.е. испытания программы, заключается в выявлении имеющихся в программе ошибок. Цель отладки состоит в выявлении и устранении причин ошибок.
Отладку программы начинают с составления плана тестирования. Такой план должен представлять себе любой программист. Составление плана опирается на понятие об источниках и характере ошибок. Основными источниками ошибок являются недостаточно глубокая проработка математической модели или алгоритма решения задачи; нарушение соответствия между схемой алгоритма или записью его на алгоритмическом языке и программой, записанной на языке программирования; неверное представление исходных данных на программном бланке; невнимательность при наборе программы и исходных данных на клавиатуре устройства ввода.
Нарушение соответствия между детально разработанной записью алгоритма в процессе кодирования программы относится к ошибкам, проходящим вследствие невнимательности программиста. Отключение внимания приводит и ко всем остальным ошибкам, возникающим в процессе подготовки исходных данных и ввода программы в ЭВМ. Ошибки, возникающие вследствие невнимательности, могут иметь непредсказуемые последствия, так как наряду с потерей меток и описаний массивов, дублированием меток, нарушением баланса скобок возможны и такие ошибки, как потеря операторов, замена букв в обозначениях переменных, отсутствие определений начальных значений переменных, нарушение адресации в массивах, сдвиг исходных данных относительно полей значений, определенных спецификациями формата.
Учитывая разнообразие источников ошибок, при составлении плана тестирования классифицируют ошибки на два типа: 1 – синтаксические; 2 – семантические (смысловые).
Синтаксические ошибки – это ошибки в записи конструкций языка программирования (чисел, переменных, функций, выражений, операторов, меток, подпрограмм).
Обнаружение большинства синтаксических ошибок автоматизировано в основных системах программирования. Поиск же семантических ошибок гораздо менее формализован; часть их проявляется при исполнении программы в нарушениях процесса автоматических вычислений и индицируется либо выдачей диагностических сообщений рабочей программы, либо отсутствием печати результатов из-за бесконечного повторения одной и той же части программы (зацикливания), либо появлением непредусмотренной формы или содержания печати результатов.
В план тестирования обычно входят следующие этапы:
- Сравнение программы со схемой алгоритма.
- Визуальный контроль программы на экране дисплея или визуальное изучение распечатки программы и сравнение ее с оригиналом на программном бланке. Первые два этапа тестирования способны устранить больше количество ошибок, как синтаксических (что не так важно), так и семантических (что очень важно, так как позволяет исключить их трудоемкий поиск в процессе дальнейшей отладки).
- Трансляция программы на машинных язык. На этом этапе выявляются синтаксические ошибки. Компиляторы с языков Си, Паскаль выдают диагностическое сообщение о синтаксических ошибках в листинге программы (листингом называется выходной документ транслятора, сопровождающий оттранслированную программу на машинном языке – объектный модуль).
- Редактирование внешних связей и компоновка программы. На этапе редактирования внешних связей программных модуле программа-редактор внешних связей, или компоновщик задач, обнаруживает такие синтаксические ошибки, как несоответствие числа параметров в описании подпрограммы и обращении к ней, вызов несуществующей стандартной программы. например, 51 H вместо 51 N, различные длины общего блока памяти в вызывающем и вызываемом модуле и ряд других ошибок.
- Выполнение программы. После устранения обнаруженных транслятором и редактором внешних связей (компоновщиком задач) синтаксических ошибок переходят к следующему этапу – выполнению программы на ЭВМ на машинном языке: программа загружается в оперативную память, в соответствие с программой вводятся исходные данные и начинается счет. Проявление ошибки в процессе вода исходных данных или в процессе счета приводит к прерыванию счета и выдаче диагностического сообщения рабочей программы. Проявление ошибки дает повод для выполнения отладочных действий; отсутствие же сообщений об ошибках не означает их отсутствия в программе. План тестирования включает при этом проверку правильности полученных результатов для каких-либо допустимых значений исходных данных.
- Тестирование программы. Если программа выполняется успешно, желательно завершить ее испытания тестированием при задании исходных данных, принимающих предельные для программы значения. а также выходящие за допустимые пределы значения на входе.
Контрольные примеры (тесты) – это специально подобранные задачи, результаты которых заранее известны или могут быть определены без существенных затрат.
Наиболее простые способы получения тестов:
- Подбор исходных данных, для которых несложно определить результата вычислений вручную или расчетом на калькуляторе.
- Использование результатов, полученных на других ЭВМ или по другим программам.
- Использование знаний о физической природе процесса, параметры которого определяются, о требуемых и возможных свойствах рассчитываемой конструкции. Хотя точное решение задачи заранее известно, суждение о порядке величин позволяет с большой вероятностью оценить достоверность результатов.
Источник: inf1.info
11. Синтаксические и логические ошибки. Тестирование и отладка программы.
Семантическая отладка — это процесс нахождения и исправления ошибок, связанных с неправильным указанием логических страниц данных.
Существует 3 способа отладки программы:
Пошаговая отладка программ с заходом в подпрограммы;
Пошаговая отладка программ с выполнением подпрограммы как одного оператора;
Выполнение программы до точки остановки.
Пошаговая отладка программ заключается в том, что выполняется один оператор программы и, затем контролируются те переменные, на которые должен был воздействовать данный оператор.
Если в программе имеются уже отлаженные подпрограммы, то подпрограмму можно рассматривать, как один оператор программы и воспользоваться вторым способом отладки программ.
Если в программе существует достаточно большой участок программы, уже отлаженный ранее, то его можно выполнить, не контролируя переменные, на которые он воздействует. Использование точек остановки позволяет пропускать уже отлаженную часть программы. Точка остановки устанавливается в местах, где необходимо проверить содержимое переменных или просто проконтролировать, передаётся ли управление данному оператору.
Тестирование — это динамический контроль программы, т.е. проверка правильности программы при ее выполнении на компьютере.
Каждому программисту известно, сколько времени и сил уходит на отладку и тестирование программ. На этот этап приходится около 50% общей стоимости разработки программного обеспечения. Но не каждый из разработчиков программных средств может верно, определить цель тестирования.
Нередко можно услышать, что тестирование — это процесс выполнения программы с целью обнаружения в ней ошибок. Но эта цель недостижима: ни какое самое тщательное тестирование не дает гарантии, что программа не содержит ошибок. Другое определение: это процесс выполнения программы с целью обнаружения в ней ошибок.
Отсюда ясно, что “удачным” тестом является такой, на котором выполнение программы завершилось с ошибкой. Напротив, “неудачным” можно назвать тест, не позволивший выявить ошибку в программе. Определение также указывает на объективную трудность тестирования: это деструктивный ( т.е. обратный созидательному ) процесс. Поскольку программирование — процесс конструктивный, ясно, что большинству разработчиков программных средств сложно “переключиться” при тестировании созданной ими продукции. Основные принципы организации тестирования:
необходимой частью каждого теста должно являться описание ожидаемых результатов работы программы, чтобы можно было быстро выяснить наличие или отсутствие ошибки в ней;
следует по возможности избегать тестирования программы ее автором, т.к. кроме уже указанной объективной сложности тестирования для программистов здесь присутствует и тот фактор, что обнаружение недостатков в своей деятельности противоречит человеческой психологии (однако отладка программы эффективнее всего выполняется именно автором программы);
по тем же соображениям организация — разработчик программного обеспечения не должна “единолично ” его тестировать (должны существовать организации, специализирующиеся на тестировании программных средств);
должны являться правилом доскональное изучение результатов каждого теста, чтобы не пропустить малозаметную на поверхностный взгляд ошибку в программе;
необходимо тщательно подбирать тест не только для правильных (предусмотренных ) входных данных, но и для неправильных (непредусмотренных);
при анализе результатов каждого теста необходимо проверять, не делает ли программа того, что она не должна делать;
следует сохранять использованные тесты (для повышения эффективности повторного тестирования программы после ее модификации или установки у заказчика);
тестирования не должно планироваться исходя из предположения, что в программе не будут обнаружены ошибки (в частности, следует выделять для тестирования достаточные временные и материальные ресурсы);
следует учитывать так называемый “принцип скопления ошибок” : вероятность наличия не обнаруженных ошибок в некоторой части программы прямо пропорциональна числу ошибок, уже обнаруженных в этой части;
следует всегда помнить, что тестирование — творческий процесс, а не относиться к нему как к рутинному занятию.
Существует два основных вида тестирования: функциональное и структурное. При функциональном тестировании программа рассматривается как “черный ящик” (то есть ее текст не используется). Происходит проверка соответствия поведения программы ее внешней спецификации. Возможно ли при этом полное тестирование программы? Очевидно, что критерием полноты тестирования в этом случае являлся бы перебор всех возможных значений входных данных, что невыполнимо.
Поскольку исчерпывающее функциональное тестирование невозможно, речь может идти о разработки методов, позволяющих подбирать тесты не “вслепую”, а с большой вероятностью обнаружения ошибок в программе. При структурном тестировании программа рассматривается как “белый ящик” (т.е. ее текст открыт для пользования). Происходит проверка логики программы. Полным тестированием в этом случае будет такое, которое приведет к перебору всех возможных путей на графе передач управления программы (ее управляющем графе). Даже для средних по сложности программ числом таких путей может достигать десятков тысяч.
Таким образом, ни структурное, ни функциональное тестирование не может быть исчерпывающим. Рассмотрим подробнее основные этапы тестирования программных комплексов. В тестирование многомодульных программных комплексов можно выделить четыре этапа:
тестирование отдельных модулей;
совместное тестирование модулей;
тестирование функций программного комплекса (т.е. поиск различий между разработанной программой и ее внешней спецификацией );
тестирование всего комплекса в целом (т.е. поиск несоответствия созданного программного продукта, сформулированным ранее целям проектирования, отраженным обычно в техническом задании).
На первых двух этапах используются, прежде всего, методы структурного тестирования, т.к. на последующих этапах тестирования эти методы использовать сложнее из-за больших размеров проверяемого программного обеспечения; последующие этапы тестирования ориентированы на обнаружение ошибок различного типа, которые не обязательно связаны с логикой программы.
12. Данные в языке Си: константы и переменные. Скалярные типы данных. Модификаторы типов.
13. Данные числовых типов в языке Си: объявление, характеристика, допустимые операции, приведение типов. Пример использования.
14. Операции языка Си. Приоритет операций. Оператор и операция присваивания в языке операции, приведение типов. Пример использования.
Оператор присваивания может присутствовать в любом выражении языка С [1] . Этим С отличается от большинства других языков программирования (Pascal, BASIC и FORTRAN), в которых присваивание возможно только в отдельном операторе. Общая форма оператора присваивания:
имя_переменной=выражение;
Выражение может быть просто константой или сколь угодно сложным выражением. В отличие от Pascal или Modula-2, в которых для присваивания используется знак «:=», в языке С оператором присваивания служит единственный знак присваивания » justify»> В книгах по С и в сообщениях компилятора часто встречаются термины lvalue [2] (left side value) и rvalue [3] (right side value).
Попросту говоря, lvalue — это объект. Если этот объект может стоять в левой части присваивания, то он называется такжемодифицируемым (modifiable) lvalue. Подытожим сказанное: lvalue — это объект в левой части оператора присваивания, получающий значение, чаще всего этим объектом является переменная. Термин rvalue означает значение выражения в правой части оператора присваивания.
Источник: studfile.net