47ae07d154847cb44a65896c9531cdce.ppt
- Количество слайдов: 38
Массивы
• Массивы Ввод и вывод массива Максимальный элемент массива Обработка массивов Сортировка массивов Поиск в массиве 2
Определения Массив – группа элементов одного типа, объединенных под общим именем.
Обычную книгу можно считать своего рода массивом. Почему? Ответ: книга состоит из множества однотипных элементов – страниц, у каждой страницы есть номер (индекс), все страницы объединены под одним названием (название книги)
Дом также можно считать массивом. Почему? Ответ: дому соответствует один почтовый адрес (город, улица, номер). Элементами дома можно считать квартиры, у каждой из которых есть номер (индекс).
Шахматную доску можно считать массивом. Почему? Доска состоит из клеток, каждая клетка обозначается буквой и цифрой (двойной индекс).
Футбольную команду можно считать «массивом» . Почему? Ответ: команда состоит из нескольких людей, у каждого из них есть номер (индекс).
Массивы Массив – это группа однотипных элементов, имеющих общее имя и расположенных в памяти рядом. Особенности: • все элементы имеют один тип • весь массив имеет одно имя • все элементы расположены в памяти рядом Примеры: • список учеников в классе • квартиры в доме • школы в городе • данные о температуре воздуха за год 8
Массивы A массив 1 НОМЕР 2 5 10 A[1] A[2] 3 3 15 15 элемента массива (ИНДЕКС) 4 5 20 25 A[3] A[4] ЗНАЧЕНИЕ A[5] элемента массива НОМЕР (ИНДЕКС) элемента массива: 2 A[2] ЗНАЧЕНИЕ элемента массива: 10 9
Определения Индекс – что-то (чаще всего номер), что позволяет отличать элементы массива один от другого и обращаться к ним.
Объявление массивов Зачем объявлять? • определить имя массива • определить тип массива • определить число элементов • выделить место в памяти Массив целых чисел: имя начальный индекс конечный индекс тип элементов var A : array[ 1. . 5 ] of integer ; Размер через константу: const N=5; var A: array[1. . N ] of integer; 11
Описание массивов Массивы описываются в разделе описания переменных (VAR). Общий вид описания: <имя массива>: array [<начальныйндекс>. . <конечный индекс>] of <тип элемента>; имя начальный индекс конечный индекс тип элементов var A : array[ 1. . 5 ] of integer ;
Примеры A : array [1. . 10] of real; Создается массив из действительных чисел (real), с нумерацией от 1 до 10 (всего 10 элементов). M : array [-5. . 5] of integer; Сколько элементов в этом массиве? Какого они типа? Как они нумеруются? Z : array [-8. . -1] of integer; Сколько элементов в этом массиве? Какого они типа? Как они нумеруются? Mass : array [5. . 15] of integer; Сколько элементов в этом массиве? Какого они типа? Как они нумеруются?
Объявление массивов Массивы других типов: var X, Y: array [1. . 10] of real; C: array [1. . 20] of char; Другой диапазон индексов: var Q: array [0. . 9] of real; C: array [-5. . 13] of char; Индексы других типов: var A: array ['A'. . 'Z'] of real; B: array [False. . True] of integer; . . . A['C'] : = 3. 14259*A['B']; B[False] : = B[False] + 1; 14
Что неправильно? var a: array[10. . 1] of integer; [1. . 10]. . . A[5] : = 4. 5; var a: array ['a'. . 'z'] of integer; ['z'. . 'a']. . . A['B'] A['b'] : = 15; var a: array [0. . 9] of integer; . . . A[10] : = 'X'; 15
Массивы Объявление: const N = 5; var a: array[1. . N] of integer; i: integer; Ввод с клавиатуры: for i: =1 to N do begin write('a[', i, ']='); read ( a[i] ); end; a[1] = a[2] = a[3] = a[4] = a[5] = 5 12 34 56 13 ? Почему write? Поэлементные операции: for i: =1 to N do a[i]: =a[i]*2; Вывод на экран: writeln('Массив A: '); for i: =1 to N do write(a[i]: 4); Массив A: 10 24 68 112 26 16
Массивы Объявление: var a: array[1. . 25] of integer; i, n: integer; Размер массива: Write(‘Введите размер массива’); Read(n) Ввод с клавиатуры: for i: =1 to N do begin write('a[', i, ']='); read ( a[i] ); end; Вывод на экран: writeln('Массив A: '); for i: =1 to N do write(a[i]: 4); a[1] = 5 a[2] = 12 a[3] = 34 a[4] = 56 a[5] = 13 Массив A: 10 24 68 112 26 17
Ввод массива Пусть массив описан так: A : array [1. . 10] of real; Тогда для ввода массива можно использовать цикл: For i: =1 to 10 do read( A[i] ); Вопрос: почему не repeat или while? Вопрос: как будет выглядеть вывод всех элементов массива? Вывод первой половины массива? Вопрос: как изменится ввод массива, если описание будет таким: A : array [-8. . 8] of integer;
ОБРАБОТКА МАССИВА
Использование элемента массива Для использования элемента указывается имя массива и в квадратных скобках индекс этого элемента. Примеры: Read(A[1]); A[3]: =(2 * x + 6) mod 4; A[4]: =(A[1]+A[2]) div A[3]; Допустимые операции определяются типом элемента (элемент массива ничем не отличается от обычной переменной, кроме особенного написания имени).
Использование массивов Пример. Опишите алгоритм доставки свежего номера газеты во все квартиры дома, если квартиры нумеруются от 1 до 100.
начало Начнем с первой квартиры N=1 Доставим газету в квартиру N Перейдем к следующей квартире (увеличим N на 1) да Такая квартира есть? (N<=100) конец
Задача. Дано 5 целых чисел. Опишите алгоритм (программу) нахождения наибольшего среди них.
Пример программы без использования массивов program Maximum; var a, b, c, d, e : integer; begin read(a, b, c, d, e); if (a>=b) and (a>=c) and (a>=d) and (a>=e) then write(a); if (b>=a) and (b>=c) and (b>=d) and (b>=e) then write(b); if (c>=a) and (c>=b) and (c>=d) and (c>=e) then write(a); if (d>=a) and (d>=b) and (d>=c) and (d>=e) then write(a); if (e>=a) and (e>=b) and (e>=c) and (e>=d) then write(a); end. Вопрос: как изменится программа, если чисел станет 10? Вопрос: как изменится программа, если чисел станет 1000?
Пример программы с использованием массива program Maximum; var A : array [1. . 5] of integer; i, max : integer; begin for i: =1 to 5 do read( A[i] ); max: = A[1]; for i: =2 to 5 do if A[i] > max then max: = A[i]; write(max); end. Вопрос: как изменится программа, если чисел станет 10? Вопрос: как изменится программа, если чисел станет 1000? Вопрос: как изменится программа, если числа будут действительными?
Вопросы Что такое массив? Что такое индекс? Как использовать элементы массива в выражениях? В каких случаях использование массива может давать преимущество?
Максимальный элемент массива
Максимальный элемент Задача: найти в массиве максимальный элемент. Алгоритм: Псевдокод: { считаем, что первый элемент – максимальный } for i: =2 to N do if a[i] > { максимального } then { запомнить новый максимальный элемент a[i] } ? Почему цикл от i=2? 28
Максимальный элемент Дополнение: как найти номер максимального элемента? max : = a[1]; { считаем, что первый – максимальный } i. Max : = 1; for i: =2 to N do { проверяем все остальные } if a[i] > a[i. Max] then { нашли новый максимальный } max begin max : = a[i]; { запомнить a[i] } i. Max : = i; { запомнить i } end; ? Как упростить? По номеру элемента i. Max всегда можно найти его значение a[i. Max]. Поэтому везде меняем max на a[i. Max] и убираем переменную max. 29
Программа program qq; const N = 5; var a: array [1. . N] of integer; i, i. Max: integer; begin случайные числа в writeln('Исходный массив: '); интервале [50, 150) for i: =1 to N do begin a[i] random(100) + 50; a[i] : =: = random(100) + 50; поиск write(a[i]: 4); максимального end; i. Max : = 1; { считаем, что первый – максимальный } for i: =2 to N do { проверяем все остальные } if a[i] > a[i. Max] then { новый максимальный } i. Max : = i; { запомнить i } writeln; {перейти на новую строку} writeln('Максимальный элемент a[', i. Max, ']=', a[i. Max]); end. 30
Обработка массивов 31
Реверс массива Задача: переставить элементы массива в обратном порядке. 1 2 … N-1 N 3 5 … 9 7 Алгоритм: 1 2 … N-1 N 7 9 … 5 3 сумма индексов N+1 поменять местами A[1] и A[N], A[2] и A[N-1], … Псевдокод: for i: =1 to N do 2 do N div { поменять местами A[i] и A[N+1 -i] } 32 ? Что неверно?
Как переставить элементы? 2 Задача: поменять местами содержимое двух чашек. 3 1 Задача: поменять местами содержимое двух ячеек памяти. y x Можно ли обойтись без c? 6 4 2 1 ? 4 6 3 x : = y; y : = x; c : = x; x : = y; y : = c; ? 4 c 33
Программа program qq; const N = 10; var A: array[1. . N] of integer; i, c: integer; begin { заполнить массив } { вывести исходный массив } for i: =1 to N div 2 do begin c: =A[i]; A[i]: =A[N+1 -i]; A[N+1 -i]: =c; end; { вывести полученный массив } end. 34
Циклический сдвиг Задача: сдвинуть элементы массива влево на 1 ячейку, первый элемент становится на место последнего. 1 2 3 4 … N-1 N 3 5 8 1 … 9 7 3 Алгоритм: A[1]: =A[2]; A[2]: =A[3]; … A[N-1]: =A[N]; Цикл: почему не N? for i: =1 to N-1 do A[i]: =A[i+1]; 35 ? Что неверно?
Программа program qq; const N = 10; var A: array[1. . N] of integer; i, c: integer; begin { заполнить массив } { вывести исходный массив } c : = A[1]; for i: =1 to N-1 do A[i]: =A[i+1]; A[N] : = c; { вывести полученный массив } end. 36
Задания « 4» : Заполнить массив из 10 элементов случайными числами в интервале [-10. . 10] и найти в нем максимальный и минимальный элементы и их номера. Пример: Исходный массив: 4 -5 3 10 -4 -6 8 -10 1 0 максимальный a[4]=10 минимальный a[8]=-10 « 5» : Заполнить массив из 10 элементов случайными числами в интервале [-10. . 10] и найти в нем два максимальных элемента и их номера. Пример: Исходный массив: 4 -5 3 10 -4 -6 8 -10 максимальные a[4]=10, a[7]=8 1 0 38