1 Программирование на языке Паскаль § 62. Массивы § 63. Алгоритмы обработки массивов § 64. Сортировка К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru 2 Программирование на языке Паскаль § 62. Массивы К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 3 Что такое массив? ? Как ввести 10000 переменных? Массив – это группа переменных одного типа, расположенных в памяти рядом (в соседних ячейках) и имеющих общее имя. Каждая ячейка в массиве имеет уникальный номер. Надо: • выделять память • записывать данные в нужную ячейку • читать данные из ячейки К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 4 Выделение памяти (объявление) минимальный индекс var A: V: L: S: максимальный индекс array[1..5] of integer; array[0..5] of real; array[-5..5] of boolean; array[65..90] of char; размер через константу ? Зачем? const N = 10; var A: array[1..N] of integer; К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 5 Что неправильно? var A: array[10..1] [1..10] of integer; ... A[5] := 4.5; var A: array[1..10] of integer; ... A[15] := 'a' var a: array ['a'..'z'] ['z'..'a'] of integer; ... A['B'] A['b'] := 15; К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 6 Обращение к элементу массива A массив 1 НОМЕР элемента массива (ИНДЕКС) 2 5 10 A[1] A[2] 33 15 15 4 5 20 25 A[3] A[4] ЗНАЧЕНИЕ A[5] элемента массива НОМЕР (ИНДЕКС) элемента массива: 2 A[2] ЗНАЧЕНИЕ элемента массива: 10 К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 7 Как обработать все элементы массива? Объявление: const N = 5; var A: array[1..N] of integer; Обработка: { { { { { ? обработать обработать обработать обработать обработать A[1] A[2] A[3] A[4] A[5] } } } } } 1) если N велико (1000, 1000000)? 2) при изменении N программа не должна меняться! К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 8 Как обработать все элементы массива? Обработка с переменной: i:= 1; { обработать i:= i + 1; { обработать i:= i + 1; { обработать i:= i + 1; { обработать i:= i + 1; { обработать A[i] } A[i] } A[i] } A[i] } A[i] } Обработка в цикле: i:= 1; while i <= N do begin { обработать A[i] } i:= i + 1; end; Цикл с переменной: for i:=1 to N do begin { обработать A[i] } end; i:= i + 1; К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 9 Заполнение массива program Arr; const N = 10; var A: array[1..N] of integer; i: integer; begin for i:=1 to N do A[i]:= i*i; end. ? Чему равен A[9]? К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 10 Ввод с клавиатуры и вывод на экран Объявление: const N = 5; var A: array[1..N] of integer; i: integer; Ввод с клавиатуры: A[1] = 5 for i:=1 to N do begin write('A[', i, ']='); A[2] = 12 read ( A[i] ) A[3] = 34 Почему end; A[4] = 56 write? A[5] = 13 Вывод на экран: writeln('Массив A:'); for i:=1 to N do Зачем «:4»? write(A[i]:4); ? ? К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 11 Заполнение случайными числами Задача. Заполнить массив (псевдо)случайными целыми числами в диапазоне от 20 до 100. for i:=1 to N do begin A[i]:= 20 + random(81); write(A[i],' ') end; К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 12 Перебор элементов Общая схема: for i:=1 to N do begin ... { сделать что-то с A[i] } end; Подсчёт нужных элементов: Задача. В массиве записаны данные о росте баскетболистов. Сколько из них имеет рост больше 180 см, но меньше 190 см? count:= 0; for i:=1 to N do if (180 < A[i]) and (A[i] < 190) then count:= count + 1; К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 13 Перебор элементов Среднее арифметическое: count:= 0; sum:= 0; for i:=1 to N do if (180 < A[i]) and (A[i] < 190) then begin count:= count + 1; sum:= sum + A[i] end; write(sum/count); среднее арифметическое К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 14 Задачи «A»: Заполните массив случайными числами в интервале [0,100] и найдите среднее арифметическое его значений. Пример: Массив: 1 2 3 4 5 Среднее арифметическое 3.000 «B»: Заполните массив случайными числами в интервале [0,100] и подсчитайте отдельно среднее значение всех элементов, которые <50, и среднее значение всех элементов, которые ≥50. Пример: Массив: 3 2 52 4 60 Ср. арифм. элементов [0,50): 3.000 Ср. арифм. элементов [50,100]: 56.000 К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 15 Задачи «C»: Заполните массив из N элементов случайными числами в интервале [1,N] так, чтобы в массив обязательно вошли все числа от 1 до N (постройте случайную перестановку). Пример: Массив: 3 2 1 4 5 К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru 16 Программирование на языке Паскаль § 63. Алгоритмы обработки массивов К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 17 Поиск в массиве Найти элемент, равный X: i:= 1; while A[i] <> X do i:= i + 1; write('A[',i,']=',X); ? Что плохо? должно быть первым! i:= 1; while (i <= N) and (A[i] <> X) do i:= i + 1; Что если такого нет? if i <= N then write('A[',i,']=',X) else write('Не нашли!'); ? К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 18 Поиск в массиве Вариант с досрочным выходом: nX:= 0; for i:=1 to N do if A[i] = X then begin nX:= i; досрочный break выход из end; цикла if nX > 0 then write('A[',i,']=',X) else write('Не нашли!'); К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 19 Задачи «A»: Заполните массив случайными числами в интервале [0,5]. Введите число X и найдите все значения, равные X. Пример: Массив: 1 2 3 1 2 Что ищем: 2 Нашли: A[2]=2, A[5]=2 Пример: Массив: 1 2 3 1 2 Что ищем: 6 Ничего не нашли. К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 20 Задачи «B»: Заполните массив случайными числами в интервале [0,5]. Определить, есть ли в нем элементы с одинаковыми значениями, стоящие рядом. Пример: Массив: 1 2 3 3 2 1 Есть: 3 Пример: Массив: 1 2 3 4 2 1 Нет К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 21 Задачи «C»: Заполните массив случайными числами. Определить, есть ли в нем элементы с одинаковыми значениями, не обязательно стоящие рядом. Пример: Массив: 3 2 1 3 2 5 Есть: 3, 2 Пример: Массив: 3 2 1 4 0 5 Нет К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 22 Максимальный элемент M:= A[1]; for i:= 2 to N do if A[i] > M then M:= A[i]; write(M); ? M:= A[1]; nMax:= 1; for i:= 2 to N do if A[i] > M then begin M:= A[i]; nMax:= i; end; write('A[',nMax,']=',M); К.Ю. Поляков, Е.А. Ерёмин, 2013 Как найти его номер? ? Что можно улучшить? http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 23 Максимальный элемент и его номер ! По номеру элемента можно найти значение! nMax:= 1; for i:= 2 to N do if A[i] > A[nMax] then nMax:= i; write('A[',nMax,']=', A[nMax] ); К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 24 Задачи «A»: Заполнить массив случайными числами и найти минимальный и максимальный элементы массива и их номера. Пример: Массив: 1 2 3 4 5 Минимальный элемент: A[1]=1 Максимальный элемент: A[5]=5 «B»: Заполнить массив случайными числами и найти два максимальных элемента массива и их номера. Пример: Массив: 5 5 3 4 1 Максимальный элемент: A[1]=5 Второй максимум: A[2]=5 К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 25 Задачи «C»: Введите массив с клавиатуры и найдите (за один проход) количество элементов, имеющих максимальное значение. Пример: Массив: 3 4 5 5 3 4 5 Максимальное значение 5 Количество элементов 3 К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 26 Реверс массива 1 2 3 4 N-3 N-2 N-1 N 7 12 5 8 18 34 40 23 1 2 3 4 N-3 N-2 N-1 N 23 40 34 18 8 5 12 5 «Простое» решение: остановиться на середине! for i:= 1 to N div 2 do поменять местами A[i] и A[N+1-i] ? К.Ю. Поляков, Е.А. Ерёмин, 2013 Что плохо? http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 27 Реверс массива for i:= 1 to N div 2 do begin c:= A[i]; A[i]:= A[N+1-i]; A[N+1-i]:= c; end; ? *Как обойтись без переменной c? К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 28 Циклический сдвиг элементов 1 2 3 4 N-3 N-2 N-1 N 7 12 5 8 18 34 40 23 1 2 3 4 N-3 N-2 N-1 N 12 5 8 15 34 40 23 7 «Простое» решение: c:= A[1]; for i:= 1 to N-1 do A[i]:= A[i+1] A[N]:= c; К.Ю. Поляков, Е.А. Ерёмин, 2013 ? Почему не до N? ? Что плохо? http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 29 Задачи «A»: Заполнить массив случайными числами и выполнить циклический сдвиг элементов массива вправо на 1 элемент. Пример: Массив: 1 2 3 4 5 6 Результат: 6 1 2 3 4 5 «B»: Массив имеет четное число элементов. Заполнить массив случайными числами и выполнить реверс отдельно в первой половине и второй половине. Пример: Массив: 1 2 3 4 5 6 Результат: 3 2 1 6 5 4 К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 30 Задачи «C»: Заполнить массив случайными числами в интервале [100,100] и переставить элементы так, чтобы все положительные элементы стояли в начала массива, а все отрицательные и нули – в конце. Вычислите количество положительных элементов. Пример: Массив: 20 -90 15 -34 10 0 Результат: 20 15 10 -90 -34 0 Количество положительных элементов: 3 К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 31 Отбор нужных элементов Задача. Отобрать элементы массива A, удовлетворяющие некоторому условию, в массив B. «Простое» решение: for i:= 1 to N do if условие выполняется для A[i] then B[i]:= A[i]; Что плохо? ? 1 2 3 4 5 6 A 12 3 34 11 23 46 B 12 ? 34 ? ? 46 К.Ю. Поляков, Е.А. Ерёмин, 2013 выбрать чётные элементы http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 32 Отбор нужных элементов 1 2 3 4 5 6 A 12 3 34 11 23 46 B 12 34 46 ? ? ? выбрать чётные элементы ? Если A и B – один и count:= 0; { счётчик } тот же массив? for i:= 1 to N do if A[i] mod 2 = 0 then begin count:= count + 1; B[count]:= A[i]; end; Как вывести на экран? ? for i:= 1 to count do write(B[i], ' '); К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 33 Задачи «A»: Заполнить массив случайными числами в интервале [-10,10] и отобрать в другой массив все чётные отрицательные числа. Пример: Массив А: -5 6 7 -4 -6 8 -8 Массив B: -4 -6 -8 «B»: Заполнить массив случайными числами в интервале [0,100] и отобрать в другой массив все простые числа. Используйте логическую функцию, которая определяет, является ли переданное ей число простым. Пример: Массив А: 12 13 85 96 47 Массив B: 13 47 К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 34 Задачи «C»: Заполнить массив случайными числами и отобрать в другой массив все числа Фибоначчи. Используйте логическую функцию, которая определяет, является ли переданное ей число числом Фибоначчи. Пример: Массив А: 12 13 85 34 47 Массив B: 13 34 К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru 35 Программирование на языке Паскаль § 64. Сортировка К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 36 Что такое сортировка? Сортировка – это расстановка элементов массива в заданном порядке. …по возрастанию, убыванию, последней цифре, сумме делителей, по алфавиту, … Алгоритмы: • простые и понятные, но неэффективные для больших массивов время работы ▫ метод пузырька ▫ метод выбора • сложные, но эффективные ▫ «быстрая сортировка» (QuickSort) ▫ сортировка «кучей» (HeapSort) ▫ сортировка слиянием (MergeSort) ▫ пирамидальная сортировка К.Ю. Поляков, Е.А. Ерёмин, 2013 N http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 37 Метод пузырька (сортировка обменами) Идея: пузырек воздуха в стакане воды поднимается со дна вверх. Для массивов – самый маленький («легкий» элемент перемещается вверх («всплывает»). 1-й проход: 4 4 4 4 1 5 5 5 1 4 2 2 1 5 5 1 1 2 2 2 3 3 3 3 3 К.Ю. Поляков, Е.А. Ерёмин, 2013 • сравниваем два соседних элемента; если они стоят «неправильно», меняем их местами • за 1 проход по массиву один элемент (самый маленький) становится на свое место http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 38 Метод пузырька 2-й проход: 3-й проход: 4-й проход: 1 1 1 1 1 1 1 1 1 4 4 4 2 2 2 2 2 2 5 5 2 4 4 4 3 3 3 2 2 5 5 5 3 4 4 4 3 3 3 3 3 5 5 5 5 ! Для сортировки массива из N элементов нужен N-1 проход (достаточно поставить на свои места N-1 элементов). К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 39 Метод пузырька 1-й проход: for j:= N-1 downto 1 do if A[j+1]< A[j] then begin { поменять местами A[j] и A[j+1] } end; единственное отличие! 2-й проход: for j:= N-1 downto 2 do if A[j+1]< A[j] then begin { поменять местами A[j] и A[j+1] } end; К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 40 Метод пузырька for i:= 1 to N-1 do for j:= N-1 downto i do if A[j+1]< A[j] then begin { поменять местами A[j] и A[j+1] } end; ? Как написать метод «камня»? ? Как сделать рекурсивный вариант? К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 41 Задачи «A»: Напишите программу, в которой сортировка выполняется «методом камня» – самый «тяжёлый» элемент опускается в конец массива. «B»: Напишите вариант метода пузырька, который заканчивает работу, если на очередном шаге внешнего цикла не было перестановок. «С»: Напишите программу, которая сортирует массив по убыванию суммы цифр числа. Используйте функцию, которая определяет сумму цифр числа. К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 42 Метод выбора (минимального элемента) Идея: найти минимальный элемент и поставить его на первое место. for i:= 1 to N-1 do begin { найти номер nMin минимального элемента из A[i]..A[N] } if i <> nMin then begin { поменять местами A[i] и A[nMin] } end end; К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 43 Метод выбора (минимального элемента) for i:= 1 to N-1 do begin nMin:= i; for j:=i+1 to N do if A[j] < A[nMin] then nMin:= j; if i <> nMin then begin { поменять местами A[i] и A[nMin] } end end; ? Как поменять местами два значения? К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 44 Задачи «A»: Массив содержит четное количество элементов. Напишите программу, которая сортирует первую половину массива по возрастанию, а вторую – по убыванию. Каждый элемент должен остаться в «своей» половине. Пример: Массив: 5 3 4 2 1 6 3 2 После сортировки: 2 3 4 5 6 3 2 1 К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 45 Задачи «B»: Напишите программу, которая сортирует массив и находит количество различных чисел в нем. Пример: Массив: 5 3 4 2 1 6 3 2 4 После сортировки: 1 2 2 3 3 4 4 5 6 Различных чисел: 5 «C»: Напишите программу, которая сравнивает число перестановок элементов при использовании сортировки «пузырьком» и методом выбора. Проверьте ее на разных массивах, содержащих 1000 случайных элементов, вычислите среднее число перестановок для каждого метода. К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 46 Конец фильма ПОЛЯКОВ Константин Юрьевич д.т.н., учитель информатики ГБОУ СОШ № 163, г. Санкт-Петербург kpolyakov@mail.ru ЕРЕМИН Евгений Александрович к.ф.-м.н., доцент кафедры мультимедийной дидактики и ИТО ПГГПУ, г. Пермь eremin@pspu.ac.ru К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru Алгоритмизация и программирование, Паскаль, 10 класс 47 Источники иллюстраций 1. 2. 3. www.mcdonalds.com иллюстрации художников издательства «Бином» авторские материалы К.Ю. Поляков, Е.А. Ерёмин, 2013 http://kpolyakov.spb.ru