Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.doc
Скачиваний:
40
Добавлен:
12.04.2015
Размер:
4.91 Mб
Скачать

Классификация ошибок

Ошибки, с которыми сталкивается программист, можно разделить следующим образом:

  • ошибки в описании задачи. Иногда случается, что программа написана, а пользователь обнаруживает несоответствие между выдаваемыми и ожидаемыми результатами. Некачественная постановка требований приводит к созданию программы, которая будет правильно решать неверно сформулированную задачу. В этом случае требуется полное перепрограммирование. Чтобы исключить такие ошибки необходимо письменное формулирование технического задания (ТЗ). Это заставляет заказчика собраться с мыслями и дать точное определение ТЗ. Всякие устные указания являются ненадежными и часто приводят к взаимному недопониманию заказчика и исполнителя;

  • ошибки в выборе алгоритмов. Примером таких ошибок является выбор алгоритма итерационного процесса решения некоторого уравнения, когда алгоритм является расходящимся вместо сходящегося. К сожалению, часто плохой выбор алгоритма становиться очевидным лишь после его опробования;

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

  • ошибки общего характера. Они возникают из-за недостаточного знания или непонимания алгоритмического языка программирования. К ним относятся: ошибки применения операторов, не обеспечивающих последовательности событий, устанавливаемых алгоритмом, синтаксические ошибки, ошибки при выполнении синтаксически правильных операторов (деление на ноль, извлечение корня из отрицательного числа и т.д.), ошибки, вызванные неверными данными. Наконец, существует еще один вид ошибок, называемый глитчем (хроническим дефектом) – программы не удовлетворяют некоторым требованиям, которые не были сформулированы в ТЗ;

  • ошибки физического характера. К ним относят случайный пропуск некоторых операторов, перестановка их в программе, отсутствие необходимых данных и др.;

  • синтаксические ошибки. Выявление компилятором синтаксических ошибок представляет собой важный и, безусловно, необходимый этап отладки программы.

Ошибки, не обнаруженные компилятором

Существует множество ошибок, которые отладочный компилятор не в состоянии выявить, например:

  • пропуск части программы;

  • переход не на ту ветвь, на которую нужно перейти после выполнения оператора условного перехода;

  • использование неверного формата в операциях ввода и вывода данных;

  • неправильные параметры циклов (начальное состояние, приращение, условия окончания и т.д.);

  • неполная или неправильная индексация массива;

  • выпадение из рассмотрения некоторых возможных ситуаций, связанных с данными и вычислениями;

  • другие.

Ситуации, возникающие при неверных результатах

Отладка начинается с того момента, когда компилятор перестает выдавать сообщения о синтаксических ошибках. В начале процесса отладки нужно использовать простые тестовые данные. Если получаются верные результаты, следует переходить к тестированию программы посредством более сложных данных. Если результаты неверны, то могут возникнуть следующие ситуации:

  1. синтаксических ошибок нет, но программа не скомпилирована. В этом случае нужно выяснить причину, посмотреть все сообщения, если происходит системное прерывание, нужно путем сегментирования локализировать участок программы и ликвидировать причину;

  2. программа скомпилирована, получен exe-файл, но нет результатов. От такой программы мало проку. Такие неполадки могут вызываться какими-либо логическими или системными ошибками. Возможна системная ошибка при реализации программы, когда программа ушла на прерывание (деление на ноль, обращение к области данных и восприятие их как инструкций, неверная индексация массива, переполнение или потеря значимости и т.д.);

  3. преждевременный останов. Программа начинает работать, выдаются какие-то результаты, но затем работа программы преждевременно прекращается. Ошибки, приводящие к преждевременному прекращению работы программы и сопровождаемые затем сообщением о системной ошибке, называются взрывами (blowup) или воронками (cratered). Это тяжелые ошибки, так как они не дают возможности продолжать выполнение программы;

  4. неверные результаты. Опытные программисты всегда считают это удачей, так как программа в принципе правильна, её логика работает точно, но нужно устранить ошибки, формирующие результат;

  5. зацикливание. Этот вид ошибок обнаружить и локализировать несложно.

Создание консольного приложения Microsoft Visual C++

Выполним команду New из меню File. На вкладке Projects создадим проект с именем Ex_1. Выберем простое консольное приложение – Win32 Console Application. В текстовом поле Location запишем путь к папке, в которой система автоматически создаст файлы нового проекта (см. раздел 1).

После нажатия кнопки ОК, отобразится окно мастера проектов с набором опций, из которых выберем An empty project , а затем нажмем кнопку Finish. Далее щелкнем на кнопке, расположенной первой слева на стандартной панели инструментов (New Text File). Откроется новое окно редактирования, в которое введем код:

/* ПРИМЕЧАНИЕ: данная программа содержит ошибки,

введенные с целью обучить использованию средств отладки */

#include <stdio.h>

/* Следующая константа определяет размер массива */

#define SIZE 5

/* Прототип функции */

void print_them(int offset, char continue, int iarray[SIZE]);

void main( void )

{

int offset; /* индекс элемента массива */

int iarray[SIZE]; /* массив чисел */

char continue= 0; /* содержит ответ пользователя */

/* Первый раз функция выводит значения неинициализированных переменных*/

print_them(offset,continue, iarray);

/* Приглашение для пользователя */

printf("\n\nWelcome to a trace demonstration!");

printf("\nWould you like to continue (Y/N)");

scanf("%c",&continue); /* Пользователь вводит новые значения в массив*/

if (continue == 'Y' )

for (offset=0; offset < SIZE, offset++)

{

printf ("\nPlease enter aninteger: ");

scanf("%d",&iarray [offset] );

}

/* Второй раз функция отображает значения, введенные пользователем */

print_them(offset, continue, iarray) ;

}

/* Функция, выводящая значения элементов массива */

void print_them(int offset, char continue, int iarray[SIZE])

{

printf("\n\n%d",offset);

printf("\n\n%d",continue);

for(offset=0; offset < SIZE,offset++)

printf("\n%d",iarray[offset]);

}

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

Далее сохраним код, для чего можно щелкнуть на третьей кнопке слева на стандартной панели инструментов (Save), выбрать в меню File команду Save, или нажать [Ctrl+S]. Когда в первый раз выбирается команда Save, открывается диалоговое окно Save и запрашивается имя файла. Сохраним файл под именем Error.сpp.

Как правило, проекты для Windows включают большое число файлов. Однако созданный проект состоит из единственного файла, который нужно добавить в проект.

Для этой цели нужно сделать активным файл Error.cpp и щелкнуть правой кнопкой мыши на нем. Появится контекстное меню (рис. 3.1). Выполнить команду Insert File into Project -> Ex_1.

После создания исходного файла (*.c) можно приступить к созданию исполняемого файла (*.exe). Согласно терминологии разработчиков Visual C++, этот процесс называется построением (Build) программы. Он выполняется с помощью меню Build (рис. 3.2).

Выполним компиляцию файла Error.cpp с помощью одной из команд Compile Error.cpp, Build Error.exe или Rebuild All (рис. 3.2). Единственное различие между командами Build и Rebuild All, состоит в том, что команда Rebuild All не проверяет дату создания используемых в проекте файлов, а компилирует и компонует все файлы проекта, независимо от того, когда они были созданы.

Чтобы избежать недоразумений, связанных с тем, что системное время компьютера можетбыть легко изменено, при работе с небольшими приложениями рекомендуется использовать команду Rebuild All.