Виды ошибок и способы их устранения 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Виды ошибок и способы их устранения



 

Выделяют три типа ошибок: ошибки компиляции, ошибки времени выполнения и логические ошибки.

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

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

Логические ошибки возникают при неправильном проектировании алгоритма или по невнимательности при записи или наборе программы. Программа с логическими ошибками может быть выполнена до конца, возможно даже, что при некоторых наборах исходных данных результаты будут правильными.

В процессе устранения логических ошибок можно выделить три этапа:

1. установление факта существования ошибки;

2. локализация ошибки;

3. устранение ошибки.

Существуют 2 метода обнаружения ошибок:

1. статическая (ручная) проверка, которая заключается в анализе программы без выполнения ее на ЭВМ;

2. тестирование - прогон на ЭВМ.

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

При отладке программ для практического использования нужно подобрать дополнительные тестовые данные:

1. Получить реальные данные у потенциального пользователя.

2. Породить случайным образом наборы тестовых данных.

Ручная проверка

 

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

Статистика утверждает, что 70% ошибок можно устранить на этапе ручного тестирования.

Машинное тестирование

 

Известный специалист в области программирования Дейкстра считает, что тестирование доказывает наличие ошибок, а не их отсутствие.

Выделяют два вида тестирования: разрушающее и диагностическое:

1. Разрушающее тестирование производится над программой, которая считается правильной, с целью заставить ее дать сбой.

2. Диагностическое тестирование выполняется с целью локализации ошибки, если известно о ее существовании.

В ТР существуют системные средства для отладки программ. Они позволяют выполнить трассировку с выводом значений интересующих переменных и выражений, устанавливать точки останова, точки прерывания (контрольные точки).

 

Проверка правильности данных

 

Правильно написанная программа должна:

1. при вводе некорректных данных выдавать сообщение, указывающее на некорректный элемент данных и сообщать о причине некорректности;

2. произвести как можно больше правильных вычислений;

3. встретив некорректный элемент данных, проверить остальные данные.

 

Исправление ошибок

1. Перед всяким устранением ошибки нужно подумать, к чему это приведет.

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

Устойчивая программа - это программа, которая порождает правильные результаты во всех случаях, когда это возможно, иначе - указывает причину, по которой программа не может быть выполнена. Всякая практически используемая программа меняется в течение своей жизни. Изменения включают в себя исправление логических ошибок, выявленных при эксплуатации программы, и модификацию программы в соответствии с новыми требованиями. На эту деятельность, которая называется сопровождением, программисты тратят больше времени, чем на создание программы. Правильная программа, после внесения в нее изменений, может перестать быть правильной. Поэтому программа должна быть предельно ясной и понятной тому, кто занимается сопровождением, структура программы должна быть такой, чтобы ее легко было модифицировать, не лишая устойчивости.

 

19. РЕГУЛЯРНЫЙ ТИП (МАССИВ)

 

Чтобы хранить и обрабатывать сложные виды информации, нужно научиться строить нетривиальные структуры данных. Такие структуры создают путем объединения данных, в конечном итоге, простых типов. Составные части структурированных типов называются их компонентами.

В ТР существует ограничение на объем памяти, занимаемой значением любого структурированного типа. Этот объем не должен превышать 65520 байтов.

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

Описание массива:

 


Количество типов индекса, перечисленных в квадратных скобках, определяет размерность массива. Размер массива - это общее число его компонентов.

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

Базовый тип может быть любым.

 

Одномерные массивы

 

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

Примеры описаний одномерных массивов:

const MAXLEN=100;{константа удобна для изменения размера массива}

type t_vect =array[1.. MAXLEN] of integer;

var a: t_vect; {для хранения целочисленных последовательностей}

b: t_vect;

c, d: array[1.. MAXLEN] of integer;

point: array[(x, y, z)] of real; {для хранения координат точки или

вектора}

flag: array[‘A’..‘Z’] of boolen;

Массивы a, b, c, d имеют одинаковые размеры (=100). Размер массива poin t равен 3, flag - 26.

Компоненты (элементы) массива занимают последовательные ячейки памяти. Объем памяти, выделяемой массиву, равен произведению размера массива на объем, занимаемый элементом. Переменная а занимает 100*2=200 байтов, point - 3*6=18 байтов, flag - 26*1=26 байтов.

