
- •Министерство образования и науки Российской Федерации
- •Цель лекции
- •План лекции
- •1 Происхождение вычислительных машин
- •2 Изучение алгоритмов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Биты и их хранение
- •2 Оперативная память
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Устройства внешней памяти
- •3 Хранение и поиск файлов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Представление числовых значений
- •2 Хранение целых чисел
- •3 Хранение дробей
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Представление текста
- •2 Представление изображений
- •Достоинства пиксельной графики
- •Недостатки пиксельной графики
- •Достоинства векторной графики
- •Недостатки векторной графики
- •3 Представление звука
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Сжатие изображений
- •2 Ошибки передачи данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Архитектура эвм
- •2 Связь процессора с другими устройствами
- •3 Другие архитектуры
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Машинный язык
- •2 Пример машинного языка
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Выполнение программы
- •2 Пример выполнения программы
- •3 Программы и данные
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Логические операции
- •2 Операции сдвига
- •3 Арифметические операции
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эволюция операционных систем
- •2 Архитектура операционных систем
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Понятие процесса
- •2 Управление процессами
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Классификация сетей
- •2 Сетевые протоколы*
- •3 Безопасность сетей
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Понятие алгоритма
- •2 Представление алгоритма
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Теория решения задач
- •2 Общие методы решения задач
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Алгоритм последовательного поиска
- •2 Управление циклами
- •3 Алгоритм сортировки методом вставки
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Алгоритмы поиска и сортировки
- •2 Управление рекурсией
- •3 Разработка рекурсивных процедур
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эффективность алгоритмов
- •2 Верификация программ
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эволюция и классификация языков программирования
- •2 Концепции традиционного программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Процедурные единицы
- •2 Реализация языка программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Объектно-ориентированное программирование
- •2 Декларативное программирование
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Структуры данных
- •Integer Scores (2.9).
- •2 Статические и динамические структуры
- •3 Указатели
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Массивы
- •2 Списки
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Структура и функции стека
- •2 Реализация стека
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Очереди
- •2 Деревья
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Пользовательские типы данных
- •Int Age;
- •2 Классы
- •Int *StackEntries;
- •3 Стандартная библиотека шаблонов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Роль операционной системы
- •2 Последовательные файлы
- •3 Вопросы программирования
- •0000000010000110
- •001100010011001100110100
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Основные положения индексации
- •2 Вопросы программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Основные положения хеширования
- •2 Вопросы программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Общие вопросы
- •2 Система управления базой данных
- •3 Поддержка целостности баз данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Модели баз данных
- •2 Реляционная модель баз данных
- •3 Объектно-ориентированные базы данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Интеллект и машины
- •2 Распознавание образов
- •3 Мышление
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Искусственные нейронные сети
- •2 Генетические алгоритмы
- •Контрольные вопросы
- •Невычислимые функции Цель лекции
- •План лекции
- •1 Основы машины Тьюринга
- •2 Невычислимая функция
- •3 Сложность задач
- •Листинг 1. Процедура MergeLists для объединения двух упорядоченных списков
- •Листинг 2. Алгоритм сортировки слиянием, реализованный в процедуре MergeSort
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Шифрование с открытым ключом
- •2 Модульная арифметика
- •Контрольные вопросы
- •Литература
- •Internet-ресурсы
Контрольные вопросы
1. Назовите предпосылки возникновения объектно-ориентированного программирования?
2. Что включает в себя понятие «класс»?
3. Что такое конструктор в контексте ООП?
4. Какие бывают члены класса?
5. Поясните на примере, что такое наследование, инкапсуляция и полиморфизм?
6. Охарактеризуйте основные понятия декларативного программирования.
Лекция № 22 Основы структур данных
Цель лекции
Изучить основы структур данных используемых в языках программирования высокого уровня.
План лекции
1. Структуры данных.
2. Статические и динамические структуры.
3. Указатели.
1 Структуры данных
Переменные в программе могут быть не только данными простых типов, но также структурами данных (data structure), то есть данными, упорядоченными каким-либо образом. Например, текст обычно рассматривается как длинная цепочка символов, а учетные записи продаж можно представить в виде таблицы, в которой в строке записываются продажи, сделанные определенным сотрудником, а в столбце — продажи, сделанные в определенный день.
Наиболее распространенной структурой данных является однородный массив (homogeneous array). Однородный массив представляет собой набор значений одного типа, например одномерный список, двумерную таблицу или таблицу с большим количеством измерений. В большинстве языков программирования для того, чтобы описать массив, нужно задать количество измерений, а также число элементов в каждом измерении. Например, структура, описанная выражением в языке Си int Scores [2] [9];
означает: «Переменная Scores будет использоваться в программе для обозначения двумерного массива целых чисел, состоящего из двух строк и девяти столбцов» (рис. 1). То же самое выражение на языке FORTRAN будет выглядеть следующим образом:
Integer Scores (2.9).
После описания массива к нему можно обращаться по заданному имени. А к отдельным элементам массива можно обращаться с помощью целых чисел, которые называются индексами (indices). Они определяют строку и ряд, в котором находится элемент массива. Однако диапазон индексов меняется от языка к языку. Например, в языке Си (и его производных Cи++, Java и Си#) индексы начинаются с 0. То есть элемент, находящийся во второй строке и четвертом столбце массива Scores, можно обозначить с помощью выражения Scores [1] [3], а элемент, расположенный в первой строке и первом столбце, будет обозначаться как Scores [0] [0]. Напротив, в языке FORTRAN индексы начинаются с 1, поэтому элемент, расположенный во второй строке и четвертом столбце, будет обозначаться как Scores (2,4) (рис. 2).
Некоторые языки программирования предоставляют программисту свободу в выборе интервала индексов для однородного массива. Например, выражение Scores: array [3..4. 12..20] of integer:
Рисунок 1 – Двумерный массив, состоящий из двух строк и девяти столбцов
в языке Pascal описывает такой же двумерный массив целых чисел Scores, как и приведенный выше, за исключением того, что строки здесь определены значениями 3 и 4, а столбцы пронумерованы от 12 до 20. Поэтому элемент, расположенный во втором ряду и четвертом столбце, будет обозначаться выражением Scores [4,15].
В отличие от однородного массива, в котором элементы данных относятся к одному типу, неоднородный массив (heterogeneous array) может содержать данные разных типов. Например, совокупность данных о сотруднике компании может состоять из элемента символьного типа Name, элемента целочисленного типа Аgе и элемента вещественного типа Ski11Rating. В языках Pascal и Си (рис. 2) такой тип массива называется соответственно записью (record) и структурой (structure).
Описание неоднородного массива в Pascal
var
Employee: record
Name: packed array [1..8] of char;
Age: integer;
SkillRating: real
end
Описание неоднородного массива в Си
struct
{ char Name [8];
int Age:
float SkillRating;
} Employee:
К компоненту неоднородного массива обычно обращаются по имени массива, после которого ставится точка и затем указывается имя этого компонента. Например, к компоненту Age массива Employee (см. рис. 2) можно обратиться с помощью выражения Employee.Age.
Далее мы рассмотрим, как абстрактные структуры, такие как массивы, реализуются в машине. В частности, мы покажем, что данные, которые содержит массив, могут быть разбросаны по оперативной памяти или по запоминающему устройству. Именно поэтому мы рассматриваем структуры
Рисунок 2 – Описание неоднородного массива в языках Pascal и Си
данных, как концептуальную форму упорядочивания данных. На самом деле, расположение данных в запоминающем устройстве машины может совершенно отличаться от их абстрактной структуры.
Оперативная память компьютера организована в виде отдельных ячеек с последовательными адресами. Однако часто бывает удобно представлять эти ячейки в виде других структур данных. Например, записи о продажах за неделю удобно просматривать в табличной форме, где продажи различных элементов в разные дни организованы в набор строк и столбцов. Мы рассмотрим, как создаются подобные абстрактные представления данных. Наша Цель лекции — научиться думать об информации в терминах абстрактной организации, а не сосредотачиваться на фактической структуре данных в оперативной памяти машины.
В изучении структур данных есть три основных аспекта: абстракция, разделение статических и динамических структур и концепция указателей.
Опять абстракция. Конечно, мы уже много раз встречались с понятием абстракции. Но необходимо еще раз обратить внимание на этот момент, так как, говоря о данных, мы говорим об инструментах обобщения. Действительно, структуры данных — это способы ограждения пользователя от деталей фактического устройства данных (ячеек памяти и адресов), чтобы он мог обращаться с информацией так, как если бы она была организована в наиболее удобной для него форме.
Слово пользователь в этом контексте не всегда обозначает человека; значение этого термина зависит от того, с чьей точки зрения мы смотрим на данные. Если представить себя человеком, который хранит в компьютере рекорды лиги боулинга, тогда пользователем будет именно человек. В этом случае приложение, в котором мы работаем, должно уметь представлять данные в абстрактной удобной для человека форме — например, в виде набора таблиц. Если думать о сервере в Интернете, тогда пользователем может быть другой компьютер, играющий роль клиента. Тогда сервер должен представлять данные в абстрактной форме, удобной для этого клиента. В случае же модульной структуры программы мы может считать пользователем отдельный модуль, которому требуется обратиться к данным. В этом случае модуль, содержащий данные, отвечает за представление данных в абстрактной форме, удобной другим модулям.
Общим во всех этих ситуациях является то, что пользователю, независимо от того, кем или чем он на самом деле является, дана привилегия доступа к данным как к абстрактному инструменту. Как сконструированы эти инструменты — это и есть вопрос структуры данных.