Если ошибки в алгоритме программы на каком этапе они обнаружатся
Отладка программы - один их самых сложных этапов разработки программного обеспечения.
9.1. Классификация ошибок
Отладка — это процесс локализации и исправления ошибок, обнаруженных при тестировании программного обеспечения. Локализацией называют процесс определения оператора программы, выполнение которого вызвало нарушение нормального вычислительного процесса. Для исправления ошибки необходимо определить ее причину, т. е. определить оператор или фрагмент, содержащие ошибку. Причины ошибок могут быть как очевидны, так и очень глубоко скрыты.
В соответствии с этапом обработки, на котором проявляются ошибки, различают (рис. 9.1):
синтаксические ошибки - ошибки, фиксируемые компилятором (транслятором, интерпретатором) при выполнении синтаксического и частично семантического анализа программы;
ошибки компоновки — ошибки, обнаруженные компоновщиком (редактором связей) при объединении модулей программы;
ошибки выполнения - ошибки, обнаруженные операционной системой, аппаратными средствами или пользователем при выполнении программы.
Рис. 9.1. Классификация ошибок по этапу обработки программы
Синтаксические ошибки относят к группе самых простых, так как синтаксис языка, как правило, строго формализован, и ошибки сопровождаются развернутым комментарием с указанием ее местоположения. Определение причин таких ошибок, как правило, труда не составляет, и даже при нечетком знании правил языка за несколько прогонов удается удалить все ошибки данного типа.
Следует иметь в виду, что чем лучше формализованы правила синтаксиса языка, тем больше ошибок из общего количества может обнаружить компилятор и, соответственно, меньше ошибок будет обнаруживаться на следующих этапах. В связи с этим говорят о языках программирования с защищенным синтаксисом и с незащищенным синтаксисом. К первым, безусловно, можно отнести Pascal, ко вторым - С со всеми его модификациями.
Ошибки компоновки, как следует из названия, связаны с проблемами, обнаруженными при разрешении внешних ссылок. Например, предусмотрено обращение к подпрограмме другого модуля, а при объединении модулей данная подпрограмма не найдена или не стыкуются списки параметров. В большинстве случаев ошибки такого рода также удается быстро локализовать и устранить.
К самой непредсказуемой группе относятся ошибки выполнения. Прежде всего они могут иметь разную природу, и соответственно по-разному проявляться. Часть ошибок обнаруживается и документируется операционной системой. Выделяют четыре способа проявления таких ошибок:
• несовпадение полученных результатов с ожидаемыми.
Причины ошибок выполнения очень разнообразны, а потому и локализация может оказаться крайне сложной. Все возможные причины ошибок можно разделить на следующие группы:
• неверное определение исходных данных,
• накопление погрешностей результатов вычислений.
Неверное определение исходных данных происходит, если возникают любые ошибки при выполнении операций ввода-вывода.
Логические ошибки имеют разную природу. Так они могут следовать из ошибок, допущенных при проектировании, например, при выборе методов, разработке алгоритмов или определении структуры классов, а могут быть непосредственно внесены при кодировании модуля. К последней группе относят:
• ошибки некорректного использования переменных,
• ошибки межмодульного интерфейса,
• другие ошибки кодирования.
Накопление погрешностей результатов числовых вычислений возникает, например, при некорректном отбрасывании дробных цифр чисел, некорректном использовании приближенных методов вычислений, игнорировании ограничения разрядной сетки представления вещественных чисел в ЭВМ и т. п.
9.2. Методы отладки программного обеспечения
Большинство ошибок можно обнаружить по косвенным признакам посредством тщательного анализа текстов программ и результатов тестирования без получения дополнительной информации. При этом используют различные методы:
Метод ручного тестирования.
Это - самый простой и естественный способ данной группы. При обнаружении ошибки необходимо выполнить тестируемую программу вручную, используя тестовый набор, при работе с которым была обнаружена ошибка.
Метод очень эффективен, но не применим для больших программ, программ со сложными вычислениями и в тех случаях, когда ошибка связана с неверным представлением программиста о выполнении некоторых операций. Данный метод часто используют как составную часть других методов отладки.
Самый ответственный этап - выявление симптомов ошибки. Организуя данные об ошибке, целесообразно записать все, что известно о ее проявлениях, причем фиксируют, как ситуации, в которых фрагмент с ошибкой выполняется нормально, так и ситуации, в которых ошибка проявляется. Если в результате изучения данных никаких гипотез не появляется, то необходима дополнительная информация об ошибке. Дополнительную информацию можно получить, например, в результате выполнения схожих тестов.
В процессе доказательства пытаются выяснить, все ли проявления ошибки объясняет данная гипотеза, если не все, то либо гипотеза не верна, либо ошибок несколько.
По методу дедукции вначале формируют множество причин, которые могли бы вызвать данное проявление ошибки. Затем, анализируя причины, исключают, те, которые противоречат имеющимся данным. Если все причины исключены, то следует выполнить дополнительное тестирование исследуемого фрагмента. В противном случае наиболее вероятную гипотезу пытаются доказать. Если гипотеза объясняет полученные признаки ошибки, то ошибка найдена, иначе - проверяют следующую причину.
Метод обратного прослеживания.
Для небольших программ эффективно применение метода обратного прослеживания. Начинают с точки вывода неправильного результата. Для этой точки строится гипотеза о значениях основных переменных, которые могли бы привести к получению имеющегося результата. Далее, исходя из этой гипотезы, делают предположения о значениях переменных в предыдущей точке. Процесс продолжают пока не обнаружат причину ошибки.
9.3. Методы и средства получения дополнительной информации
Для получения дополнительной информации об ошибке можно выполнить добавочные тесты или использовать специальные методы и средства
• интегрированные средства отладки,
Метод требует включения в программу дополнительного отладочного вывода в узловых точках. Узловыми считают точки алгоритма, в которых основные переменные программы меняют свои значения. При этом предполагается, что, выполнив анализ выведенных значений, программист уточнит момент, когда были получены неправильные значения, и сможет сделать вывод о причине ошибки.
Данный метод не очень эффективен и в настоящее время практически не используется.
Интегрированные средства отладки.
Большинство современных сред программирования (Delphi, Builder C++, Visual Studio и т. д.) включают средства отладки, которые обеспечивают максимально эффективную отладку. Они позволяют:
• выполнять программу по шагам, причем как с заходом в подпрограммы, так и выполняя их целиком,
• предусматривать точки останова,
• выполнять программу до оператора указанного курсором и т.п..
Отладка с использованием независимых отладчиков.
При программировании программ иногда используют специальные программы - отладчики, которые позволяют выполнить любой фрагмент программы в пошаговом режиме и проверить содержимое интересующих программиста переменных. Как правило, такие отладчики позволяют отлаживать программу только в машинных командах, представленных в 16-ричном коде.
9.4. Общая методика отладки программного обеспечения
Суммируя все сказанное выше, можно предложить следующую методику отладки программного обеспечения, написанного на универсальных языках программирования для выполнения в операционных системах MS DOS и Win32:
Если ошибка не найдена или система просто «зависла», переходят ко второму этапу.
2 этап- локализация ошибки - определение конкретного фрагмента, при выполнении которого произошло отклонение от предполагаемого вычислительного процесса. При этом, если были получены неправильные результаты, то в пошаговом режиме проверяют ключевые точки процесса формирования данного результата.
Как подчеркивалось выше, ошибка не обязательно допущена в том месте, где она проявилась. Если в конкретном случае это так, то переходят к следующему этапу.
3 этап - определение причины ошибки - изучение результатов второго этапа и формирование версий возможных причин ошибки. Эти версии необходимо проверить, возможно, используя отладочные средства для просмотра последовательности операторов или значений переменных.
4 этап - исправление ошибки - внесение соответствующих изменений во все операторы, совместное выполнение которых привело к ошибке.
5 этап - повторное тестирование - повторение всех тестов с начала, так как при исправлении обнаруженных ошибок часто вносят в программу новые.
В предыдущей части мы рассмотрели исходный код и его составляющие.
После того, как вы начнете проверять фрагменты кода или попытаетесь решить связанные с ним проблемы, вы очень скоро поймете, что существуют моменты, когда программа крашится, прерывается и прекращает работу.
Это часто вызвано ошибками, известными как дефекты или исключительные ситуации во время выполнения. Акт обнаружения и удаления ошибок из нашего кода – это отладка программы. Вы лучше разберетесь в отладке на практике, используя ее как можно чаще. Мы не только отлаживаем собственный код, но и порой дебажим написанное другими программистами.
Для начала необходимо рассортировать общие ошибки, которые могут возникнуть в исходном коде.
Синтаксические ошибки
Эти эрроры не позволяют скомпилировать исходный код на компилируемых языках программирования. Они обнаруживаются во время компиляции или интерпретации исходного кода. Они также могут быть легко обнаружены статическими анализаторами (линтами). Подробнее о линтах мы узнаем немного позже.
Синтаксические ошибки в основном вызваны нарушением ожидаемой формы или структуры языка, на котором пишется программа. Как пример, это может быть отсутствующая закрывающая скобка в уравнении.
Семантические ошибки
Отладка программы может потребоваться и по причине семантических ошибок, также известных как логические. Они являются наиболее сложными из всех, потому что не могут быть легко обнаружены. Признак того, что существует семантическая ошибка, – это когда программа запускается, отрабатывает, но не дает желаемого результата.
Рассмотрим данный пример:
По порядку приоритета, называемому старшинством операции, с учетом математических правил мы ожидаем, что сначала будет оценена часть умножения, и окончательный результат будет равен 33. Если программист хотел, чтобы сначала происходило добавление двух чисел, следовало поступить иначе. Для этого используются круглые скобки, которые отвечают за смещение приоритетов в математической формуле. Исправленный пример должен выглядеть так:
3 + 5, заключенные в скобки, дадут желаемый результат, а именно 48.
Ошибки в процессе выполнения
Как и семантические, ошибки во время выполнения никогда не обнаруживаются при компиляции. В отличие от семантических ошибок, эти прерывают программу и препятствуют ее дальнейшему выполнению. Они обычно вызваны неожиданным результатом некоторых вычислений в исходном коде.
Вот хороший пример:
Фрагмент кода выше будет скомпилирован успешно, но input 25 приведет к ZeroDivisionError. Это ошибка во время выполнения. Другим популярным примером является StackOverflowError или IndexOutofBoundError. Важно то, что вы идентифицируете эти ошибки и узнаете, как с ними бороться.
Существуют ошибки, связанные с тем, как ваш исходный код использует память и пространство на платформе или в среде, в которой он запущен. Они также являются ошибками во время выполнения. Такие ошибки, как OutOfMemoryErrorand и HeapError обычно вызваны тем, что ваш исходный код использует слишком много ресурсов. Хорошее знание алгоритмов поможет написать код, который лучше использует ресурсы. В этом и заключается отладка программы.
Процесс перезаписи кода для повышения производительности называется оптимизацией. Менее популярное наименование процесса – рефакторинг. Поскольку вы тратите больше времени на кодинг, то должны иметь это в виду.
Отладка программы
Вот несколько советов о том, как правильно выполнять отладку:
- Использовать Linters. Linters – это инструменты, которые помогают считывать исходный код, чтобы проверить, соответствует ли он ожидаемому стандарту на выбранном языке программирования. Существуют линты для многих языков.
- Превалирование IDE над простыми редакторами. Вы можете выбрать IDE, разработанную для языка, который изучаете. IDE – это интегрированные среды разработки. Они созданы для написания, отладки, компиляции и запуска кода. Jetbrains создают отличные IDE, такие как Webstorm и IntelliJ. Также есть NetBeans, Komodo, Qt, Android Studio, XCode (поставляется с Mac), etc.
- Чтение кода вслух. Это полезно, когда вы ищете семантическую ошибку. Читая свой код вслух, есть большая вероятность, что вы зачитаете и ошибку.
- Чтение логов. Когда компилятор отмечает Error, обязательно посмотрите, где он находится.
Двигаемся дальше
Поздравляем! Слово «ошибка» уже привычно для вас, равно как и «отладка программы». В качестве новичка вы можете изучать кодинг по книгам, онлайн-урокам или видео. И даже чужой код вам теперь не страшен :)
В процессе кодинга измените что-нибудь, чтобы понять, как он работает. Но будьте уверены в том, что сами написали.
Введение в анализ алгоритмов для программистов и сочувствующих. Разбираемся в базовых понятиях теоретической информатики.
Вы никогда не задумывались, для чего нужна теоретическая computer science, и какое отношение она имеет к реальному программированию? Кажется, что если вас не очень интересует сфера математического анализа, то TCS может понадобиться только для ответа на вопросы о сложности алгоритмов на собеседованиях. Должно же быть нечто большее!
Хороший программист создает удобное и полезное программное обеспечение, а очень хороший старается сделать его максимально эффективным в использовании. Для этого необходимо понимать, почему и в каких пределах работает программа.
Вспомните фильм Каратэ-пацан с Джеки Чаном и Джейден Смит. Джеки заставляет Дре снова и снова надевать и снимать куртку. Смысл этого действия не в одежде, а в приобретении необходимых для кунг-фу навыков.
То же самое делает для нас теоретическая computer science. Она закладывает прочную основу фундаментальных абстрактных понятий, благодаря которой мы можем принимать правильные практические решения.
Эта статья предназначена для программистов, которые хорошо разбираются в написании кода, но не в TCS. Чтобы понять изложенные концепции, не требуется глубокое знание математики. Мы начнем с самых основ: алгоритмов, их вычислительной сложности, тета-нотации, асимптотического поведения и пессимистического анализа.
Что такое алгоритм?
Алгоритм можно определить как список шагов, которые необходимо выполнить для решения задачи.
Допустим, вы хотите купить книгу в интернете. Алгоритм ваших действий будет следующим:
Анализ алгоритмов и производительность
Анализ алгоритмов можно определить как теоретическое исследование производительности компьютерных программ и использования ими ресурсов.
Мы сосредоточимся на производительности.
Прежде всего, подумайте, есть ли в программировании что-то более важное, чем производительность? Разумеется! Если сверхбыстрая программа выдает неверный результат, это плохая программа.
Еще есть такие понятия, как простота, удобство обслуживания, надежность, безопасность, функциональность и удобство для пользователя. Все они гораздо важнее производительности.
Вот например, Эван Шпигель решил перепроектировать Snapchat. Зачем? Snapchat уже работает отлично, как было задумано. Просто пользователи жаловались на определенную сложность работы с приложением, и Эван решил сделать его проще в использовании. Удобство явно перевешивает эффективность алгоритмов.
Очевидно, что производительность – это не самая важная вещь. Тогда почему мы о ней говорим?
Дело в том, что иногда удобство использования напрямую связано с производительностью.
Представьте, что вы смотрите на веб-страницу, которая загружается уже целую вечность. В режиме реального времени недостаточно быстрое приложение считается неработающим. Слишком большое использование памяти тоже ухудшает пользовательский опыт.
Анализ алгоритмов на практике
Вооружившись этими знаниями, попробуем проанализировать простую задачу сортировки.
Мы будем использовать алгоритм сортировки пузырьком. На псевдокоде он выглядит вот так:
Функция Bubblesort принимает неупорядоченный массив чисел в виде входного параметра и сортирует его.
Давайте рассмотрим работу функции на реальном примере. Отправим на вход следующие данные: . На выходе мы ожидаем получить , то есть массив, отсортированный по возрастанию. Будем последовательно сравнивать числа и при необходимости менять их местами ( swap ).
Проход 1
• Сравниваем первый и второй элементы:
• 6 > 5, поэтому их следует поменять:
• Сравниваем второй и третий элементы:
• 6 > 3, меняем их местами:
После первого прохода наш массив выглядит так:
Он все еще не отсортирован, алгоритм нужно повторить.
Проход 2
• Сравниваем первый и второй элементы:
• Сравниваем второй и третий элементы:
После второго прохода мы получили желаемый результат.
Больше узнать о сортировке пузырьком вы можете здесь.
Время работы
Время выполнения алгоритма напрямую зависит от входных данных:
• от их качества
Предположим, что исходный список , переданный алгоритму пузырьковой сортировки, уже упорядочен. В этом случае достаточно сделать один проход по нему, чтобы убедиться в правильности расположения элементов. Но, что делать, если входной список отсортирован в обратном порядке? Потребуется несколько раундов выполнения, чтобы получить желаемый результат, так как нужно заменить каждый элемент.
• от количества
Представьте себе сортировку списка, содержащего 6*10⁹ элементов. Вероятно, она будет выполняться чуть дольше, чем упорядочивание шести чисел.
Итак, когда мы делаем анализ алгоритмов по времени выполнения, то обычно определяем максимальный предел. Эта верхняя граница дает гарантию пользователю, что выполнение задачи не займет больше конкретного количества секунд.
Количество проходов
Также имеет значение, сколько раз придется повторить алгоритм для выполнения задачи. Например, для пузырьковой сортировки можно подсчитать количество выполненных сравнений.
Чаще всего анализ проводится для худшего случая, при котором придется сделать больше всего повторений. В нашем примере худшим случаем является массив, упорядоченный по убыванию.
Гораздо реже рассматривается средний случай для всех возможных входных данных. Это наиболее полезная мера, но рассчитать ее очень сложно.
Можно также выполнять анализ алгоритмов для лучшего случая входных данных, но практического приложения это не имеет. Если массив чисел уже упорядочен, нет особого смысла сортировать его.
Асимптотический анализ алгоритмов
Итак, давайте попробуем проанализировать худший случай сортировки пузырьком и формально измерить, насколько быстро она работает.
Но где именно мы должны запустить этот алгоритм? На чьем компьютере? А ведь если запустить его на суперкомпьютере, он будет работать очень-очень быстро!
Нам явно требуется некий инструмент для сравнения двух алгоритмов на уровне идеи без учета деталей реализации: языка программирования, аппаратного обеспечения и т. д.
Начинается самое интересное: асимптотический анализ алгоритмов!
Этот метод игнорирует все константы, зависящие от машины, и вместо конкретной величины времени выполнения, рассматривает его динамическое изменение.
Для представления временной сложности алгоритмов в основном используют три асимптотических нотации:
- Θ-нотация (нотация тета большое);
- O-нотация (нотация о большое);
- Ω-нотация (нотация омега большое).
Θ-нотация
Давайте взглянем на нотацию тета большое. Она следует простым двум правилам:
- отбросить слагаемые низких порядков;
- отбросить константы.
Что это значит, рассмотрим на примере:
3n³ + 40n² - 10n + 409
Первое правило гласит: отбросьте слагаемые низких порядков. Здесь самый высокий порядок n – это 3 . Следовательно все остальное, включая свободный член 409 , можно отбросить.
Второе правило требует отбросить константы. Убираем 3 и получаем в итоге:
Что читается как тета большое от n в кубе .
Это инженерный способ манипулирования тета-нотацией.
Функция n³ , которую мы помещаем в Θ – это сложность нашего алгоритма.
Когда n приближается к бесконечности, алгоритм Θ(n²) всегда будет работать быстрее, чем Θ(n³) . Неважно, какими были члены нижнего порядка или ведущие константы. Даже если вы запустите Θ(n²) на медленном компьютере, а Θ(n³) – на быстром, с ростом n первый будет все сильнее вырываться вперед.
Анализ алгоритмов заботится только о том, во сколько раз чаще выполняется операция по мере увеличения входных данных, что соответствует поведению в худшем случае. Если alg1 превосходит alg2 для очень большого входящего n , очевидно, что он будет делать это и при малом n . Учитывая это, мы можем отбросить все медленнорастущие слагаемые и сконцентрироваться только на самых быстрорастущих. Это называется асимптотическим поведением.
Нотация о большое работает с худшими случаями, а омега большое – с лучшими.
Типы ошибок в алгоритмах.Если программа только что составлена, то она в очень редких случаях не содержит ошибок.
Различают три типа ошибок: синтаксические ошибки, ошибки выполнения и ошибки в алгоритме программы.
Синтаксические ошибки– возникает при нарушении правил языка QBasic. Такие ошибки сравнительно безобидны, поскольку причина ошибки описывается и программная строка с ошибкой выводится на экран. При наличии определенных навыков исправляются они достаточно быстро. Примером такой ошибки может служить неправильный набор ключевого слова PRITN вместо PRINT.
Ошибки выполнения – это такие ошибки, которые не нарушают синтаксиса языка, но приводят к ошибочным операциям в процессе выполнения. Примерами таких ошибок могут быть ошибка - индекс, ошибка – значение, деление на нуль, неправильное обращение к подпрограмме и т.д.
Ошибки в алгоритме программы – это такие ошибки, которые при верных исходных данных и безошибочной работе программы приводят к неправильным результатам. Такие ошибки должен обнаруживать сам программист. Поэтому, избавившись от синтаксических ошибок и ошибок выполнения, необходимо проверить работу программы на данных, охватывающих по возможности все случаи, которые могут встретиться при реальном счете. Для этого создаются и «прокручиваются» различные тесты (контрольные примеры).
Другой часто применяемый способ отладки программы состоит в следующем: в критических точках расставляются вспомогательные команды STOP. При выполнении STOP вычисления приостанавливаются, и пользователь может вывести значения интересующих его переменных в режиме непосредственного исполнения на экран. После остановки вычисления возобновляют командой CONT. Анализ выведенных значений переменных позволяет делать выводы о правильности хода вычислительного процесса и принимать соответствующие решения.
Если же за дисплеем найти ошибку не удалось, нужно сесть за стол и применить очень действенный метод – выполнить программу вручную. Для этого необходимо представить, что вы машина, и начав с первого оператора программы, выполнять оператор за оператором, пока не будет обнаружена причина неправильной работы программы.
Эту работу нужно выполнять методично и терпеливо. Имитируя работу программы, мы должны иметь текст программы, список переменных с их текущими значениями и лист бумаги для отслеживания изменений. Выполняя программу вместо машины, нужно все время задавать себе вопрос: «Тот ли получен результат, которого я ожидал?». Если - да, то продолжите выполнение программы. Если - нет, то нужно думать, почему программа работает неправильно.
Следует иметь в виду, что в процессе отладки могут быть обнаружены и устранены не все ошибки. Более того, в процессе исправления обнаруженных ошибок могут быть допущены новые. Поэтому после каждого исправления требуется вновь произвести тестирование.
Основные этапы проектирования (алгоритмизации). Рассмотрим процесс решения задачи на конкретном примере:
Задача: Определить дальность полета тела, брошенного под углом к горизонту.
На первом этапе обычно строится описательная информационная модель объекта или процесса. В нашем случае с использованием физических понятий создается идеальная модель движения объекта. Из условия задачи можно сформулировать следующие основные предложения:
1) размеры тела малы по сравнению с траекторией полета, поэтому тело можно считать материальной точкой,
2) скорость бросания тела мала, поэтому :
- ускорение свободного падения считать постоянной величиной;
- сопротивлением воздуха можно пренебречь.
На втором этапе создается формальная модель, т.е. описательная информационная модель записывается с помощью какого-либо формального языка.
Из курса физики известны следующие формулы
Vx=V0*cos(A) – горизонтальная проекция вектора скорости
Vy=V0*sin(A) – вертикальная проекция вектора скорости
L=Vx*t – дальность полета, t- время полета
0=Vy*t-gt 2 /2 – координата точки падения
g=9,81 м/с 2 - ускорение свободного падения
Органичения :
Как видно из этой системы неравенств, бросание тела не должно происходить вправо и вверх, и начальная скорость не должна быть отрицательной.
Таким образом, метод решения данной задачи описывается следующей последовательностью формул:
На третьем этапе необходимо формализованную информационную модель преобразовать в компьютерную модель, т.е. выразить ее на понятном для компьютерном языке. Существуют два принципиально различных пути построения компьютерной модели:
- создание алгоритма решения задачи и его кодирование на одном из языков программирования;
- формирование компьютерной модели с использованием одного из приложений (электронных таблиц, СУБД и т.д.)
Для реализации первого пути надо построить алгоритм определения координаты тела в определенный момент времени и закодировать его на одном из языков программирования, например на языке QuickBasic.
Второй путь требует создания компьютерной модели, которую можно исследовать в электронных таблицах.
Собственно алгоритм решения данной задачи состоит из последовательного решения наших уравнений:
- Ввести начальную скорость (V0) и угол бросания (А)
- Присвоить переменной Vy значение V0*sin(A)
- Присвоить переменной Vx значение V0*cos(A)
- Присвоить переменной t (время полета) значение 2*Vy/g
- Присвоить переменной L (дальность полета) значение Vx*t
- Вывести ответ на экран (L).
Четвертый этап - составление программы, т.е. запись задачи на понятном компьютеру языке. В качестве примера выбран язык QuickBasic.
Пятый этап исследования информационной модели состоит в проведении компьютерного эксперимента. Если компьютерная модель существует в виде программы на одном из языков программирования, ее нужно запустить на выполнение и получить результаты.
На шестом этапе выполняется анализ полученных результатов и при необходимости корректировка исследуемой модели. В нашем случае можно попробовать запустить программу с различными исходными данными.
Таким образом, технология решения задач с помощью компьютера состоит из следующих этапов: построение описательной модели – формализация – построение компьютерной модели – компьютерный эксперимент – анализ результатов и корректировка модели.
Отладка программы – это процесс поиска и устранения ошибок. Часть ошибок формального характера, связанных с нарушением правил записи конструкций языка или отсутствием необходимых описаний, обнаруживает транслятор, производя синтаксический анализ текста программы. Транслятор выявляет ошибки и сообщает о них, указывая их тип и место в программе. Такие ошибки называются ошибками времени трансляции или синтаксическими ошибками.
Ошибочные ситуации могут возникнуть и при выполнении программы, например, деление на нуль или извлечение корня квадратного из отрицательного числа. Такие ошибки называются ошибками времени выполнения.
Программа, не имеющая ошибок трансляции и выполнения, может и не дать верных результатов из-за логических ошибок в алгоритме, т. е. алгоритмических или семантических ошибок. Ошибки подобного рода могут возникнуть на любом этапе разработки программы: постановки задачи, разработке математической модели или алгоритма. Необходим действенный контроль над процессом вычислений, позволяющий предотвращать или своевременно обнаруживать ошибки подобного рода. Для этого используются как качественный анализ задачи, основанный на различного рода интуитивных соображениях и правдоподобных рассуждениях, так и контрольный просчет или тестирование программы.
Тестирование программы – это выполнение программы на наборах исходных данных (тестах), для которых известны результаты, полученные другим методом. Система тестов подбирается таким образом, чтобы
а) проверить все возможные режимы работы программы;
б) по возможности, локализовать ошибку.
При тестировании программы простой и действенный метод дополнительного контроля над ходом её выполнения – получение контрольных точек, т. е. контрольный вывод промежуточных результатов.
Для проверки правильности работы программы иногда полезно также выполнить проверку выполнения условий задачи (например, для алгебраического уравнения найденные корни подставляются в исходное уравнение и проверяются расхождения левой и правой частей).
33. ВИДЫ ОШИБОК В ПРОГРАММАХ
Об ошибках в программе сигнализируют некорректная работоспособность программы либо ее полное невыполнение. В наше время для обозначения ошибки в программе используют термин «Баг» (с англ. Bug-жук).
Есть несколько типов ошибок:
1) Логическая ошибка. Это, пожалуй, наиболее серьезная из всех ошибок. Когда написанная программа на любом языке компилирует и работает правильно, но выдает неправильный вывод, недостаток заключается в логике основного программирования. Это ошибка, которая была унаследована от недостатка в базовом алгоритме. Сама логика, на которой базируется вся программа, является ущербной. Чтобы найти решение такой ошибки нужно фундаментальное изменение алгоритма. Вам нужно начать копать в алгоритмическом уровне, чтобы сузить область поиска такой ошибки. (пример: задача программы вывести сумму двух чисел а и b.
varc,a,b:integer;
2) Синтаксическая ошибка.Каждый компьютерный язык, такой как C, Java, Perl и Python имеет специфический синтаксис, в котором будет написан код. Когда программист не придерживаться "грамматики" спецификациями компьютерного языка, возникнет ошибка синтаксиса. Такого рода ошибки легко устраняются на этапе компиляции.
3) Ошибка компиляции.Компиляция это процесс, в котором программа, написанная на языке высокого уровня, преобразуется в машиночитаемую форму. Многие виды ошибок могут происходить на этом этапе, в том числе и синтаксические ошибки. Иногда, синтаксис исходного кода может быть безупречным, но ошибка компиляции все же может произойти. Это может быть связано с проблемами в самом компиляторе. Эти ошибки исправляются на стадии разработки.
vara:array[1..5] of integer;
6) Ошибки ресурса. Ошибка ресурса возникает, когда значение переменной переполняет максимально допустимое значение. Переполнение буфера, использование неинициализированной переменной, нарушение прав доступа и переполнение стека - примеры некоторых распространенных ошибок.
vara:integer;
7) Ошибка взаимодействия. Они могут возникнуть в связи с несоответствием программного обеспечения с аппаратным интерфейсом или интерфейсом прикладного программирования. В случае веб-приложений, ошибка интерфейса может быть результатом неправильного использования веб-протоколов
Синтаксические ошибки – это ошибки в записи конструкций языка программирования (чисел, переменных, функций, выражений, операторов, меток, подпрограмм).
Семантические ошибки – это ошибки, связанные с неправильным содержанием действий и использованием недопустимых значений величин.
Читайте также: