Освоение технологии структурного программирования и применения стандартных методов работы с двумерными массивами при разработке и создании программы на языке Турбо Паскаль

ЛАБОРАТОРНАЯ РАБОТА № 6

Освоение технологии структурного программирования

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

при разработке и создании программы на языке Турбо Паскаль.

Цели работы:

1. Освоение методики нисходящей разработки (проектирования) программы методом пошаговой детализации с помощью псевдокода при решении задач с помощью ПК.

2. Освоение методов структурного программирования при разработке и создании программы на языке Турбо Паскаль для обработки двумерных массивов.

3. Овладение выразительными средствами графики языка ТП для повышения читаемости программы.

4. Овладение навыками введения в программу необходимого количества комментариев.

5. Приобретение навыков алгоритмизации и программирования на алгоритмическом языке Паскаль

6. Освоение средств исследования программы.

7. Освоение методики тестирования программы.

1. Теоретические сведения

Двумерный массив – это регулярная структура (последовательность) однотипных данных, объявляемых специальной конструкцией языка ТП:

Array [<Диапазон1, Диапазон2>] of <ТипКомпонентов>;

Например, массив:

Matrix : Array [1..4, 1..3] of Real;

описывает структуру из 12 элементов:

Matrix[1,1]

Matrix[1,2]

Matrix[1,3]

Matrix[2,1]

Matrix[2,2]

Matrix[2,3]

Matrix[3,1]

Matrix[3,2]

Matrix[3,3]

Matrix[4,1]

Matrix[4,2]

Matrix[4,3]

Под однотипностью данных, содержащихся в массиве, понимается принадлежность каждому конкретному массиву только однотипных элементов (Real, Integer и др.). То есть, в массиве не могут, к примеру, одновременно находиться числа вещественного и целого типов и т.д.

Доступ к любому компоненту двумерного массива обеспечивается простым указанием его «координат», т.е. номера строки и столбца. Поэтому, наиболее часто двумерные массивы используют для хранения матриц. В нашем случае это матрица вида:

Этот факт позволяет использовать массивы для проведения вычислений связанных с обработкой матриц. Для этой цели используются циклы с параметром for.

2. Стандартные приемы работы с двумерными массивами

2.1. Вввод-вывод двумерных массивов

Запомните, что ввод-вывод двумерных массивов является стандартной приемом и его просто необходимо запомнить и научиться применять (рис. 6.1).

2.2. Суммирование элементов матриц

При работе с матрицами, как правило, приходится иметь дело с набором стандартных приёмов либо их композицией. Поэтому Вам необходимо знать этот набор, чтобы в будущем конструировать из него фрагменты алгоритмов программ, которые могут возникнуть из постановки конкретных задач.

Самым простым является суммирование элементов матриц: в программе – двумерных массивов. Для этого необходимо описать переменную Sum такого же типа, что и элементы массива, и в двойном цикле for, по очереди, добавлять к ней:

... {Суммирование элементов двумерного массива (матрицы)}

Type

MatrixType = Array[1..m,1..n] of Real;

Var

A: MatrixType; {Массив для хранения матрицы }

i, {Параметр цикла для прохода по строкам}

m, {Количество строк}

j, {Параметр цикла для прохода по столбцам}

n : Integer; {Количество столбцов}

Sum : Real; {Переменная Sum для суммы элементов}

Sum := 0; {Подготовка переменной Sum для суммирования!!!}

for i: =1 to m do {Поочередно фиксируем номер строки матрицы}

for j: =1 to n do {Проходим по столбцам матрицы}

Sum := Sum+ A[i,j]; {Суммируем элементы в Sum}

{После выполнения циклов в Sum находится сумма элементов массива A}

2.3. Использование счетчика

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

{Определим количество положительных элементов Count (типа Integer)}

Count := 0; {Подготовка переменной Count для суммирования!!!}

for i: =1 to m do {Поочередно фиксируем номер строки матрицы}

