- •Вопрос 2. Спецификация, представление, реализация абстрактных типов данных.
- •Вопрос 3. Многомашинные вс. Реализация на основе ес эвм. Кластерные вс.
- •Типы кластеров:
- •Вопрос 2. Линейные структуры данных: стек, очередь, дек
- •Вопрос 3. Сравнительный анализ и основные компоненты инструментальных среды разработки пользовательских интерфейсов. Классификация элементов пользовательского интерфейса
- •Вопрос 1. Конкретные реализации языков функционального программирования: язык программирования Лисп, основные объекты, примитивы, списки, правила составления программ.
- •Вопрос 2. Семантическая теория программ. Вычислимость и разрешимость
- •Вопрос 3. Формальные методы описания диалоговых систем. Законы Фитса и Хика.
- •Вопрос 1. Основные конструкции логической программы: факты, правила, запросы, логические переменные. Операционная и декларативная семантика логических программ.
- •1. 5. Декларативный и процедурный смысл программ
- •Вопрос 2. Интерфейсы. Способы согласования аппаратных структур. Организация асинхронных интерфейсов
- •Элементы процесса как поведенческой категории :
- •Дескриптивный асинхронный процесс (dp)
- •Асинхронный процесс (ap)
- •Инициаторы
- •Вопрос 3. Эргономика пользовательского интерфейса. Критерии эргономичности интерфейса. Человеческие ошибки. Методы предотвращения ошибок. Снижение чувствительности системы к ошибкам.
- •Типы ошибок
- •Методы предотвращения ошибок
- •Как избежать сообщений об ошибках
- •Вопрос 1. Интерпретация и корректность логических программ. Абстрактный интерпретатор, значение логической программы, вычислительная модель
- •Вопрос 2. Порядковые статистики (Гулаков сказал что его не будет)
- •Субъективная удовлетворенность
- •Типичные интерфейсные ошибки отечественного по
- •Программа перегружена элементами управления
- •Терминология не адекватна знаниям пользователя о системе
- •От пользователя постоянно требуется дополнительная информация
- •Вопрос 1. Программирование баз данных. Динамическая база данных. Добавление и удаление фактов в процессе работы программы.
- •Вопрос 2. Поиск и кодирование (сжатие) данных, кодовые деревья, оптимальные префиксные коды
- •Вопрос 1. Рекурсивное программирование на логическом языке. Рекурсивные структуры данных – списки. Объявление списков. Составные списки. Голова и хвост списка. Примеры работы со списками.
- •Вопрос 2. Бинарный поиск, хеширование
- •Вопрос 3. Тестирование и отладка программного обеспечения. Структурное и функциональное тестирование. Особенности тестирования объектно-ориентированного по. Автоматизация процесса тестирования.
- •Вопрос1. Вычислительная модель программы на логическом языке. Согласование целевых утверждений. Сопоставление и унификация. Детерминизм.
- •Вопрос 2. Понятие выполнения сети. Свойства сети (устойчивость, безопасность, консервативность).
- •Вопрос 3. Автоматизация проектирования программного обеспечения на базе case-технологий. Принципы построения и т.Д.
- •Вопрос 1. Множественные выражения Программирование второго порядка Недетерминированное программирование
- •Вопрос 2. Нелинейные структуры данных: иерархические списки, деревья и леса, бинарные деревья
- •Вопрос 1. Вне логические предикаты. Ввод-вывод. Доступ к программам и обработка программ. Металогические предикаты. Сравнение не основных термов.
- •Вопрос 2. Алгоритмы сортировки
- •Сортировка разделением (Quicksort)
- •Вопрос 1. Constraint–Пролог: операционная семантика обобщение механизма унификации, понятие constraint'а. Операционная модель Constraint-пролоГа.
- •Вопрос 2. Нелинейные структуры: обходы деревьев
- •Вопрос 3. Качество по. Критерии качества: сложность, корректность, надежность, трудоемкость. Методика оценки качества по. Метрические особенности объектно-ориентированных пс. Сертификация по
- •Вопрос 1. Cancelled мистером г.
- •Вопрос 2. Стандартные схемы программ. Методы формальной спецификации и верификации.
- •Вопрос 1. Использование деревьев в задачах поиска: бинарные деревья поиска, случайные, оптимальные, сбалансированные по высоте и рандомизированные деревья поиска
- •. Деревья цифрового поиска
- •Вопрос 2. Определение асинхронного процесса как описания модели вычислительного процесса. Глобальные свойства – асинхронность, недетерминированность, параллельность.
- •1. Задачи сортировки; внутренняя и внешняя сортировка
- •2. Подклассы асинхронного процесса. Эффективный асинхронный процесс
- •Длительность реакции системы
- •Субъективное восприятие скорости работы
- •Приемы для уменьшения субъективного восприятия
- •1. Оптимальная сортировка.
- •2. Конвейерный процесс. Автономный процесс. Асинхронный процесс как метамодель.
- •Непосредственное манипулирование
- •Потеря фокуса внимания (прерывание)
- •Ограничение принятия решений
- •1. Анализ сложности и эффективности алгоритмов поиска и сортировки.
- •2. Классификация сетей (ординарные, автоматные, маркированный граф).
- •Понятность системы
- •Ментальная модель
- •Метафора
- •Аффорданс
- •Стандарт
- •1. Файлы: организация и обработка, представление деревьями: b-деревья.
- •2. Сетевое представление параллельных процессов. Области применения сетей Петри
- •3. Основы теории формальных языков и грамматик. Основные понятия и определения. Операции над языками. Классификация формальных языков и грамматик по порождающей способности
- •1. Алгоритмы на графах: представления графов, схемы поиска в глубину и ширину, минимальное остовное дерево, кратчайшие пути.
- •2.1.Поиск в глубину
- •2.2 Поиск в ширину.
- •2. Протоколы взаимодействия объектов вычислительных структур. Понятие протокола.
- •3. Вывод контекстно-свободных (кс) – грамматик и правила построения дерева вывода. Синтаксический разбор. Способы задания схем грамматик. Форма Бэкуса-Наура.
- •1. Теория сложности алгоритмов: np-сложные и труднорешаемые задачи.
- •2. Недетерминированные конечные автоматы. Конечные преобразователи и переводы. Преобразование некоторых грамматик к автоматному виду.
- •3. Объектно-ориентированное проектирование. Принципы проектирования. Схемы, диаграммы, инструменты.
- •1. Детерминированные конечные автоматы. Эквивалентные состояния и автоматы.
- •2. Синтаксический анализ. Метод оперативного предшествования. Восходящие и нисходящие методы синтаксического анализа.
- •2. Жизненный цикл программного обеспечения. Структура жизненного цикла согласно международного стандарта.
- •1. Нисходящие распознаватели. Ll(k) – грамматики. Построение детерминированного нисходящего распознавателя.
- •2. Параллельная обработка как основа высокопроизводительных вычислений. Уровни организации параллелизма: уровень заданий, программ и команд. Системы (языки) параллельного программирования.
- •1. Восходящие распознаватели. Lr(k) грамматики. Построение грамматики.
- •2. Понятие архитектуры вычислительной системы (вс). Архитектура как набор компонент и как система уровневых интерфейсов. Основные аппаратные и программные элементы вс.
- •1.1. Архитектура как набор взаимодействующих компонент
- •1.2. Архитектура как интерфейс между уровнями физической системы
- •1. Магазинные преобразователи. Определение магазинного преобразователя. Перевод, определяемый преобразователем.
- •2. Архитектура системы команд. Микропроцессоры (мп) с полным (cisc) и сокращённых (risc) набором команд. Основные принципы risc- архитектуры. Организация risc мп Alpha 21x64 фирмы dec.
- •Особенности архитектуры Alpha компании dec
- •1. Описание перевода или трансляции. Синтаксически-управляемые (су) – схемы.
- •2. Основные идеи объектно-ориентированных языков программирования. Создание абстрактных типов данных. Инкапсуляция. Полиморфизм. Наследование.
- •3. Развитие архитектур современных мп. Конвейеризация и динамическое выполнение потока команд. Суперскалярность. Архитектура epic мп Intel itanium.
- •1. Транслирующие грамматики. Построение транслирующей грамматики по су-схеме. Атрибутные транслирующие грамматики.
- •3. Векторные и векторно-конвейерные вс. Структура векторного процессора. Матричные вс.
- •1. Трансляторы, интерпретаторы и компиляторы. Стадии работы компиляторы. Лексический анализ.
- •3. Системы массовой параллельной обработки (мрр). Супер эвм фирмы sgi - Cray t3e(t3d) -1200.
- •2. Классификация и типы вс. Многомашинные и многопроцессорные вс. Представление вс на основе распределения потоков команд и данных (классификация Флинна)
1. Трансляторы, интерпретаторы и компиляторы. Стадии работы компиляторы. Лексический анализ.
Для обеспечения построения трансляторов язык высокого уровня, на котором пишутся программы описывается в терминах некоторой грамматики. Эта грамматика определяет форму (синтаксис) допустимых предложений языка. Проблема трансляции может быть сформулирована как проблема поиска соответствия написанных программистом предложений, тем структурам, которые определяются грамматикой, с последующей генерацией соответствующего машинного кода для каждого предложения.
Транслятор может быть интерпретирующего или компилирующего типа. В первом случае его называют интерпретатором входного языка, а во втором - компилятором.
Интерпретатор последовательно читает предложения входного языка, анализирует их и сразу же выполняет, а компилятор не выполняет предложения языка, а строит программу, которая может в дальнейшем быть запущена для получения результата.
Работа компилятора состоит из нескольких стадий, которые могут выполняться последовательно, либо совмещаться по времени. Каждое предложение исходной программы удобнее представить в виде последовательности лексем, чем просто в виде последовательности символов. Лексемы можно воспринимать как кирпичики, из которых строится язык. Лексемой может быть ключевое слово, имя переменной, арифметический оператор и т.д. Просмотр исходного текста, распознавание лексем и их классификация называется лексическим анализом. Та часть транслятора, которая выполняет лексический анализ называется сканером. Как только лексемы выделены, каждое предложение может быть рассмотрено как некая конструкция исходного языка, которая описывается с помощью грамматики. Распознавание принадлежности предложений языку называется синтаксическим анализом и разбором. Часть транслятора, выполняющая эту операцию, называется синтаксическим анализатором. Последний шаг – генерация объектного кода.
Любая грамматика объединяет 2 понятия: синтаксис и семантика. С одной стороны грамматика является формальным описанием синтаксиса языка, в то время как семантика несет смысловое значение для каждого предложения. При этом семантика учитывается при генерации машинного кода.
Лексический анализ включает в себя сканирование транслируемой программы и распознавание лексем. Сканер – программа, которая строится т.о., чтобы он мог распознавать ключевые слова, операторы и идентификаторы, также как целые числа, числа с плавающей точкой, строки символов и другие аналогичные конструкции, составляющие исходные программы. Точный перечень лексем зависит от языка программы, на которую рассчитан транслятор и от грамматики, используемой для описания языка. Как правило идентификаторы и целые числа распознаются сканером, как отдельные лексемы. В то же время возможен подход, когда отдельные лексемы описываются правилами грамматики. Поскольку распознавание односимвольных лексем и построение идентификатора увеличивает время работы сканера использование многосимвольных идентификаторов позволяет снизить время трансляции. Результатом работы сканера является последовательность лексем. Для упрощения дальнейшей работы каждая лексема представляется в виде кода фиксированной длины. Если распознанная лексема - ключевое слово или оператор, то такая схема кодирования дает всю необходимую информацию. В случае идентификатора нужно иметь конкретное имя идентификатора. Этого можно добиться, если хранить не только код лексемы, но и ее спецификатор.
2. Классы и объекты. Определение класса. Конструкторы и деструкторы. Определение класса и области видимости. Опережающее определение класса. Использование спецификатора памяти static. Статические компоненты класса. Константные объекты и константные методы. Неявный указатель this. Указатели на член класса. Локальные и вложенные классы.
Класс - тип данных, определяемый пользователем и представляющий набор данных и множество операций, манипулирующих этими данными Класс состоит из 2-х частей - заголовка и тела.
class имя_класса {/*тело*/};
Определим различия между классом и объектом класса. Греди Буч определил объект через некоторые свойства. Он имеет состояние, поведение, может быть однозначно идентифицирован (поименован). С другой стороны, класс - это множество объектов, имеющих общую структуру и общее поведение. При объявлении данных и методов класса используются общие правила объявления данных и функций, но не допускается явная инициализация элементов данных классов.
В каждую член-функцию класса, кроме указанных явно аргументов, передается также неявный указатель this. Этот указатель представляет собой адрес конкретного объекта, для которого был вызван метод. Если в методе обращение к членам класса происходит без явного указания объекта, по умолчанию подразумевается, что идет обращение к данному объекту через указатель this.
Конструкторы и деструкторы - специальные методы класса. Конструктор производит инициализацию объекта при его создании. Деструктор предназначен для корректного удаления объекта. Если у класса есть конструктор, он вызывается всякий раз при создании объекта этого класса. Если у класса есть деструктор, он вызывается всякий раз, когда уничтожается объект этого класса.
Объект может создаваться как:
автоматический, который создается каждый раз, когда его описание встречается при выполнении программы, и уничтожается по выходе из блока, в котором он описан;
статический, который создается один раз при запуске программы и уничтожается при ее завершении;
объект в свободной памяти, который создается операцией new и уничтожается операцией delete;
объект-член, который создается в процессе создания другого класса или при создании массива, элементом которого он является.
Кроме этого, объект может создаваться, если в выражении явно используется его конструктор или как временный объект. В обоих случаях такой объект не имеет имени.
Язык C++ поддерживает 3 вида области видимости:
Область видимости файла: Объявляемые на уровне файла функции и данные видны от точки объявления до конца файла. Это относится и к макросам предпроцессора
Локальная область видимости: Объявленные в блоке функции и данные видны только в этом блоке. Локальное объявление перекрывает глобальное (не относится к макросам предпроцессора).
Область видимости класса: члены, данные и методы класса видны только внутри класса. Вне его требуется уточнение имени объекта или имени класса (Point::X;)
Для ограничения доступа к элементам класса используются следующие спецификаторы доступа:
public - ограничений доступа нет
private - доступны только в своем классе
protected - члены данных и функций доступны только в порожденных классах
Член класса виден и может быть использован во всем классе вне зависимости от точки объявления. Методы класса имеют доступ ко всем элементам класса вне зависимости от спецификатора доступа Метод класса имеет область видимости класса и этот метод также определяет собственную локальную область видимости.
В некоторых случаях необходимо объявить класс заранее. Использование опережающего объявления класса возможно только при определении ссылок и указателей на объект класса, т.е. тогда, когда не важна структура класса:
class Point2D;
struct Point { Point2D *p;...};
Каждый объект класса имеет свою копию данных - членов класса. Иногда необходимо чтобы все элементы класса имели доступ к какой-то общей переменной, а не к копии переменной в каждом объекте. Для этого ее нужно объявить со спецификатором класса памяти static. Существуют следующие спецификаторы класса памяти:
Для локального класса памяти (область видимости - блок, в котором данные объявлены):
auto (используется по умолчанию) - память выделяется в стеке;
register - для размещения данных в регистрах.
Для статического класса памяти:
static - с областью видимости в блоке, где описывается;
extern - для расширения области видимости глобальных переменных.
Элемент класса, объявленный как static, будет создан и инициализирован в момент запуска программы, и будет находиться в фиксированном месте памяти и разделяться всеми объектами класса. Он существует уже тогда, когда ни один объект класса еще не создан. Его можно рассматривать как глобальную переменную класса. Но, в отличие от обычной глобальной переменной, он имеет область видимости класса, а не файла.
Доступ к статическим public-элементам класса возможен посредством любого объекта класса или имени самого класса с помощью операции разрешения области видимости:
class Ref{ public: static int count;
}ref;
ref.count = 0;
Ref::count = 0; // то же самое
Кроме статических членов-данных, бывают также статические члены-функции класса. Статический метод класса не получает this в качестве параметра и может работать только со статическими данными класса.
Константные объекты и методы. Любой объект может быть объявлен константным, например, const Point2D р(5.3,4.6). С константными объектами могут работать только конструкторы, деструкторы и методы с суффиксом const. т.е. так называемые "безопасные функции" Для функций const указывает на константность неявного указателя this и, таким образом, входит в сигнатуру. В константных методах можно изменять объект с помощью явного преобразования указателя this к неконстантному.
В связи с тем, что атрибут const относится к неявному указателю this, могут существовать два одноименных метода, отличающиеся наличием или отсутствием атрибута const. При этом для const-объекта будет вызываться только const-метод, для другого - неконстантный. При существовании одного лишь const-метода он будет вызываться для любых объектов, т.к. преобразование неконстантных объектов в константные безопасно.
Указатели на член класса. Язык C++, аналогично языку С, использует для представления адреса тип данных, называемый указателем Указатель может указывать на обычную переменную, массив, строку, структуру, другой указатель, объект класса. С функциями тоже может быть связан указатель. Поэтому можно вызвать функцию через указатель, содержащий адрес этой функции.
В C++ через указатели можно работать и с членами класса, но здесь есть своя специфика. Предположим, что есть член-функция
char *Gruppa::Starosta() {return students(0};}
Если объявить указатель
char *(*fp)();
а затем попытаться его установить
fp = &Gruppa::Starosta;
возникнет ошибка несоответствия типа. Дело в том, что член-функции неявно передается дополнительный аргумент - экзмепляр класса, над которым выполянется данное действие (функция). В данном случае в функцию Starosta необходимо НЕЯВНО передать конкретную группу. Естественно, что тип указателя fp не соответствует типу функции Starosta, потому что у него отсутствует этот аргумент, и в языке С нету возможности его указать. Объявление указателя на член класса должно включать имя класса. Рассмотрим пример:
Gruppa g96po; // экземпляр класса Gruppa
int Gruppa:: *int_ptr; // указатель на член типа int в Gruppa
int_ptr = &Gruppa::kolvo; // теперь указывает на член kolvo
Адрес члена из секции private можно взять только в функциях этого же класса. Объявление указателя на член-функцию класса:
char *(Gruppa:: *func_ptr)();
Такому указателю можно присвоить адрес подходящей член-функции.
func_ptr = &Gruppa::Starosta;
Указатели на члены класса используются для доступа к соответствующим членам конкретных объектов с помощью новых операций в C++:
".*" - для объектов класса и ссылок; "->*" - для указателей на класс;
Пример:
cout « g96po.*func_ptr();
Gruppa *ptr_97po = new Gruppa;
ptr_97po->*int_ptr = 27;
Следует добавить, что указатель на член класса НЕ ЯВЛЯЕТСЯ указателем в привычном смысле, то есть не содержит адреса ячейки в памяти. Он хранит смещение, по которому доступен указываемый член, внутри обпасти памяти, где располагается экземпляр или объект класса.
Вложенные классы. Описание класса может быть вложенным. Доступность вложенного класса ограничивается областью видимости лексически объемлющего класса. Если только описание вложенного класса не является совсем простым, то лучше описывать этот класс отдельно, поскольку вложенные описания могут стать очень запутанными Полезное свойство вложенности - это сокращение числа глобальных имен, а недостаток его в том, что оно нарушает свободу использования вложенных типов
Имя вложенного класса можно использовать вне описания объемлющего его класса так же, как имя любого другого члена, если позволяет область видимости
Локальные классы. В C++ класс может быть определен внутри некоторого блока или функции, этом случае имя класса видно только в этой локальной области/Таким образом, определение локального класса ограничивает область видимости имени класса, функции или блока, где находится класс. Определять локальный класс имеет смысл тогда, когда определение класса простое, а сам класс используется только в конкретной функции.
