Структурный тип данных. Массив

Содержание

Слайд 2

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

Одним из важных инструментов программиста является возможность работы с массивами переменных.
Массив

- набор однотипных данных, хранящихся вместе и имеющих общее имя.
Возможность объединения групп элементов в массив позволяет, с одной стороны, облегчить массовую обработку данных, а с другой - упростить идентификацию элементов массива.
Слайд 3

Основные понятия Массив обозначается одним именем. Например, всю совокупность действительных чисел

Основные понятия

Массив обозначается одним именем.
Например, всю совокупность действительных чисел 1.6, 14.9,

-5.0, 8.5, 0.46
можно считать массивом и обозначить одним именем, например А.
Каждый элемент массива обозначается именем массива с индексом, заключенным в квадратные скобки. A[1], A[2], A[3], ..., A[n]. Индекс определяет положение элемента массива : A[1]=1.6, A[2]=14.9, A[3]=-5.0, A[4]=8.5, A[5]=0.46
Слайд 4

Доступ к элементу массива Чтобы обратиться к какому-либо элементу массива, необходимо

Доступ к элементу массива

Чтобы обратиться к какому-либо элементу массива, необходимо назвать

его имя и индекс (позицию).
A[7]:=11;
Writeln (A[10]);

Индекс элемента

Элемент массива

Слайд 5

Двумерный массив Temp Тогда для доступа к элементу этого массива необходимо

Двумерный массив Temp

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

имя массива и два индекса – номер строки и номер столбца.
Temp[4,8]:=15;
Temp[2,31]:=0;
Слайд 6

Описание массива Var :array[тип индекса] of ; Например: M: array[1..4] of

Описание массива

Var
<перемен>:array[тип индекса] of <тип элементов>;
Например: M: array[1..4] of integer; MAS: array[1..3,1..5] of

real;
T:array[‘a’..’z’] of byte;
A:array[1..1000] of string;
Поэтому стандартного идентификатора для типа массив нет. Программист сам конструирует тип массив:
Type
<идентиф.типа>=array[тип индекса] of <тип элемент>;
Слайд 7

Сначала конструируется тип массив в разделе типов Type, где описывается структура

Сначала конструируется тип массив в разделе типов Type, где описывается структура

массива. Затем нужно выделить память под переменные этого типа.
TYPE
<идентиф. типа>=Array[<тип индекса>] of<тип элементов>;
В качестве типа индекса может быть указан любой порядковый тип, а также диапазоны этих типов: 1..10, ‘a’…’z’.
Тип элементов массива (базовый тип) – любой допустимый в Pascal (в том числе и массив), кроме файла.
Type
Mas=array[1..10] of integer;
Mass_Char=array [byte]of char;
Matr=array[‘A’..’C’,-5..-3]of Mas;
Var
A:Mas; B1,B2:Mass_Char; C:Matr;
Слайд 8

Двумерный массив можно описать двумя способами Первый способ заключается в прямом

Двумерный массив можно описать двумя способами

Первый способ заключается в прямом указании

диапазонов строк и столбцов в квадратных скобках:
Type Matr=array[1..3,1..5] of byte;
Var A:Matr;
{Сначала указывается диапазон строк, затем диапазон столбцов}
Второй способ представляет собой описание одномерного массива, содержащего элементы типа массив.
Type Matr=array[1..3] of array [1..5] of byte;
или
Type Stroka=array [1..5] of byte;
Matr=array[1..3] of Stroka;
Var А:Matr;
Слайд 9

Второй способ описания двумерного массива определяется его внутренним представлением. В памяти

Второй способ описания двумерного массива определяется его внутренним представлением.
В памяти

компьютера массив любой размерности, в том числе и двумерный, хранится в виде одномерных (линейных) массивов.
Т.е. двумерный массив представляет собой массив массивов, т.е. линейный массив элементов, которые в свою очередь также являются линейными массивами.
Поэтому массив А в памяти ЭВМ имеет следующую структуру: ((0,0,0,0,0), (0,0,0,0,0), (0,0,0,0,0)).
Длина массива составляет 3*5=15 байт.
Слайд 10

Инициализация массива (заполнение массива элементами)

Инициализация массива

(заполнение массива элементами)

Слайд 11

Значения элементов массива в программе можно определить тремя способами: Массив может

Значения элементов массива в программе можно определить тремя способами:

Массив может быть

