Uploaded by valeri-vik.98

Информатика 36 урок

advertisement
11 класс. Урок 36. Теоретический материал для самостоятельного изучения
Рассмотрим следующую задачу: ввести с клавиатуры 20 действительных чисел и
вычислить их сумму, при этом каждое из чисел сохранить в памяти для последующей
обработки.
Для решения этой достаточно простой задачи мы будем вынуждены ввести 20 имен
переменных, что, естественно, очень неудобно. Но ведь чисел может быть гораздо
больше, чем 20!
Основное предназначение современных компьютеров — обработка большого количества
данных. Очень сложно каждой переменной при этом давать собственное имя и не
запутаться. Выходом их этой ситуации является использование более сложных по своей
конструкции типов данных — составных (или структурированных). Одним из таких типов
являются массивы.
Массив — это поименованная совокупность однотипных элементов, упорядоченных по
индексам, определяющим положение элемента в массиве.
Элемент массива — отдельная переменная, входящая в массив.
Индекс элемента массива — номер элемента в этом массиве.
Размерность массива — количество элементов, которое содержит массив.
Массивы бывают одномерными и многомерными. Мы будем рассматривать только
одномерные массивы. Их условно можно представлять в виде таблицы, которая состоит из
множества ячеек, расположенных в одну строку или в один столбец.
Описание массивов
В языке Паскаль массивы описываются в блоке описания переменных следующим
образом:
var <идентификатор>: array [<тип индекса>] of <тип компонентов>
Здесь:
- array и of — служебные слова, которые буквально можно перевести как «массив» и
«из»;
- <тип индекса> — описание индексации (нумерации) элементов массива. В качестве типа
индекса можно использовать любые порядковые типы;
- <тип компонентов> — тип величин, непосредственно составляющих массив.
Приведем несколько примеров описаний:
1. var day: array [1..365] of integer; — массив, состоящий из 365 целых чисел,
которые пронумерованы от 1 до 365;
2. var tem: array [0..11] of real; — массив, состоящий из 12 вещественных,
пронумерованных от 0 до 11;
3. var ocenka: array [–2..2] of char; — массив, состоящий из 5 символьных
переменных с номерами от -2 до 2:
4. const n=10; var slovo: array [1..n] of string; — n строковых величин,
пронумерованных от 1 до n;
Для того, чтобы обратиться к элементу массива, нужно записать имя массива и в
квадратных скобках индекс нужного элемента, например, day[100].
Рассмотрим основные приемы работы с массивами.
Заполнение одномерного массива значениями
Задать элементам массива значения мы можем:
— вводя значения с клавиатуры;
— случайным образом из некоторого диапазона;
— по формуле.
Но какой бы способ мы ни выбрали, нам обязательно нужно организовать цикл.
Для начала договоримся, что мы имеем дело с массивом из 10 натуральных чисел (хотя
тип элементов в данном случае значения не имеет).
Вывод элементов массива на экран
Вывод элементов также нужно организовывать с помощью цикла. При этом можно
объединять процессы формирования массива и вывода его элементов на экран в один
цикл, и выводить элементы массива либо в столбик, либо в строчку.
Воспользуемся вторым и третьим способами, рассмотренными выше:
Теперь перейдем к задачам обработки массивов.
Вычисление суммы элементов массива
Алгоритм решения практически полностью совпадает с алгоритмом нахождения суммы
некоторого количества чисел, который мы уже рассматривали на третьем уроке в этой
теме.
Следующая группа задач очень часто встречается нам в реальной жизни. Это задача
поиска в массиве. Например, поиск нужного слова в словаре, поиск времени отправления
нужного поезда в расписании и т. д.
В программировании поиск — одна из наиболее часто встречающихся задач
вычислительного характера.
В алгоритмах поиска существуют два возможных варианта окончания их работы: поиск
может оказаться удачным — заданный элемент найден в массиве и определено его
месторасположение, либо поиск может оказаться неудачным – необходимого элемента в
данном объеме информации нет. Кроме того, искомый элемент может встретиться в
массиве неоднократно.
Рассмотрим несколько типовых задач, которые уже знакомы вам из курса основной
школы.
Поиск в массиве элемента, удовлетворяющего некоторому условию
Например, требуется найти в массиве элемент, значение которого равно значению
переменной p, или сообщить, что такого элемента в массиве нет.
Мы построим алгоритм, идея которого следующая:
1. Просматриваем все элементы массива с первого до последнего.
2. Как только находим элемент, равный p, выведем его номер, и увеличим счетчик
вхождений элемента m в массив на 1.
3. Если после просмотра массива счетчик окажется равным 0, выведем сообщение об
отсутствии искомого элемента в массиве.
Можно заметить, что наш алгоритм решает еще одну часто встречающуюся задачу
обработки массивов — подсчет количества элементов, удовлетворяющих некоторому
условию.
Поиск максимального (минимального) элемента массива
Подумаем, какие операции нужно выполнить, если требуется найти максимальный
элемент. Естественно, как и в предыдущей задаче, операцию сравнения. Но с чем нам
сравнивать очередной элемент массива?
Введем дополнительную переменную max, которой присвоим значение, равное значению
элемента массива a[1]. Теперь будем сравнивать все элементы, начиная со 2-го, с max, и
если найдем больший элемент, то присвоим его значение переменной max. Конечное
значение этой переменной и будет значением наибольшего элемента массива.
Поиск максимального (минимального) среди всех элементов массива,
удовлетворяющих некоторому условию
Фактически, эта задача является объединением двух предыдущих, но с одним
«подвохом».
Допустим, нужно найти наибольшее среди всех четных чисел, входящих в массив
произвольных натуральных чисел.
Мы знаем, что условие «четности» на языке Паскаль можно записать так: x mod 2=0.
Значит, найти все четные элементы массива мы сможем. Но как среди них найти
наибольший?
Прием, которым мы воспользовались в задаче 5, здесь может привести к ошибке.
Например, на первом месте в массиве будет стоять НЕЧЕТНОЕ число, которое окажется
больше всех четных. Здесь переменной max лучше присвоить начальное значение,
заведомо меньшее всех элементов массива. Например, если наш массив составлен из
натуральных чисел, то присвоить max значение -2. Если после окончания программы
значение max останется таким же, это будет означать, что в массиве нет четных чисел.
Если же они будут, max изменит значение.
Сдвиг элементов массива
Сдвиг элементов массива необходимо выполнять при удалении или вставке элементов.
Если происходит удаление, то элементы, расположенные после удаленного, сдвигаются на
одну ячейку влево. Если же происходит добавление, то элементы, расположенные после
места вставки, сдвигаются вправо. При этом нужно учитывать, что размерность массива
уже указана при его описании и измениться не может.
Таким образом при удалении элемента из массива мы можем получить, например, такую
ситуацию. Допустим, имеется массив:
Удалим из него элемент с индексом i=4, т. е. a[1]=a[1], a[2]=a[2], a[3]=a[3], a[4]=a[5],
a[5]=a[6], a[6]=a[7]. А вот для последнего элемента a[7] новое значение взять неоткуда. Он
сохранит свое значение. Получим:
Чтобы избежать такого дублирования последнего элемента обычно на его место ставят
число 0.
Программа удаления элемента из массива на языке Паскаль может выглядеть следующим
образом:
Сложнее обстоит дело со вставкой элемента внутрь массива. Как мы сказали, при вставке
все элементы, расположенные справа от места вставки, сдвигаются вправо. Последнему
же элементу сдвигаться некуда, и он пропадет. Чтобы этого не произошло, нужно
увеличить размерность массива на 1. Но учесть это надо при описании массива. Второй
важный момент заключается в том, что сдвиг значений мы будем производить справа
налево до заявленной позиции вставки:
Реверс массива
Реверс массива — это перестановка его элементов в обратном порядке: первый элемент
становится последним, а последний — первым.
Из примера видно, что местами меняются 1-й элемент с N-м, второй — с (N–1)-м и т. д.
Замечаем, что сумма индексов элементов, участвующих в обмене, равна N+1, поэтому
элемент с номером i должен меняться местами с (N+1–i)-м элементом.
Теперь разберемся с организацией цикла. Если мы организуем цикл по всем элементам, то
получим:
Все вернулось в исходное состояние, потому что реверс выполнился дважды. Чтобы этого
не произошло, нужно остановить процесс обмена на середине массива, т.е. на элементе с
индексом (N div 2).
Сортировка массива
Сортировка — один из наиболее распространенных процессов обработки данных.
Под сортировкой массива понимают расстановку элементов массива в заданном порядке.
Порядок сортировки может быть любым, для чисел обычно рассматривают сортировку по
возрастанию или убыванию значений.
Цель сортировки — ускорить последующий поиск элементов, т. к. нужный элемент легче
искать в упорядоченном массиве.
Существует много различных алгоритмов сортировки. Мы рассмотрим некоторые из них
на примере сортировки массива целых чисел в порядке неубывания (a[i]<=a[i+1]).
Обменная сортировка методом «пузырька»
Свое название этот алгоритм получил из-за схожести с физическим явлением всплытия
пузырька воздуха в воде. Точно также в массиве как бы «всплывают» наверх (к началу
массива) меньшие элементы.
Сначала мы сравниваем последний и предпоследний элементы массива. Если они стоят
неправильно (нижний элемент меньше верхнего), то меняем их местами. Далее
сравниваем следующую пару элементов и т. д.
В итоге самый «легкий» элемент поднимается на самый верх.
Теперь спускаемся вниз и начинаем аналогичные сравнения, но при этом остановимся на
втором сверху элементе, потому что, как мы уже выяснили, верхний — наименьший.
На каждом проходе число сравнений будет уменьшаться на 1. Число проходов будет на
единицу меньше числа элементов в массиве, ведь в самом конце последний элемент уже
окажется наибольшим и сравнивать его смысла нет.
Сортировка выбором
Еще один простой метод сортировки — метод выбора. Его идея заключается в том, что на
каждом этапе среди неотсортированных элементов выбирается минимальный и меняется
местами с первым среди неотсортированных:
Рассмотренные алгоритмы сортировки являются достаточно простыми для понимания и
запоминания, но на практике применяются редко. Дело в том, что они обладают
квадратичной сложностью, т. е. в общем случае число сравнений и обменов сопоставимо с
n2, где n — число элементов в массиве.
С примером более эффективного алгоритма сортировки — «быстрой сортировкой» — вы
сможете познакомиться в дополнительном материале.
Попробовать код:
https://www.onlinegdb.com/online_pascal_compiler
Задание высылать: valeriandry@vk.com
Или в личные сообщения вк.
Download