for j: =1 to n do {Проходим по столбцам матрицы}

if A[i,j] > 0 then {Определение положительного элемента}

Count:=Count+1; {Увеличение счетчика положительных эл-тов}

{После выполнения циклов в Count находится кол-во положит. эл-тов массива A}

Кроме этого, теперь Вы можете использовать этот алгоритм для определения:

  1. числа отрицательных или нулевых элементов;
  2. числа элементов, равных заданному числу;
  3. числа элементов массива, содержащих числа превышающие или не превышающие заранее заданное число;
  4. числа элементов, содержащих значения, находящиеся в заданном интервале и т.д.

2.4. Определения максимального или минимального элемента

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

{Определим максимальный элемент массива А}

Max := A[1,1]; {Считаем, что первый элемент массива – максимальный }

for i: =1 to m do {Поочередно фиксируем номер строки матрицы}

for j: =1 to n do {Проходим по столбцам матрицы}

if A[i,j] > Max then {Сравниваем каждый последующий элемент}

{массива с текущим максимальным значением }

Max:= A[i,j];{Заменяем старое значение Max новым}

{После выполнения циклов в Max находится максимальное значение из массива A}

2.5. Работа с чётными/нечётными элементами

Ещё одним достаточно полезным алгоритмом, который может Вам понадобиться при работе с массивами, является поиск чётных/нечётных элементов целых массивов и их суммирование. Для этого в Турбо Паскале существует специальная встроенная логическая функция Odd(x), которая при целом аргументе x возвращает значение True при x нечётном и False в случае чётного числа:

... {Нахождение суммы нечетных элементов двумерного массива (матрицы)}

Type

MatrixType = Array[1..m,1..n] of Integer;

Var

B: MatrixType; {Целый массив для хранения матрицы}

Sum : Integer; {Целая переменная для хранения суммы}

{Находим сумму нечётных элементов с использованием функции Odd(i)}

Sum := 0; {Подготовка переменной Sum для суммирования!!!}

for i: =1 to m do {Поочередно фиксируем номер строки матрицы}

for j: =1 to n do {Проходим по столбцам матрицы}

if Odd(B[i,j]) then {для чётных – условие – not Odd(i)}

Sum := Sum + B[i,j]; {Суммируем нечетные эл-ты}

{После выполнения циклов в Sum находится сумма нечётных элементов массива B}

3. Этапы создания программы

Рассмотрим теперь последовательно все этапы создания программы обработки двумерного массива.

3.1. Условие задачи:

Дан массив размера 3 x 4 с элементами целого типа. Написать программу для вычисления количества элементов в массиве, которые являются натуральными трехзначными числами.

3.2. Решение задачи в ее предметной области.

В данном случае предметной областью является алгебра. По определению [1], числа 1, 2, 3, 4, 5, … , использующиеся для счета предметов или для указания порядкового номера того или иного предмета среди однородных пердметов, называются натуральными. Любое натуральное число в десятичной системе счисления записывается с помощью цифр 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Например, запись 2457 означает, что 2 – цифра тысяч, 4 – цифра сотен, 5 – цифра десятков и 7 – цифра единиц, т.е. 2457 = 21000 + 4100 + 510 + 7.

Исходя из этого, можем записать натуральные трехзначные числа: 100, 101, … , 999. Стало быть, в программе мы должны перебрать все элементы массива и проверить их на принадлежность этому диапазону.

3.3. Проектируем структуры данных (их имена и типы).

Понятно, что нам понадобится двумерный целый массив размером 3 х 4, назовем его В. Кроме того, нам понадобятся: константы m = 3 – число строк и n = 4 – число столбцов, для описания типа массива, переменные цикла i и j, а также количество элементов в массиве, которые являются натуральными трехзначными числами – KolNat3 – все типа Integer.

Значит в разделе описаний программы, назовем ее Natural3, с учетом требований о необходимости обеспечения легкочитаемости программы и размещения необходимых комментариев, поместим следующие описания:

