Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания.pdf
Скачиваний:
81
Добавлен:
13.02.2015
Размер:
1.2 Mб
Скачать

writeln(s1,s2,s3);

Задача 5. Найти количество элементов массива больших среднего арифметического этих элементов

s:=0;

for i:=1 to 10 do s:=s+a[i]; r:=s/10;

n:=0;

for i:=l to 10 do

if a[i]>r then inc(n); writeln(n);

Задача 6. Поиск максимального элемента и подсчет частоты его появления в массиве

mах:=а[1];

for i:=1 to 10 do

if a[i]>max then max:=a[i];

s:=0;

for i:=1 to 10 do

if a[i]=max then inc(s); writeln(s);

Задача 7. Поиск нулевого элемента i:=1:

while (i<=10) and (а[i]<>0) do inc(i); if i>10 then writeln(‘нет’)

else writeln(‘первый 0 стоит на позиции ‘,i);

Задача 8. Поиск отрицательного числа с конца массива i:=10;

while (i>=1) and (a[i]>=0) do dec(i);

if i<l then writeln(‘отрицательных чисел нет’)

else writeln(‘последнее число<0 стоит на позиции ‘,i);

13.4 Стандартная обработка двумерных массивов

Значительное количество практических задач требует обработки не одномерных, а двумерных массивов.

Двумерный массив и его части

Например, рассмотрим двумерный массив из 25 элементов, содержащий 5 строк и 5 столбцов:

5 -2 3 14 11

16

 

17

13

1

7

1

 

5

-2

3

14

20

 

8

0

9

10

-4

 

3

-6

3

14

16

Компонентами двумерного массива, требующими специальной обработ-

ки, могут быть его строки, столбцы и диагонали, например:

-

вторая строка:

 

 

 

 

 

17

13

1

7

1

- главная (первая) диагональ:

 

 

 

 

5

13

3

10

16

- побочная (вторая) диагональ:

 

 

 

-

11

7

3

0

3

третий столбец:

 

 

 

 

-

3

1

3

9

3

и т.д.

 

 

 

 

 

Индексы элементов двумерного массива

 

 

 

 

Двумерный массив А из 25 элементов (5 строк и 5 столбцов) имеет такие

индексы:

 

 

 

 

 

 

 

 

 

5

-2

3

14

11

А[1,1]

А[1,2]

А[1,3]

А[1,4]

А[1,5]

17

13

1

7

1

А[2,1]

А[2,2]

А[2,3]

А[2,4]

А[2,5]

5

-2

3

14

20

А[3,1]

А[3,2]

А[3,3]

А[3,4]

А[3,5]

8

0

9

10

-4

А[4,1]

А[4,2]

А[4,3]

А[4,4]

А[4,5]

3

-6

3

14

16

А[5,1]

А[5,2]

А[5,3]

А[5,4]

А[5,5]

Первый индекс — это номер строки, а второй — номер соответствующего столбца (в некоторых программных продуктах возможна другая трактовка: первый индекс — столбец, а второй — строка).

При обработке в программе всех элементов двумерного массива необходимо писать вложенные операторы FOR:

FOR I:=1 TO 5 DO

FOR J:=1 TO 5 DO ... A[I,J] ...

Индексы строки и столбца двумерного массива

Рассмотрим в качестве примера индексы второй строки:

А[2,1] А[2,2] А[2,3] А[2,4] А[2,5].

Легко заметить, что первый индекс — номер строки — фиксирован и равен 2 (для 2-й строки), а второй индекс последовательно пробегает значения от 1 до 5. Поэтому в случае необходимости обработки 2-й строки двумерного массива достаточно написать:

17

FOR I:=1 ТО 5 DO ... А[2 , I ] ...

Переменная I может быть по необходимости заменена любой другой, например М:

FOR M:=1 ТО 5 DO ... А[2 , M ] ...

Теперь рассмотрим в качестве примера индексы третьего столбца:

