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

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

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

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

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

Цели работы:

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

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

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

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

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

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

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

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

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

Array [<ДиапазонИндексов>] of <ТипКомпонентов>;

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

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

Наиболее часто массивы используют для хранения вектор-столбцов и вектор-строк (одномерные массивы):

Var

Vector : Array [1..3] of Real; {одномерный массив Vector, аналог вектор-столбцов и вектор-строк из 3-х элементов}

Таким образом мы объявляем структуру Vector – из трёх элементов типа Real, проиндексированных заданным диапазоном чисел от 1 до 3:

Vector[1], Vector[2], Vector[3]

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

– максимальные значения индексов в описании массивов не должны быть типа LongInt, то есть наибольшее значение индекса должно "вмещаться" максимум в типе Word и таким образом принимать максимальные значения не более 65535;

– произведение количества компонентов массива на размер компонентов, выраженный в байтах, не может превышать 65520 байт (64Кбайт).

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

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

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

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

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

Type

VectorType = Array[1..20] of Real;

Var

A: VectorType; {Массив для хранения вектора}

i, m : Integer; {Параметр цикла и размер вектора}

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

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

for i: =1 to m do

Sum;

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

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

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

for i:= 1 to m do

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

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

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

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

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

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

for i:= 2 to n do {Поэтому начинаем обработку со второго элемента}

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

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

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

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

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

Sum := 0;

for i:=1 to n do

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

Sum := Sum + A[i];

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

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

Массив Х содержит 10 целых чисел. Переписать четные элементы массива Х в массив А, нечетные – в массив В, и найти максимальный элемент массива А и минимальный элемент массива В.

2. Решение задачи в ее предметной области, в данном случае этого не требуется.

3. Проектируем структуры данных (их имена и типы). Понятно, что все имена масивов с их типами, входящие в условие задачи, нужно описать в программе. Кроме того, нам понадобятся: переменная цикла i, количество четных элементов KolChet, количество нечетных элементов KolNech, значение максимального элемента Max, его индекс MaxInd, значение минимального элемента Min и его индекс MinInd – все типа Integer.

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

Type

VectorType = Array[1..10] of Integer;

Var

X, {Массив для хранения вектора}

A, {Массив для хранения четных чисел}

B : VectorType; {Массив для хранения нечетных чисел}

i, {Параметр цикла}

KolChet, {Количество четных элементов}

KolNech, { Количество нечетных элементов }

Max, {Максимальное значение}

MaxInd, {Его индекс}

Min, {Минимальное значение}

MinInd : Integer; { Его индекс}

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

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

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

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

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

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

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

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

Определить четные элементы Х и переписать в А

Определить нечетные элементы Х и переписать в В

Найти максимальный элемент массива А

Найти минимальный элемент массива В

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

Вывести название максимального эл-та и его содержимое

Вывести название минимального эл-та и его содержимое

5. Выполняем структурное программирование с использованием стандартных приемов:

BEGIN

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

WriteLn(‘Введите 10 элементов вектора Х:’);

for i:=1 to 10 do {Организуем цикл по количеству элементов}

begin

Write (‘ X[‘,i,’] = ’); {Удобно видеть номера элементов}

ReadLn (X[i])

end;

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

{Переносим чётные элементы из Х в А с использованием функции Odd(i)}

KolChet := 0;

for i:=1 to 10 do

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

begin

KolChet := KolChet+1; {Определяем номер очередного эл-та}

A[KolChet] := X[i] {Заносим по этому номеру}

end;

{Переносим нечётные элементы из Х в В с использованием функции Odd(i)}

KolNech := 0;

for i:=1 to 10 do

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

begin

KolNech := KolNech+1; {Определяем номер очередного эл-та}

A[KolNech] := X[i] {Заносим по этому номеру}

end;

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

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

for i:= 2 to KolChet do {Поэтому начинаем обработку со второго элемента}

if A[i] > Max then {Сравниваем с текущим максимальным значением }

begin

Max := A[i]; {Запоминаем максимальное значение}

MaxInd := i { Запоминаем его индекс}

end;

{Определяем минимальный элемент массива В из KolNech элементов}

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

for i:= 2 to KolNech do {Поэтому начинаем обработку со второго элемента}

if B[i] < Min then {Сравниваем с текущим минимальным значением }

begin

Min := B[i]; {Запоминаем минимальное значение}

MinInd := i { Запоминаем его индекс}

end;

{ Выводим результат }

WriteLn(‘Максимальный элемент A[’, MaxInd, ‘] = ‘,

A[MaxInd]);

WriteLn(‘Минимальный элемент B[’, MinInd, ‘] = ‘,

A[MinInd]);

ReadLn

END.

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

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

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

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

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

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

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

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

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

9.4.1. Что такое массив?

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

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