- •Глава 7. Структурированные типы данных
- •7.1. Массивы
- •7.1.1. Одномерный массив Объявление массива.Перед использованием массив, как и любая переменная, должен быть объявлен в разделе объявления переменных. В общем виде объявление массива выглядит так:
- •Вывод массива. Под выводом массива понимается вывод на экран значений элементов массива. Вывод элементов одномерного массива на экран.
- •1 9 5
- •6 9 7
- •Ввод двумерного массива
- •Описание типа множество
- •Операции над множествами
- •3.4. Адресный тип данных
Вывод массива. Под выводом массива понимается вывод на экран значений элементов массива. Вывод элементов одномерного массива на экран.
write(‘Вывод элементов одномерного массива ’);
for i:=1 to 10 do
begin
writeln (i,’ ’,a[i]);
end;
Пример 7.1.Вычисление суммы 10 – и элементов массива.
Program Prog7_1;
var
a:array[1..10] of real;
i:integer;
c:real;
begin
c:=0;
writeln('Вычислить сумму элементов массива');
writeln('Введите 10 элементов массива');
for i:=1 to 10 do
begin
write(i, элемент=);
readln(a[i]);
c:=c+a[i];
end;
writeln('Сумма элементов массива',c);
writeln('Для окончания работы нажмитеEenter);
readln;
end.
Пример 7.2.Вывод на экран номера и названия предметов учебного плана, хранящихся в массивеPred
Program prog7_2;
useswinCrt;
var
Pred:аггау[1..5] of string[20];
i: integer;
begin
Pred[1] = 'Информатика';
Pred[2] = 'Управление качеством';
Pred[3] = 'Менеджмент';
Pred[4] = 'Экология';
Pred[5] = 'Английский язык';
for i:=1 to 5 do
Writeln( i:2, pred[i]);
end.
Пример 7.3.Присваивание значений элементов одного массива другому.
Одномерные массивы могут присваивать свое значение целиком, если их типы эквивалентны:
program prog7_3;
uses WinCrt;
var
a,b:array[1..7] of real;
i:byte;
begin
write (“ввод массива”)
for i:=1 to 7 do
begin
read(a[i]);
b:=a;
end;
for i:=1 to 7 do
write(b[i]);
end.
{Пример 7.4. Программа ввода символов с использованием функцииEOLN.
Встроенная функция EOLN(EndOfLiNe) проверяет есть ли введенные символы, и если есть, то возвращаетtrue, если последний необработанный программой символ - "конец строки", соответствующий клавише <Enter>.
Если не введено ни одного символа, функция ожидает ввода строки с клавиатуры.}
Program Prog7_4;
uses WinCrt;
const
SIZE=30;
var
buf:array[l..SIZE] of char;
n:integer; { реальная длина введенной строки }
begin
write('->');
n:=0;
repeat
if NOT EOLN then
begin
n:=n+l;
read(buf[n]) ;
end;
until EOLN or (n=SIZE);
writein('Длина введенной строки ', n,'символов.');
end.
Пример 7.5.Программа преобразования строчных букв в прописные.
Алгоритм преобразования строчных букв в прописные буквы основан на том, что код строчной буквы больше кода прописной. Код прописных букв от "а" до "п" больше кода соответствующих строчных букв на 32, а для букв от "р" до "я" -на 80 (см. таблицу кодов ASCII).}
Program Prog7_5;
Uses WinCrt;
const
size=80;{длина строки }
var
buf:array [1 .. size] of char;
n:integer;{ длина введенной строки }
i:integer;
begin
n:=0;
write('->');
repeat
if not EOLN
then begin
n:=n+1;
read(buf[n]) ;
end;
until EOLN or (n=BSIZE);
{ здесь прочитана строка и записана в массив buf }
{ преобразование строки к верхнему регистру}
for i:=1 to n do
begin
case buf[i] of
'а'..'я':buf[i]:=chr(ord(buf[i])-32);
{ 'р'..'я':buf[i]:=chr(ord(buf[i])-80);}
end;
end;
{ вывод преобразованной строки }
writeln;
for i:=1 to n do
write(buf[i] ) ;
end.
В программе использована встроенная функция ORD, которая возвращает код (номер в таблицеASCII) символа, указанного в качестве ее аргумента.
Пример работы программы:
Преобразование строчных букв в прописные
ПРЕОБРАЗОВАНИЕ СТРОЧНЫХ БУКВ В ПРОПИСНЫЕ
Преобразование массива.
Пример 7.6. Перестановка элементов массива с номерамиnиm. Алгоритм реализуется присвоением промежуточной переменнойpзначения элемента массива с индексом n , элементу массива с индексом n значения элемента массива с индексом m, а элементу массива с индексом m значения промежуточной переменной p. }
Program Prog7_6;
Uses WinCrt;
var
a:array[1..4] of real;
p:real;
i,n,m:integer;
begin
read(n,m);
for i:=1 to 4 do
read(a[i]);
p:=a[n]; {перестановка}
a[n]:=a[m];
a[m]:=p;
for i:=1 to 4 do
write(a[i]);
end.
Пример 7_7. Удаление из массива элемента с номеромk.
Алгоритм реализуется сдвигом всех элементов с k- номера
на одну позицию влево.
Program Prog7_7;
uses WinCrt;
var
a:array[1..7] of integer;
i,k:byte;
begin
randomize;
write(' номер удаляемого элемента массива = ');
read(k);
writeln ('ввод массива')
for i:=1 to 7 do
begin
a[i] := random(20);
write(a[i], ' ');
end;
writeln;
for i:=k to 7 do
begin
a[i]:=a[i+1];
end;
for i:=1 to 6 do
begin
write(a[i], ' ');
end;
end.
Пример 7.8.Перенос в конец массива элемента сk-ой позиции.
Алгоритм реализуется с помощью действий:
сохранение k- элемента в дополнительной переменнойp:
сдвиг элементов следующих за k-ым на одну позицию влево.
восстановление последнего значения из переменной p.
Program Progn;
uses WinCrt;
Const
n=7;
var
a:array[1..n] of integer;
i,k:byte;
begin
randomize;
write(' номер элемента = ');
read(k);
writeln ('ввод массива')
for i:=1 to n do
begin
a[i] := random(20);
write(a[i], ' ');
end;
p:=a[k];
writeln;
for i:=k to n-1 do
begin
a[i]:=a[i+1];
end;
a[n]:=p;
for i:=1 to n do
begin
write(a[i], ' ');
end;
end.
Пример 7.9.Перенос в начало массива элемента сk-ой позиции.
Алгоритм реализуется с помощью следующих действий:
Ввод элементов массива.
Сохранение k-элемента в дополнительной переменнойp.
Сдвиг всех элементов до элемента с номером kвправо.
Записать на первое место значение из переменной р.}
Program Prog7_9;
uses WinCrt;
const
n=7;
var
a:array[1..n] of integer;
i,k:byte;
begin
randomize;
write(' номер элемента = ');
read(k);
writeln ('ввод массива')
for i:=1 to n do
begin
a[i] := random(20);
write(a[i], ' ');
end;
p:=a[k];
writeln;
for i:=k downto 2 do
begin
a[i]:=a[i-1];
end;
a[1]:=p;
for i:=1 to n do
begin
write(a[i], ' ');
end;
end.
Пример 7.10.Вывод температуры воздуха в течение недели и вычисление
среднего значения. Для подсказок используется массив строк dey.
Var
dey:аггау[1..7]of string[11]; {названия дней недели}
temper:аггау[1..7]ofгеа1; {температура)
st:real;{сумма температур за неделю}
sred:геа1; (средняя температура за неделю}
i:integer;
begin
st:=0;
dey[1]: ='Понедельник';
dey[2]: ='Вторник';
dey[3]: ='Среда';
dey[4]: ='Четверг' ;
dey[5]:='Пятница';
dey[6]: ='Суббота' ;
dey[1]: ='Воскресенье';
Writeln('Задайте температуру воздуха за неделю.');
for i:=1 to 7 do
begin
writeln(dey[i]), ' ');
read(temper [1]) ;
st:=st+ temper [1;
end;
{ вычисление средней температуры за неделю }
sred:=st/7;
Wrtiteln('Средняя температура за неделю: ',sred:6:2) ;
end.
Сортировка массива.Под сортировкой массива подразумевается процесс перестановки элементов с целью упорядочивания их в соответствии с каким-либо критерием.
Например, если имеется массив целых чисел а , то после сортировки по возрастанию должно выполняться условие:
а[1] < а[2] <. ...<а[size]
где size- верхняя граница индекса массива.
Так как можно сравнивать переменные типов integer,real,char,string, то можно сортировать массивы этих типов.
В информационных системах задача сортировки используется как предварительный этап задачи поиска, так как поиск в упорядоченном (отсортированном) массиве проводится намного быстрее, чем в
неупорядоченном.
Существует много методов (алгоритмов) сортировки массивов. Здесь мы рассмотрим два метода:
метод прямого выбора
метод прямого обмена
Сортировка методом прямого выбора. Алгоритм сортировки массива по возрастанию методом прямого выбора может быть представлен так:
Просматривая массив от первого элемента, найти минимальный и
поместить его на место первого элемента, а первый на место минимального.
Просматривая массив от второго элемента, найти минимальный
поместить его на место второго элемента, а второй на место минимального.
3. И так далее до предпоследнего элемента.
Ниже представлена программа сортировки массива целых чисел по возрастанию. Для демонстрации процесса сортировки программа выводит массив после каждого обмена элементов.
Program Prog7_3;
uses WinCrt;
const;
size=5;
var
а:аrrау[1..size] of integer;
i:integer; { номер элемента, от которого ведется поиск }
{ минимального эл-та }
min, nc:integer; {значение минимального элемента и его номер }
j:integer; { номер эл-та, сравниваемого с минимальным }
buf: integer; { буфер, используемый при обмене эл-тов массива }
k:integer;
begin
writeln ('Сортировка массива.');
write('Введите',size:3,'целых числа через пробел и нажмите<Enter>');
for k:=1 to size do read(a[k]);
writeln('Сортировка');
for i:=1 to size-1 do
begin
{ поиск минимального элемента массива от а[1] до а[size]}
min:=a[i];
for j:=i+1 to size do
begin
if a[i]>a[j] then
begin
min:=a[j];nc:=j;
{поменяем местами а[min] и а[i]}
buf:=a[i];
а[i]:=а[j];
а[j]:=buf;
end;
end;
{ вывод массив}
for k:=1 to size do write(a[k]), ' ');
writeln;
end;
writeln ('Массив отсортирован.');
end.
Пример работы программы:
Сортировка массива.
Введите 5 целых в одной строке через пробел и нажмите <Еnter>
12 -3 56 47 10
Сортировка
-3 12 56 47 10
-3 10 56 47 12
-3 10 12 47 56
-3 10 12 47 56
Массив отсортирован.
Сортировка методом прямого обмена. В основе алгоритма - обмен значениями соседних элементов массива. Каждый элемент массива, начиная с первого, сравнивается со следующим и если он больше следующего, то элементы меняются местами. Таким образом, элементы с меньшим значением сдвигаются к началу массива (всплывают), а элементы с большим значением - к концу массива (тонут), поэтому этот метод иногда называют "пузырьковым". Этот процесс повторяется на единицу меньше раз, чем элементов в массиве.
На рис. 7.1. показан пример процесса сортировки массива. Буквой ("а") обозначено исходное состояние массива и перестановки на первом проходе, буквой ("б") - состояние после перестановок на первом проходе и перестановки на втором проходе и так далее. Ниже представлена программа сортировки массива целых чисел по возрастанию. Программа выводит массив после каждого цикла обмена.
-
i=1
3
2
2
2
1
i=2
2
3
3
1
2
i=3
4
4
1
3
3
i=4
5
1
4
4
4
i=5
1
5
5
5
5
а б в г д
Пример 7.4.Программа сортировки массива целых чисел по возрастанию с
помощью метода прямого обмена.
Program Prog7_4;
uses wincrt;
const
size=5;
var
a:array[1..size] of integer;
i:integer; { счетчик циклов }
buf: integer; { буфер для обмена эл-тов массива }
k:integer; {текущий индекс элемента массива}
begin
writeln ('Сортировка массива пузырьковым методом');
write('Введите',size:3,' целых числа через пробел и нажмите enter');
for k:=1 to size do read(a[k]);
writeln('Сортировка');
for i:=1 to size-1 do
begin
for k:=1 to size-1 do
begin
if a[k]>a[k+1] then begin
{меняем местами а[k] и а[k+1]}
buf:=a[k];
a[k]:=a[k+1];
a[k+1]:=buf;
end;
end;
{ выведем массив}
for k:=1 to size do write(a[k],' ');
writeln;
end;
writeln ('Массив отсортирован.');
end.
Пример работы программы:
Сортировка массива пузырьковым методом.
Введите 5 целых в одной строке через пробел и нажмите <Еnter>
3 2 4 5 1
Сортировка.
2 3 4 1 5 '
2 3 1 4 5
2 1 3 4 5
1 2 3 4 5
Массив отсортирован.
Поиск в массиве.При решении многих задач возникает необходимость установить, содержит ли массив определенную информацию или нет. Задачи такого типа называютсяпоиском в массиве.Поиск осуществляется сравнением элементов массива с образцом до тех пор, пока не будет найден элемент, равный образцу, или не будут проверены все элементы.
Поиск минимального (максимального) элемента массива. Алгоритм поиска минимального (максимального) элемента массива очевиден: делается предположение, что первый элемент массива является минимальным (максимальным), затем остальные элементы массива сравниваются с этим элементом. Если обнаруживается, что проверяемый элемент меньше (больше) принятого за минимальный (максимальный), то этот элемент
принимается за минимальный (максимальный) и продолжается проверка оставшихся элементов.
Пример 7.5.Программа поиска минимального элемента в массиве целых
чисел.
Program Prog7_5;
uses WinCrt;
const
n=10;
vаг
a:array[1. .n] of integer; { массив целых }
min:integer; { номер минимального эл-та массива }
i:integer; { номер эл-та сравниваемого с минимальным }
begin
{ ввод массива }
min:=a[1];{ пусть первый элемент минимальный }
for i:=2 to n do
If a[i] <min then min:=a[i]; nc:=i;
writeln('Минимальный элемент массива:',min);
wtiteln('Номер элемента:',nc);
end.
Поиск с помощью алгоритма простого перебора.Алгоритм простого перебора применяется, если элементы массива не упорядочены. Ниже приведен текст программы поиска в массиве целых чисел.
Пример 7.6.Программа поиска методом простого перебора.
Перебор элементов массива осуществляет инструкция REPEAT, в теле которой инструкцияIFсравнивает текущий элемент массива с образцом и присваивает переменнойpoiskзначениеTrue, если текущий элемент равен образцу. Цикл завершается, если в массиве обнаружен элемент, равный образцу (poisk=True), или если проверены все элементы массива. По завершении цикла, по значению переменнойfoundможно определить, успешен поиск или нет.
Program Prog7_6;
var
mas:аггау[1. . 10] of integer; { массив целых}
obr: integer; { образец для поиска }
naiden:boolean; { признак совпадения с образцом )
i: integer;
begin
(ввод 10 целых чисел}
Write('Введите 10 целых чисел в одной строке через пробел ');
Writeln('и нажмите <Еnter>');
For i:=1 to 10 do read (mas[i]); { числа введены в массив }
Write('Введите образец для поиска (целое число)-> ');
Read(obr) ;
( поиск простым перебором }
naiden:=false;; ( совпадений нет }
i:=1; { проверяем с первого элемента массива }
гереаt
if mas[i] =obr then naiden:= true { совпадение с образцом }
elsei:=i+1;{ переход к следующему элементу }
Until(i>10)ornaiden; {завершим, если совпадение с образцом или}
{проверен последний элемент массива }
Ifnaidenthenwrite('Поиск успешен. Элемент ',i, ' найден');
else write ('Совпадений с образцом нет.');
end.
Пример работы программы:
Поиск в массиве.
Введите 10 целых в одной строке через пробел и нажмите <Enterг>
->123 45 -17 23 56 2 -8 0 14 324
Введите образец для поиска (целое число)->2
Совпадение с элементом номер 6. Поиск успешен.
Данный алгоритм может использоваться для поиска как в числовых, так и в строковых массивах.
На практике довольно часто проводится поиск в массиве, элементы которого упорядочены по некоторому критерию. Например, массив фамилий упорядоченный по алфавиту, массив данных о погоде упорядоченный по датам наблюдений.
Для поиска в упорядоченных массивах применяют другие, более эффективные по сравнению с методом простого перебора, алгоритмы, один из которых - метод бинарного поиска.
Суть метода бинарного поиска заключается в следующем. Выбирается средний элемент упорядоченного по возрастанию массива (элемент с номером sred), с которым сравнивается образец (рис. 7.2.).
|
1 |
-5 |
|
|
|
1 |
-5 | |||
verh |
|
2 |
-1 |
|
|
|
2 |
-1 | ||
|
|
3 |
0 |
|
verh |
|
3 |
0 | ||
sred |
|
4 |
2 |
|
|
|
sred |
|
4 |
2 |
|
|
5 |
13 |
|
|
|
5 |
13 | ||
niz |
|
6 |
44 |
|
niz |
|
6 |
44 | ||
|
|
7 |
70 |
|
|
|
7 |
70 | ||
|
|
8 |
75 |
|
|
|
8 |
75 | ||
|
|
9 |
91 |
|
|
|
9 |
91 | ||
|
|
|
|
|
|
|
|
|
Рис . Выбор среднего элемента массива при бинарном поиске
Если средний элемент равен образцу, то задача считается решенной.
Если средний элемент меньше образца, то искомый элемент расположен выше среднего элемента (между элементами с номерами verhиsred).
Если средний элемент больше образца, то искомый элемент расположен :
ниже среднего (между элементами с номерами sredиniz.
После того как определена часть массива, в которой может располагать искомый элемент, поиск проводят в этой части, выделяя новый средний элемент. Номер среднего элемента вычисляется по формуле (niz-verh)/2+verh.
Ниже(рис ) представлены алгоритм и текст программы бинарного поиска в массиве. В программу добавлены операторы вывода значений переменных verh,nizиsred. Выводимая информация полезна для понимания сути алгоритма. Кроме того, переменнаяnпозволяет оценить эффективность этого алгоритма по сравнению с поиском методом простого перебора (для массивов, упорядоченных по возрастанию).
Program prog7_7;
Uses WinCrt;
var
а:аггау [1. . 9] оf integer; { массив целых }
obr: integer; { образец для поиска }
sred,niz,verh:integer; { номера среднего, верхнего и нижнего}
{ эл-тов массива}
naiden.bolean; { признак совпадения с образцом }
n:integer; ( счетчик сравнений с образцом }
i: integer;
begin
{ ввод 9 целых чисел }
writeln('Бинарный поиск в массиве.');
write('Введите 9 целых в одной строке через пробел ');
writeln ('и нажмите <Enter>');
for i:=1 to 9 do read(а[i]); { ввод массива }
writeln('Введите образец для поиска (целое число) ');
read(obr) ;
{ бинарный поиск }
verh:=1;
niz:=9;
naiden:=false;
n:=0 ;
writeln(' verh, niz, sred');
repeat
sred:=(niz-verh) div 2+ verh;
writeln(verh:6,niz:б,sred:6) ;
n:=n+1;
if a[sred] =obr then naiden:= true
else begin
if obr<a [sred] then niz:=sred-1
else verh:=sred+1;
end;
until (verh>niz) or naiden;
if naiden then writeln ('Совпадение с элементом номер ',
sred,'. Выполнено ',n,' сравнений.')
elsewriteln('Образец в массиве не найден.');
readln;
end.
Пример работы программы
Бинарный поиск в массиве.
Ваедите 9 целых в одной строке через пробел и нажмите <Enter>
-5 -1 0 2 13 44 70 75 91
Введите образец для поиска (целое число) 70
verh niz sred