А[1,3] А[2,3] А[3,3] А[4,3] А[5,3]

Очевидно, что теперь второй индекс — номер столбца — фиксирован, а первый индекс — номер строки — пробегает последовательно все значения от 1 до 5. Поэтому цикл обработки элементов третьего столбца должен выглядеть так:

FOR I:=1 ТО 5 DO ... А[ I , 3 ] ...

Индексы диагоналей двумерного массива

Элементы первой диагонали двумерного массива имеют индексы:

А[1,1] А[2,2] А[3,3] А[4,4] А[5,5]

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

FOR I:=1 ТО 5 DO ... А[I , I] ...

Элементы второй диагонали двумерного массива имеют индексы:

А[1,5] А[2,4] А[3,3] А[4,2] А[5,1]

Нелегко, но можно заметить, что сумма индексов строки и столбца для всех элементов второй диагонали постоянна и равна 6 (для массива 5 x 5; для массива N x N это будет N + 1), и потому цикл обработки элементов второй диагонали должен выглядеть следующим образом:

FOR I:=1 ТО N DO ... А[I , N+1-I] ...

Перенос простейших алгоритмов на двумерные массивы

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

s:=0;

{Суммирование элементов}

for i:=1 to 30 do s:=s+А[i];

{одномерного массива А}

s:=0;

{Суммирование элементов второй}

for i:=1 to 5 do s:=s+B[2,i];

{строки двумерного массива B}

s:=0;

{Суммирование элементов третье- }

for i:=1 to 5 do s:=s+B[i,3];

{го столбца двумерного массива B}

s:=0;

{Суммирование элементов первой}

for i:=1 to 5 do s:=s+B[i,i];

(диагонали двумерного массива B}

s:=0;

{Суммирование элементов второй}

for i:=1 to 5 do s:=s+B[i,6-1];

{диагонали двумерного массива B}

s:=0;

{Суммирование элементов}

18

for

i:=1

to

5

do

{двумерного массива B}

for

j:=1

to

5

do

s:=s+B[i,j];

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

Другие примеры работы с массивами смотрите в соответствующем разде-

ле.

13.5Отладка и тестирование программ

2.5.1Общие сведения об отладке и тестировании ПО

Отладка программы — это процесс поиска и устранения ошибок в программе, производимый по результатам её прогона на компьютере.[1]

Тестирование (англ. test — испытание) — это испытание, проверка правильности работы программы в целом, либо её составных частей.[1]

Отладка и тестирование — это два четко различимых и непохожих друг на друга этапа:

-при отладке происходит локализация и устранение синтаксических ошибок и явных ошибок кодирования;

-в процессе же тестирования проверяется работоспособность программы, не содержащей явных ошибок.

Тестирование устанавливает факт наличия ошибок, а отладка выясняет ее

причину. В современных программных системах (Visual Studio, Delphi и др.) отладка осуществляется часто с использованием специальных программных средств, называемых отладчиками. Эти средства позволяют исследовать внутреннее поведение программы.

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

-пошаговое исполнение программы с остановкой после каждой команды (оператора);

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

-установку в программе "контрольных точек"(breakpont), т.е. точек, в которых программа временно прекращает свое выполнение, так что можно оценить промежуточные результаты, и др. Причем прерывание исполнения программы может быть вызвано как достижением точки прерывания, так и при выполнении в этой точке некоторого условия При отладке программ важно помнить следующее:

-в начале процесса отладки надо использовать простые тестовые дан-

19

ные;

-возникающие затруднения следует четко разделять и устранять строго поочередно;

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

возникновения ошибок:

-должна быть испытана каждая ветвь алгоритма;

-очередной тестовый прогон должен контролировать нечто такое, что еще не было проверено на предыдущих прогонах;

-первый тест должен быть максимально прост, чтобы проверить, работает ли программа вообще;

-арифметические операции в тестах должны предельно упрощаться для уменьшения объема вычислений;

