
- •Министерство образования и науки Российской Федерации
- •Цель лекции
- •План лекции
- •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-ресурсы
Int *StackEntries;
int StackPointer;
int MaxStack;
public:
StackOflntegersCint Max)
{
StackEntries = new int[Max]:
StackPointer = 0:
MaxStack = Max:
}
void push(int NewEntry)
{
if (StackPointer < MaxStack)
StackEntries[StackPointer++] = NewEntry;
}
int pop ( )
{if (StackPointer >0) return SrackEntries[--StackPointer]:}
}:
1) Надо заметить, что дисциплина изменения указателя стека, примененная в данном классе, является допустимой, но в корне отличается от изложенной ранее. Здесь указатель всегда показывает на свободное место в стеке, поэтому при проталкивании (push) очередной элемент сначала помещается в стек. А затем указатель смещается на свободное место. При выталкивании (pop), наоборот, сначала смещается указатель, а затем извлекается значение.
Рисунок 3 – Стек в памяти
Листинг 2. Стек целых чисел (реализация на Java и С#)
class StackOflntegers
{private int[] StackEntries:
private int StackPointer;
private int MaxStack;
public StackOfIntegers(int Max)
{StackEntries = new int[Max]:
StackPointer = 0:
MaxStack = Max;
}
public void push(int NewEntry)
{if (StackPointer < MaxStack)
StackEntries[StackPointer++] = NewEntry:
}
public int pop ( )
{if (StackPointer >0) return SrackEntnes[--StackPointer]:
else return 0;
}
}
Используя этот класс как шаблон, при помощи следующего оператора на Java или С# можно создать объект с именем StackOne, представляющий стек объемом до 50 целых чисел:
StackOfIntegers StackOne = new Stack0flntegers(50);
Для C++ это будет оператор StackOfIntegers Stack0ne(50):
Далее в программе в стек StackOne можно протолкнуть значение 106, применив оператор
StackOne.push(106):
или получить в переменную OldValue верхнюю запись из StackOne при помощи оператора
OldValue - StackOne.pop ( ):
Возвращаясь к листингам 1 и 2, обратите внимание, что для обеспечения целостности структур данных в классе используется инкапсуляция. В частности, StackEntries и StackPointer определены в разделе private, тогда как методы push и pop — в разделе public. Так, внутренняя структура стека недоступна за пределами экземпляров класса. Любое обращение к стеку должно быть выполнено при помощи общих методов.
Чтобы понять важность такой защиты, предположим, что StackEntries и StackPointer определены как publiс, и программисту требуется обратиться к третьей записи стека типа StackOfIntegers. Программист, который знает, как стек реализован в памяти, может нарушить целостность стека и обратиться к массиву StackEntry напрямую, а не путем выталкивания первых двух записей. Проблема состоит в том, что в будущем программисты, обслуживающие это приложение, могут внести где-либо в программе изменения, не совместимые с этой прямой ссылкой на запись. Например, для увеличения максимального размера стека можно изменить внутреннюю организацию типа StackOfIntegers с массива на связную структуру, в которой прямая ссылка, предполагающая, что стек реализован в виде массива, будет недопустима.
В завершение раздела заметим, что класс StackOfInteges в том виде, как он определен в листингах 1 и 2, иллюстрирует кульминацию темы, проходящей через все предыдущие лекции, — это набор структур данных и процедур для управления ими в одном программном модуле. Действительно, концепция классов позволяет еще более расширить эту тему, так как разрешает программистам объединять структуры данных и относящиеся к ним процедуры в форме пользовательских типов данных, при помощи которых можно создавать множество экземпляров. На самом деле концепция классов является более общей, чем концепция типов данных, так как класс может состоять, в том числе, только из процедур. Или другой экстремальный случай — класс может включать только структуры данных. Таким образом, концепция классов ~ это мощный инструмент разработки программного обеспечения, при помощи которого можно проектировать и реализовывать шаблоны для программных модулей различных видов. Классы и объектно-ориентированный принцип стали основными инструментами в сегодняшнем арсенале средств разработки приложений.
Знания обычно принимают одну из двух форм: первый случай иллюстрируется тем, что человек знает свое имя, а второй — что человек знает, как ходить. Первый пример — это пример описательных знаний, которые отвечают на вопросы «кто?», «что?», или «почему?». Зачастую мы связываем описательные знания с накоплением фактов. Второй пример — это процедурные знания, отвечающие на вопрос «как?». Их мы ассоциируем с возможностью производить подходящее действие. Важны обе формы. В частности, накопление исключительно описательных данных редко говорит о превосходном владении предметом изучения.
Если говорить о компьютере, то мы представляем описательные знания в виде хранящихся в памяти традиционных структур данных, тогда как процедурные знания представлены как алгоритмы, закодированные в программах. В этом смысле переход от традиционных структур данных к объектам означает сдвиг от структур, содержащих только описательные знания, к более интеллектуальным структурам, объединяющим как описательные, так и процедурные знания.