Лабораторная работа №5. Тема: Одномерные массивы

advertisement
Лабораторная работа №5.
Тема: Одномерные массивы
До настоящего момента мы использовали в программах простые переменные стандартных типов
данных. В этом случае каждой области памяти для хранения одной величины соответствует свое имя.
Если переменных много, программа, предназначенная для их обработки, получается длинной и
однообразной. Поэтому в любом процедурном языке есть понятие массива — ограниченной совокупности однотипных величин. Элементы массива располагаются в памяти непрерывным блоком и имеют
одно и то же имя (рис.). Различают элементы по порядковому номеру (индексу).
Пять простых переменных:
a
b
c
d
e
Массив из пяти элементов:
a[1]
a[2]
a[3]
a[4]
a[5]
a
Рис. Простые переменные и массив
Описание массива
Чтобы описать массив, надо сообщить компилятору:
o
сколько в нем элементов;
o
какого типа эти элементы;
o
как они нумеруются.
Массив не является стандартным типом данных, поэтому он задается в разделе описания типов:
type имя_типа = аrrау [тип_индекса] of тип_элемента
Здесь tуре — признак начала раздела описания типов, array и of — ключевые слова, тип индекса
задается в квадратных скобках, например:
type mas = аrrау [1 .. 10] of rеаl;
Здесь описан тип массива из вещественных элементов, которые нумеруются от 1 до 10. После
задания типа его можно использовать точно так же, как любой стандартный тип, то есть описывать с
его помощью переменные, например:
var a, b : mas;
Компилятор, встретив такой оператор, выделит по 60 байт под каждый из массивов а и b (10
элементов по 6 байт). К элементу массива обращаются, указав его имя, за которым в квадратных
скобках записывается порядковый номер элемента:
а[4]
b[i]
С элементом массива можно делать все, что допустимо для переменных того же типа.
ВНИМАНИЕ: Тип элементов массива может быть любым, кроме файлового, тип индексов — интервальным, перечисляемым или byte. При
описании типа индексов можно использовать только константы или константные выражения. Переменные не допускаются, потому что место
под массив резервируется до выполнения программы.
Если тип массива используется только в одном месте программы, можно задать тип прямо при
описании переменных, например:
const n = 100:
var x,у : array [1 . . n] of integer;
С массивами в целом можно выполнять только одну операцию — присваивание. При этом
массивы должны быть одного типа, например:
х := у;
Задача 4.1. Количество элементов между минимумом и максимумом
………………………………………………………………………………………………………………..
Написать программу, которая для 10 целочисленных элементов определяет, сколько положительных
элементов располагается между максимальным и минимальными элементами.
Запишем алгоритм в самом общем виде:
1. Считать исходные данные в массив.
2. Определить, где расположены его максимальный и минимальный элементы, то есть найти их
индексы.
3. Просмотреть все элементы, расположенные между ними. Если элемент массива больше нуля,
увеличить счетчик элементов на единицу.
Перед написанием программы полезно составить тестовые примеры, чтобы более наглядно
представить себе алгоритм. Ниже представлен массив из 10 чисел и обозначены искомые величины:
6
-8
15
9
-1
3
5
-10
12
2
макс
+
+
+
мин
Для этого примера программа должна вывести число 3.
Порядок расположения элементов в массиве заранее не известен — сначала может следовать как
максимальный, так и минимальный элемент, более того, они могут совпадать. Поэтому прежде чем
искать количество положительных элементов, требуется определить, какой из этих индексов больше,
чтобы просматривать массив от меньшего номера к большему.
Рассмотрим подробно принцип поиска максимального элемента в массиве. Он весьма прост.
Очевидно, что для его отыскания нужно сравнить между собой все элементы массива. Поскольку
компьютер может сравнивать одновременно только два числа, элементы выбираются попарно.
Например, сначала первый элемент сравнивается со вторым, затем тот из них, который оказался
больше — с третьим, тот, который оказался больше — с четвертым, и так далее до последнего
элемента.
Иными словами, при каждом сравнении из двух чисел выбирается наибольшее. Поскольку его
надо где-то хранить, в программе описывается переменная того же типа, что и элементы массива.
После окончания просмотра массива в ней окажется самый большой элемент. Для того чтобы все
элементы сравнивались единообразно, перед началом просмотра в эту переменную заносится первый
элемент массива.
Сформулируем алгоритм поиска максимума:
1.
Принять за максимальный первый элемент массива.
2.
Просмотреть массив, начиная со второго элемента.
3.
Если очередной элемент оказывается больше максимального, принять его за максимальный.
Для решения поставленной задачи нам требуется знать не значение максимума, а его
положение в массиве, то есть индекс:
Как видите, в этой программе в переменной imax запоминается номер максимального из
просмотренных элементов. По этому номеру осуществляется выборка элемента из массива.
Запишем уточненный алгоритм решения нашей задачи:
1. Определить, где в массиве расположены его максимальный и минимальный элементы:
o задать начальные значения индексов искомых максимального и минимального элементов;
o просмотреть массив, поочередно сравнивая каждый его элемент с ранее найденными
максимумом и минимумом. Если очередной элемент больше ранее найденного максимума,
принять этот элемент за максимум (то есть запомнить его индекс). Если очередной элемент
меньше ранее найденного минимума, принять этот элемент за минимум.
2. Определить границы просмотра массива для поиска положительных элементов, находящихся
между его максимальным и минимальным элементами:
o если максимум расположен в массиве раньше, чем минимум, принять левую границу
просмотра равной индексу максимума, иначе — индексу минимума;
o если максимум расположен в массиве раньше, чем минимум, принять правую границу просмотра
равной индексу минимума, иначе — индексу максимума.
3.
Определить количество положительных элементов в найденном диапазоне:
o обнулить счетчик положительных элементов;
o просмотреть массив в указанном диапазоне. Если очередной элемент больше нуля, увеличить
счетчик на единицу.
Для экономии времени значения элементов массива при отладке задаются путем инициализации.
program num_positive_1;
uses crt;
const
n=10;
a:array[1..n] of integer=(1,3,-5,1,-2,1,-1,3,8,4);
var
i:integer;
{индекс текущего элемента}
imax:integer;
{индекс максимального элемента}
imin:integer;
{индекс минимального элемента}
ibeg:integer;
{начало интервала}
iend:integer;
{конец интервала}
count:integer;
{количество положительных элементов}
begin
clrscr;
for i:=1 to n do write(a[i]:3);writeln;
{отладочная часть}
imax:=1;imin:=1;
{начальные значения номеров макс. и мин. эл-ов}
for i:=1 to n do begin
if a[i]>a[imax] then imax:=i; {новый номер максимума}
if a[i]<a[imin] then imin:=i; {новый номер минимума}
end;
writeln ('max=',a[imax],' min=',a[imin]);
{отладочная печать}
if imax<imin then ibeg:=imax else ibeg:=imin; {левая граница}
if imax<imin then iend:=imin else iend:=imax; {правая граница}
writeln('ibeg=',ibeg,' iend=',iend);
{отладочная печать}
count:=0;
for i:=ibeg+1 to iend-1 do
{подсчет кол-ва положительных}
if a[i]>0 then inc(count);
writeln('Количество положительных: ',count);
readln;
end.
Замечание: inc(x) – увеличивает на 1;
dec(x) – уменьшает на 1.
Download