ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ВЫСШАЯ ШКОЛА ЭКОНОМИКИ ПЕРМСКИЙ ФИЛИАЛ Программа дисциплины «Информатика и программирование» для направления 080700.62 – Бизнес-информатика (вторая ступень высшего профессионального образования) Утверждена Учебно-методическим Советом ПФ ГУ-ВШЭ Одобрена на заседании кафедры информационных технологий в бизнесе Зав. кафедрой_______________Казаченко Т.А. Председатель______________ Володина Г.Е. «______»__________________________2009 г. «_______»_________________________2009 г. Пермь 2009 I. Обязательный минимум содержания дисциплины по ГОС ЕН.Ф.06 Информатика и программирование Основные этапы компьютерного решения задач; критерии качества программы; диалоговые программы; дружественность; постановка задачи и спецификация программы; способы записи алгоритма; программа на языке высокого уровня; стандартные типы данных; представление основных структур: итерации, ветвления, повторения; процедуры: построение и использование; типы данных, определяемые пользователем; записи; файлы; динамические структуры данных; списки: основные виды и способы реализации; программирование рекурсивных алгоритмов; способы конструирования программ; модульные программы; основы доказательства правильности; архитектура и возможности семейства языков высокого уровня. Нелинейные структуры данных: классификация; деревья: ориентированные, упорядоченные и бинарные; представление деревьев в памяти компьютера: последовательное и связанное размещение элементов; операции над деревьями; графы и их представление в компьютере; алгоритмы, оперирующие со структурами типа графа; задачи поиска; исчерпывающий поиск: перебор с возвратом, метод ветвей и границ, динамическое программирование; быстрый поиск: бинарный и последовательный поиски в массивах, хеширование; использование деревьев в задачах поиска: бинарные, случайные бинарные, оптимальные и сбалансированные деревья поиска; алгоритмы поиска на графах; задачи сортировки; внутренняя и внешняя сортировки; алгоритмы сортировки; анализ сложности и эффективности алгоритмов поиска и сортировки; файлы: организация и обработка, представление деревьями: B-деревья; теория сложности алгоритмов: NP-сложные и труднорешаемые задачи. Языки программирования и методы трансляции: основные понятия языков программирования; синтаксис, семантика, формальные способы описания языков программирования; типы данных, способы и механизмы управления данными; методы и основные этапы трансляции; конструкции распределенного и параллельного программирования. II. Пояснительная записка 1. Авторы программы: Л.Н. Лядова (к.ф.-м.н., доцент), М.А. Плаксин (к.ф.-м.н., доцент) 2. Требования к студентам: Приступая к изучению данной дисциплины, студент должен обладать знаниями информатики в объеме общеобразовательной школы. 3. Аннотация: Программа составлена в соответствии с требованиями ГОС к обязательному минимуму содержания основной образовательной программы подготовки бакалавра бизнесинформатики. Дисциплина «Информатика и программирование» относится к циклу «Общие математические и естественно-научные дисциплины». Цель дисциплины – дать фундаментальную подготовку, необходимую для успешного освоения как общепрофессиональных, так и специальных дисциплин, изучение которых связано с применением средств информационно-коммуникационных технологий, созданием эффективных алгоритмов, разработкой программного обеспечения для различных предметных областей. Задачи: познакомить студентов с базовыми понятиями информатики и современных информационных технологий; 2 познакомить с теоретическими основами разработки эффективных алгоритмов и современными средствами разработки программ; дать навыки практического применения различных методов решения задач с помощью компьютеров; познакомить с основами организации современных компьютеров, базовыми принципами их функционирования. Курс призван повысить общую эрудицию студентов, показать методы применения алгоритмического подхода в различных, в том числе гуманитарных, областях. В курсе «Информатика и программирование» изучаются вопросы, касающиеся проблем, связанных с понятием алгоритма, сложности алгоритмов. Изучаются способы формализации алгоритмов, позволяющие изучать их свойства, рассматриваются основные методы разработки алгоритмов и приемы конструирования типов данных, их использования при разработке программ. Вводятся понятия формальных языков и грамматик, изучаются средства формального описания языков программирования, и их возможности для разработки эффективных программ. ЭВМ рассматривается как основной исполнитель алгоритма и как основное устройство хранения, обработки и передачи информации. Содержание программы дисциплины должно обеспечить базовую подготовку студентов в процессе формирования устойчивых знаний и практических навыков разработки алгоритмов и программ, их оценки, решения задач с помощью компьютеров. Данный курс является базовым для изучения общепрофессиональных и специальных дисциплин подготовки бакалавров бизнес-информатики. 4. Учебная задача курса: В результате изучения курса студент должен: Иметь представление: о месте информатики среди других дисциплин; об основных возможностях современных средств программирования; об организации вычислительного процесса и общих принципах функционирования компьютеров с традиционной архитектурой, а также основных направлениях развития архитектур современных вычислительных систем. Знать: основные понятья информатики; определение, свойства и средства формализации алгоритмов, исследования их свойств, оценки эффективности; основные управляющие структуры и способы описания алгоритмов; основные методы разработки алгоритмов, особенности их реализации; понятие типа данных, форматы представления данных при решении задач с помощью компьютера, а также средства конструирования новых типов на основе стандартных типов, используемых в языках программирования; основные алгоритмы сортировки и поиска; динамические типы данных и алгоритмы реализации основных операций над динамическими структурами данных; основы организации файлов, выполнения операций над файлами, возможности их использования при решении задач; способы формального описания языков и возможности современных систем программирования; основы прикладной архитектуры современных персональных компьютеров. 3 Уметь: решать задачи, используя различные методы разработки алгоритмов и выбирая наиболее подходящие алгоритмы и средства их реализации в зависимости от постановки задачи; разрабатывать программы средней сложности на языке Pascal с использованием основных управляющих конструкций, стандартных типов и функций языка; анализировать алгоритмы и программы, оценивать эффективность алгоритмов и их реализации; Обладать навыками: разработки и анализа алгоритмов решения типовых задач, исследования их свойств; разработки программ средней сложности на языке Pascal, их тестирования и отладки; самостоятельного решения задач с помощью компьютеров. Студенты после изучения курса должны уметь самостоятельно разрабатывать алгоритмы решения различных задач средней степени сложности, производить оценку временных затрат при выполнении алгоритмов независимо от свойств исполнителя (архитектуры компьютера и языков программирования), а также разрабатывать программы, реализующие алгоритмы, выбирая наиболее эффективные средства реализации. Требуется умение выбирать типы и конструировать структуры данных для решения задач для тех предметных областей, для которых разрабатываются алгоритмы. Студенты должны представлять, как происходит исполнение их программ на ЭВМ различной архитектуры. 5. Формы контроля: Текущий контроль: выполнение лабораторных работ сопровождается проведением контрольных опросов, согласно графику контрольных мероприятий выполняются домашние задания и контрольные работы. Итоговый контроль: зачет проводится в соответствии с учебным планом в конце второго модуля. Изучение дисциплины завершается сдачей экзамена. Итоговая оценка: складывается в соответствии с «Положением о рейтинге», принятом в ПФ ГУ-ВШЭ. Формы проведения определяются учебным планом. 4 III. Содержание программы Темы лекций Раздел 1. ОСНОВЫ АЛГОРИТМИЗАЦИИ Тема 1. Введение в теорию алгоритмов Интуитивное понятие алгоритма. Свойства алгоритмов. Понятие об исполнителе алгоритма. Уточнение понятия алгоритма. Способы записи алгоритмов. Тема 2. Машины Тьюринга Алгоритм как преобразование слов из заданного алфавита. Машина Тьюринга. Формат команды и программа машины Тьюринга. Способы записи программы: таблицы, диаграммы. Примеры. Композиция машин Тьюринга. Примеры. Тезис Тьюринга и его обоснование. Тема 3. Нормальные алгорифмы Маркова Нормальные алгоритмы Маркова. Формулы подстановки и схемы. Выполнение алгорифма. Примеры. Принцип нормализации и его обоснование. Тема 4. Вычислимые функции Понятие вычислимой функции. Суперпозиция, примитивная рекурсия, минимизация. Примеры. Тема 5. Алгоритмическая неразрешимость Понятие об алгоритмической неразрешимости. Доказательство существования алгоритмически неразрешимых задач. Примеры. Тема 6. Методы разработки алгоритмов Основные методы разработки алгоритмов. Рекурсия и математическая индукция. Реализация механизма рекурсии. Рекурсия и итерация. Реализация. Сравнение. Тема 7. Развитие понятия алгоритма Развитие понятия алгоритма: параллельное программирование и распределенные алгоритмы, объектно-ориентированный подход к разработке программ, методы искусственного интеллекта. Конструкции языков высокого уровня для организации ветвлений и циклов, конструкции распределенного и параллельного программирования. Тема 8. Понятие сложности алгоритма и классы сложности задач Понятие вычислительной сложности (по времени и памяти) алгоритма и его применение для анализа алгоритмов. Асимптотические верхние и средние оценки для итеративных и рекурсивных алгоритмов; сравнение алгоритмов по времени и памяти. Основные методы и приемы анализа сложности. Сложность алгоритмов с ветвлениями, циклами. Сложность рекурсовных алгоритмов. Оптимизация алгоритмов. Основы доказательства правильности. Разрешимые и неразрешимые задачи. Сложность задачи. Задачи полиномиальной и экспоненциальной сложности (труднорешаемые задачи). Сводимость и другие классы сложности. Класс задач NP, NP-сложные и NP-полные задачи. Примеры. Раздел 2. ФОРМАЛЬНЫЕ ЯЗЫКИ И ГРАММАТИКИ Тема 9. Формальные языки и понятие грамматики Понятие о формальных языках. Основные понятия: алфавит, лексика, синтаксис и семантика, прагматика языка. Понятие грамматики. Классификация формальных языков. Тема 10. Способы описания алгоритмических языков Способы строгого описания формальных языков, понятие о метаязыках. Алфавит, синтаксис и семантика алгоритмического языка. Формальные способы описания языков про5 граммирования: описание синтаксиса языка с помощью металингвистических формул и синтаксических диаграмм. Примеры. Раздел 3. РЕКУРСИВНЫЕ ДАННЫЕ И АЛГОРИТМЫ Тема 11. Рекурсивные данные Конструирование типов. Понятие рекурсивно определенного типа данных и динамическое распределение памяти. Линейные списки, деревья, графы: определение и способы представления. Тема 12. Операции над линейными списками Создание списков, включение элементов в голову и конец списка, на указанное место. Просмотр списков. Поиск элемента в списке. Удаление элемента списка. Сравнение списков. Тема 13. Операции над бинарными деревьями Создание деревьев, включение элементов в бинарное древо. Просмотр деревьев и поиск элементов. Удаление элемента списка. Сравнение деревьев. Применение бинарных деревьев в программировании. Тема 14. Представление графов и операции над графами Способы представления графов. Сравнение. Создание графа (добавление вершин и дуг). Поиск вершины и дуги. Удаление вершин и дуг. Алгоритмы на графах. Раздел 4. ФАЙЛЫ: ОРГАНИЗАЦИЯ И ОБРАБОТКА Тема 15. Понятие файла Понятие файла, способы организации файлов, физическая и логическая организация. Файловые системы, примеры. Тема 16. Операции над файлами Операции над файлами. Особенности работы с текстовыми и бинарными файлами. Примеры использования файлов. Раздел 5. СОРТИРОВКА И ПОИСК Тема 17. Основные понятия, задачи сортировки и поиска Формулировка задач сортировки и поиска. Основные понятия. Связь между задачами. Тема 18. Сортировка массивов Основные подходы к разработке алгоритмов сортировки массивов, классификация алгоритмов сортировки. О(n) алгоритмы сортировки (например, выбором и вставкой); оценки сложности, лучшие и худшие случаи. О(n log n) алгоритмы сортировки (например, быстрая сортировка, метод слияния); оценка сложности; другие методы сортировки (метод Шелла и т.д.); сравнение алгоритмов сортировки. Тема 19. Внешние сортировки Понятие файла. Представление деревьями, В-деревья. Особенности сортировки файлов. Общие подходы и основные методы сортировки файлов (двухпутевое слияние, фибоначчиева сортировка и пр.). Тема 20. Поиск и хеширование Подходы к решению задач поиска. Последовательный и бинарный поиск, оценки сложности, лучшие и худшие случаи. Поиск в массивах. Использование деревьев в решении задач поиска. Исчерпывающий поиск: перебор с возвратом, метод ветвей и границ, динамическое программирование. 6 Понятие хеш-функции и возможность эффективной реализации, проблема коллизий. Основные методы разрешения коллизий: устранение коллизий с помощью рехеширования (линейное и случайное рехеширование), метод цепочек. Сравнение. Раздел 6. ЯЗЫКИ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ Тема 21. Языки программирования Основные понятия и классификация языков программирования. Языки программирования высокого уровня и возможности современных систем программирования. Типы данных, способы и механизмы управления данными. Представление основных структур: итерации, ветвления, повторения. Процедуры и функции: построение и использование, способы передачи параметров. Модульное программирование. Конструкции распределенного и параллельного программирования. Состав систем программирования. Способы конструирования программ и этапы подготовки программ к выполнению. Тема 22. Методы трансляции программ Основы разработки трансляторов. Этапы трансляции. Алгоритмы разбора, лексический, синтаксический и семантический анализ. Генерация кода. Используемые структуры данных. IV. Учебно-методическое обеспечение дисциплины 1. Литература: Базовые учебники: 1. Королев Л.Н., Миков А.И. Информатика. Введение в компьютерные науки. М.: Высшая школа, 2009. Основная: 1. Плаксин М.А. Тестирование и отладка программ – для профессионалов будущих и настоящих. М.: БИНОМ. Лаборатория базовых знаний, 2007. 2. Залогова Л.А. Разработка Паскаль-компилятора. М.: БИНОМ. Лаборатория базовых знаний, 2007. Дополнительная: 1. Андреева Т.А. Программирование на языке Pascal: Учебное пособие. М.: 2006.234 с. 2. Борисенко В.В. Основы программирования: Учебное пособие. М.: Интернетуниверситет информационных технологий; МГУ им. М. В. Ломоносова, 2005.328 с. 3. Острейковский В.А. Информатика: Учебник для вузов М.: 2001.-511с. 4. Кнут Д.Э. Искусство программирования. (Классический труд. Исправленное и дополненное издание). В 3-х томах. М.: 2004. 5. Анисимов А.Е., Пупышев В.В. Сборник заданий по основаниям программирования: Учеб. пособие. М.: 2006. -348 с. 6. Пентус А.Е., Пентус М Р. Математическая теория формальных языков: Учеб. пособие / М.: 2006. -247 с. 7. Васильев П.П. Турбо Паскаль в примерах и задачах: Освой самостоятельно: Учеб.пособие. М.: Финансы и статистика, 2002. 496 с. 8. Конспект лекций по курсу «Информатика и программирование». М.: ГУВШЭ.[Электронный ресурс] 9. Основы алгоритмизации и программирования. [Электронный ресурс] 7 2. Тематика заданий по различным формам текущего контроля: Тематика контрольных работ: 1. Теоретические основы программирования. 2. Оценка сложности и способы записи алгоритмов. 3. Основные алгоритмы и структуры данных. Перечень примерных заданий представлен в приложении. Тематика домашних заданий: 1. Основы программирования на языке Pascal: массивы, строки, записи, рекурсия и итерация. 2. Рекурсивные типы данных и динамическое распределение памяти. 3. Сортировка и поиск. Перечень примерных заданий представлен в приложении. Перечень вопросов для самоконтроля студентов: Перечень вопросов для самоконтроля студентов представлен в приложении. Тематика практических занятий: Примерный перечень заданий, выполняемых на практических занятиях приведен в приложении. План практических занятий Тема 1. Решение задач с помощью компьютера (2 ч.) Основные этапы компьютерного решения задач. Постановка задачи и спецификация программы, способы записи алгоритма. Программа на языке высокого уровня. Понятия тестирования и отладки. Критерии качества программы. Диалоговые программы, дружественность интерфейса. Стиль программирования. Тема 2. Основы программирования на языке Pascal (8 ч.) Лексика языка. Описание синтаксиса языка. Стандартные типы данных. Операции и стандартные функции. Операторы и основные управляющие структуры: итерация, ветвление, повторение. Нисходящее программирование и пошаговая детализация и использование процедур и функции: построение, описание данных, глобальные и локальные переменные, способы передачи параметров. Блочная структура. Понятие типа данных. Классификация языков по типизации. Классификация типов данных. Идентичность типов. Идентичность типов в языке Pascal. Числовые типы. Тип Boolean. Тип Char и тип String. Типы данных, определяемые пользователем: перечисления, диапазоны, множества, массивы, записи, файлы. Типизированные константы. Реализация процедур и функций. Тема 3. Тестирование и отладка программ (4 ч.) Принципы тестирования. Полнота тестирования. Критерии черного ящика. Критерии белого ящика. МГТ. Ошибкоопасные ситуации при работе с файлами. Ошибкоопасные ситуации при обращении к данным. Ошибкоопасные ситуации при вычислениях. Ошибкоопасные ситуации при передаче управления и вызовах подпрограмм. Безмашинное тестирование. Оценка количества ошибок в программе. Мера доверия к миллсовой модели оценки количества ошибок в программе. Оценка количества необходимых тестов. Отладка. Отладочные операторы. Методы поиска ошибки. Принципы отладки. Анализ обнаруженной ошибки. Отладочные средства. Нисходящее программирование и нисходящее тестирование. 8 Тема 4. Методы разработки алгоритмов, рекурсия и итерация (8 ч.) Разработка рекурсивных процедур и функций. Вычисление факториала. Последовательность чисел Фибоначчи. Бинарный поиск и решение уравнений методом деления отрезка пополам. Использование процедурных типов. Тема 5. Ввод/вывод и работа с файлами (4 ч.) Ввод данных с клавиатуры. Вывод данных на экран. Файлы. Виды файлов. Методы доступа. Текстовые файлы. Файлы записей. Триада для работы с файлом. Синхронизация. Буферизация. Блокирование. Двоичные файлы в Турбо-Паскале. Потоковые файлы в Турбо-Паскале. Тема 6. Работа с массивами, строками и записями (6 ч.) Описание и использование массивов. Операции над элементами массивов и над массивами. Тип String и операции над строками. Функции для работы со строками. Реализация машины Тьюринга и нормальных алгорифмов Маркова. Тема 7. Рекурсивные типы данных и динамическое распределение памяти (16 ч.) Динамические структуры данных. Списки: основные виды, способы организации, создание списков и операции над списками. Линейные списки. Нелинейные структуры данных, их классификация. Понятие графов и деревьев. Ориентированные графы. Упорядочение данных и бинарные деревья, их представление в памяти компьютера и применение. Реализация интерпретатора выражений с использованием деревьев. Графы и способы их представления: матричное представление, представление списками. Тема 8. Сортировка и поиск (12 ч.) Запись, ключ и информационная часть. Ключи простые и составные, лексикографический порядок; ключи первичные и вторичные; хранимые и вычислимые. Хранение ключей отдельно от информационной части. Сортировка внутренняя и внешняя, записей и ключей, массивов и списков, линейная и нелинейная, простая и комбинированная, оптимальная по памяти и по времени. Самоупорядочивающиеся списки. Методы внутренней сортировки: вставки (простые и бинарные), выбор, обмен (стандартный, пузырек, шейкер, просеивание), подсчет, распределительная сортировка. Сортировка Шелла. Сортировка Хоара (варианты Вирта и Кнута). Внешняя сортировка. Предварительное упорядочивание блоков внутренней сортировкой. Сбалансированное слияние. Трехленточное слияние. Четырехленточное слияние. Pпутевое слияние. Многофазная сортировка. Распределение начальных серий по N лентам (Фиббоначиева сортировка). Естественное слияние. Сравнение сложности алгоритмов. Методы поиска: последовательный и быстрый поиск, бинарный (двоичный), блочный, многоуровневый блочный. Их применение для внутреннего и внешнего поиска. Использование деревьев в задачах поиска, деревья поиска. Хэширование и разработка хэш-функций, удовлетворяющих требованиям. Методы борьбы с коллизиями: метод цепочек, рехэширование. Виды функций рехэширования. Первичные и вторичные скопления. Механизм бэктрекинга. Пример: формирование набора чисел с заданной суммой. Поиск одного решения. Поиск всех решений. Варианты организации режима возвратов. Схема реализации бэктрекинга на языке Pascal. Реализация перебора с возвратом: формирование набора чисел с заданной суммой, задача о 8 ферзях, задача об устойчивых браках. Поиск одного решения и всех решений. Внимание на глобальную оптимизацию. В задаче о 8 ферзях – на структурирование информации (вместо того, чтобы проверять каждую клеточку по от9 дельности, манипулируем горизонталями, вертикалями и диагоналями), в задаче об устойчивых браках – на сокращение перебора. Тема 9. Алгоритмы на графах (8 ч.) Представление графов в памяти компьютера и операции над графами: создание, добавление, поиск и удаление вершин и дуг. Алгоритмы поиска на графах кратчайших путей, минимального сечения, построения остовного дерева. Для решения практических задач и выполнения домашних заданий, для подготовки к контрольным работам рекомендуется использовать следующие основные источники: 1. Королев Л.Н., Миков А.И. Информатика. Введение в компьютерные науки. М.: Высшая школа, 2009. 2. Плаксин М.А. Тестирование и отладка программ – для профессионалов будущих и настоящих. М.: БИНОМ. Лаборатория базовых знаний, 2007. При разработке программ на языке Pascal рекомендуется использовать справочную систему системы программирования, примеры и рекомендации по решению задач, приведенные в электронных пособиях по курсу, указанных в списке дополнительной литературы. 3. Методические рекомендации (материалы) преподавателю: На лекциях используется «проблемный» подход к изложению материала: материал каждой лекции иллюстрируется примерами, рассматриваются нестандартные ситуации, требующие решения с использованием рассматриваемого материала. При этом студенты должны активно участвовать в обсуждении вопросов, выработке решений. Для самостоятельного изучение предлагается использовать электронные ресурсы. На лабораторных занятиях используются следующие методы обучения и контроля усвоения материала: 1) выполнение лабораторных работ по теме занятия сопровождается контрольным опросом; 2) обсуждение различных вариантов решения, предложенных студентами, сравнение решений, анализ возможных ситуаций. 4. Методические указания студентам: Студенту рекомендуется следующая схема подготовки к лабораторному занятию: 1) проработать конспект лекций; 2) проанализировать основную и дополнительную литературу, рекомендованную по изучаемому разделу; 3) проанализировать варианты решений, предложенные преподавателем; 4) при затруднениях сформулировать вопросы к преподавателю. 5. Рекомендации по использованию информационных технологий: Все практические занятия проводятся в компьютерном классе. Программное обеспечение сети должно поддерживать 1) возможность доступа к материалам для подготовки, размещаемым на сервере; 2) разработки, тестирования, отладки программ, написанных на языке Pascal; 3) возможность оформления отчетов по выполненным заданиям с помощью текстовых редакторов и электронных таблиц. Авторы программы: __________________________________________ /Л.Н. Лядова / __________________________________________ /М.А. Плаксин / 10 № Наименование разделов и тем (с разбивкой по модулям) Лекции Модуль 1 1 2 3 4 5 6 7 8 9 Введение в теорию алгоритмов Решение задач с помощью компьютера Основы программирования на языке Pascal Машины Тьюринга Нормальные алгорифмы Маркова Тестирование и отладка программ Вычислимые функции Алгоритмическая неразрешимость Методы разработки алгоритмов Всего за модуль: Модуль 2 10 11 12 13 14 15 16 Рекурсия и итерация Развитие понятия алгоритма Ввод/вывод и работа с файлами Работа с массивами, строками и записями Понятие сложности алгоритма и классы сложности задач Формальные языки и понятие грамматики Способы описания алгоритмических языков Всего за модуль: Модуль 3 Рекурсивные данные и динамическое распределение памяти 18 Операции над линейными списками 19 Операции над бинарными деревьями 20 Представление графов и операции над графами 17 Всего за модуль: Модуль 4 Понятие файла 22 Операции над файлами 21 11 Семинарские или практические занятия Аудиторные часы Всего Самостоятельная работа Тематический расчет часов Всего часов 18 18 36 46 82 2 0 2 2 4 0 2 2 2 4 0 6 6 10 16 4 2 6 6 12 4 2 6 6 12 0 4 4 8 12 4 0 4 6 10 2 0 2 2 4 2 2 4 4 8 18 18 36 46 82 16 16 32 44 76 4 4 8 12 20 2 0 2 4 6 0 2 2 6 8 0 4 4 10 14 4 0 4 4 8 4 2 6 4 10 2 4 6 4 10 16 16 32 44 76 14 14 28 46 74 2 2 4 6 10 4 4 8 12 20 4 4 8 14 22 4 4 8 14 22 14 0 28 46 74 14 14 28 46 74 2 0 2 4 6 2 2 4 6 10 Лекции Основные понятия, задачи сортировки и поиска 24 Сортировка массивов 25 Внешние сортировки 26 Поиск и хеширование 23 Всего за модуль: Модуль 5 Алгоритмы на графах 28 Языки программирования 29 Методы трансляции программ 27 Всего за модуль: Всего Авторы программы: Всего Самостоятельная работа Наименование разделов и тем (с разбивкой по модулям) № Семинарские или практические занятия Аудиторные часы Всего часов 2 0 2 4 6 2 4 6 10 16 2 4 6 10 16 4 4 8 12 20 14 14 28 46 74 12 16 28 44 72 4 8 12 20 32 4 2 6 6 12 4 6 10 18 28 12 16 28 44 72 74 78 152 226 378 __________________________________________ /Л.Н. Лядова / __________________________________________ /М.А. Плаксин / 12 Приложение 1 Вопросы и задачи для входного контроля Вариант 1 1. Написать программу, которая выводит на экран максимальное из значений элементов целочисленного массива, содержащего 15 элементов. 2. Написать программу, которая выводит на экран номера строк матрицы размером 510, содержащей вещественные числа, сумма элементов которых меньше нуля. Если такой строки нет (по всем строкам суммы элементов неотрицательны), то на экран нужно вывести сообщение – строку «Таких строк в матрице нет!». 3. Написать программу сортировки (упорядочения) элементов массива, содержащего 20 элементов – символов (букв латинского алфавита), в лексико-графическом (алфавитном) порядке. Вариант 2 1. Написать программу, которая выводит на экран номер первого элемента целочисленного массива, содержащего 25 элементов, значение которого является минимальным среди значений всех элементов массива. 2. Написать программу, которая выводит на экран номера строк матрицы размером 105, содержащей вещественные числа, и суммы элементов, находящихся в этих строках. Номер и сумма для каждой строки матрицы должны выводиться в отдельных строках на экране. 3. Написать программу сортировки (упорядочения) элементов массива, содержащего 20 элементов – символов (букв латинского алфавита), в лексико-графическом (алфавитном) порядке. Примечание: программу можно написать на любом языке, которым Вы владеете (предпочтительнее – Pascal); если Вы не можете написать программу на языке программирования, можно записать алгоритм решения задачи на псевдокоде или представить его в виде блоксхемы. 13 Приложение 2 Примерный перечень задач для подготовки к контрольной работе №1 Приведены примерные задания для подготовки к контрольной. По темам и уровню сложности приведенные задачи соответствуют контрольным заданиям. Для подготовки к контрольной необходимо выполнить все домашние задания и разобрать примеры, приведенные в лекциях. Задания, помеченные звездочками, имеют больший уровень сложности. Их решение необходимо для получения отличной оценки. Контрольная работа включает задачи по следующим темам: 1. Машины Тьюринга. 2. Алгорифмы Маркова. 3. Вычислимые функции. 4. Рекурсия. Типовые задачи для подготовки к контрольной работе № 1 по дисциплине «Информатика и программирование» в первом модуле I. Построить машину Тьюринга (представить программу в виде таблицы и в форме диаграммы) для решения следующих задач: 1. Прибавить 1 к целому неотрицательному числу (вычислить функцию F(x) = x + 1). Рассмотреть задачу для машины Тьюринга с алфавитами a) A = {0, 1, e} (операции выполняются в двоичной системе); b) A = {1, e} (строка «…e1e…» соответствует x = 0, в записи любого другого целого числа x > 0 количество единиц равно x + 1). 2. Вычесть 1 из целого неотрицательного числа (вычислить функцию F(x) = x – 1). Операции выполняются по следующему правилу: 0, если x 0 F ( x) . x 1, если x 0 Рассмотреть задачу для машины Тьюринга с алфавитами a) A = {0, 1, e} (операции выполняются в двоичной системе); b) A = {1, e} (строка «…e1e…» соответствует записи x = 0 на ленте, в записи любого другого целого числа x > 0 количество единиц равно x + 1). 3. Прибавить 3 к целому неотрицательному числу (вычислить функцию F(x) = x + 3). Построить решение в двух вариантах: a) машина Тьюринга строится для вычисления указанной функции; b) машина Тьюринга строится как композиция машин Тьюринга, вычисляющих функции F(x) = x + 1 и F(x) = x + 2. 4. Умножить на 2 целое положительное число x (вычислить функцию F(x) = 2×x)). Числа записываются в двоичной системе (используется алфавит A = {0, 1, e}). 5. Умножить на 2 целое положительное число (вычислить функцию F(x) = 2×x). Для записи чисел используется алфавит A = {1, e} (строка «…e1e…» соответствует записи x = 0 на ленте, в записи любого другого целого числа x > 0 количество единиц равно x + 1)***. 6. Умножить на 4 целое положительное число, записанное в двоичной системе (вычислить функцию F(x) = 4×x). a) машина Тьюринга строится для вычисления указанной функции; 14 b) машина Тьюринга строится как композиция машин Тьюринга, вычисляющих функции F(x) = 2×x. 7. Умножить на степень 2 (на 2n) целое положительное число x (вычислить функцию F(x, n) = 2n×x)). Числа записываются в двоичной системе (используется алфавит A = {0, 1, e, }). На ленте числа x и n записываются последовательно и разделяются символом ‘’. В результате выполнения программы машины Тьюринга на ленте должно остаться одно число – результат умножения***. 8. На ленте записано целое число (используется двоичная система счисления, значение может быть как положительным, так и отрицательным, отрицательное значение записывается в прямом коде со знаком минус, перед положительным числом может стоять знак плюс, т.е. используется алфавит A = {0, 1, e, +, –}). Написать программу машины Тьюринга для вычисления функций*** a) F(x) = x + 1 (увеличения на 1 к записанного на ленте числа); b) F(x) = x – 1 (вычитания 1 из записанного на ленте числа). 9. Построить композицию машин Тьюринга для вычисления функций f(x) = (x+1)×4, f(x) = (x+2)×2. F(x) = 2×x + 1. 10. Построить машину Тьюринга для вычисления функции I nm(x1, x2,…, xn) = xm. Исходные данные – записанные на ленте значения m, x1, x2,…, xn, разделенные запятыми. Результат – значение xm (все остальные значения должны быть стерты)***. Проверьте результаты работы созданных машин, протестировав их на различных входных данных (тесты разработайте самостоятельно). II. Какую функцию вычисляет машина Тьюринга с программой, представленной таблицей, приведенной ниже, если на ленте записано подряд x + 1 единиц, а слева и справа от них – символы e. Маркер находится против левой единицы. Таблица имеет вид: q1 q2 q3 q4 q5 q6 e q1 S e q3 S 1 q3 S 1 q3 S 1 q3 S e e q2 R e q6 R 1 q5 S 1 q4 R 1 q3 S 1 Покажите по шагам, как вычисляется результат выполнения приведенной выше программы машины для числа 15, записав число в предложенной системе. III. Какую функцию вычисляет машина Тьюринга с программой, представленной таблицей, если на ленте записано подряд x + 1 единиц, а слева и справа от них – символы e. Маркер находится против левой единицы. Таблица имеет вид: q1 q2 q3 q4 q5 e q1 S e q4 S 1 q4 R 1 q5 R e e q2 R e q3 R 1 q3 R 1 Покажите по шагам, как вычисляется результат выполнения программы построенной машины для числа 7. IV. Определить результат применения алгорифма Маркова с заданной схемой к заданной строке (показать по шагам, как применяются формулы подстановок). 1. Каков результат действия на слово P = nnnnnnnnnn нормального алгорифма со схемой Z = | nnn → abc | ca → ac | ba → nnnn | ? 2. Каков результат действия на слово P = hgdfasdfghjgdsadfgg нормального алгорифма со схемой F = | fg → sa | df →. hg | j → Λ | gg →. d |? 15 V. Имеется множество вычислимых функций P = { z(x), I nm(x1, x2,…, xn), Inc(x) }. (z(x) = 0, I nm(x1, x2,…, xn) = xm, Inc(x) = x + 1). Используя операции суперпозиции , примитивной рекурсии и минимизации , постройте функции 1. Dec(x) = x – 1, 2. Add(x, y) = x + y, 3. Sub(x, y) = x – y, 4. Mult(x, y) = x * y, 5. Power(x, y) = x y, 6. F(x) = x!, где x – целое неотрицательное число. Покажите порядок вывода формулы и пример вычисления функции для 0 и 3, подставляя указанные значения в построенную формулу. При построении функций можно использовать полученные ранее функции, расширяя ими базовый набор. VI. Напишите рекурсивную процедуру закраски фигуры. Используется два цвета (цвет границ фигур и цвет закраски). Покажите порядок закраски по шагам (постройте дерево вызова и выполните «заливку» (до 15 вызова процедуры), используя приведенную ниже схему). Начальная точка отмечена буквой “x” (первый вызов процедуры выполняется для точки с координатами, соответствующими выделенной на схеме клетке), каждой точке на экране соответствует элемент матрицы на схеме: х х 16 х VII. Напишите рекурсивную функцию на языке Pascal, вычисляющую функцию Маккарти («Функция 91») по следующему правилу: Маккарти(n) = n –10, если n>100, иначе Маккарти(Маккарти(n+11)). Построить дерево вызовов и показать состояние стека при вызове функции со следующими начальными значениями: n = 98. VIII. Напишите рекурсивную функцию на языке Pascal, вычисляющую функцию Аккермана по следующему правилу: Аккерман(m, n) = n+1, если m = 0 или иначе Аккерман(m–1, 1), если n = 0 или иначе Аккерман(m–1, Аккерман(m, n–1)). Построить дерево вызовов при вызове функции со следующими начальными значениями: n = 2, m = 1. Напишите программу, которая позволила бы ввести данные (числа m и n) с клавиатуры и вычислить и вывести на экран значение функции Аккермана. Проверьте полученный результат (дерево вызова), выполнив программу в пошаговом режиме. Измените входные данные. 17 Приложение 3 Примерный перечень задач для подготовки к контрольной работе №2 Задание 1. Постройте диаграммы Вирта для операторов языка Pascal. Задание 2. Постройте БНФ (формулы Бэкуса-Наура) для операторов языка Pascal. Задание 3. Постройте дерево вызовов (используйте написанные на паре описания процедур), дерево разбора и обратную польскую запись для следующих выражений: (A*B+C/D)*5–A*(2*B/(C+D)) A+B–C+D (((1+D))) A+(C*(A–5+D)*B)–D Задание 4. В программе на языке Pascal выделите лексемы (возьмите фрагменты любых программ), выпишите синтаксические правила, которым удовлетворяют использованные в программе конструкции. Задание 5. В программе на языке Pascal выделите лексемы (возьмите фрагменты любых программ). Задание 6. Дайте понятие грамматики и определите по виду приведенных правил, к какому классу относится язык L(G) (используйте классификацию по Хомскому): G = (A, N, R, S) A = {a, b, c, d, f} N = {A, B, C, D, F} R: F ::= AaBb A ::= c [ C | D ] d B ::= { dD } f aCb ::= aDb cCd ::= cAd D ::= aA | bB S =F Является ли строка cacddadacbdfdb словом в языке L(G)? Покажите порядок разбора (вывода) строки. Задание 7. Оцените сложность процедуры (в зависимости от исходных данных V): 1.procedure F (V: integer); var I,J,K: integer; S,T: real; begin T := 0; for I:=1 to V do begin S:=I*123; for J:=V downto 2 do for K:=1 to I+V*V do T:=(T+S)/5 end end; 18 2.procedure P (V: integer; var B: real); var M,K: integer; A: real; begin for M:=1 to V do begin A:=M+2; K:=2; while K<V do begin A:=A–V+M*K; B:=2–A; K:=K*K end end end; Дополнительные материалы для подготовки к контрольной по теме «Оценка сложности алгоритмов» Оценка алгоритмов, содержащих ветвления Для определения максимальной и минимальной сложность необходимо вычислить вес каждой ветви как сумму весов всех входящих в нее вершин и найти максимальное и минимальное значения по всем ветвям соответственно. Для определения средней сложности необходимо оценить частоты выбора ветвей. Под частотой ветви понимается отношение числа выполнений программы (алгоритма), при которых исполнились операторы, принадлежащие данной ветви, к общему числу исполнений этой программы. Средняя сложность программы (ее алгоритма) вычисляется как сумма произведений весов ветвей на их частоты. Если в программе имеются вложенные ветвления, то можно предложить метод оценки, основанный на оценке частоты, с которой встречаются определенные комбинации входных данных. Рассмотрим его. Пусть управляющий граф программы содержит ветвления, где выбор ветвей определяется условиями C1, C2, C3, …, Cn. Вид управляющего графа представлен на рис. 1. C3 C1 C2 Рис. 1. Пример управляющего графа с ветвлениями 19 Проверка условия C1 выполняется всегда, таким образом оно разбивает все ветви на две группы: для первой условие истинно, для второй – ложно. Условие C2 разбивает группу ветвей, для которых условие C1 истинно, еще на две группы, для которых истинны условия (C1 and C2) и (C1 and not C2) соответственно. Условие C3 также разбивает группу ветвей, для которых условие C1 ложно, еще на две группы, удовлетворяющих условиям (not C1 and C3) и (not C1 and not C3) соответственно. Для следующих ветвлений (до Cn) этот процесс «разбиения» ветвей на группы можно было бы продолжить. Выбор ветвей определяется комбинацией входных данных D. Множество комбинаций исходных данных D также можно разбить на две части D1 и D2 (два подмножества), порождаемые условием C1. В свою очередь D1 делится на D3 и D5, а D2 разбивается на D5 и D6 (рис. 2). Каждая область (подмножество D), которая не разбивается больше ни на какие другие более мелкие части, соответствует ветви в управляющем графе (ветви пересекаются в начальной части графа – для общих условий, определяющих их выбор). Все такие подмножества комбинаций входных данных (областей на рисунке) обозначим di. В том случае, когда все комбинации исходных данных являются равновероятными, частоту исполнения i-й ветви можно оценить как отношение мощности подмножества di к мощности всего множества D: pi = | di | / | D |. Если имеются оценки li веса (сложности) i-й ветви, то сложность такого алгоритма с ветвлениями можно оценить величиной k |d | T Avrg i li , i 1 | D | где k – количество всех ветвей. D2 D5 D D6 D3 D4 D1 Рис. 2. Разбиение множества комбинаций входных данных, соответствующее примеру управляющего графа с ветвлениями (рис. 1) Пример. Пусть алгоритм с ветвлением имеет вид read(X); if X < 0.5 then Y := (X + 0.5) * 2 else if X < 0.75 then Y := X * 2 + 0.5 + X**2 + X**3 else Y := X Допустим, что значение переменной X может принадлежать диапазону [0.00, 1.00], причем ввод любого значения из указанного диапазона равновероятен. Тогда вероятность того, что значение X [0.00, 0.50), примерно равна вероятности того, что X [0.50, 1.00]. В приведенном примере вероятность выбора ветви 20 Y := (X + 0.5) * 2 равна 0.5. При невыполнении условия X < 0.5 выбор ветви определяется проверкой условия X < 0.75. Причем ветви выбираются также равновероятно, поэтому частота выбора каждой равна примерно 0.25. Разбиение всего множества комбинаций (в данном случае каждая комбинация определяется только значением переменной X) показано на рис. 3. 0.00 0.50 d1 1.00 0.75 d2 X d3 Рис. 3. Геометрическая вероятность ввода значений переменной, определяемая длинами отрезков числовой прямой (значения равновероятны) Таким образом, при выполнении программы возможен выбор трех ветвей: 1) ветви Y := (X + 0.5) * 2, соответствующей условию X < 0.5, вес (сложность) которой составляет 5 (ввод, проверка условия, вычисление выражения (2 операции) и присваивание), а вероятность выбора – 0.5; 2) ветви Y := X * 2 + 0.5 + X**3, соответствующей условию not(X < 0.5) and (X < 0.75), вес (сложность) которой составляет 10 (ввод, проверка условия X < 0.5, проверка условия X < 0.75, вычисление выражения (6 операций) и присваивание), а вероятность выбора составляем 0.25; 3) ветви Y := X, соответствующей условию not(X < 0.5) and not(X < 0.75), вес (сложность) которой составляет 4 (ввод, проверка условия X < 0.5, проверка условия X < 0.75, и присваивание), а вероятность ее выбора – примерно 0.25. Средняя сложность алгоритма составляет TAvrg = 0,5 5 + 0,25 10 + 0,25 4 = 2,5 + 2,5 + 1 = 6. Определите максимальную и минимальную сложность приведенного алгоритма. Оценка алгоритмов, содержащих циклы со счетчиком Если выражения, определяющие начальное и конечные значения параметра цикла – константы, то можно посчитать, сколько раз будет выполняться цикл, и умножить это число на вес (сложность) тела цикла. Если число повторений зависит от исходных данных, то необходимо оценить значение разности между начальным и конечным значениями в худшем, лучшем и среднем случаях. Пример 1. Процедура содержит цикл вида for I := 1 to X do Тело цикла Допустим, что переменная X может принимать значения от 0 до 100 с равной вероятностью (1/101). Тело цикла выполняется X раз, причем худший случай реализуется при X = 100, а наилучший – при X = 0. Среднее число выполнений тела цикла равно tAvrg = 1/1010 + 1/1011 + 1/1012 + … + 1/101100 = = 1/101(0+1+2+…+100) = 1/101(0+100)/2101 = 50. Пример 2. Процедура содержит вложенные циклы вида for I := 1 to X do for J := I to X do Тело цикла Допустим, что переменная X может принимать значения от 1 до 5 с равной вероятностью (1/5). Внешний цикл выполняется X раз. Тело цикла выполняется X + (X – 1) + (X – 2) + … + 1 = X (X + 1)/2 21 раз, причем худший случай реализуется при X = 5, а наилучший – при X = 1. Таким образом, верхняя граница сложности равна X (X + 1)/2 = 5 (5 + 1)/2 = 15. Минимальное число выполнений тела цикла равно X (X + 1)/2 = 1 (1 + 1)/2 = 1. Среднее число выполнений тела цикла равно 5 1 X 1 1 5 1 X ( X ( X 1)) (1 2 2 3 3 4 4 5 5 6) 2 10 X 1 10 X 1 5 1 70 (2 6 12 20 30) 7. 10 10 Пример 3. Оценим сложность алгоритма умножения двух квадратных матриц A и B размерностью NN и получения в качестве результата третьей матрицы C: for I := 1 to N do {Цикл 1} for J := 1 to N do {Цикл 2} begin C[I,J] := 0; for K := 1 to N do {Цикл 3} C[I,J] := C[I,J] + A[I,K]* A[K,J] end В качестве параметра, определяющего сложность данных, в этом случае можно взять N. Сложность алгоритма определяется величиной T (N) = N (T1), где T1 – сложность тела цикла 1 по I, которая равна T1 = N (T2), где T2 – сложность тела цикла 2 по J и T2 = 1 + N (T3). Здесь сложность тела цикла 3 по K (T3) равна 3 (умножение, сложение и присваивание), а 1 операция – это присваивание начального значения элементу матрицы C. Выполняем подстановку и получаем выражение сложности алгоритма через сложность исходных данных: T (N) = N (N (1 + N 3)) = N (N + N 2 3) = N 2 + N 3 3 = 3N 3 + N 2. При оценивании сложности алгоритмов не были учтены операции, которые должны быть выполнении для организации самих циклов, в частности, присваивание значения параметру цикла, изменение значения параметра цикла, сравнение текущего значения параметра с граничным значением, заданным в заголовке цикла, и передача управления на начало тела цикла или на команду, следующую за циклом. Задание. Сделайте оценку сложности для приведенных примеров с учетом операций, задаваемых в заголовках циклов. Оценка алгоритмов, содержащих циклы с пред- или постусловием Оценка этих алгоритмов в общем случае сложнее, т.к. зависимость условия, определяющего, будет ли исполняться тело цикла и число его повторений, от исходных данных может быть достаточно сложной. При этом условие, заданное в цикле, делит все комбинации входных данных на два подмножества: для первого условие выполняется, а для второго – нет. Если комбинация исходных данных такова, что тело цикла выполняется, то необходимо установить зависимость числа повторений от того, как меняются данные. Эти оценки в каждом случае выполняются «индивидуально». 22 Задачи к теме «Формальные языки и грамматики» 1. Постройте синтаксическую диаграмму, описывающую идентификаторы, длиной не более четырех символов. 2. Постройте металингвистическую формулу, описывающую целые числа со знаком, включающие не более 5 цифр (используйте металингвистические формулы показателем кратности). 3. Сколько слов в языке, грамматика которого задается правилами: 1) S ::= DBC 2) B ::= aCb 3) C ::= b | 1 | a 4) D ::= a | 0 4. Сколько слов порождает следующая металингвистическая формула: 10 | 110 | 101[1 | 0 | 01 | 000]0 5. Расширим металингвистические формулы показателем кратности: конкатенацию n экземпляров цепочки будем записывать в виде n . Сколько различных слов задает формула 0011304 [1 | 10]n | 0n 1n | [1n | 005]n 6. Две формулы назовем эквивалентными, если они порождают одно и то же множество слов. Являются ли следующие формулы эквивалентными? F1 = 00 | 11 | {0 | 01}; F2 = {10 | 0} 7. Описать пересечение и объединение множеств цепочек, порождаемых следующими двумя формулами: F3 = 00 | 111 | {0 | 01}; F4 = {10 | 0}2 Задачи по теме «Рекурсия» (и «Формальные языки») 1. Нарисовать дерево вызовов процедур при синтаксическом анализе выражения S+T* (6+d*e)*f–q*h+8 2. Нарисовать дерево вызовов процедур при синтаксическом анализе выражения (((5))+(((4) – s + d)) + 3) 23 Приложение 4 Примерный перечень задач по теме «Рекурсивные типы данных» Задания по теме «Линейные списки»1 Создание списков 1. Напишите процедуру создания линейного списка, в информационные поля элементов которого последовательно заносятся номера с 1 до N (N водится с клавиатуры в главной программе). Рассмотрите два варианта процедуры: а) первый включенный в список элемент, имеющий номер 1, оказывается в хвосте списка (последним); б) первый включенный в список элемент, имеющий номер 1, оказывается в голове списка (первым). 2. Напишите рекурсивную процедуру создания линейного списка, в информационные поля элементов которого последовательно заносятся номера с 1 до N (N водится с клавиатуры в главной программе и передается в процедуру в качестве параметра). Рассмотрите два варианта процедуры, как и в предыдущем задании. 3. Напишите процедуру создания линейного списка, в информационные поля элементов которого заносятся числа, считываемые из файла (файл может оказаться пустым). Имя файла вводится с клавиатуры в главной программе и передается в процедуру в качестве параметра. Рассмотрите следующие варианты создания списка: а) первый включенный в список элемент оказывается в хвосте списка (последним); б) первый включенный в список элемент оказывается в голове списка (первым); в) элементы включаются в список в порядке возрастания: в информационном поле первого элемента списка должно быть записано минимальное значение, а последнего элемента – максимальное; г) элементы, содержащие отрицательные значения, заносятся всегда в конец списка, а положительные – в начало (в порядке считывания из файла), нулевые – между положительными и отрицательными. Перепишите все процедуры, написанные при выполнении заданий 1-3, для создания: циклического списка и двунаправленного списка. Обработка и преобразование списков 4. В программе построен линейный список. Напишите функцию подсчета количества его элементов (рекурсивный и нерекурсивный варианты). 5. В программе построен линейный список. Напишите функцию подсчета суммы всех значений, занесенных в информационные поля его элементов (рекурсивный и нерекурсивный варианты). 6. В программе построен линейный список. Напишите процедуру подсчета двух сумм: всех положительных и всех отрицательных значений, записанных в информационные поля элементов списка 7. В программе построен линейный список. Напишите функцию подсчета разности между суммами всех четных и всех нечетных значений, записанных в информационные поля элементов списка. 1 Входные данные для программ вводятся из текстовых файлов, если это не оговаривается специально. Подготовьте набор тестов для тестирования программы. 24 8. В программе построен линейный список. Напишите процедуру, создающую два новых линейных списка: а) список, включающий все положительные значения из элементов исходного списка, и список, включающий все отрицательные значение из элементов исходного списка; при включении элементов в новые списки, они удаляются из исходного списка; например: Исходный список Head –3 1 0 5 * Списки после выполнения процедуры Head 0 * Pos 1 5 * Neg –3 * б) список, включающий элементы, ссылающиеся на элементы исходного списка, содержащие в информационных полях положительные значения, и список, включающий элементы, ссылающиеся на элементы исходного списка, содержащие в информационных полях отрицательные значения. Исходный список Head –3 1 0 5 * Списки после выполнения процедуры Pos * Neg * Head 1 –3 0 25 5 * 9. В программе построен линейный список. Напишите итерационную и рекурсивную процедуры «обращения» списка – создания нового списка, включающего элементы, содержащие те же значения в информационных полях, что и элементы исходного списка, но в обратном порядке (первый элемент исходного списка должен стать последним, второй – предпоследним и т.д., последний – первым). 10. В программе построен линейный список. Напишите итерационную и рекурсивную процедуры уничтожения списка. 11. В программе построен линейный список. Напишите итерационную и рекурсивную процедуры удаления из списка элементов с повторяющимися в информационных полях значениями. Перепишите все процедуры, написанные при выполнении заданий 4-7, 10, 11 для обработки: циклического списка и двунаправленного списка. Применение линейных списков для реализации вычислений 12. Полином P(x) с целочисленными коэффициентами представлен списком. Каждый элемент списка содержит два информационных поля: показатель степени i переменной x и коэффициент ai при xi. Если в полиноме некоторый коэффициент ai равен нулю, то соответствующий элемент в список не включается. Вычислите значение y = P(x) этого полинома (показатели степени и коэффициенты считываются из текстового файла, каждая строка которого содержит два числа: показатель степени и соответствующий коэффициент) для конкретных значений x (значения x вводятся с клавиатуры в цикле до тех пор, пока не будет введено нулевое значение). 13. Полиномы P(x) с целочисленными коэффициентами представлены списками. Каждый элемент списка содержит два информационных поля: показатель степени i переменной x и коэффициент ai при xi. Если в полиноме некоторый коэффициент ai равен нулю, то соответствующий элемент в список не включается. Напишите процедуру сложения двух полиномов (показатели степени и коэффициенты считываются из текстовых файлов (значения показателей степеней и соответствующих коэффициентов двух полиномов содержатся в двух разных файлах, каждая строка которых содержит два числа: показатель степени и коэффициент)). Результат – полином, представленный новым списком. Выведите в текстовый файл полученные в результате вычислений показатели степеней и коэффициенты результирующего полинома, записанные в элементы списка (по паре чисел в строку). 14. Напишите процедуру умножения двух полиномов, представленных списками (как в предыдущем задании). Задания по темам «Бинарные деревья» и «Графы»2 1. Написать итерационную и рекурсивную процедуры уничтожения дерева. 2. Написать процедуру слияния деревьев. По завершении процедуры одно из двух деревьев должно быть уничтожено, а второе должно включать вершины, содержащие все значения, которые содержались в вершинах двух деревьев. 3. Написать процедуру обхода дерева по ярусам. Процедура должна вычислять число ярусов и количество вершин на каждом ярусе. 2 Входные данные для программ вводятся из текстовых файлов, если это не оговаривается специально. Подготовьте набор тестов для тестирования программы. 26 4. Высота дерева – это длина его самой длинной ветви. Дерево называется сбалансированным, если высоты левого и правого поддеревьев для каждой вершины дерева отличаются не более чем на единицу. Разработать и реализовать на языке Pascal алгоритм балансировки дерева при включении в него новой вершины*. 5. Написать процедуру удаления из графа всех вершин с заданным значением информационного поля. 6. Написать процедуру поиска кратчайшего пути между двумя вершинами графа, не имеющего циклов отрицательного веса, используя матричное представление графа и списковое представление*. 7. Написать процедуру, реализующую алгоритм, определяющий множество вершин, достижимых из заданной вершины. Используйте матричное и списковое представления графа*. 8. Написать процедуру поиска минимального сечения сети (максимального потока через сеть с одной входной и одной выходной вершиной). Используйте матричное и списковое представления графа*. 9. Написать процедуру «стягивания» в одну вершину всех вершин, информационное поле которых содержит заданное значение. При «стягивании» в графе остается только одна вершина, содержащая заданное значение, остальные вершины удаляются, но все исходящие из них и входящие в них дуги «передаются» оставшейся вершине. При этом петли, связывающие вершину с собой, не создаются. Не создаются также и параллельные дуги. Например, стянем вершины, содержащие значение 7: 2 6 1 0 3 7 1 5 0 7 4 2 6 3 7 7 27 Приложение 5 Примерный перечень задач для подготовки к контрольной № 3 Задачи к теме «Внешняя сортировка» 1. Сколько отрезков будет в файле записей с ключами 47, 9, 8, 76, 7, 6, 61, 5, 3, 4, 6, 58, 13, 24, 6, 7, 5, 6, 8, 42, 37, 55, 74, 6, 9, 11, 5, 4, 74, 5, 45, 37, 42, 5, 6, 3, 5, 3, 4 после 2-го слияния при использовании метода а) трехпутевого слияния; б) двухпутевого сбалансированного слияния файлов; в) фибоначчиевой сортировки? Задачи к теме «Хэширование» 2. Пусть коды букв имеют значения: A-1, B-2, C-3, D-4, E-5, F-6, G-7, H-8, I-9, J-10, K-11, L-12, M-13, N-14, O-15, P-16, Q-17, R-18, S-19, T-20, U-21, V-22, W-23, X-24, Y-25, Z-26. Размер хэш-таблицы N=37. Строки нумеруются с 0. Хэш-функция для идентификатора равна сумме кодов букв, составляющих его. Показать состояние таблицы после записи в нее последовательности идентификаторов: MAIL, BOOK, MAN, WWW, RINO, ROOM, PARIS, LIMA, KIT, PHONE, если используется а) линейное рехеширование; б) метод цепочек. Сколько коллизий было разрешено? 28 Приложение 6 Варианты проверочного теста по основам программирования Вариант 1 1. Вычислить выражение (ord(chr(ord(’8’)+1))-ord(’0’))+round(cos(sin(0))+3/1.5) 1 10 2 11 3 12 4 13 5 Выражение содержит ошибку 2. Какое из следующих выражений всегда истинно? а. (A and B) or (not A and not B) б. (A and A or not A and A) в. (not A or A and A) 1 а 2 б 3 в 4 Все 5 Ни одно 3. Дана программа: program s; Const N=10; Var A:array[1..N] of integer; i,j:integer; procedure Exchange (a,b:integer); var c:integer; begin c:=a;a:=b;b:=c;end; begin for i:=1 to N-1 do for j:=i+1 to N do if A[j]<A[j-1] then Exchange(A[j],A[j-1]); end. Как программа изменяет массив А? 1 Сортирует массив по убыванию 2 Сортирует массив по возрастанию 3 Меняет местами первый и последний элементы массива 4 Меняет местами минимальный и максимальный элементы массива 5 Не изменяет массив 4. В программе описан массив А (A:array [1..10] of real). Дано описание функции: function f1(i:integer):integer; begin f1:=f1(i-1)*i+A[i]; end; Что будет выведено на экран в результате вызова функции – выполнения оператора write(f1(3)) ? 1 Сумма первых 3-х элементов массива 2 Сумма элементов массива с 3-го по 10-ый 3 Сумма всех элементов массива 4 3*A[1]+2*A[2]+A[3] 5 Ничего не будет выведено, т.к. описание функции содержит ошибку 29 5. Что будет выведено на экран при выполнении программы: program S; var K: integer; F: text; function N(A: integer; B: integer; var C: integer):integer; begin if K>0 then begin K:=B*3-A;C:=C-C div 2; N:=B-N(K,C div 2,C); write(F, C); end else N:=K+A end; begin assign(F, ‘FILE_TXT.TXT’); rewrite(F); K:=5; write(N(2*K,K,K)) end. 1 1 2 Программа не закончит работу 3 3 4 4 5 531 6. В программе описаны переменные Y: real; A: real; B: char; C: integer. Какое из описаний соответствует вызову Y:=X(A*2, ord(B), C, B, A+C) ? function X(a:real;b:integer;var c:real;d:char;e:real):integer; function X(a:real;b:real;var c:integer;var d:char;e:real):integer; function X(a:real;b:integer;c:integer; d:char;var e:real):char; procedure X(a:real;b:real;c:real; var d:char; e:real); function X(a:real;b:real;var c:integer; var d:char; var e:real):real; 1 2 3 4 5 Вариант 2 1. Вычислить выражение (ord(chr(ord(’8’)+1))-ord(’0’))+round(cos(sin(0))+3 div 1.5) 1 10 2 11 3 12 5 Выражение содержит ошибку 4 13 2. Какое из следующих выражений всегда истинно? а. (A and B) or (not A and not B) б. (A and A or not A and A) в. (not A or A) and (B and not B) 1 а 2 б 3 в 4 Все 3. Дана программа: program s; Const N=10; Var A:array[1..N] of integer; i,j:integer; procedure Exchange (a,b:integer); var c:integer; begin c:=a;a:=b;b:=c;end; begin for i:=1 to N-1 do for j:=i+1 to N do if A[j]<A[j-1] then Exchange(A[j],A[j-1]); end. 30 5 Ни одно Как программа изменяет массив А? 1 Не изменяет массив 2 Сортирует массив по убыванию 3 Сортирует массив по возрастанию 4 Меняет местами первый и последний элементы массива 5 Меняет местами минимальный и максимальный элементы массива 4. В программе описан массив А (A:array функции: [1..10] of real). Дано описание function F1(I:integer):integer; begin F1:= F1(I-1) * I + A[I] end; Что будет выведено на экран в результате вызова функции – выполнения оператора write(F1(5)) ? 1 Сумма первых 3-х элементов массива 2 Сумма элементов массива с 3-го по 10-ый 3 Сумма всех элементов массива 4 5*A[3]+2*A[4]+A[5] 5 Ничего не будет выведено, т.к. описание функции содержит ошибку 5. Что будет выведено на экран при выполнении программы: program S; var K: integer; F: text; function N(A: integer; B: integer; var C: integer):integer; begin if K>0 then begin K:=B*3-A;C:=C-C div 2; N:=B-N(K,C div 2,C); write(F, C); end else N:=K+A end; begin assign(F, ‘FILE_TXT.TXT’); rewrite(F); K:=5; write(N(2*K,K,K)) end. 1 1 2 Программа не закончит работу 3 3 4 4 5 531 6. В программе описаны переменные Y: real; A: real; B: char; C: integer. Какое из описаний соответствует вызову Y:=X(A*2, ord(B), C, B, A+C) ? 1 2 3 4 5 function X(a:real;b:integer;var c:real;d:char;e:real):integer; function X(a:real;b:real;var c:integer;var d:char;e:real):integer; procedure X(a:real;b:real;c:real; var d:char; e:real); function X(a:real;b:integer;c:integer; d:char;var e:real):char; function X(a:real;b:real;var c:integer; var d:char; var e:real):real; 31 Задания для выполнения на компьютере по теме «Основы программирования» (типы данных, ввод и вывод, массивы, циклы и ветвления) 1. В текстовом файле содержится следующая информация (4 строки): Массив (матрица А) содержит следующие значения (по строкам): 1 2 3 4 5 6 7 8 9 Необходимо в основной программе организовать ввод данных, заполнив ими двумерный массив (матрицу A), транспонировать матрицу с помощью написанной Вами процедуры и в основной программе вывести результат работы процедуры в текстовый файл в формате: Результат транспонирования матрицы А: столбцы строки 1 2 3 -----------1 | 1 4 7 2 | 2 5 8 3 | 3 6 9 2. Напишите программу, решающую описанную выше задачу, организовав ввод данных не из файла, а с клавиатуры, и вывод результатов на экран. 3. Написать программу, которая вводит массив записей содержащих сведения о студентах группы: фамилию, имя и отчество, дату рождения, оценки, полученные в сессию. Сохранить введенные данные в файле. Найти для каждого студента средний балл и вывести результаты на экран. 4. Используя возможности Pascal, включите в программу, выполняющую суммирование элементов массива, вводимых из текстового файла, средства контроля выхода за границы диапазонов допустимых значений. 5. Организуйте ввод последовательности чисел с клавиатуры и найдите: а) сумму всех введенных чисел; б) сумму положительных чисел; в) максимум среди отрицательных чисел. Работа программы завершается, когда с клавиатуры будет веден символ ‘*’. Используйте возможности Pascal для предотвращения ошибок, связанных с вводом недопустимых значений и выходом за границы допустимых диапазонов значений при вычислениях. 6. Перепишите программу (предыдущее задание), организовав ввод данных из текстового файла. 32 Приложение 7 Вопросы для самоконтроля 1. Понятие алгоритма и свойства алгоритмов. Способы записи алгоритмов. Примеры. 2. Понятие рекурсии. Рекурсивные алгоритмы: определение и виды рекурсии. Примеры рекурсивных алгоритмов различных видов. Реализация рекурсии и использование стека. Рекурсия и итерация. Примеры, сравнение. 3. Формализация понятия алгоритма: машина Тьюринга. Представление машин Тьюринга с помощью диаграмм. Табличное представление программ машины Тьюринга. Сравнение. Примеры. Композиция машин Тьюринга. Связь с методами разработки алгоритмов. 4. Методы разработки алгоритмов. Суперпозиция, итерация и рекурсия. 5. Проблема алгоритмической разрешимости. Примеры алгоритмически неразрешимых задач. 6. Вычислимые функции. Базовый набор функций и операции над функциями: суперпозиция, примитивная рекурсия, минимизация. Примеры. 7. Формализация понятия алгоритма: нормальные алгорифмы Маркова, определение и выполнение. Примеры. 8. Задача анализа сложности алгоритмов. Понятие сложности. Оценки сложности. Использование управляющего графа для оценки сложности алгоритма. Оценка сложности управляющих структур. Оценка сложности рекурсивных алгоритмов. 9. Понятие сложности задачи и классы сложности задач. Типы задач. Понятие сводимости, полиномиальная сводимость. 10. Понятие типа данных. Представление данных в памяти компьютера. Рекурсивные типы данных: определение, примеры. 11. Операции над линейными списками: создание списков, включение элементов в списки (рассмотреть различные способы). 12. Поиск элементов списков, сравнение списков. Операции над линейными списками: удаление элементов списков. Операции над бинарными деревьями: включение вершины в дерево. 13. Обход деревьев, подсчет числа вершин в дереве. Подсчет числа вершин, удовлетворяющих заданному условию. Удаление вершины дерева. 14. Понятие графа. Способы представления графов. Операции над графами: добавление вершины, добавление дуги. Операции над графами: поиск вершины, удаление вершины, удаление дуги. Примеры алгоритмов на графах (поиск кратчайшего пути, поиск циклов, алгоритм построения остовного дерева, выделения связных компонентов…). 15. Формальные языки и грамматики. Определение языка, описание языка. Понятие грамматики. Классификация формальных языков. Описание синтаксиса языка с помощью синтаксических диаграмм. Описание синтаксиса языка с помощью металингвистических формул. Примеры. 16. Сортировка и поиск. Сортировка массивов простыми включениями. Сортировка массивов простым выбором. Алгоритм быстрой сортировки. 17. Алгоритмы внешней сортировки. Сортировка последовательных файлов с использованием двух файлов (двухпутевое сбалансированное слияние файлов). Фибоначчиева сортировка. 18. Понятие хеширования. Построение хеш-функции. Разрешение коллизий, линейное рехеширование, случайное рехеширование. Разрешение коллизий: метод цепочек. По каждому вопросу необходимо приводить примеры. Желательно не только те, которые разбирались на лекциях (для получения высоких оценок – обязательно). Для получения хорошей оценки нужно показать, что имеются навыки самостоятельной работы с материалом, использования дополнительных источников, умение связать материал различных вопросов, проиллюстрировать его примерами из практики. 33 Для получения хорошей оценки для приведенных примеров алгоритмов нужно получать оценки сложности, показывая, как сложность вычисляется 34