Алгоритмизация задач. Массивы (96
.pdfCopyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
a) по некоторому закону (вычисление выражения):
For i:=1 to 5 do odmas[i] :=i*i;
б) заполнение массива случайными числами с использованием генератора случайных чисел (random access):
For i:=1 to 5 do odmas[i] :=Random(10);
в) введение данных с клавиатуры.
Предположим, что в программе массивы объявлены следующим образом:
Const
n=3; m=2; Type
Tarint = array[1..n*m] of integer; Tmatrchar= array[1..n,1..m] of char;
Var
Vector :Tarint;
Matr:Tmatrchar;
Ввод данных в массив можно выполнить двумя способами. Для одномерного массива первый способ описывается такой последовательностью операторов:
Writeln(‘Введите в массив Vector 6 целых чисел’); For i:=1 to n*m do read(Vector[i]);
Числа в количестве n*m вводятся через пробел в одну строку, и только в конце ввода следует нажатие клавиши ENTER.
Для двумерного массива последовательность операторов тако-
ва:
Writeln(‘Введите в матрицу 6 символов’); For i :=1 to n do
For j :=1 to m do Read (Matr[i, j]);
Данный способ обеспечивает ввод данных в виде матрицы. После ввода трех символов в каждой строке следует нажимать клавишу ENTER.
Второй способ позволяет вводить данные столбиком (в каждой строке по одному числу для одномерного массива и символу для матрицы). Этот способ следует использовать только для массивов малых размеров.
11
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Инициализация одномерного массива:
For i:=1 to n*m do Begin
Write(‘Vector[‘, i:2,’] = ’); Readln(Vector[i]);
End;
Инициализация матрицы:
For i:=1 to n do For j:=1 to m do Begin
Write( ‘matr[‘,i:1, ’ ’, j:1,’]= ‘); Readln(matr[i,j]);
End;
Эти фрагменты программы позволяют вводить элементы массива непосредственно за подсказкой, курсор стоит´ через пробел за знаком равенства.
Вывод на экран значений элементов массивов
Вывод значений элементов массивов, полученных в результате работы программы можно осуществить двумя способами.
1. Вывод значений в виде последовательности элементов одномерного массива и в виде матрицы для двумерного массива:
{одномерный массив}
Writeln(‘ Элементы одномерного массива: ‘); For i : = 1 to 10 do write(‘ ‘, a[ i ]);
Writeln;
{ двумерный массив}
Writeln(‘ Результирующая матрица’); For i := 1 to n do
begin
For j : = 1 to m do {вывод строки по столбцам} Write(b[ i, j ] : 3,’ ’);
Writeln {переход к новой строке} end;
2. Вывод на монитор данных массива в виде столбца его элементов:
{одномерный массив}
12
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Writeln(‘ Все элементы действительного типа одномерного массива выведены столбиком: ‘);
For i : = 1 to 10 do writeln(‘a [‘, I : 2,’] = ‘, a [ i ] : 4 : 2); { двумерный массив}
Writeln(‘ Результирующая матрица, выведенная поэлементно в столбец’);
For i:=1 to n do For j:=1 to m do
Writeln(’ b [‘, i : 2,’,’, j : 2,’] = ’, b [ i, j ] : 3);
Этот способ вывода применяется только для малоразмерной матрицы.
Работа с одномерными массивами
Поиск элемента в массиве
Поиск элемента — важная и часто встречающаяся задача при работе с массивами.
Пусть имеется массив с именем Massiv, состоящий из семи элементов — целых чисел (рис. 3).
Рис. 3
1. Поиск заданного элемента массива. Пусть требуется найти заданное число в одномерном массиве, например, 4. Необходимо всегда начинать поиск с первого элемента массива, просматривая массив последовательно от первого элемента до последнего и сравнивая каждый элемент с заданным числом (рис. 4). Если требуемый элемент обнаружен, следует закончить поиск.
13
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Рис. 4
Алгоритм поиска выглядит следующим образом.
Затребовать заданное число поиска. Цикл по i от 1 до n делай:
Если какой-нибудь элемент массива будет равен заданному числу, то поиск завершен успешно.
Выйти из цикла. Конец цикла.
Графическое представление алгоритма приведено на рис. 5.
Рис. 5
Пример. Пусть требуется найти число 4.
В цикле по i от 1 до 7 сравниваем а[i] с заданным числом 4: а) если а[i] = 4, то определяем место, где находится в массиве
этот элемент (рис. 6); б) если заданный элемент найден, то уже нет смысла продол-
жать поиск — цель достигнута, и можно выйти из цикла (рис. 7); в) если заданный элемент не найден, то нужно выдать сообще-
ние, что такого элемента в массиве нет.
Задание 3.1. Выполнить процесс поиска графически в текстовом процессоре.
Задание 3.2. Написать программу поиска элемента на языке Паскаль.
14
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Рис. 6
Рис. 7
2. Поиск максимального элемента массива. Обозначим максимальный элемент в массиве (рис. 8) через идентификатор (имя) Max_element. Присвоим ему очень маленькое значение (обычно задают значение левой границы диапазона допустимых значений для типа данных).
Пусть Max_element будет равен –1000, т. е. Max_element: =
=–1000.
Вцикле по i от 1 до 6 сравниваем каждый элемент массива со
значением Max_element.
15
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Рис. 8
Если текущий элемент в массиве больше, чем Max_element, то присваиваем максимальному элементу текущее значение элемента массива.
После окончания цикла выводим полученное значение в качестве результата (рис. 9).
Рис. 9
Максимальным элементом в массиве является число 17, его индекс i = 4.
Запишем алгоритм поиска.
16
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Принять максимальный элемент Max_element равным очень маленькому числу.
Цикл по i от 1 до n делай:
Сравнить каждый элемент массива с Max_element и если элемент массива больше Max_element, то присвоить максимальному элементу текущее значение элемента массива:
если a[i] > Max_element то Max_element = a[i]; Конец цикла.
Можно максимальному элементу первоначально до цикла задать значение первого элемента массива: Max_element = a[1]. В этом случае поиск начинается со второго элемента массива и выполняется до его конца.
Задание 4.1. Представить рассмотренный алгоритм в текстовом процессоре..
Задание 4.2. Написать программу поиска максимального элемента на языке Паскаль.
Перестановка элементов массива («поменять элементы местами»)
Имеется массив с именем odmas (рис. 10). Требуется поменять местами второй и пятый элементы массива odmas [2] и odmas[5].
Рис. 10
Второй элемент массива odmas содержит русскую букву А, пятый элемент массива содержит русскую букву П:
odmas[2]:= ’A’; odmas[5]:= ’П’;
Если произвести непосредственный обмен данными между элементами odmas[2] и odmas[5], то получится два одинаковых элемента и один из них будет потерян:
17
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
а) odmas[2]: = оdmas[5]; в результате второй и пятый элементы массива будут содержать букву П. Букву А потеряли;
б) оdmas[5]: = odmas[2]; второй и пятый элементы массива будут содержать букву А. Потеряли букву П.
Вывод: прямой обмен между элементами массива производить нельзя. Нужен некоторый «посредник» — дополнительная переменная для временного хранения любого элемента массива.
Введем в качестве дополнительной переменную с именем obmen (она должна быть того же типа, что и элементы массива odmas).
Присвоим переменой obmen значение элемента odmas[2], т. е. obmen: = odmas[2];
В этом случае мы копируем переменную odmas[2] в переменную obmen (рис. 11).
Рис. 11
Поставим на место элемента [2] элемент [5], т. е. odmas[2]: = = odmas[5] (рис. 12).
Рис. 12
Сохраненный элемент odmas[2] ставим на место элемента [5], т. е. odmas[5]: = obmen (рис. 13).
Задание 5.1. Представить рассмотренный алгоритм в текстовом процессоре.
18
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Рис. 13
Задание 5.2. Написать программу перестановки элементов массива на языке Паскаль.
Сортировка массива
Сортировка — это упорядочение элементов массива по какомулибо признаку. Например, список студентов, записанный произвольным образом, необходимо записать в алфавитном порядке или номера студенческих билетов нужно записать в порядке их возрастания.
Сортировку элементов массива по возрастанию их значений рассмотрим на примере массива Data, приведенного на рис. 14.
Рис. 14
Находим минимальный элемент массива между data[0] и data[9] и переставляем его на место первого элемента (рис. 15).
Ищем второй минимальный элемент, начиная с элемента data[1] и заканчивая элементом data[9]. Им является data[5] (data [5] = 4). Меняем местами data[5] и data[0]. Далее поиск минимального элемента происходит в диапазоне от data[2] до data[9]. Минимальным является элемент data[2] (data[2] = 6). Он стоит
19
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Рис. 15
на месте, и обмен производить не нужно. Граница поиска минимального элемента — левая граница массива — смещается вправо, а правая граница остается неизменной (рис. 16).
Из приведенного примера следует, что в алгоритме сортировки требуется два циклических процесса. Первый цикл (внешний) перемещает левую границу поиска и обеспечивает обмен элементами, а второй (внутренний) осуществляет поиск минимального элемента.
Алгоритм сортировки элементов массива выглядит следующим образом.
Цикл по i от 1 до n делай:
Принять min_element равным большому числу;
Цикл по j от j = i до n делай:
Поиск min элемента и его сохранение; {сравнение текущего элемента с минимальным и сохранение наименьшего из них}
Конец цикла по j.
20