инициализирован с помощью типизированных констант или просто присваиванием значений элементам;
Элементы массива могут быть введены с клавиатуры или из файла;
Элементы массива могут быть определены в программе:
С использованием датчика случайных чисел;
Заданным образом, в том числе и скопированы из другого массива.
Слайд 12

Типизированные константы CONST : =( ); CONST D:array[1..10]of integer=(9,-2,0,0,-5,6,2,-13,76,9); А:Mass=((0, -3.6,

Типизированные константы

CONST
<имя константы>:<описание структуры>=(<список значений>);
CONST
D:array[1..10]of integer=(9,-2,0,0,-5,6,2,-13,76,9);
А:Mass=((0, -3.6, 7),( 8.3,

0.4,52.0),(-9,7.2,-13));
B:array[1..4]of char=(‘+’, ’-‘, ’*’, ‘/’);
Слайд 13

Значения элементов многомерных массивов перечисляют в порядке возрастания индексов справа налево,

Значения элементов многомерных массивов перечисляют в порядке возрастания индексов справа налево,

заключая в скобки каждый подмассив.
CONST
B: array [1..2, 1..6] of real=
((0, -3, 7, 2.3, 5.0, -9), (0,0,0,0,0,0));
S: array [1..3, 0..1, 1..4] of byte=(((0,0,0,0),(1,1,1,1)),
((2,2,2,2),(3,3,3,3)),
((4,4,4,4),(5,5,5,5)));
Слайд 14

Заполнение массива с помощью генератора случайных чисел program Mas; Uses CRT;

Заполнение массива с помощью генератора случайных чисел

program Mas;
Uses CRT;
Const n=10;
Type MyMass=array[1..n]

of integer;
Var A:MyMass; i:Integer;
Begin
randomize; {подключение генератора случайных чисел}
for i:=1 to n do
A[i]:=random(20);
{вывод массива А в одну строку}
for I:=1 to n do
write(A[i]:3);
end.
Слайд 15

задания Заполните двумерный массив из 5 строк и 3 столбцов случайными

задания

Заполните двумерный массив из 5 строк и 3 столбцов случайными числами

в диапазоне -50…50.
Заполнить массив А(20) числами Фибоначчи.
Сформируйте двумерный массив N*N по следующему правилу: элементы главной диагонали равны 1, элементы ниже главной диагонали – 0, а выше – сумме индексов соответствующего элемента.
Дан линейный массив А(15) случайных чисел. Подсчитать, сколько в нем различных чисел.
Заполните массив М(20) случайными числами, при этом чтобы все элементы были различны.
Слайд 16

Основные операции над массивами

Основные операции над массивами

Слайд 17

Присваивание массивов Данную операцию можно применять только к массивам одного типа.

Присваивание массивов

Данную операцию можно применять только к массивам одного типа.
TYPE

Mas=array [1..2] of real;
CONST A:Mas=(3.0, 0.12);
VAR B:Mas;
C,D: array [1..6] of char;
Begin
B:=A;
C:=D;

Данная операция не выполнима для массивов различных типов, даже, если у них одинаковая структура.
Var А:array [1..10]of integer;
B:array[1..10]of integer;
Begin

А:=В;

Слайд 18

Основные операции с массивами: Заполнение массива данными, Вывод элементов массива на

Основные операции с массивами:

Заполнение массива данными,
Вывод элементов массива на экран или

в файл,
Поиск элемента (элементов),
Упорядочивание элементов массива,
Вставка/удаление элемента массива.
Все эти операции требуют последовательной обработки всех элементов массива, а поэтому требуют использования циклов.
Слайд 19

Вывод элементов массива на экран монитора Вывод линейного массива: for i:=1

Вывод элементов массива на экран монитора

Вывод линейного массива:
for i:=1 to N

do
Write (A[i]:3);
Вывод двумерного массива в виде таблицы:
for i:=1 to N do
begin
for j:=1 to n do
Write (A[i,j]:4);
Writeln; {Переход на новую строку}
End;

Формат вывода

Формат вывода

Переход на новую строку

Слайд 20

Поиск элемента массива по заданному критерию Существует несколько методов поиска: Линейный

Поиск элемента массива по заданному критерию

Существует несколько методов поиска:
Линейный поиск

(поиск максимума, поиск нулевого элемента и т.д.),
Двоичный поиск.
Слайд 21

Алгоритм линейного поиска Алгоритм заключается в последовательном просмотре элементов массива на

Алгоритм линейного поиска

Алгоритм заключается в последовательном просмотре элементов массива на определение

искомого значения.
Последовательный просмотр элементов выполняется в цикле. Условием выхода из цикла будет либо обнаружение искомого элемента, либо конец массива (т.е. все элементы проверены).
Слайд 22

Пример. Составить программу обработки массива размерностью n, заполненного целыми числами, введенными

Пример. Составить программу обработки массива размерностью n, заполненного целыми числами, введенными

с клавиатуры. Вывести индексы и значения положительных элементов массива.

CONST N=10; VAR A:ARRAY[0..N] of integer; i:byte; begin { заполнение массива } for i:=1 to n do begin write('введите ',i,' элемент массива ');
readln(a[i]); end; { обработка элементов массива } for i:=1 to n do if a[i]>0 then writeln('положительный элемент = ',a[i],' его индекс = ',i); end.

Слайд 23

Разработать программу, определяющую первый отрицательный элемент массива А(20). Const n=20; var

Разработать программу, определяющую первый отрицательный элемент массива А(20).

Const n=20;
var A:array [1..n]of

integer;
i:byte;
begin
//Заполнение массива
//Поиск первого отрицательного элемента
i:=0;
repeat
inc(i);
until (i>n) or (a[i]<0);
if i>N then writeln (‘NO’)
else writeln (a[i]);
end.
Слайд 24

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

Алгоритм двоичного поиска

Допустим имеется отсортированный по возрастанию массив целых чисел. Необходимо

найти значение b=23
2, 5, 8, 11, 13, 14, 19, 23, 33, 45, 49
2, 5, 8, 11, 13, 14, 19, 23, 33, 45, 49
19,23
2, 5, 8, 11, 13, 14, 19, 23, 33,
Слайд 25

Const n=10; Type mass=array[1..n]of integer; Var m:mass; key:integer; i,j,d:byte; fl:boolean; begin

Const n=10;
Type mass=array[1..n]of integer;
Var m:mass;
key:integer; i,j,d:byte; fl:boolean;
begin
//Заполнение массива упорядоченными по

возрастанию числами
//Ввод ключа поиска
Writeln(‘Какой элемент найти’);
Readln(key);
//поиск элемента:
i:=1;j:=n;
fl:=false; //элемент не найден
repeat
d:=(i+j)div 2; //Серединный элемент
if m[d]=key then fl:=true
else
if m[d] else j:=d-1; //ищем слева
until fl or (i>j);
if fl then
writeln('искомый элемент ',key,'занимает позицию',d)
else writeln('элемент не найден');
end;
End.
Слайд 26

Переформирование массива Переформирование массивов предполагает изменение порядка элементов массива посредством их

Переформирование массива

Переформирование массивов предполагает изменение порядка элементов массива посредством их перемещения,

удаления или вставки.
Вставка или удаление элементов осуществляется за счет сдвига всех элементов той части массива, которая расположена после удаляемого или до вставляемого элемента.
Задание
Дан массив А (n), где N<=10. Разработать программу удаления элемента с индексом k.
Слайд 27

Задание Дан массив А (n), где N Write('Введите индекс удаляемого элемента:');

Задание

Дан массив А (n), где N<=10. Разработать программу удаления элемента с

индексом k.
Write('Введите индекс удаляемого элемента:');
Readln(k);
For i:=b To N-1 Do
A[i]:=A[i+1];
Слайд 28

Задание Заполнить массив А(20) случайными числами. Удалить из массива минимальный элемент массива.

Задание

Заполнить массив А(20) случайными числами. Удалить из массива минимальный элемент массива.

Слайд 29

Перестановка элементов массива Buf:=A[2]; A[2]:=A[10]; A[10]:=buf 3 1 буфер 2

Перестановка элементов массива
Buf:=A[2];
A[2]:=A[10];
A[10]:=buf

3

1

буфер

2

Слайд 30

Задача Напишите программу, которая переставляет первый и последний элементы массива. Напишите

Задача

Напишите программу, которая переставляет первый и последний элементы массива.
Напишите программу, которая

максимальный элемент массива ставит в конец массива.
Слайд 31

Дана матрица A(n,n), n Type Matr=array[1..20,1..20]of Integer; Var A:Matr; i,j,n,n1,n2:byte; buf:integer;

Дана матрица A(n,n), n<=20. Выполнить перестановку строк, номера которых вводятся с

клавиатуры.

Type Matr=array[1..20,1..20]of Integer;
Var A:Matr; i,j,n,n1,n2:byte;
buf:integer;
begin
//Заполнение массива и вывод
//Перестановка строк
Writeln(‘строка 1, строка 2?');
readln(n1,n2);
for j:=1 to n do //цикл по столбцам
begin
buf:=a[n1,j];
a[n1,j]:=a[n2,j];
a[n2,j]:=buf;
end;

Слайд 32

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

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

оставляя индексы, определяющие данный подмассив.
Например, из двумерного массива можно выделять строки, но нельзя – столбцы.
Writeln(‘строка 1, строка 2?');
readln(n1,n2);
buf:=a[n1];
a[n1]:=a[n2];
a[n2]:=buf;
Поэтому задачу перестановки строк можно решить одним оператором. При этом необходимо учесть совместимость массивов по присваиванию.
Слайд 33

Сортировка массивов Сортировка – это процесс упорядочивания информации по определенному признаку.

Сортировка массивов

Сортировка – это процесс упорядочивания информации по определенному признаку.
По

возрастанию,
По убыванию,
По алфавиту
Цель сортировки – повышение скорости поиска данных в больших объемах.
Слайд 34

Сортировка простым обменом (Пузырьковая сортировка) Сортировка простым обменом основана на многократном

Сортировка простым обменом (Пузырьковая сортировка)

Сортировка простым обменом основана на многократном обходе

массива a1, a2,… an., при котором сравниваются два соседних элемента ai и ai+1. Если элементы неупорядочены, то они меняются местами.
7, 5, 8, 4, 1, 3, 2.
Слайд 35

Как можно повысить эффективность алгоритма? For j:=N downto 2 do for

Как можно повысить эффективность алгоритма?

For j:=N downto 2 do
for i:=1

to j-1 do
if A[i]>A[i+1] then begin
buf:=A[i];
A[i]:=A[i+1];
A[i+1]:=buf;
end;
Слайд 36

Задание Упорядочить последовательность чисел 3, 0, 5, 1, 2 по возрастанию. Как можно повысить эффективность алгоритма?

Задание

Упорядочить последовательность чисел 3, 0, 5, 1, 2 по возрастанию.
Как можно

повысить эффективность алгоритма?
Слайд 37

Как можно повысить эффективность алгоритма? Repeat fl:=false; for i:=1 to j-1

Как можно повысить эффективность алгоритма?

Repeat
fl:=false;
for i:=1 to j-1 do
if

A[i]>A[i+1] then begin
fl:=true;
buf:=A[i];
A[i]:=A[i+1];
A[i+1]:=buf;
end;
Until fl=false;
Слайд 38

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

Сортировка простым выбором

Идея сортировки простым выбором заключается в поиске граничного элемента,

например, максимального и водворении его на «свое место» в конец массива. Далее последний элемент «исключаем» (не просматриваем) и повторяется поиск максимума. Процесс повторяется до тех пор, пока длина массива не станет равна одному элементу.
Слайд 39

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

Сортировка простыми вставками

В исходном состоянии считают, что сортируемая последовательность элементов состоит

из двух частей: отсортированной (она на первом шаге состоит из единственного элемента – первого) и неотсортированной.
На каждом шаге из неотсортированной части последовательности берется очередной элемент и вставляется в уже отсортированную часть.
Поиск места вставки осуществляется с правого конца отсортированного подмассива путем сравнения вставляемого элемента (назовем его ключом key) с элементами aj. Если ключ меньше элемента aj (при сортировке по возрастанию), то ключ key и элемент aj меняются местами, и ключ продолжает сравнение с последующим элементом подмассива aj-1. Поиск места вставки завершается, если элемент вставлен или если достигнут левый конец массива.
Слайд 40

Дана последовательность чисел: 5 2 3 8 6 1 5 2

Дана последовательность чисел: 5 2 3 8 6 1

5 2 3 8

6 1
2 5 3 8 6 1
2 3 5 8 6 1
2 3 5 8 6 1
2 3 5 6 8 1
2 3 5 6 1 8
2 3 5 1 6 8
2 3 1 5 6 8
2 1 3 5 6 8
1 2 3 5 6 8