-количества элементов последовательностей, точность для итерационных вычислений, количество проходов цикла в тестовых примерах должны задаваться из соображений сокращения объема вычислений;

-минимизация вычислений не должна снижать надежности контроля;

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

-усложнение тестовых данных должно происходить постепенно. Пример. Система тестов для задачи нахождения корней квадратного

уравнения a x2 +b x +c =0 представлена в таблице 2:

Таблица 1.4

Номер

Проверяемый случай

Коэффициенты

Результаты

теста

a

b

c

 

 

 

 

 

 

 

 

1

d >0

 

 

1

1

-2

x1 = 1, x2 = - 2

2

d=0

 

 

1

2

1

Корни равны: x1 =- 1, x2 = - 1

3

d < 0

 

 

2

1

2

Действительных корней нет

4

a=0, b=0,

c=0

0

0

0

Все коэффициенты равны нулю.

 

 

 

 

 

 

 

х — любое число.

5

a=0,

b=0,

c<>0

0

0

2

Неправильное уравнение

6

a=0,

b<>0

 

0

2

1

Линейное уравнение. Один корень: x =- 0,5

7

a <> 0, b <> 0, с = 0

2

1

0

x1 = 0, x2 = - 0,5

Следует помнить о том, что ошибки могут быть допущены на всех этапах решения задачи — от ее постановки до оформления. Разновидности ошибок и соответствующие примеры приведены в таблице 3:

20

 

Таблица 1.5

Вид ошибки

Пример

Неправильная постанов-

Правильное решение неверно сформулированной задачи

ка задачи

 

Неверный алгоритм

Выбор алгоритма, приводящего к неточному или эффективному

 

решению задачи

Ошибка анализа

Неполный учет ситуаций, которые могут возникнуть; логические

 

ошибки

Семантические ошибки

Непонимание порядка выполнения оператора

Синтаксические ошибки

Нарушение правил, определяемых языком программирования

Ошибки при выполне-

Слишком большое число, деление на ноль, извлечение квадратно-

нии операций

го корня из отрицательного числа и т. п.

Ошибки в данных

Неудачное определение возможного диапазона изменения данных

Опечатки

Перепутаны близкие по написанию символы, например, цифра 1 и

 

буквы I, l

Ошибки ввода-вывода

Неверное считывание входных данных, неверное задание форма-

 

тов данных

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

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

Примеры синтаксических ошибок:

-пропуск знака пунктуации;

-несогласованность скобок;

-неправильное формирование оператора;

-неверное образование имен переменных;

-неверное написание служебных слов;

-отсутствие условий окончания цикла;

-отсутствие описания массива и т.п.

Существует множество ошибок, которые транслятор выявить не в состоянии, если используемые в программе операторы сформированы верно. Приведем примеры таких ошибок.

Логические ошибки:

-неверное указание ветви алгоритма после проверки некоторого условия;

-неполный учет возможных условий;

-пропуск в программе одного или более блоков алгоритма.

Ошибки в циклах:

-неправильное указание начала цикла;

-неправильное указание условий окончания цикла;

21

-неправильное указание числа повторений цикла;

-бесконечный цикл.

Ошибки ввода-вывода; ошибки при работе с данными:

-неправильное задание типа данных;

-организация считывания меньшего или большего объёма данных, чем требуется;

-неправильное редактирование данных.

Ошибки в использовании переменных:

-использование переменных без указания их начальных значений;

-ошибочное указание одной переменной вместо другой.

Ошибки при работе с массивами:

-массивы предварительно не обнулены;

-массивы неправильно описаны;

-индексы следуют в неправильном порядке. Ошибки в арифметических операциях:

-неверное указание типа переменной (например, целочисленного вместо вещественного);

-неверное определение порядка действий;

-деление на нуль;

-извлечение квадратного корня из отрицательного числа;

-потеря значащих разрядов числа.

Все эти ошибки обнаруживаются с помощью тестирования.

22