Следует обратить внимание на то, что типы переменных a и с компилятор считает разными. Важным понятием в Паскале является понятие тождественности типов. Переменные имеют тождественные типы, если они определены в одной секции или через одно и то же имя типа.

Согласно приведенным выше описаниям, типы переменных a и b тождественны, так как переменные описаны с использованием имени типа t_vect. Переменные с и d тоже имеют тождественные типы, так как описаны в одной секции.

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

Если массивы a и d инициализированы, то допустимы операторы b:= a и c:= d.

Имя массива является общим именем совокупности компонентов (элементов) массива. Обращение к отдельным компонентам массива осуществляется с помощью переменных с индексами:

 

 


Выражение в квадратных скобках должно иметь тип индекса. Например, a[1], d[MAXLEN div 2], point[x], point[y], flag[‘X’], flag[succ(‘G’)].

Переменные с индексами можно использовать в любом месте программы, где допустим базовый тип. Ввод и вывод массива производится покомпонентно, обычно в цикле for.

Пример. Составим программу для определения максимального члена данной целочисленной последовательности, длиной не больше 100, и номера этого элемента:

Program max_elem;

const MAXLEN=100;

var v: array [1.. MAXLEN] of integer;

max:integer; {для максимального значения}

n: 1.. MAXLEN; {n - длина последовательности}

imax, i: 1.. MAXLEN; {imax - для номера максимального члена}

Begin

write('Введите длину последовательности £ ', MAXLEN);

read (n);

write('Введите члены последовательности ');

for i:=1 to n do read(v[i]);

{Поиск максимального элемента}

max:= v[1]; imax:= 1; {инициализация переменных}

for i:=2 to n do

if v[i] > max then

begin {запоминаем большее значение}

max:= v[i];

imax:= i

end;

writeln(‘ Максим. член последовательности - v[’, imax, ‘] = ’, max)

End.

 

Упакованные массивы

 

Если в одном машинном слове можно разместить несколько элементов массива, то для экономии памяти можно использовать упакованный массив. Для этого при описании массива перед ключевым словом array следует указать ключевое слово packed.

Например, при описании

 
 
var a: packed array [1..10] of 0..7;

 


в двухбайтовом машинном слове размещается 5 элементов, для массива потребуется 2 слова, то есть 4 байта.

При работе с упакованными массивами усложняется доступ к отдельным элементам массива. В ТР массивы упаковываются автоматически, слово packed можно не указывать.

Многомерные массивы

 

Если количество типов индекса в описании массива равно n, то массив называют n -мерным. Формально размерность массива не ограничена, но фактически она зависит и от размера базового типа, и от ограничения на объем памяти структурированных типов.

Для представления матриц используются двумерные массивы. Тип первого индекса определяет число строк, а тип второго индекса - число столбцов матрицы. Например,

const ROW=20;

COL=10;

type t_matr=array[1..ROW, 1..COL] of word;

var a: t_matr;

d: array[1..2, 1..3, (x, y)] of real;

Тип t_matr - двумерный массив размером 20х10. Его можно использовать для работы с матрицами порядка не больше чем 20x10. Переменная d - трехмерный массив.

Обращение к элементам многомерных массивов:

 


Идентификатор - имя массива. Число выражений (индексов) в квадратных скобках должно быть равно размерности массива. Например, a[3, 4], d [2, 1, y].

В памяти двумерные массивы располагаются по строкам. В общем случае элементы многомерных массивов размещаются так, что чем правее индекс, тем быстрее он меняется. Так, элементы массива d размещаются в памяти в следующей последовательности:

 
 
d [1, 1, x], d [1, 1, y], d [1, 2, x], d [1, 2, y], d [1, 3, x], d [1, 3, y], d [2, 1, x], d [2, 1, y], d [2, 2, x], d [2, 2, y], d [2, 3, x], d [2, 3, y].

 


Для ввода и вывода многомерных массивов используются вложенные циклы. В качестве примера приведем фрагмент программы вывода в виде таблицы описанного выше массива a (i и j - целочисленные переменные):

for i:=1 to ROW do {i - номер строки }

begin

writeln; {переход к новой строке}

for j:=1 to COL do {j - номер столбца}

write(a[i, j]: 7)

end;

 



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 1700; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.244.201 (0.026 с.)