Const

m = 4; {Количество строк m массива}

n = 3; {Количество столбцов n массива }

Type

MatrixType = Array[1..m,1..n] of Integer; {Тип массива m х n}

Var

B : MatrixType; {Массив B целого типа размера m х n}

i, {Параметр цикла для прохода по строкам}

j, { Параметр цикла для прохода по столбцам}

KolNat3 : Integer; { Количество трехзначных натуральных чисел в массиве}

3.4. Проводим нисходящую разработку (проектирование) программы методом пошаговой детализации с помощью псевдокода.

Воспользуемся результатами (Лаб. 1. рис. 1.1) для получения первой версии алгоритма:

Ввести данные Natural3

Выполнить вычисления Natural3

Вывести результаты Natural3

С учетом требований к «дружественности» интерфейса, детализация псевдокода Ввести данные Natural3 дает следующее:

Вывести на экран приглашение для ввода массива B

Ввести массив B

Дальнейшей детализации не требуется – сюда подставляем фрагмент кода стандартного приема 2.1.

Детализация псевдокода Выполнить вычисления Natural3 дает следующее:

Определить количество элементов в массиве B, которые являются натуральными трехзначными числами

Это стандартный прием 2.3. – использование счетчика. В этом месте программы Вы должны подставить известный Вам фрагмент кода с некоторой модификацией.

Детализация псевдокода Вывести результаты Natural3 с учетом требований к «дружественности» интерфейса дает:

Вывести название «KolNat3» и его содержимое

3.5. Выполняем структурное программирование

Используя стандартные приемы 2.1 и 2.3. получаем:

BEGIN

ClrScr; { Очищаем экран }

WriteLn(‘Введите 12 элементов матрицы В:’);

for i:=1 to m do {Поочередно фиксируем номер строки матрицы}

for j:=1 to n do {Проходим по столбцам матрицы}

begin

Write (‘B[‘,i,’,’j,’] = ‘);{Выводим приглашение}

Read (B[i,j]); {Читаем элемент матрицы }

end;

WriteLn; {Устанавливаем курсор на новую строку}

{Определяем кол-во эл-тов в массиве B, кот. являются нат. трехзначными числами}

KolNat3 := 0; {Подготовка переменной KolNat3 для суммирования!!!}

for i:=1 to m do {Поочередно фиксируем номер строки матрицы}

for j:=1 to n do {Проходим по столбцам матрицы}

if (100<=B[i,j]) AND (B[i,j]<=999) then {Попадание в диапазон}

KolNat3 := KolNat3+1; {Увеличение счетчика}

WriteLn(‘KolNat3 = ’, KolNat3); { Выводим результат }

ReadLn {Останавливаем экран результатов}

End.

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

3.6. Отладка программы. Отладка программы – это процесс поиска и устранения синтаксических ошибок в готовой программе. Обычно отладка предшествует стадии тестирования. В этом пункте необходимо привести скриншот результата работы готовой программы (см. п. 5 Лаб. раб № 1).

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

Исследуйте Вашу программу при необходимых тестовых значениях Одновременно с этим исследуйте изменение значений индексов массива при вводе и обработке (рис. 6.2).

3.8. Перед защитой лабораторной работы Вам необходимо подготовить отчет (Приложение 2). Перед распечаткой обязательно продемонстрируйте его преподавателю в электронном виде, чтобы избежать ошибок в оформлении!

3.9. Для защиты лабораторной работы:

3.9.1. Представить отчет по лабораторной работе в печатном виде.

3.9.2. Продемонстрировать умение исследовать свою программу.

3.9.3. Решить любую другую задачу из списка заданий.

3.9.4. Ответить на вопросы:

3.9.4.1. Что такое двумерный массив?

3.9.4.2. Как обеспечивается доступ к элементам двумерного массива?

3.9.4.3. Какие основные стандартные методы работы с двумерными массивами Вы знаете?