
- •160001, Г. Вологда, ул. Челюскинцев, 3.
- •Предисловие
- •Введение
- •Раздел 1. Теория информации
- •Глава 1. Исходные понятия информатики
- •1.1. Начальные определения
- •1.2. Формы представления информации
- •1.3. Преобразование сообщений
- •Контрольные вопросы и задания
- •Глава 2. Понятие информации в теории Шеннона
- •2.1. Понятие энтропии
- •2.1.1. Энтропия как мера неопределенности
- •2.1.2. Свойства энтропии
- •2.1.3. Условная энтропия
- •2.2. Энтропия и информация
- •2.3. Информация и алфавит
- •Контрольные вопросы и задания
- •Глава 3. Кодирование символьной информации
- •3.1. Постановка задачи кодирования, Первая теорема Шеннона
- •3.2. Способы построения двоичных кодов
- •3.2.1. Алфавитное неравномерное двоичное кодирование сигналами равной длительности. Префиксные коды
- •3.2.2. Равномерное алфавитное двоичное кодирование. Байтовый код
- •3.2.3. Алфавитное кодирование с неравной длительностью элементарных сигналов. Код Морзе
- •3.2.4. Блочное двоичное кодирование
- •Контрольные вопросы и задания
- •Глава 4. Представление и обработка чисел в компьютере
- •4.1. Системы счисления
- •4.2. Представление чисел в различных системах счисления
- •4.2.1. Перевод целых чисел из одной системы счисления в другую
- •4.2.2. Перевод дробных чисел из одной системы счисления в другую
- •4.2.3. Понятие экономичности системы счисления
- •4.2.4. Перевод чисел между системами счисления 2 ↔ 8 ↔ 16
- •4.2.5. Преобразование нормализованных чисел
- •4.3. Кодирование чисел в компьютере и действия над ними
- •4.3.1. Кодирование и обработка в компьютере целых чисел без знака
- •4.3.2. Кодирование и обработка в компьютере целых чисел со знаком
- •4.3.3. Кодирование и обработка в компьютере вещественных чисел
- •Контрольные вопросы и задания
- •Глава 5. Передача информации
- •5.1. Общая схема передачи информации в линии связи
- •5.2. Характеристики канала связи
- •5.3. Влияние шумов на пропускную способность канала
- •5.4. Обеспечение надежности передачи и хранения информации
- •5.4.1. Постановка задачи
- •5.4.2. Коды, обнаруживающие ошибку
- •5.4.3. Коды, исправляющие одиночную ошибку
- •5.5. Способы передачи информации в компьютерных линиях связи
- •5.5.1. Канал параллельной передачи
- •5.5.2. Последовательная передача данных
- •5.5.3. Связь компьютеров по телефонным линиям
- •Контрольные вопросы и задания
- •Глава 6. Хранение информации
- •6.1. Классификация данных. Проблемы представления данных
- •6.2. Представление элементарных данных в озу
- •6.3. Структуры данных и их представление в озу
- •6.3.1. Классификация и примеры структур данных
- •6.3.2. Понятие логической записи
- •6.3.3. Организация структур данных в озу
- •6.4. Представление данных на внешних носителях
- •6.4.1. Иерархия структур данных на внешних носителях
- •6.4.2. Особенности устройств хранения информации
- •Контрольные вопросы и задания
- •Раздел 2. Алгоритмы. Модели. Системы
- •Глава 7. Элементы теории алгоритмов
- •7.1. Нестрогое определение алгоритма
- •7.2. Рекурсивные функции
- •7.3. Алгоритм как абстрактная машина
- •7.3.1. Общие подходы
- •7.3.2. Алгоритмическая машина Поста
- •7.3.3. Алгоритмическая машина Тьюринга
- •7.4. Нормальные алгоритмы Маркова
- •7.5. Сопоставление алгоритмических моделей
- •7.6. Проблема алгоритмической разрешимости
- •7.7. Сложность алгоритма
- •Контрольные вопросы и задания
- •Глава 8. Формализация представления алгоритмов
- •8.1. Формальные языки
- •8.1.1. Формальная грамматика
- •8.1.2. Способы описания формальных языков
- •8.2. Способы представления алгоритмов
- •8.2.1. Исполнитель алгоритма
- •8.2.2. Строчная словесная запись алгоритма
- •8.2.3. Графическая форма записи
- •8.2.4. Классификация способов представления алгоритмов
- •8.3. Структурная теорема
- •Контрольные вопросы и задания
- •Глава 9. Представление о конечном автомате
- •9.1. Общие подходы к описанию устройств, предназначенных для обработки дискретной информации
- •9.2. Дискретные устройства без памяти
- •9.3. Конечные автоматы
- •9.3.1. Способы задания конечного автомата
- •9.3.2. Схемы из логических элементов и задержек
- •9.3.3. Эквивалентные автоматы
- •Контрольные вопросы и задания
- •Глава 10. Модели и системы
- •10.1. Понятие модели
- •10.1.1. Общая идея моделирования
- •10.1.2. Классификация моделей
- •Модели структурные и функциональные
- •Модели натурные и информационные
- •Модели проверяемые и непроверяемые
- •Модели по назначению
- •10.1.3. Понятие математической модели
- •10.2. Понятие системы
- •10.2.1. Определение объекта
- •10.2.2. Определение системы
- •10.2.3. Формальная система
- •10.2.4. Значение формализации
- •10.3. Этапы решения задачи посредством компьютера
- •10.4. Об объектном подходе в прикладной информатике
- •Контрольные вопросы и задания
- •Заключение
- •Приложение а. Элементы теории вероятностей
- •А.1. Понятие вероятности
- •А.2. Сложение и умножение вероятностей
- •A.3. Условная вероятность
- •Контрольные вопросы и задания
- •Приложение б. Некоторые соотношения логики
- •Глоссарий
- •Список литературы
- •Содержание
- •Глава 4. Представление и обработка чисел в компьютере 45
- •Глава 5. Передача информации 69
- •Глава 6. Хранение информации 83
- •Раздел 2. Алгоритмы. Модели. Системы 98
- •Глава 7. Элементы теории алгоритмов 99
- •Глава 8. Формализация представления алгоритмов 120
- •Глава 9. Представление о конечном автомате 134
- •Глава 10. Модели и системы 147
8.2.2. Строчная словесная запись алгоритма
В соответствии с рассмотренными выше способами описания формальных языков в представлении алгоритмов можно выделить две основные формы: символьную (словесную) и графическую.
Строчная запись, как ясно из названия, представляет собой последовательность строк, каждая из которых содержит описание одного или нескольких элементарных действий. Эти строки могут иметь метки в виде букв или порядковых числовых номеров. Логика алгоритма, т.е. порядок выполнения действий, задается либо в явном виде путем указания метки последующей строки, либо в неявном - по умолчанию управление передается строке, следующей за выполненной. «Элементарность» действия определяется возможностями исполнителя.
Данный способ представления алгоритма следует считать основным, поскольку последовательностью строк может быть записана алгоритмическая нотация для любого исполнителя - как человека, так и технического устройства. Для человека строчная алгоритмическая запись может быть максимально приближена к естественному языку. Для технического устройства запись производится на специализированном формализованном языке.
Недостатком строчной формы представления алгоритма является неудобство целостного восприятия его логической структуры. Указание об изменении естественной последовательности действий в строчной записи выглядит в виде ссылки на строку с меткой. В случае достаточно сложного алгоритма такие ссылки затрудняют уяснение логики и последовательности действий, что необходимо при проверке и отладке алгоритма.
Рассмотрим несколько примеров строчной записи алгоритмов для различных исполнителей.
Пошагово-словесная форма представляет собой пронумерованную последовательность строк, каждая из которых содержит описания конкретных действий на естественном языке. Данная форма применяется в том случае, если исполнителем является человек. Обычно в качестве примеров алгоритмов, представленных в такой форме, приводят кулинарные рецепты, инструкции по использованию каких-либо устройств, указания по посадке деревьев и т.п. Однако примеры эти нельзя признать корректными, поскольку в них идет речь не об обработке информации, а об управлении действиями, направленными на получение некоторого материального результата. Примерами данной формы представления могут служить алгоритмы математических вычислений над конечными числами. Рассмотрим хорошо известный со школы алгоритм Евклида нахождения наибольшего общего делителя двух натуральных чисел (а и b); его пошагово-словесное описание выглядит следующим образом:
1. Если а = b, результатом считать а; закончить вычисления.
2. Если а > b, найти разность а - b; новым значением а считать значение разности; перейти к п. 1;
3. Если b > а, найти разность b - а; новым значением b считать значение разности; перейти к п. 1;
Удобство пошагово-словесной формы - в ее универсальности (по отношению к классам описываемых алгоритмов), использовании естественного национального языка для записи конструкций, отсутствии строгой формализации. Форма широко используется для представления различных учебных алгоритмов.
Формула - строчная запись действий, обеспечивающих обработку числовых, символьных или логических данных. Формулы, предназначенные для исполнителя «человек», не обязательно могут быть строчными - это приводит к некоторой неоднозначности порядка действий, не сказывающейся, однако, на результат вычислений вследствие дистрибутивного и сочетательного законов.
Пример:
Если же формула записывается для вычисления компьютером, она представляется строго в строчной форме, а для однозначности выполнения действий устанавливаются приоритеты операций. Например, в языке PASCAL для математических и логических операций приняты следующие приоритеты:
операции в скобках;
возведение в степень, вычисление значения стандартных функций и процедур-функций;
логическое отрицание NOT;
умножение, деление, целочисленное деление (div), остаток от целочисленного деления (mod), логическое И (AND);
сложение, вычитание, логическое ИЛИ (OR);
операции отношения (>, <, =, >=, <=,< >).
Помимо указанных приоритетов принимается дополнительное правило:
при наличии операций равного приоритета они выполняются в порядке слева направо.
Приведенная выше формула, записанная в соответствии с приоритетами и правилом, будет выглядеть следующим образом:
Обработка символьной информации производится предназначенными для этого функциями и процедурами.
Псевдокод - ориентированный на исполнителя «человек» частично формализованный язык, позволяющий записывать алгоритмы в форме, весьма близкой к алголоподобным языкам программирования. Термин «частично формализованный» в данном случае означает, что в псевдокоде строго определены только правила записи управляющих структур, а описание самих действий остается естественным. Псевдокод имеет русскоязычную основу и используется, в основном, при обучении азам программирования.
Алгоритм представленный с помощью автокода, представляет собой последовательность строк, в каждой из которых содержится описание действий либо по обработке данных, либо по управлению процессом обработки. Для записи управляющих структур приняты следующие обозначения:
внешнее оформление: АЛГ - начало алгоритма, ПРОЦ - начало процедуры, КНЦ; - конец процедуры, КНЦ. - конец алгоритма;
ветвление: ЕСЛИ ...ТО...ИНАЧЕ...ВСЕ; после ЕСЛИ ставится описание логического условия, по которому происходит ветвление, после ТО - описание действий (их может быть несколько), которые исполняются при значении условия TRUE, если ветвление полное - после ИНАЧЕ описываются альтернативные действия, в любом случае в конце ставится слово ВСЕ, которое служит признаком окончания данной конструкции;
цикл: ПОКА...ПОВТОРЯТЬ...КЦ; после ПОКА ставится описание логического условия выполнения команд цикла, после ПОВТОРЯТЬ - описание действий (тела цикла), КЦ - признак конца циклической конструкции.
Часто при записи алгоритма отдельные действия заканчиваются разделителем (например, «;») - это позволяет избежать ошибок в случае, если описание действия занимает не одну строку. Помимо этого, для удобочитаемости и наглядности применяется так называемая «структурная запись», при которой запись отдельных элементов структур производится не с начала строки, а с отступом, показывающим вложенность и подчиненность этих элементов.
В качестве примера алгоритма, записанного с помощью псевдокода, приведем рассмотренный выше алгоритм Евклида нахождения НОД двух целых чисел (а и b).
Удобство использования псевдокода - в сочетании относительной строгости синтаксических конструкций и их русскоязычной основы. Близость конструкций псевдокода языкам программирования позволяет легко перейти от одного к другому. Однако отсутствие формальных правил записи действий не позволяет использовать псевдокод для составления алгоритмов, исполнителями которых являются технические устройства.
Язык программирования - искусственный формализованный язык, предназначенный для записи алгоритма для исполнителя «компьютер», метаязыком которого является естественный язык. Язык программирования строго фиксирует (т.е. определяет) и изображение управляющих структур, и описание допустимых действий, и синтаксические правила построения сложных структур.
Различают языки низкого уровня (машинно-ориентированные) и высокого уровня (машинно-независимые). К языкам первого типа относятся:
машинный язык (язык машинных кодов) - совокупность команд, интерпретируемых и исполняемых компьютером; каждый оператор программы на этом языке является машинной командой, а все данные отыскиваются по абсолютным значениям адресов, по которым они располагаются в ОЗУ;
ассемблер (макроассемблер) - язык символического кодирования - операторами языка являются машинные команды, которым приписываются мнемонические обозначения, а в качестве операндов используются не конкретные адреса в ОЗУ, а их символические имена.
Пример команд ассемблера:
CLA - очистить один из регистров сумматора (аккумулятор);
ADD - сложение содержимого ячейки, номер которой написан после команды, с содержимым аккумулятора; результат остается в аккумуляторе;
MOV - содержимое аккумулятора пересылается в ячейку с номером, записанным вслед за командой;
HLT - стоп.
Безусловно, ассемблеры содержат и другие команды.
Рассмотрим простой пример сложения чисел a, b и с. Результат должен присваиваться переменной d.
Запись алгоритма производится в текстовом редакторе с ASC-кодировкой. Ясно, что для преобразования текста в последовательность машинных команд необходима еще одна промежуточная программа - она называется компилятор. На этапе компиляции производится также распределение данных в ОЗУ; при этом вместо имен переменных подставляются относительные адреса ячеек, в которых данные располагаются. Абсолютные адреса данным присваивает операционная система при размещении программы в ОЗУ компьютера перед ее использованием.
Ассемблер является машинно-зависимым языком, т.е. записанная на нем программа может исполняться лишь на той технике, точнее тем типом процессора, ассемблер которого был использован.
Для всех языков высокого уровня общим является то, что ориентированы они не на систему команд той или иной машины, а на систему операторов, характерных для записи определенного класса алгоритмов. Примерами таких операторов, содержащихся во всех языках программирования, являются операторы присваивания, условные операторы и операторы циклов - причина этого будет обсуждаться далее; помимо этого обязательно имеются операторы ввода-вывода для организации взаимодействия программы с пользователем.
По функциональному назначению языки программирования высокого уровня различают на проблемно-ориентированные и универсальные. Из названий классов ясно, что первые предназначены для решения каких-то специфических задач из некоторой отрасли знаний.
Примерами являются язык FORTRAN (FORmula TRANslator) -язык решения сложных научных и инженерных задач (кстати, это был первый язык программирования высокого уровня); COBOL (Common Business Oriented Language) - язык для решения экономических и коммерческих задач; LISP (List Processing Language) -язык, используемый в решении задач искусственного интеллекта. К универсальным языкам относятся PASCAL (Philips Automatic Sequence CALculator), BASIC (Beginner ALL-purpose Symbolic Instruction Code), С (C++), Jawa, а также современные среды визуального программирования DELPHI, VISUAL BASIC и др. Эти языки позволяют решить, вообще говоря, любую задачу, хотя трудоемкость решения конкретной задачи в разных языках будет различаться.
Другой признак, в соответствии с которым возможна классификация языков программирования, является парадигма (концепция) программирования, т.е. совокупность основополагающих идей и подходов, определяющих модель представления данных и их обработки, а также методологии программирования. Основные различия в парадигмах представлены в табл. 8.1.
Таблица 8.1
Парадигма программирования |
Представление программ и данных |
Исполнение программы |
Связь частей программы между собой |
Процедурное |
Программа и данные представляют собой отдельные, не связанные друге другом элементы |
Последовательное выполнение операторов |
Возможна только через совместно обрабатываемые данные |
Объектно-ориентированное |
Данные и методы их обработки инкаспулированы в рамках единого объекта |
Последовательность событий и реакций объектов на эти события |
Отдельные части программы могут наследовать методы и элементы данных друг у друга |
Логическое |
Данные и правила их обработки объединены в рамках единого логического структурного образования |
Преобразование логического образования в соответствии с логическими правилами |
Разбиение программы на отдельные независимые части затруднительно |
В настоящее время в распоряжении программиста имеется весьма обширный спектр языков-инструментов, из которых для любой конкретной задачи можно выбрать тот, что позволит решить ее оптимальным путем.
Снова приходим к высказанной ранее мысли: компьютер по отношению к пользователю оказывается не единственным исполнителем, а предоставляется множеством исполнителей, из которых следует выбрать наиболее подходящий для задачи.