1
5
3
-
http://books.altspu.ru/files/original/111/129/_[650].png
9054cadda510f256942e1d706d8fc36e
http://books.altspu.ru/files/original/111/129/moskalenko[mini].pdf
2ceb0fca6cef7ef1e0e0a5e8760ac6e5
PDF Text
Text
Содержание
�Содержание
Об издании
Основной титульный экран
Дополнительный титульный экран непериодического издания – 1
Дополнительный титульный экран непериодического издания – 2
�Содержание
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Алтайский государственный педагогический университет»
(ФГБОУ ВО «АлтГПУ»)
Р.Ю. Ракитин, Е.В. Москаленко
Компьютерные сети
Учебное пособие
Барнаул
ФГБОУ ВО « АлтГПУ»
2019
Об издании - 1, 2, 3.
ISBN 978-5-88210-942-3
�Содержание
УДК 004.71(075)
ББК 32.971.35я73
Р191
Ракитин, Р.Ю.
Компьютерные сети [Электронный ресурс] : учебное пособие / Р.Ю. Ракитин, Е.В. Москаленко. –
Барнаул : АлтГПУ, 2019. – Систем. требования: PC не ниже класса Intel Celeron 2 ГГц ; 512 Мb RAM ;
Windows XP/Vista/7/8/10 ; Adobe Acrobat Reader ; SVGA монитор с разрешением 1024х768 ; мышь.
ISBN 978-5-.88210-942-3
Рецензенты:
Полетаев Г.М., доктор физико-математических наук, заведующий кафедрой высшей математики и
математического моделирования Алтайского государственного технического университета
им. И.И. Ползунова;
Аксенов М.С., кандидат физико-математических наук, доцент кафедры теоретических основ
информатики Алтайского государственного педагогического университета
Учебное пособие содержит теоретический материал по основам организации, принципам построения
и функционирования современных компьютерных сетей, а также практические руководства по
разработке web-сайтов и моделированию компьютерных сетей.
Учебное пособие предназначено для студентов и преподавателей высших и среднеспециальных
учебных заведений при изучении темы «Компьютерные сети».
Рекомендовано к изданию редакционно-издательским советом АлтГПУ 30.05.2019 г.
Текстовое (символьное) электронное издание.
Системные требования:
PC не ниже класса Intel Celeron 2 ГГц ; 512 Мb RAM ; Windows XP/Vista/7/8/10 ; Adobe Acrobat Reader ;
SVGA монитор с разрешением 1024х768 ; мышь.
Об издании - 1, 2, 3.
�Содержание
Электронное издание создано при использовании программного обеспечения Sunrav BookOffice.
Объём издания - 32 500 КБ.
Дата подписания к использованию: 09.09.2019
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Алтайский государственный педагогический университет» (ФГБОУ ВО «АлтГПУ»)
ул. Молодежная, 55, г. Барнаул, 656031
Тел. (385-2) 36-82-71, факс (385-2) 24-18-72
е-mail: rector@altspu.ru, http://www.altspu.ru
Об издании - 1, 2, 3.
�Содержание
Содержание
Введение
Глава 1. Введение в компьютерные сети
1.1. Вычислительная и телекоммуникационная технологии
1.2. Мультипрограммирование
1.3. Многотерминальные системы – прообраз сети
1.4. Первые компьютерные сети. Появление глобальных сетей
1.5. Первые локальные сети
1.6. Создание стандартных технологий локальных сетей
1.7. Конвергенция локальных и глобальных сетей
1.8. Современные тенденции
Контрольные вопросы к главе 1
Глава 2. Общие принципы построения сетей
2.1. Классификация компьютерных сетей
2.2. Взаимодействие компьютеров в сети
2.3. Средства телекоммуникации
2.4. Базовые сетевые топологии
2.5. Доступ к среде передачи
2.6. Принципы разделения среды
2.7. Физическая структуризация локальной сети
2.8. Логическая структуризация сети на разделяемой среде
Контрольные вопросы к главе 2
Глава 3. Архитектура и стандартизация сетей
3.1. Протокол и стек протоколов
3.2. Службы и протоколы
3.3. Источники стандартов
3.4. Эталонная модель OSI
3.5. Эталонная модель TCP/IP
Контрольные вопросы к главе 3
Глава 4. Технологии физического уровня
4.1. Линии связи
4.2. Типы кабелей
4.3. Коммуникационное оборудование вычислительных сетей
Контрольные вопросы к главе 4
Глава 5. Беспроводная передача данных и беспроводные технологии
5.1. Беспроводная линия связи
5.2. Беспроводные системы
�Содержание
5.2.1. Двухточечная связь
5.2.2. Связь одного источника и нескольких приемников
5.3. Спутниковые системы
5.3.1. Геостационарный спутник
5.3.2. Средневысотные спутники
5.3.3. Низкоорбитальные спутники
5.4. Технология Bluetooth
5.5. Технология Wi-Fi
5.5.1. Принцип работы Wi-Fi
5.5.2. Основные стандарты Wi-Fi
5.5.3. Преимущества и недостатки Wi-Fi
5.5.4. Юридический статус Wi-Fi
Контрольные вопросы к главе 5
Глава 6. Мобильные системы
6.1. Мобильная связь
6.2. Поколения связи
6.2.1. Поколение 1G
6.2.2. Поколение 2G
6.2.3. Поколение 2.5G
6.2.4. Поколение 3G
6.2.5. Поколение 3.5G
6.2.6. Поколение 4G. LTE
6.2.7. Поколение 5G
Контрольные вопросы к главе 6
Глава 7. Коммутация каналов и пакетов
7.1. Коммутация каналов
7.1.1. Элементарный канал
7.1.2. Составной канал
7.1.3. Неэффективность при передаче пульсирующего трафика
7.2. Коммутация пакетов
7.2.1. Буферизация пакетов
7.2.2. Дейтаграммная передача
7.2.3. Передача с установлением логического соединения
7.2.4. Передача с установлением виртуального канала
7.3. Сравнение сетей с коммутацией каналов и пакетов
Контрольные вопросы к главе 7
Глава 8. Протокол межсетевого взаимодействия
8.1. Назначение, функции и особенности протокола IP
�Содержание
8.2. Протокол IPv4
8.3. Протокол IPv6
Контрольные вопросы к главе 8
Глава 9. Адресация в сетях на примере стека протоколов TCP/IP
9.1. Стек протоколов TCP/IP
9.2. Типы адресов стека TCP/IP
9.2.1. Локальные адреса
9.2.2. Сетевые IP-адреса
9.2.3. Доменные имена
9.3. Формат IP-адреса
9.4. Классы IP-адресов
9.5. Использование масок при IP-адресации
9.6. Отображение IP-адресов на локальные адреса
9.7. Протокол DHCP
9.7.1. Режимы DHCP
9.7.2. Алгоритм динамического назначения адресов
Контрольные вопросы к главе 9
Глава 10. Проектирование локальных сетей в программе логического моделирования
телекоммуникационной сети NetEmul
Лабораторная работа № 1. Программа логического моделирования телекоммуникационной сети
«NetEmul»
Лабораторная работа № 2. Соединение ЭВМ в сеть
Лабораторная работа № 3. Использование маршрутизаторов. Статическая маршрутизация
Лабораторная работа № 4. Разрешение адресов по протоколу ARP. APR-спуфинг
Лабораторная работа № 5. Динамическая маршрутизация по протоколу RIP. Получение сетевых
настроек по DHCP
Глава 11. Система управления контентом Joomla
Лабораторная работа № 1. Первоначальные настройки и установка шаблона сайта
Лабораторная работа № 2. Добавление категорий и удаление демонстрационного контента
Лабораторная работа № 3. Добавление материалов и создание меню
Лабораторная работа № 4. Создание пунктов меню и установка баннера
Лабораторная работа № 5. Модули и расширения в Joomla
Лабораторная работа № 6. Плагины в Joomla
Лабораторная работа № 7. Компоненты в Joomla
Контрольные вопросы к главе 11
Список использованной литературы
�Содержание
Введение
В настоящее время компьютерные сети – это одна из самых главных и
быстроразвивающихся технологий. Сегодня в мире существует более 130 миллионов
персональных компьютеров и более 80 % из них объединены в различные
информационно-вычислительные сети разного масштаба.
Основная цель проектирования компьютерных сетей заключается в предоставлении
возможности
территориально
разобщенным
пользователям
обмениваться
информацией между собой, а также использовать одно и то же программное
обеспечение, общие информационные, вычислительные и аппаратные ресурсы.
Компьютерные сети являются логическим результатом эволюции компьютерных и
телекоммуникационных технологий [9, с. 37].
На данном этапе развития сетевых технологий существует потребность активного
использования компьютерных сетей как основы информационного обеспечения. Уже
сейчас компьютерные сети представляют собой одно из основных средств
коммуникации всего человечества, а глобальная сеть Интернет стала частью культуры
и необходимой потребностью в повседневной жизни людей в большинстве стран
нашей планеты [44]. В настоящий момент сеть Интернет расширяет круг своих
функций, ввиду того, что происходит тесная интеграция Интернета с мобильными и
беспроводными технологиями [4, с. 21].
Компьютерные сети появились в конце 60-х годов XX века и унаследовали много
полезных свойств от своих предшественников телефонных сетей – более старых и
распространенных телекоммуникационных сетей.
В то же время компьютерные сети привнесли в телекоммуникационный мир нечто
совершенно новое – неисчерпаемые запасы информации, созданные цивилизацией за
несколько тысячелетий своего существования и продолжающие пополняться с
растущей скоростью в наши дни.
Результатом влияния компьютерных сетей на остальные типы телекоммуникационных
сетей стал процесс их конвергенции. Этот процесс начался достаточно давно, одним
из первых признаков конвергенции стала передача голоса в цифровой форме
посредством телефонных сетей. Компьютерные сети активно развиваются,
разрабатывая
новые
сервисы,
которые
ранее
были
прерогативой
телекоммуникационных сетей – телефонных, радио и телевизионных сетей – сервисы
IP-телефонии, радио- и видеовещания и ряд других. В настоящий момент, процесс
конвергенции продолжается, и о том, каким будет его конечный результат, с
уверенностью говорить пока рано.
�Содержание
Глава 1. Введение в компьютерные сети
1.1. Вычислительная и телекоммуникационная технологии
1.2. Мультипрограммирование
1.3. Многотерминальные системы – прообраз сети
1.4. Первые компьютерные сети. Появление глобальных сетей
1.5. Первые локальные сети
1.6. Создание стандартных технологий локальных сетей
1.7. Конвергенция локальных и глобальных сетей
1.8. Современные тенденции
Контрольные вопросы к главе 1
�Содержание
1.1. Вычислительная и телекоммуникационная технологии
Компьютерные сети – это не единственный вид сетей, созданный человеческой
цивилизацией. В качестве примера наиболее древних сетей можно привести
водопроводы Древнего Рима, покрывающие большие территории и обслуживающие
многочисленных клиентов. Другой пример – электрические сети. В электрических
сетях можно найти аналоги компонентов любой территориальной компьютерной сети:
источникам информационных ресурсов соответствуют электростанции, магистралям –
высоковольтные линии электропередач, сетям доступа – трансформаторные
подстанции, клиентским терминалам – осветительные и бытовые электроприборы.
«Компьютерные сети, называемые также сетями передачи данных, являются
логическим результатом эволюции двух важнейших научно-технических отраслей
современной цивилизации – компьютерных и телекоммуникационных технологий» [8].
С одной стороны, сети представляют собой частный случай распределенных
вычислительных систем, в которых группа компьютеров согласованно выполняет
набор взаимосвязанных задач, обмениваясь данными в автоматическом режиме. С
другой стороны, компьютерные сети могут рассматриваться как средство передачи
информации на большие расстояния, для чего в них применяются методы
кодирования и мультиплексирования данных, получившие развитие в различных
телекоммуникационных системах (рис. 1.1).
Рис. 1.1. Эволюция компьютерных сетей на стыке вычислительной техники и телекоммуникационных
технологий
�Содержание
1.2. Мультипрограммирование
В условиях резко возросших возможностей компьютера, связанных с обработкой и
хранением данных, выполнение только одной программы в каждый момент времени
оказалось крайне неэффективным.
Начались разработки в области мультипрограммирования.
Мультипрограммирование – способ организации вычислительного процесса, при
котором в памяти компьютера находится одновременно несколько программ,
попеременно выполняющихся на одном процессоре.
Мультипрограммирование было реализовано в двух вариантах:
• пакетная обработка;
• разделение времени.
Системы пакетной обработки предназначались для решения задач в основном
вычислительного характера, не требующих быстрого получения результатов. В этот
период максимальная пропускная способность (или, другими словами, решение
максимального числа задач в единицу времени) была основной целью и критерием
эффективности систем пакетной обработки [71].
Системы пакетной обработки, как правило, строились на базе мэйнфрейма –
мощного и надежного компьютера универсального назначения. Пользователи
подготавливали перфокарты, содержащие данные и команды программ, после чего
передавали их в вычислительный центр (рис. 1.2).
Рис. 1.2. Централизованная система на базе мэйнфрейма
Операторы вводили эти карты в компьютер, а распечатанные результаты пользователи
получали обычно только на следующий день. Таким образом, одна неверно набитая
карта означала как минимум суточную задержку. Безусловно, интерактивный режим
работы, при котором с терминала имеется возможность оперативно руководить
�Содержание
процессом обработки данных, был бы более удобней для конечного пользователя.
Однако на первых этапах развития вычислительных систем приоритет отдавался
эффективности работы самого дорогого устройства вычислительной машины –
процессора.
В системах разделения времени пользователям (или одному пользователю)
предоставляется возможность интерактивной работы сразу с несколькими
приложениями. Для этого каждое приложение должно регулярно взаимодействовать с
пользователем. Очевидно, что в пакетных системах возможности диалога
пользователя с приложением ограничены.
В системах разделения времени эта проблема решается за счет того, что операционная
система принудительно периодически приостанавливает приложения, не дожидаясь,
когда они сами освободят процессор. Всем приложениям попеременно выделяется
квант процессорного времени, таким образом, пользователи, запустившие программы
на выполнение, получают возможность поддерживать с ними диалог.
Системы разделения времени были созданы с целью исправить основной недостаток
систем пакетной обработки – изоляцию пользователя-программиста от процесса
выполнения задач. Каждому пользователю в этом случае предоставляется терминал, с
которого он может вести диалог со своей программой. Так как в системах разделения
времени каждой задаче выделяется только квант процессорного времени, ни одна
задача не занимает процессор надолго, и время ответа оказывается приемлемым. Если
квант небольшой, то у всех пользователей, одновременно работающих на одной и той
же машине, складывается впечатление, что каждый из них использует машину
единолично.
Очевидно, что системы разделения времени обладают меньшей пропускной
способностью, чем системы пакетной обработки, так как на выполнение принимается
каждая запущенная пользователем задача, вне зависимости
от
того,
«предпочтительна» ли она системе или нет. Кроме того, производительность системы
снижается из-за дополнительного расходования вычислительной мощности на более
частое переключение процессора с задачи на задачу. Это вполне соответствует тому,
что критерием эффективности систем разделения времени является удобство и
эффективность работы пользователя, а не максимальная пропускная способность.
Вместе с тем, мультипрограммное выполнение интерактивных приложений повышает
и пропускную способность компьютера (пусть и не в такой степени, как пакетные
системы). Аппаратура загружается быстрее, поскольку пока одно приложение ожидает
сообщения пользователя, другие приложения могут обрабатываться процессором
[71].
�Содержание
1.3. Многотерминальные системы – прообраз сети
По мере того, как стоимость процессоров стала снижаться, в начале 60-х годов
прошлого века появились новые способы организации вычислительного процесса,
которые позволили учесть интересы пользователей. Начали развиваться
интерактивные многотерминальные системы разделения времени (рис. 1.3). В
таких системах каждый пользователь получал собственный терминал, с помощью
которого он мог вести диалог с компьютером. Количество одновременно работающих
с компьютером пользователей зависело от его мощности так, чтобы время реакции
вычислительной системы было достаточно мало, и пользователю была не заметна
параллельная работа с компьютером других пользователей.
Рис. 1.3. Многотерминальная система – прообраз вычислительной сети
Терминалы, выйдя за пределы вычислительного центра, рассредоточились по всему
предприятию. И хотя вычислительная мощность оставалась полностью
централизованной, некоторые функции – такие как ввод и вывод данных – стали
распределенными. Подобные многотерминальные централизованные системы внешне
уже были очень похожи на локальные вычислительные сети.
Многотерминальные системы, работающие в режиме разделения времени, стали
первым шагом на пути создания локальных вычислительных сетей.
Однако до появления локальных сетей нужно было пройти еще большой путь, так как
многотерминальные системы, хотя и имели внешние черты распределенных систем,
все еще поддерживали централизованную обработку данных. В этот период был
�Содержание
справедлив так называемый закон Гроша, который эмпирически отражал уровень
технологии того времени. В соответствии с этим законом производительность
компьютера была пропорциональна квадрату его стоимости, отсюда следовало, что за
одну и ту же сумму было выгоднее купить одну мощную машину, чем две менее
мощных – их суммарная мощность оказывалась намного ниже мощности дорогой
машины.
�Содержание
1.4. Первые компьютерные сети. Появление глобальных сетей
«Глобальные сети (Wide Area Networks, WAN) – это сети, объединяющие
территориально рассредоточенные компьютеры, возможно находящиеся в различных
городах и странах» [8]. Данный вид компьютерных сетей появились первыми, так как
возникла потребность в соединении узлов, находящихся на удаленном расстоянии
друг от друга. Началось все с решения более простой задачи – доступа к компьютеру
с терминалов, удаленных от него на многие сотни и тысячи километров. Терминалы
соединялись с компьютерами через телефонные сети с помощью модемов. Такие сети
позволяли многочисленным пользователям получать удаленный доступ к
разделяемым ресурсам нескольких мощных компьютеров класса суперЭВМ. Затем
появились системы, в которых наряду с удаленными соединениями типа терминалкомпьютер были реализованы и удаленные связи типа компьютер-компьютер.
Компьютеры получили возможность обмениваться данными в автоматическом
режиме, что является базовым признаком любой вычислительной сети. На основе
подобного механизма в первых сетях были реализованы службы обмена файлами,
синхронизации баз данных, электронной почты и другие, ставшие теперь
общепринятыми сетевыми службами.
Именно при проектировании глобальных сетей впервые были предложены и
отработаны многие основные принципы и идеи, лежащие в основе современных
вычислительных сетей. Такие, например, как концепции коммутации и маршрутизации
пакетов и многоуровневое построение коммуникационных протоколов.
Глобальные компьютерные сети очень многое унаследовали от других, гораздо более
старых и распространенных глобальных сетей – телефонных. Основное
технологическое отличие глобальных сетей от телефонных – это отказ от принципа
коммутации каналов. Вместо этого в глобальных сетях использовался принцип
коммутации пакетов, что способствовало гораздо более производительной передаче
компьютерного трафика. Это было связано с тем, что выделяемый на все время
сеанса связи составной телефонный канал, передающий информацию с постоянной
скоростью, не мог эффективно использоваться пульсирующим трафиком
компьютерных данных, у которого периоды интенсивного обмена чередуются с
продолжительными паузами. В сетях с коммутацией пакетов лежит принцип разбиения
данных на порции – пакеты, которые самостоятельно перемещаются по сети
благодаря наличию адреса конечного узла в заголовке пакета.
Так как прокладка высококачественных линий связи на большие расстояния требует
больших расходов, то в первых глобальных сетях часто использовались уже
существующие каналы связи, изначально предназначенные совсем для других целей.
Основные недостатки таких каналов:
•
низкая скорость передачи данных;
•
значительные искажения в передаваемых сигналах.
�Содержание
Примером таких сетей являются сети Х.25, разработанные еще в начале 70-х годов
прошлого века, когда низкоскоростные аналоговые каналы, арендуемые у телефонных
компаний, были преобладающим типом каналов, соединяющих компьютеры и
коммутаторы глобальной вычислительной сети.
В 1969 году министерство обороны США инициировало работы по объединению в
единую сеть суперкомпьютеров оборонных и научно-исследовательских центров. Эта
сеть, получившая название ARPAnet, положила начало для создания первой
глобальной сети – Интернет.
Сеть ARPAnet объединяла компьютеры разных типов, работавшие под управлением
различных операционных систем с дополнительными модулями, реализующими
коммуникационные протоколы, общие для всех компьютеров сети. Операционные
системы этих компьютеров можно считать первыми сетевыми операционными
системами.
Прогресс глобальных компьютерных сетей тесно связан с прогрессом телефонных
сетей. С конца 60-х годов прошлого века в телефонных сетях все чаще стала
применяться передача голоса в цифровой форме. Это привело к появлению
высокоскоростных цифровых каналов, соединяющих автоматические телефонные
станции (АТС) и позволяющих одновременно передавать десятки и сотни разговоров.
Была разработана специальная технология для создания первичных, или опорных,
сетей. Такие сети не предоставляют услуг конечным пользователям, они являются
базой или основой, на которой строятся скоростные цифровые каналы «точка–
точка», соединяющие оборудование других, так называемых наложенных сетей,
которые уже работают на конечного пользователя.
Сначала технология первичных сетей была исключительно внутренней технологией
телефонных компаний. Однако со временем эти компании стали сдавать часть своих
цифровых каналов, образованных в первичных сетях, в аренду предприятиям,
которые использовали их для создания собственных телефонных и глобальных
компьютерных сетей. Появившаяся в конце 80-х годов прошлого века технология
синхронной цифровой иерархии (Synchronous Digital Hierarchy, SDH) расширила
диапазон скоростей цифровых каналов до 10 Гбит/c, а технология спектрального
мультиплексирования DWDM (Dense Wave Division Multiplexing) – до сотен гигабит и
даже нескольких терабит в секунду [71].
Несмотря на то, что локальные сети появились значительно позже, на сегодняшний
день глобальные сети нисколько не уступают им по разнообразию и качеству
предоставляемых услуг.
�Содержание
1.5. Первые локальные сети
В начале 70-х годов XX века произошло значимое событие, которое повлияло на
дальнейшее развитие компьютерных сетей, вследствии технологического прогресса в
области производства компьютерной техники появились большие интегральные
схемы (БИС). Их сравнительно невысокая стоимость и широкие функциональные
возможности в дальнейшем привели к созданию мини-компьютеров, которые
начинали постепенно вытеснять мэйнфреймы. Ввиду этого, эмпирический закон
Гроша уже не соответствовал реальности, так как десяток мини-компьютеров,
стоимость которых была равна стоимости мэйнфрейма, решали некоторые задачи за
гораздо меньшее время.
Приобрести компьютеры теперь могли даже небольшие подразделения и отделы
предприятий. Мини-компьютеры решали многие задачи, например: управления
технологическим оборудованием, складом и другие задачи соответствующего отдела
предприятия. И хотя все компьютеры в пределах одного предприятия продолжали
работать автономно, однако появившимся новшеством было создание концепции
распределения компьютерных ресурсов по всему предприятию (рис. 1.4).
Рис. 1.4. Автономное использование нескольких мини-компьютеров на одном предприятии
Постепенно потребности пользователей вычислительной техники росли, вследствии
чего возможностей изолированной работы на одном компьютере стало недостаточно,
пользователям необходимо было в автоматическом режиме обмениваться
компьютерными данными с другими пользователями. Это привело к появлению
первых локальных вычислительных сетей (рис. 1.5).
�Содержание
Рис. 1.5. Различные типы связей в первых локальных сетях
«Локальные сети (Local Area Network) – это объединения компьютеров,
сосредоточенных на небольшой территории, обычно в радиусе не более 1–2 км, хотя
в отдельных случаях локальная сеть может иметь и более протяженные размеры,
например, несколько десятков километров» [8]. В общем случае локальная сеть
представляет собой коммуникационную систему, принадлежащую одному
предприятию.
�Содержание
1.6. Создание стандартных технологий локальных сетей
Изначально для соединения компьютеров
нестандартные сетевые технологии.
друг
с
другом
использовались
«Сетевая технология – это согласованный набор программных и аппаратных
средств (например, драйверов, сетевых адаптеров, кабелей и разъемов) и механизмов
передачи данных по линиям связи, достаточный для построения вычислительной
сети» [8].
Разнообразные устройства сопряжения, использующие собственные способы
представления данных на линиях связи, свои типы кабелей и т. п., могли соединять
только те конкретные модели компьютеров, для которых были разработаны,
например, мини-компьютеры PDP-11 с мэйнфреймом IBM 360 или мини-компьютеры
HP с микрокомпьютерами LSI-11. Однако в середине 80-х годов XX века в
проектировании локальных сетей произошли изменения. Утвердились стандартные
технологии объединения компьютеров в сеть – Ethernet, ArcNet, Token Ring, Noken
Bus, позднее – FDDI. Персональные компьютеры во многом способствовали
появлению стандартных технологий. Персональные компьютеры стали наиболее
подходящими элементами для построения сетей – это обусловлено тем, что, вопервых, они были достаточно мощными, чтобы обеспечивать работу сетевого
программного обеспечения, а во-вторых, – явно нуждались в объединении своей
вычислительной мощности для решения сложных задач и разделения периферийных
устройств и дисковых массивов. В связи с этим персональные компьютеры начали
преобладать в локальных сетях, причем не только в качестве клиентских компьютеров,
но и в качестве сетевых серверов – центров хранения и обработки данных, вытеснив
мэйнфреймы и мини-компьютеры.
В основе построения всех стандартных технологий локальных сетей лежал принцип
коммутации пакетов, так как ранее этот принцип эффективно применялся при передаче
трафика данных в глобальных компьютерных сетях.
Стандартные сетевые технологии значительно упрощали процесс конфигурации
локальных сетей. Теперь для создания сети достаточно было приобрести стандартный
кабель, сетевые адаптеры соответствующего стандарта, например Ethernet, вставить
адаптеры в компьютеры, присоединить их к кабелю стандартными разъемами и
установить на компьютеры одну из популярных сетевых операционных систем,
например Novell NetWare.
С появлением локальных сетей в организации работы пользователей появился ряд
новшеств, например:
• получать доступ к общим сетевым ресурсам теперь стало значительно проще, чем в
глобальных сетях;
•
в локальной сети пользователь освобождается
от
запоминания
сложных
�Содержание
идентификаторов разделяемых ресурсов; вместо этого система предоставляет ему
список ресурсов в удобной для восприятия форме, например в виде древовидной
иерархической структуры;
•
после соединения с удаленным ресурсом пользователь получает возможность
обращаться к нему с помощью тех же команд, что и для работы с локальными
ресурсами.
Появление всех вышеперечисленных возможностей связано с использованием в
локальных сетях качественных кабельных линий связи, на которых даже сетевые
адаптеры первого поколения обеспечивали скорость передачи данных до 10 Мбит/с.
При небольшой протяженности, характерной для локальных сетей, стоимость таких
линий связи была вполне приемлемой. Поэтому экономное расходование пропускной
способности каналов, одна из основных задач технологий первых глобальных сетей,
никогда не выходило на первый план при разработке протоколов локальных сетей. В
таких условиях основным механизмом прозрачного доступа к ресурсам локальных
сетей стали периодические широковещательные объявления серверов о своих
ресурсах и услугах. На основании таких объявлений клиентские компьютеры
составляли списки имеющихся в сети ресурсов и предоставляли их пользователю.
Безусловно, скорость передачи данных в глобальных сетях не могла сравниться со
скоростью передачи данных в локальных сетях. Это во многом связано с тем, что при
передаче данных в глобальных сетях приходилось пользоваться теми каналами связи,
которые были в наличии, ведь для того, чтобы проложить новых кабельные системы
для вычислительных сетей протяженностью в десятки и тысячи километров,
требовались большие затраты. Скорости передачи данных в глобальных сетях
достигали в среднем около 1 200 бит/с, это связано с тем, что в них использовались
преимущественно телефонные каналы связи, плохо приспособленные для
высокоскоростной передачи дискретных данных [88].
В конце 90-х годов XX века лидирующие позиции среди технологий локальных сетей
заняло семейство Ethernet и Gigabit Ethernet 1 000 Мбит/с. Простые алгоритмы работы
обусловили низкую стоимость оборудования Ethernet. Широкий диапазон иерархии
скоростей позволяет рационально строить локальную сеть, выбирая ту технологию
семейства, которая в наибольшей степени отвечает задачам организации и
потребностям пользователей. Кроме того, все технологии Ethernet очень близки друг к
другу по принципам работы, что упрощает обслуживание и интеграцию этих сетей.
�Содержание
1.7. Конвергенция локальных и глобальных сетей
В конце 80-х годов XX века различие между локальными и глобальными сетями было
колоссальным, они отличались по многим факторам, например:
• протяженность и качество линий связи. Основным отличием локальных сетей от
глобальных компьютерных сетей является сравнительно небольшое расстояние
между узлами сети, что позволяет использовать в локальных сетях более
качественные линии связи;
• сложность методов передачи данных. В отличие от локальных, в глобальных сетях
требуются более сложные методы передачи данных и соотвествующее
оборудование, ввиду низкой степени надежности физических каналов;
• скорости передачи данных. На тот момент времени скорость обмена данными в
локальных компьютерных сетях достигала 10, 16 и 100 Мбит/с, а в глобальных
сетях значительно меньше – от 2,4 Кбит/с до 2 Мбит/с;
• разнообразие предоставляемых услуг. Благодаря высоким скоростям передачи
данных локальные сети получили возможность предоставлять разнообразные
услуги, например такие, как: разнообразные механизмы использования файлов,
хранящихся на дисках других узлов компьютерной сети; совместное использование
принтеров, модемов, факсов, доступ к единой базе данных; электронная почта и
т. д. В свою очередь, глобальные сети предоставляли в основном только файловые
и почтовые услуги в их самом простейшем виде.
С течением времени отличия между локальными и глобальными компьютерными
сетями становились незначительными. Теперь глобальные сети стали использовать в
качестве связующей среды в процессе объединения изолированных ранее локальных
сетей. Тесная интеграция локальных и
глобальных сетей послужила
взаимопроникновению соответствующих технологий. Сближение в методах передачи
данных происходит на основе цифровых методов по волоконно-оптическим линиям
связи без дополнительного преобразования сигнала (модуляции) как в локальных, так
и в глобальных сетях. Новый стандарт Ethernet 10G, позволяющий передавать данные
со скоростью 10 Гбит/с, предназначен для магистралей как глобальных, так и крупных
локальных сетей. Этот фактор обусловливает значительное повышение скорости
обмена, и как следствие – создание в глобальных сетях служб для работы с большими
объемами мультимедийной информации в режиме online. Например, интерактивные
возможности службы WorldWideWeb превзошли возможности многих схожих по
функционалу служб локальных сетей. Процесс копирования служб и технологий из
глобальной сети Интернет в локальные сети (включая использование IP-протокола)
стал настолько широкомасштабным, что появился специальный термин – intranet
технологии.
В последнее время в локальных сетях методам обеспечения защиты информации от
несанкционированного доступа уделяется нисколько не меньше внимания, чем в
глобальных. В основу защиты локальных сетей положены методы шифрования
данных, аутентификации и авторизации пользователей.
�Содержание
Процессу конвергенции сетей также способствовало создание сетей масштаба
большого города, занимающих промежуточное положение между локальными и
глобальными сетями. Городские сети, или сети мегаполисов (MetropolitanAreaNetworks,
MAN), предназначены для обслуживания территории крупного города. Эти сети
используют цифровые линии связи, часто волоконно-оптические со скоростями на
магистрали от 155 Мбит/с и выше. Сети MAN предоставляют возможность выхода в
глобальные сети и обеспечивают экономичное соединение локальных сетей между
собой. Современные сети типа MAN отличаются широким спектром предоставляемых
услуг и дают возможность своим клиентам объединять коммуникационное
оборудование различного типа.
В последнее время наблюдается также тенденция процесса конвергенции
телекоммуникационных и компьютерных сетей, это обусловлено процессом развития
и совершенствования методов, а также технических средств передачи различных
видов информации. Кроме того, ведутся работы по созданию мультисервисной сети,
то есть сети, способной передавать не только изображение и звук, но и компьютерные
данные.
Конвергенция телекоммуникационных и компьютерных сетей проходит по различным
направлениям.
Первая попытка создания мультисервисной сети – сети, способной оказывать
разнообразные услуги, в том числе услуги телефонии и передачи данных, привела к
появлению технологии цифровых сетей с интегральными услугами – ISDN
(IntegratedServicesDigitalNetwork). Однако в настоящее время сеть ISDN используется
преимущественно как цифровая телефонная сеть, так как она не отвечает требованиям,
предъявляемым к современным компьютерным сетям ввиду скорости передачи в ней
около 2 Мбит/с. Это обусловлено тем, что при ее разработке за основу был взят
уровень требований по передаче данных, соответствующий глобальным сетям в 80-е
гг. XX века.
Вследствие масштабного массового распространения глобальной сети Интернет
ведутся работы по ее преобразованию в глобальную мультисервисную сеть –
NextGenerationNetwork (NGN) или NewPublicNetwork (NPN). В результате созданная
таким образом сеть будет с одинаковым уровнем качества поддерживать такие услуги,
как: WWW, телефония, мультимедийная почта, передача аудио- и видеоновостей и т. д.
Уже сегодня в мире широко используется IP-телефония, где за счет представления
голоса в цифровой форме происходит передача телефонного и компьютерного
трафиков по одним и тем же цифровым каналам.
Другая же сеть – интеллектуальная (IntelligentNetwork, IN) представляет собой
компьютерную сеть с серверами, на которых программируется логика услуг и может
предоставлять дополнительные услуги телефонных сетей, например такие, как:
конференц-связь, переадресация вызова, телеголосование.
В настоящее время процесс технологической конвергенции телекоммуникационных и
компьютерных сетей происходит на основе следующих методов: цифровой передачи
информации различного типа; коммутации пакетов и программирования услуг. В
компьютерных сетях все чаще применяются принципы, характерные для телефонных
�Содержание
сетей,
такие
как
иерархическая
структура
построения,
обеспечение
отказоустойчивости.
Компьютерные сети успешно используют транспортную инфраструктуру, созданную
в рамках тех или иных телекоммуникационных сетей: распределительные сети
кабельного телевидения (с помощью кабельных модемов); телефонные абонентские
линии (с помощью оборудования xDSL); мобильную сотовую и спутниковую связь и
др.
Развитие телекоммуникационных и компьютерных сетей в идеале должно привести к
такой ситуации, когда конечный пользователь не будет замечать, работает ли он в
автономном режиме или получает информацию посредством мультисервисной сети.
�Содержание
1.8. Современные тенденции
На сегодняшний день компьютерные сети продолжают достаточно быстро
развиваться. Отличия между локальными и глобальными сетями становятся
несущественными вследствие появления высокоскоростных территориальных каналов
связи, не уступающих по качеству кабельным системам локальных сетей. В
глобальных сетях появляются службы доступа к ресурсам (сеть Интернет
предоставляет такие возможности), ничем не отличающихся от служб локальных
сетей.
Претерпевают существенные изменения также и локальные сети. На смену пассивного
кабеля, соединяющего узлы, появилось разнообразное коммуникационное
оборудование – коммутаторы, мосты, концентраторы, маршрутизаторы, шлюзы.
Вследствие внедрения подобного коммуникационного оборудования появилась
возможность проектирования масштабных корпоративных сетей, насчитывающих
тысячи узлов и имеющих сложную структуру. После того, как стал очевидным тот
факт, что системы, состоящие из сотен серверов, обслуживать гораздо сложнее, чем
несколько больших компьютеров, в корпоративные вычислительные системы в
качестве полноправных сетевых узлов стали возвращаться мэйнфреймы,
поддерживающие технологии Ethernet или Token Ring, а также стек протоколов TCP/IP,
ставший благодаря сети Интернет сетевым стандартом.
Стоит отметить новую тенденцию обработки в локальных и глобальных сетях такой
информации, как голос, видеоизображения, рисунки. Это новшество обусловило
внесение изменений в работу протоколов, коммуникационного оборудования и
сетевых операционных систем. Сложность передачи данной мультимедийной
информации по сети связана с ее чувствительностью к задержкам при передаче
пакетов данных. По причине того, что служба передачи файлов или электронная почта
создают малочувствительный к задержкам трафик и все элементы сетей
разрабатывались в расчете на него, то в связи с появлением трафика реального
времени возникли некоторые сложности.
На сегодняшний день эти противоречия решаются различными способами, в том
числе и с помощью специально рассчитанной на передачу различных типов трафика
технологии АТМ. Но, несмотря на колоссальные усилия, предпринимаемые в этом
направлении, оптимального решения проблемы пока не найдено. Чтобы добиться
слияния технологий не только локальных и глобальных сетей, но и технологий любых
информационных сетей – вычислительных, телефонных, телевизионных и т. п. –
необходимо дальнейшее развитие научно-технического прогресса. И, несмотря на
иллюзорность этой концепции, предпосылки для такого синтеза уже существуют.
Причем считается, что основой для объединения послужит технология коммутации
пакетов, применяемая сегодня в компьютерных сетях, а не технология коммутации
каналов, используемая в телефонии [85].
�Содержание
Хронологическую последовательность важнейших событий, ставших историческими
вехами на пути появления первых компьютерных сетей, иллюстрирует табл. 1.1.
Таблица 1.1
Хронология важнейших событий на пути появления первых компьютерных
сетей
Этап
Время
Первые глобальные связи компьютеров, первые эксперименты с пакетными Конец 1960-х гг.
сетями
Начало передач по телефонным сетям голоса в цифровой форме
Конец 1960-х гг.
Появление больших интегральных схем, первые мини-компьютеры. Первые Начало 1970-х гг.
нестандартные локальные сети
Создание сетевой архитектуры IBM SNA
1974 г.
Стандартизация технологии Х.25
1974 г.
Появление персональных компьютеров, создание Интернета в современном Начало 1980-х гг.
виде, установка на всех узлах стека TCP/IP
Появление стандартных технологий локальных сетей (Ethernet – 1980 г., Token Середина
Ring – 1985 г., FDDI – 1985 г.)
гг.
1980-х
Начало коммерческого использования Интернета
Конец 1980-х гг.
Изобретение Web
1991 г.
�Содержание
Контрольные вопросы к главе 1
1. Какие свойства многотерминальной системы отличают ее от компьютерной сети?
2. Когда впервые были получены значимые практические результаты по объединению
компьютеров с помощью глобальных связей?
3. Что такое ARPANET?
4. Какое из этих событий произошло позже других?
•
изобретение Web;
•
появление стандартных технологий LAN;
•
начало передачи голоса в цифровой форме по телефонным сетям.
5. Какое событие послужило стимулом к активизации работ по созданию LAN?
6. Когда была стандартизована технология Ethernet? Token Ring? FDDI?
7. По каким направлениям идет сближение компьютерных и телекоммуникационных
сетей?
8. Поясните термины «мультисервисная сеть», «инфокоммуникационная сеть».
9. Почему сети WAN появились раньше, чем сети LAN?
�Содержание
Глава 2. Общие принципы построения сетей
2.1. Классификация компьютерных сетей
2.2. Взаимодействие компьютеров в сети
2.3. Средства телекоммуникации
2.4. Базовые сетевые топологии
2.5. Доступ к среде передачи
2.6. Принципы разделения среды
2.7. Физическая структуризация локальной сети
2.8. Логическая структуризация сети на разделяемой среде
Контрольные вопросы к главе 2
�Содержание
2.1. Классификация компьютерных сетей
В зависимости от основания классификации существует множество различных
способов классификации компьютерных сетей. Рассмотрим некоторые из них.
1. В зависимости от расстояния между связываемыми узлами сети можно
разделить на три основных класса: локальные, региональные и глобальные (рис. 2.1).
Рис. 2.1. Классификация сетей по расстоянию между узлами
«Локальная вычислительная сеть (ЛВС) – небольшая группа компьютеров, связанных
друг с другом и расположенных обычно в пределах одного здания или
организации» [8].
«Региональная сеть – сеть, соединяющая множество локальных сетей в рамках одного
района, города или региона».
«Глобальная сеть – сеть, объединяющая компьютеры разных городов, регионов и
государств» [8].
Объединение глобальных, региональных и локальных вычислительных сетей
позволяет создавать многоуровневые иерархии, которые предоставляют мощные
средства для обработки огромных массивов данных и доступ к практически
неограниченным информационным ресурсам. На рис. 2.2 приведена одна из
возможных иерархий вычислительных сетей.
Рис. 2.2. Пример объединения сетей
�Содержание
Локальные вычислительные сети могут входить в качестве компонентов в состав
региональной сети; региональные сети – объединяться в составе глобальной сети;
наконец, глобальные сети могут образовывать еще более крупные структуры. Самым
большим объединением компьютерных сетей в масштабах планеты Земля является
глобальная сеть Интернет.
Примером связи локальных и глобальных сетей является виртуальная частная сеть
(Virtual Private Network, VPN). Так называется сеть организации, получающаяся в
результате объединения двух или нескольких территориально разделенных локальных
вычислительных сетей с помощью общедоступных каналов глобальных сетей,
например через сеть Интернет (рис. 2.3).
Рис. 2.3. Виртуальная частная сеть – несколько локальных сетей предприятия, объединенных через
Интернет
2. По типу среды передачи сети делятся на проводные и беспроводные (рис. 2.4).
Рис. 2.4. Классификация сетей по типу среды передачи
�Содержание
3. По скорости передачи информации сети можно разделить на низко-, средне- и
высокоскоростные (рис. 2.5).
Рис. 2.5. Классификация сетей по скорости передачи информации
4. Если за основание классификации взять распределение ролей между
компьютерами, то компьютерные сети бывают одноранговые и клиент-серверные
(рис. 2.6.)
Рис. 2.6. Классификация сетей по распределению ролей между компьютерами
«Одноранговая, децентрализованная или пиринговая (от англ. peer-to-peer, P2P –
равный к равному) сеть (рис 2.7) – это оверлейная компьютерная сеть, основанная на
равноправии участников» [8]. В такой сети отсутствуют выделенные серверы, а
каждый узел (peer) является одновременно как клиентом, так и сервером. В отличие от
архитектуры
«клиент-сервер»,
такая
организация
позволяет
сохранять
работоспособность сети при любом количестве и любом сочетании доступных узлов.
Участниками сети являются узлы. Число компьютеров в одноранговых сетях обычно
не превышает 10, отсюда их другое название – рабочая группа. Примерами рабочих
групп являются домашние сети или сети небольших офисов.
Рис. 2.7. Пример одноранговой сети
�Содержание
В сетях с выделенным сервером (рис. 2.8) выделяются один или несколько
компьютеров, называемых серверами, задача которых состоит в быстрой и
эффективной обработке большого числа запросов других компьютеров – клиентов.
При этом клиентские запросы бывают самыми разными, начиная с простейшей
проверки имени и пароля пользователя при входе в систему и заканчивая сложными
поисковыми запросами к базам данных, на обработку которых даже современный
многопроцессорный компьютер может потратить несколько часов [69].
Рис. 2.8. Пример сети с выделенным сервером
5. По назначению сети ЭВМ делятся на:
•
вычислительные,
пользователей;
предназначенные
для
решения
•
информационные, ориентированные на предоставление информационных услуг;
примерами таких сетей могут служить сети, предоставляющие справочные и
библиотечные услуги;
•
информационно-вычислительные,
предназначенные
для
пользователей и предоставления информационных услуг;
•
информационно-управляющие,
объектами и процессами.
предназначенные
для
вычислительных
решения
управления
задач
задач
реальными
�Содержание
2.2. Взаимодействие компьютеров в сети
Для того чтобы компьютеры взаимодействовали друг с другом в сети, сначала нужно
каким-либо образом соединить между собой всех участников сети – серверы,
стационарные рабочие станции пользователей, ноутбуки, карманные компьютеры,
принтеры, сетевые хранилища данных и т. д. Для этих целей применяются: сетевые
кабели различных типов, телефонные или спутниковые каналы, беспроводные
технологии (WLAN, Wi-Fi, Wi-MAX). При использовании сетевых кабелей обычно
требуются специальные коннекторы, закрепленные на их концах. Затем кабель одним
концом вставляется в сетевой адаптер – специальную печатную плату («карту
расширения»), установленную в компьютер и позволяющую подключить его к сети, а
другим – в какое-либо устройство связи (концентратор, коммутатор, маршрутизатор,
мост, шлюз и т. д.). В большинстве современных компьютеров сетевой адаптер
является встроенным (соответствующий разъем имеется непосредственно на
материнской плате). Если же используется беспроводной сетевой адаптер, то
взаимодействие с сетью происходит за счет передачи радиосигналов между адаптером
и точкой доступа, соединенной с локальной сетью.
Однако соединить компьютеры друг с другом недостаточно – нужно еще и «научить
их взаимодействовать» друг с другом. Для этого требуются сетевые операционные
системы, поддерживающие один и тот же набор протоколов, или языков, с помощью
которых компьютеры обмениваются данными по сети. И только после этого, запустив
сетевое приложение, можно будет, например, пообщаться с человеком, находящимся
на другом конце планеты.
�Содержание
2.3. Средства телекоммуникации
«Средства телекоммуникации (СТК) реализуют передачу данных и образуют
телекоммуникационную сеть (сеть связи, сеть передачи данных), состоящую из узлов
связи (УС), объединенных каналами связи (КС) для передачи данных» (рис. 2.9) [9].
Способ объединения узлов связи и каналов
(конфигурацию) телекоммуникационной сети.
связи
определяет
топологию
Рис. 2.9. Средства телекоммуникаций
«Канал связи (КС) включает в себя линию связи (ЛС) и каналообразующее
оборудование» (рис. 2.10).
«Линия связи (ЛС) представляет собой физическую среду передачи, по которой
передаются сигналы с аппаратурой передачи данных (АПД), формирующей сигналы,
соответствующие типу локальной сети» [9].
Рис. 2.10. Канал связи
ООД – оконечное оборудование данных; КО – каналообразующее оборудование; АПД – аппаратура
передачи данных
«Аппаратура передачи данных (АПД) осуществляет преобразование сигналов в
соответствии с типом среды передачи (линии связи)» [9]. К АПД относятся
различного типа модемы (модуляторы-демодуляторы), используемые в телефонных и
высокочастотных компьютерных сетях: телефонные, кабельные, радиомодемы, xDSLмодемы, адаптеры и т. д.
�Содержание
«Каналообразующее оборудование (КО) предназначено для формирования канала
передачи данных между двумя взаимодействующими абонентами, при этом в одной и
той же линии связи одновременно может быть сформировано несколько каналов за
счет использования различных методов уплотнения» [8].
Технология уплотнения и формирования многоканальных систем передачи данных в
компьютерных
сетях
называется
мультиплексированием
и
реализуется
мультиплексорами и демультиплексорами. Обычно каналообразующее оборудование
входит в состав узлов телекоммуникационной сети.
Основными функциями узлов связи являются:
•
маршрутизация, заключающаяся в выборе направления передачи (маршрута)
данных;
•
коммутация, заключающаяся в установлении физического или логического
соединения между входными и выходными портами узла;
•
мультиплексирование, заключающееся в объединении нескольких входящих в узел
потоков данных в один выходящий из узла поток;
•
демультиплексирование, заключающееся в разделении одного входящего в узел
потока данных на несколько выходящих из узла потоков.
В качестве узлов связи в вычислительных сетях используются специализированные
сетевые устройства: концентраторы, мосты, коммутаторы, маршрутизаторы и шлюзы.
В качестве оконечного оборудования данных (ООД) могут выступать компьютеры и
сетевое оборудование (мосты, коммутаторы, маршрутизаторы), находящееся в узлах
сети.
�Содержание
2.4. Базовые сетевые топологии
При организации компьютерной сети исключительно важным является выбор
топологии. Под « топологией сети понимается конфигурация графа, вершинам
которого соответствуют конечные узлы сети (например, компьютеры) и
коммуникационное оборудование (например, маршрутизаторы), а ребрам –
физические или информационные связи между вершинами» [9, с.55].
Следует различать понятия «физической топологии, т. е. способа размещения
компьютеров, сетевого оборудования и их соединения с помощью кабельной
инфраструктуры», и «логической топологии – структуры взаимодействия
компьютеров и характера распространения сигналов».
Существуют три базовые топологии, на основе которых строится большинство сетей.
• «Шина» (Bus). В этой топологии все компьютеры соединяются друг с другом
одним кабелем (рис. 2.11). Посланные в такую сеть данные передаются всем
компьютерам, но обрабатывает их только тот компьютер, аппаратный MAC-адрес
сетевого адаптера которого записан в кадре как адрес получателя.
Рис. 2.11. Сеть с топологией «шина»
Эта топология исключительно проста в реализации и требует меньше всего кабеля,
однако имеет ряд существенных недостатков.
Недостатки сетей типа «шина»:
1) подобные сети трудно масштабируемые;
2) в каждый момент времени осуществлять передачу может только один из узлов, это
связано с тем, что «шина» используется совместно. В случае одновременной передачи
с двух и более узлов возникает коллизия (искажение сигнала), что приводит к
повреждению всех кадров. В этом случае узлы становятся вынуждены
приостанавливать передачу, а затем по очереди ретранслировать данные. Чем больше
объем передаваемой по сети информации и чем больше узлов подключено к «шине»,
�Содержание
тем заметнее влияние коллизий, и, как следствие, снижается общая и максимально
возможная производительность сети, замедляя ее работу;
3) «шина» является пассивной топологией, это означает что узлы не могут
восстанавливать затухающие при передаче по сети сигналы. Для того чтобы
расширить сеть, необходимо использовать повторители (репитеры), усиливающие
сигнал перед его передачей в следующий сегмент сети;
4) сети с топологией «шина» отличаются низкой степенью надежности. Этот
показатель связан с тем, что, когда электрический сигнал достигает конца кабеля, он
(если не приняты специальные меры) отражается, тем самым нарушая работу всего
сегмента сети. В целях предотвращения отражения сигналов на концах кабеля
устанавливаются специальные резисторы (терминаторы), поглощающие сигналы. При
возникновении повреждения кабеля в каком-либо месте или при отсоединении
коннектора возникают два незатерминированных сегмента сети, на концах которых
сигналы начинают отражаться, и вся сеть перестает функционировать.
Многочисленные сложности, возникающие в процессе конфигурирования и
эксплуатации сетей с топологией «шина», обусловили тот факт, что в настоящий
момент сети топологии «шина» практически нигде не используются, хотя еще
несколько десятков лет назад они довольно широко применялись.
• «Кольцо» (Ring). Принцип данной топологии основан на том, что каждый из узлов
сети соединяется с двумя другими так, чтобы от одного он получал информацию, а
второму – передавал ее (рис. 2.12). Последний узел подключается к первому, и
кольцо замыкается.
Рис. 2.12. Сеть с топологией «кольцо»
�Содержание
Преимущества и недостатки сетей с топологией «кольцо»
Преимущества
Недостатки
Поскольку у кабелей в этой сети нет свободных Сигнал
в
«кольце»
должен
пройти
концов, терминаторы здесь не нужны
последовательно (и только в одном направлении)
через все узлы, каждый из которых проверяет: не
ему ли адресована информация, поэтому время
передачи
может
быть
достаточно
продолжительным
Каждый из узлов выступает в роли репитера, При добавлении в сеть нового узла требуется
усиливая сигнал, что позволяет строить сети остановка ее работы, что приводит к нарушению
значительной протяженности
работы всех других компьютеров сети
Из-за отсутствия коллизий данная топология Выход из строя хотя бы одного из узлов сети
обладает высокой устойчивостью к перегрузкам, нарушает работоспособность всей сети
обеспечивая эффективную работу с большими
потоками передаваемой по сети информации
При повреждении или коротком замыкании в
любом из кабелей сети топологии «кольцо», вся
сеть выходит из строя
Чтобы избежать сбоев в работе сети при
неисправности оборудования или обрыве кабеля,
обычно прокладывают два «кольца», что
повышает стоимость конфигурации сети
•
Активная топология «звезда» (Active Star) возникла в период начала развития
вычислительной техники, когда к мощному центральному узлу подключались все
остальные абоненты сети. В такой конфигурации центральный компьютер
контролирует все потоки данных и отвечает за управление информационным
обменом между всеми узлами сети. При данной организации взаимодействия
устройств в сети возникновение коллизий было невозможно. Вместе с тем,
центральный компьютер занимался только обслуживанием сети по причине
колоссальной нагрузки на него. При выходе из строя центрального компьютера вся
сеть переставала функционировать, а в случае выхода из строя периферийного узла
или обрыв связи с ним на работоспособности остальной сети никак не отражался.
В настоящее время сети активной топологии «звезда» используются редко.
На сегодня более распространенной топологией является топология «звездашина» (Star Вus), или «пассивная звезда» (рис. 2.13). Принцип работы данной
топологии заключается в том, что периферийные узлы подключаются не к
центральному компьютеру, а к пассивному концентратору, или хабу (hub). Хаб
восстанавливает приходящие сигналы и пересылает их всем остальным подключенным
к нему компьютерам и устройствам, то есть выполняет функции репитера. В
�Содержание
топологии «пассивная звезда» за управление обменом данными отвечает центральный
компьютер, а не пассивный концентратор, в связи с этим, несмотря на то, что
визуально данная топология выглядит как топология «звезда», логически она
является топологией «шина».
Рис. 2.13. Сеть с топологией «звезда-шина»
В современных компьютерных сетях наиболее распространеной является топология
«звезда», так как имеет ряд преимуществ в сравнении с другими топологиями сети.
Одним из недостатков данной тополии является большой расход кабеля.
Преимущества сетей типа «звезда-шина»:
•
высокая степень надежности сетей данной топологии обусловлена тем, что
подключение к центральному концентратору и отключение компьютеров от него
никак не влияет на процесс взаимодействия других узлов сети;
•
повреждение кабеля влияет только на отдельные узлы;
•
нет необходимости в терминаторах;
•
процесс реконфигурации и обслуживания сети значительно упрощается, так как все
узлы и сетевые устройства подключаются к центральному соединительному
устройству;
•
высокая степень защищенности сети обусловлена тем, что концентрация точек
подключения в одном месте позволяет ограничить доступ к основным объектам
компьютерной сети.
�Содержание
Если вместо концентраторов при конфигурировании сети топологии «звезда»
использовать мосты, коммутаторы и маршрутизаторы, то в итоге получается
«промежуточный» тип топологии между активной и пассивной звездой. В этом
случае устройство связи не только ретранслирует поступающие сигналы, но и
производит управление их обменом.
Другие возможные сетевые топологии
Современные компьютерные сети постоянно масштабируются и модернизируются. В
связи с этим почти всегда такая сеть является гибридной, т. е. ее топология
представляет собой комбинацию нескольких базовых топологий. Приведем некоторые
примеры «гибридных» топологий сети.
•
Топология «дерево» (tree) представляет собой объединение нескольких
«звезд» (рис. 2.14). На сегодняшний день данная топология является наиболее
распространенной при проектировании локальных сетей.
Рис. 2.14. Топология сети «дерево»
•
В сетчатой, или сеточной (mesh) топологии все или некоторые узлы и другие
устройства соединены друг с другом напрямую (рис. 2.15). Данная топология
может быть полной или частичной и отличаться высокой степенью надежности,
так как при повреждении любого канала передача данных продолжается, поскольку
возможно несколько маршрутов доставки информации. Сетчатая топология
используются в том случае, если необходимо обеспечить максимальную
отказоустойчивость сети, например при объединении нескольких участков сети
�Содержание
крупной организации или при подключении к сети Интернет. К недостаткам
сеточной топологии относятся: большой расход кабеля, а также сложность
настройки сетевого оборудования.
Рис. 2.15. Сетчатая топология сети
�Содержание
2.5. Доступ к среде передачи
«Способ доступа к среде передачи представляет собой набор правил,
регламентирующих, каким образом компьютеры должны отправлять и принимать
данные по сети» [9].
Таких способов возможно несколько. Основными из них являются:
1) множественный доступ с контролем несущей и обнаружением столкновений;
2) множественный доступ с контролем несущей и предотвращением столкновений;
3) передача маркера.
•
При множественном доступе с контролем несущей и обнаружением столкновений
(Carrier Sense Multiple Access with Collision Detection, CSMA/CD) все узлы
(множественный доступ) «мониторят» кабель (контроль несущей), чтобы
определить, передаются по нему данные или нет. Если кабель свободен, любой
компьютер может начать передачу данных; тогда все остальные узлы вынуждены
ждать, пока кабель не освободится. Если несколько узлов начали осуществлять
передачу одновременно и возникла коллизия, в этом случае все компьютеры на
разные промежутки времени приостанавливают передачу данных (обнаружение
столкновений), после чего ретранслируют данные.
Главным недостатком данного способа доступа является то, что при большом
количестве узлов в сети и высокой нагрузке на сеть количество коллизий возрастает, а
пропускная способность существенно снижается.
Преимущество множественного доступа с контролем несущей и обнаружением
коллизий заключается в отсутствии сложностей в технической реализации, поэтому
именно данный метод применяется в технологии Ethernet. С целью уменьшения числа
коллизий в современных компьютерных сетях применяются мосты, коммутаторы и
маршрутизаторы.
•
Метод множественного доступа с контролем несущей и предотвращением коллизий
(Carrier Sense Multiple Access with Collision Avoidance, CSMA/CA) отличается от
предыдущего тем, что перед тем, как осуществлять передачу данных, узел
отправляет в сеть специальный пакет, тем самым сообщая другим участникам о
своем намерении начать трансляцию. Подобным образом другие узлы сети
оповещаются о предстоящей передаче данных, что позволяет избежать коллизий.
Безусловно, эти сообщения увеличивают общую нагрузку на компьютерную сеть,
тем самым снижая ее пропускную способность, вследствии чего метод CSMA/CA
работает медленнее, чем CSMA/CD. Но, несмотря на этот факт, данные
уведомления необходимы для работы беспроводных сетей.
•
В сетях с передачей маркера (Token Passing) от одного компьютера к другому по
кольцу постоянно поступает небольшой блок данных, называемый маркером. Если
�Содержание
у узла, получившего маркер, нет информации для передачи, он просто пересылает
его следующему компьютеру. Если же такая информация имеется, компьютер
«захватывает» маркер, дополняет его данными и отсылает это следующему узлу по
кругу. Такой информационный пакет передается от компьютера к компьютеру, пока
не достигает пункта назначения. Ввиду того, что в момент передачи данных маркер
в сети отсутствует, другие компьютеры уже не могут ничего передавать. Поэтому в
сетях с передачей маркера невозможны ни временные задержки, ни коллизии, что
делает их весьма эффективными для использования в системах автоматизации
работы предприятий.
�Содержание
2.6. Принципы разделения среды
«Разделяемая среда – физическая среда передачи данных, к которой непосредственно
подключено несколько конечных узлов сети. Причем в каждый момент времени
только один из конечных узлов получает доступ к разделяемой среде и задействует ее
для передачи пакета другому узлу, подключенному к этой же среде» [8].
В качестве разделяемой среды могут использоваться: коаксиальный кабель, витая
пара, оптоволокно или радиоволны.
Способы доступа к разделяемой среде:
• Метод случайного доступа. Управление доступом к среде в данном случае
осуществляется децентрализовано: в этом процессе участвуют все сетевые
интерфейсы, непосредственно подключенные к разделяемой среде. В компьютерах
эту функцию выполняют сетевые интерфейсные карты, или сетевые адаптеры.
1. Компьютер может осуществлять передачу данных по сети только в том случае,
если сеть свободна, то есть если никакой другой узел в данный момент не передает
данные, и электрические сигналы в среде отсутствуют.
2. После того, как компьютер удостоверится, что среда передачи свободна, он
начинает трансляцию, «занимая» среду. Время монопольного использования
разделяемой среды одним компьютером ограничивается временем передачи одного
кадра.
3. При попадании кадра в разделяемую среду передачи данных все сетевые адаптеры
одновременно начинают принимать этот кадр. Все они анализируют адрес назначения,
располагающийся в одном из начальных полей кадра.
4. Если этот адрес совпадает с их собственным адресом, кадр помещается во
внутренний буфер сетевого адаптера. Таким образом компьютер-адресат получает
предназначенные ему данные.
При методе случайного доступа может возникнуть ситуация, когда одновременно два
или более компьютеров решают, что сеть свободна и начинают передавать
информацию. Такая ситуация, называемая коллизией (столкновение), препятствует
правильной передаче данных по сети. Во всех сетевых технологиях, построенных на
разделяемых средах, предусмотрен алгоритм обнаружения и корректной обработки
коллизий. Вероятность возникновения коллизии зависит от интенсивности сетевого
трафика.
• Метод детерминированного доступа. Этот метод может быть реализован на
основе как распределенного, так и централизованного подходов. Он основан на
использовании кадра специального формата, который обычно называют маркером
или токеном доступа. Компьютер имеет право пользоваться разделяемой средой
только тогда, когда он владеет токеном. Время использования токена ограничено,
по истечении этого времени узел обязан передать токен другому компьютеру [8,
с 104–105].
�Содержание
2.7. Физическая структуризация локальной сети
Различают топологию физических связей и топологию логических связей.
При физической структуре сети конфигурация физических связей определяется
электрическими соединениями компьютеров, то есть ребрам графа соответствуют
отрезки кабеля, связывающие пары узлов. Основными средствами физической
структуризации локальных сетей являются повторители (repeater) и концентраторы
(concentrator), или хабы (hub).
Повторитель (repeater) – коммуникационное устройство, которое используется для
физического соединения различных сегментов кабеля локальной сети с целью
увеличения протяженности сети. Повторитель передает сигналы, приходящие из
одного сегмента сети в другие ее сегменты. Повторитель улучшает качество
передаваемого сигнала за счет восстановления его мощности и амплитуды, улучшения
фронтов и т. п., что в свою очередь позволяет преодолеть ограничения на длину
линий связи.
Повторитель, который имеет несколько портов и соединяет несколько физических
сегментов сети называют концентратором или хабом. Использование концентраторов
свойственно практически для всех базовых технологий локальных сетей: Ethernet,
ArcNet, Token Ring, FDDI, Fast Ethernet, Gigabit Ethernet. Физическая структуризация
сети с помощью концентраторов нужна не только для увеличения расстояния между
узлами сети, но и для повышения ее надежности [63].
�Содержание
2.8. Логическая структуризация сети на разделяемой среде
При логической структуре сети в качестве логических связей выступают маршруты
передачи данных между устройствами сети, которые образуются путем
соответствующей настройки коммуникационного оборудования.
«Локализация трафика – распространение трафика, предназначенного для
компьютеров некоторого сегмента сети, только в пределах этого сегмента» [9].
«Логическая структуризация сети – это процесс разбиения сети на сегменты с
локализованным трафиком» [8].
Для логической структуризации
оборудование, как:
•
мосты;
•
коммутаторы;
•
маршрутизаторы;
•
шлюзы.
сети
используется
такое
коммуникационное
Мост (bridge) разделяет разделяемую среду передачи данных сети на логические
сегменты, передавая информацию из одного сегмента в другой только в том случае,
если такая передача действительно необходима, то есть если адрес компьютера
назначения принадлежит другой подсети. Тем самым мост изолирует трафик одной
подсети от трафика другой, повышая общую производительность передачи данных в
сети. Локализация трафика позволяет уменьшить возможность несанкционированного
доступа к данным в связи с тем, что кадры не выходят за пределы своего сегмента, и
злоумышленнику сложнее перехватить их. Также локализация трафика экономит
пропускную способность.
Каждый порт коммутатора оснащен специализированной микросхемой, которая
обрабатывает кадры по алгоритму моста независимо от микросхем других портов. Он
является коммуникационным мультипроцессором. И хотя коммутатор (switch), как и
мост, обрабатывает кадры, общая производительность коммутатора обычно намного
выше производительности традиционного моста, имеющего один процессорный
блок.
Маршрутизатор (router), в отличии от моста, более надежно и более эффективно
изолирует трафик отдельных частей сети друг от друга. Маршрутизаторы используют
составные числовые адреса, и поэтому образуют логические сегменты посредством
явной адресации. В этих адресах имеется поле номера сети, так что все компьютеры, у
которых значение этого поля одинаковое, принадлежат одному сегменту, называемому
в данном случае подсетью (subnet). Маршрутизаторы могут работать в сети с
замкнутыми контурами, при этом они осуществляют выбор наиболее рационального
маршрута из нескольких возможных. Другой очень важной функцией
�Содержание
маршрутизаторов является их способность связывать в единую сеть подсети,
построенные с использованием разных сетевых технологий, например Ethernet и X.25.
Кроме перечисленных коммуникационных устройств, отдельные части сети может
соединять шлюз (gateway) [93]. «Шлюз позволяет объединять сети, построенные на
существенно разных программных и аппаратных платформах» [8].
�Содержание
Контрольные вопросы к главе 2
1. Перечислите основания, по которым классифицируют компьютерные сети и саму
классификацию по каждому из них.
2. Что применяется для того, чтобы соединить между собой всех участников сети?
3. Что такое средства телекоммуникаций?
4. Что представляет собой линия связи?
5. Что относят к аппаратуре передачи данных?
6. Для чего предназначено каналообразующее оборудование?
7. Сформулируйте определение мультиплексирования.
8. Назовите основные функции узлов связи.
9. Что используется в качестве узлов связи в вычислительных сетях?
10.Охарактеризуйте базовые сетевые топологии.
11.Назовите способы доступа к среде передачи.
12.Назовите основные средства физической структуризации локальных сетей.
�Содержание
Глава 3. Архитектура и стандартизация сетей
3.1. Протокол и стек протоколов
3.2. Службы и протоколы
3.3. Источники стандартов
3.4. Эталонная модель OSI
3.5. Эталонная модель TCP/IP
Контрольные вопросы к главе 3
�Содержание
3.1. Протокол и стек протоколов
Многоуровневое представление средств сетевого взаимодействия имеет свою
особенность, связанную с тем, что в процессе обмена сообщениями участвуют, по
меньшей мере, две стороны, то есть в данном случае необходимо организовать
согласованную работу двух иерархий аппаратных и программных средств,
работающих на разных компьютерах. Оба участника сетевого обмена должны принять
множество соглашений. Например, они должны согласовать способ определения
размера сообщений, уровни и форму электрических сигналов, договориться о методах
контроля достоверности и т. п. Подобные соглашения должны быть приняты на всех
уровнях, начиная от самого низкого – уровня передачи битов – и заканчивая самым
высоким, реализующим обслуживание пользователей сети.
На рис. 3.1 показана модель взаимодействия двух узлов.
Рис. 3.1. Взаимодействие двух узлов
С каждой стороны средства взаимодействия представлены четырьмя уровнями.
Каждый уровень поддерживает интерфейсы двух типов. Во-первых, это интерфейсы
услуг с выше- и нижележащим уровнями «своей» иерархии средств. Во-вторых, это
интерфейс со средствами взаимодействия другой стороны, расположенными на том
же уровне иерархии. Этот тип интерфейса называют протоколом. Таким образом,
протокол всегда является одноранговым интерфейсом.
«Стек протоколов – иерархически организованный набор протоколов, достаточный
для организации взаимодействия узлов в сети» [9].
Протоколы нижних уровней часто реализуются комбинацией программных и
аппаратных средств, а протоколы верхних уровней, как правило, программными
средствами.
«Протокольная сущность – программный модуль, реализующий некоторый протокол»
[8]. Протокольные сущности одного уровня двух взаимодействующих сторон
обмениваются сообщениями в соответствии с определенным для них протоколом.
�Содержание
Сообщения состоят из заголовка и поля данных (иногда оно может отсутствовать).
Обмен сообщениями является своеобразным способом коммуникации, с помощью
которого каждая из сторон «излагает» другой стороне, что необходимо сделать на
каждом этапе взаимодействия. Работа каждого протокольного модуля состоит в
интерпретации заголовков поступающих к нему сообщений и выполнении связанных с
этим действий. Заголовки сообщений разных протоколов имеют разную структуру,
что соответствует различиям в их функциональности. Чем сложнее структура
заголовка сообщения, тем более сложные функции возложены на соответствующий
протокол.
�Содержание
3.2. Службы и протоколы
Службы и протоколы являются различными понятиями, хотя часто эти понятия
смешиваются.
«Служба (или сервис) – это набор операций, которые более низкий уровень
предоставляют более высокому» [11]. Служба определяет, какие именно операции
уровень будет выполнять от лица своих пользователей, но никак не определяет, каким
образом эти операции должны реализовываться. Служба описывает интерфейс между
двумя уровнями, в котором нижний уровень является поставщиком сервиса, а верхний
– его потребителем.
« Протокол – это набор правил, описывающих формат и назначение кадров, пакетов
или сообщений, которыми обмениваются одноранговые сущности внутри уровня» [8].
Сущности используют протокол для реализации определений их служб. Они могут
менять протокол при условии, что при этом остаются неизменными службы,
предоставляемые ими своим пользователям. Таким образом, служба и протокол
оказываются практически независимыми.
Другими словами, службы – это нечто связанное с межуровневыми интерфейсами,
тогда как протоколы связаны с пакетами, передающимися сущностями одного уровня,
расположенными на разных машинах (рис. 3.2.).
Рис. 3.2. Связь между службой и протоколом
�Содержание
3.3. Источники стандартов
Работы по стандартизации вычислительных сетей ведутся большим количеством
организаций. В зависимости от статуса организаций различают следующие виды
стандартов:
•
стандарты отдельных фирм (например, стек протоколов SNA компании IBM или
графический интерфейс OPEN LOOK для Unix-систем компании Sun);
•
стандарты специальных комитетов и объединений, создаваемых несколькими
компаниями, например стандарты технологии ATM, разрабатываемые специально
созданным объединением ATM Forum, насчитывающем около 100 коллективных
участников, или стандарты союза Fast Ethernet Alliance по разработке стандартов
100 Мбит Ethernet;
•
национальные стандарты, например стандарт FDDI, представляющий один из
многочисленных стандартов института ANSI, или стандарты безопасности для
операционных систем, разработанные центром NCSC Министерства обороны
США;
•
международные стандарты, например, модель и стек коммуникационных
протоколов
Международной
организации
по
стандартизации
(ISO),
многочисленные стандарты Международного союза электросвязи (ITU), в том
числе стандарты на сети с коммутацией пакетов Х.25, сети Frame Relay, ISDN,
модемы и многие другие.
�Содержание
3.4. Эталонная модель OSI
Из того, что протокол является соглашением, принятым двумя взаимодействующими
узлами сети, не обязательно следует, что он обязательно является стандартным. Но на
практике при реализации сетей стремятся использовать стандартные протоколы. Это
могут быть фирменные, национальные или международные стандарты.
В начале 80-х годов ряд международных организаций по стандартизации, в частности
International Organization for Standardization (ISO) или International Standards Organization,
а также International Telecommunications Union (ITU) и некоторые другие, разработали
стандартную модель взаимодействия открытых систем Open System Interconnection
(OSI). Эта модель сыграла огромную роль в развитии компьютерных сетей.
К концу 70-х годов XX века в мире уже существовало большое количество фирменных
стеков коммуникационных протоколов, среди которых такие популярные стеки, как
DECnet, TCP/IP и SNA. В связи с большим разнообразием средств межсетевого
взаимодействия возникло противоречие, заключающееся в несовместимости
устройств, использующих разные протоколы. В качестве варианта решения данной
проблемы был предложен всеобщий переход на единый, общий для всех систем, стек
протоколов, созданный с учетом недостатков уже существующих стеков. Так начались
работы по созданию модели OSI. Модель OSI разрабатывалась с 1977 г. по 1984 г.
Главная задача модели OSI – обобщение представления средств сетевого
взаимодействия, она является справочной моделью.
В модели OSI (рис. 3.3) средства взаимодействия делятся на семь уровней:
прикладной, представления, сеансовый, транспортный, сетевой, канальный и
физический. Каждый уровень имеет дело с совершенно определенным аспектом
взаимодействия сетевых устройств.
Модель OSI включает семь уровней, данный факт обусловлен тем, что:
1. Уровень должен создаваться по мере
абстракции.
необходимости
отдельного
уровня
2. Каждый уровень должен выполнять строго определенную функцию.
3. Выбор функций для каждого уровня должен осуществляться с учетом создания
стандартизированных международных протоколов.
4. Границы между уровнями должны выбираться таким образом, чтобы поток
данных между интерфейсами был минимальным.
5. Количество уровней должно быть достаточно большим, чтобы различные функции
не объединялись в одном уровне без необходимости, но не слишком высоким, чтобы
архитектура не становилась громоздкой.
�Содержание
Рис. 3.3. Модель взаимодействия открытых систем OSI
3.4.1. Уровни модели OSI
Физический уровень
«Физический уровень (physical layer) имеет дело с передачей потока битов по
физическим каналам связи, таким как коаксиальный кабель, витая пара,
оптоволоконный кабель или цифровой территориальный канал» [8].
�Содержание
Функции физического уровня реализуются на всех устройствах, подключенных к
сети. Со стороны компьютера функции физического уровня выполняются сетевым
адаптером или последовательным портом.
Примером протокола физического уровня может служить спецификация 10Base-T
технологии Ethernet, которая определяет в качестве используемого кабеля
неэкранированную витую пару категории 3 с волновым сопротивлением 100 Ом,
разъем RJ-45, максимальную длину физического сегмента 100 м, манчестерский код
для представления данных в кабеле, а также некоторые другие характеристики среды и
электрических сигналов.
Физический уровень не вникает в смысл информации, которую он передает. Для него
эта информация представляет однородный поток битов, которые нужно доставить без
искажений и в соответствии с заданной тактовой частотой (интервалом между
соседними битами).
Канальный уровень
Канальный уровень (data link layer) является первым уровнем, который работает в
режиме коммутации пакетов. На этом уровне PDU – это кадр (frame).
Функции средств канального уровня определяются по-разному для локальных и
глобальных сетей.
В локальных сетях канальный уровень должен обеспечивать доставку кадра между
любыми узлами сети. При этом предполагается, что сеть имеет типовую топологию,
например: общую шину, кольцо, звезду или дерево (иерархическую звезду).
Примерами технологий локальных сетей, применение которых ограничено типовыми
топологиями, являются Ethernet, FDDI, Token Ring.
В глобальных сетях канальный уровень должен обеспечивать доставку кадра только
между двумя соседними узлами, соединенными индивидуальной линией связи.
Протоколы РРР и HDLC являются двухточечными протоколами. На основе
двухточечных связей могут быть построены сети произвольной топологии.
Для связи локальных сетей между собой или для доставки сообщений между любыми
конечными узлами глобальной сети используются средства более высокого сетевого
уровня.
Одной из функций канального уровня является поддержание интерфейсов с
нижележащим физическим уровнем и вышележащим сетевым уровнем. Сетевой
уровень направляет канальному уровню пакет для передачи в сеть или принимает от
него пакет, полученный из сети. Физический уровень используется канальным как
инструмент, который принимает и передает в сеть последовательности битов.
Для того чтобы сетевой уровень отправителя передал канальному уровню пакет,
канальный уровень создает кадр, который имеет поле данных и заголовок. Канальный
уровень инкапсулирует пакет в поле данных кадра и заполняет соответствующей
служебной информацией заголовок кадра. Коммутаторы сети будут продвигать пакет
на основании адреса назначения, указываемого в заголовке кадра.
�Содержание
Одной из задач канального уровня является обнаружение и коррекция ошибок. Для
этого канальный уровень фиксирует границы кадра, помещая специальную
последовательность битов в его начало и конец, а затем добавляет к кадру
контрольную сумму, которая называется также контрольной последовательностью
кадра (Frame Check Sequence, FCS). Контрольная сумма вычисляется по некоторому
алгоритму как функция от всех байтов кадра. По значению FCS узел назначения
сможет определить, были или нет искажены данные кадра в процессе передачи по
сети.
Однако прежде, чем перенаправить кадр физическому уровню для непосредственной
передачи данных в сеть, канальному уровню может потребоваться решить еще одну
важную задачу. Если в сети используется разделяемая среда, то прежде, чем
физический уровень начнет передавать данные, канальный уровень должен проверить
доступность среды. Функции проверки доступности разделяемой среды иногда
выделяют в отдельный подуровень управления доступом к среде (Media Access
Control, MAC).
Если разделяемая среда освободилась (когда она не используется, то такая проверка,
конечно, пропускается), кадр передается средствами физического уровня в сеть,
проходит по каналу связи и поступает в виде последовательности битов в
распоряжение физического уровня узла назначения. Этот уровень в свою очередь
передает полученные биты канальному уровню своего узла. Канальный уровень
группирует биты в кадры, снова вычисляет контрольную сумму полученных данных и
сравнивает результат с контрольной суммой, переданной в кадре. Если они совпадают,
кадр считается правильным. Если же контрольные суммы не совпадают, фиксируется
ошибка. В функции канального уровня входит не только обнаружение ошибок, но и
исправление их за счет повторной передачи поврежденных кадров. Однако эта
функция не является обязательной и в некоторых реализациях канального уровня она
отсутствует, например в Ethernet, Token Ring, FDDI и Frame Relay.
Протоколы
канального
уровня
реализуются
компьютерами,
мостами,
коммутаторами и маршрутизаторами. В компьютерах функции канального уровня
реализуются совместными усилиями сетевых адаптеров и их драйверов.
Протокол канального уровня обычно работает в пределах сети, являющейся одной из
составляющих более крупной составной сети, объединенной протоколами сетевого
уровня. Адреса, с которыми работает протокол канального уровня, используются для
доставки кадров только в пределах этой сети, а для перемещения пакетов между
сетями применяются уже адреса следующего, сетевого, уровня.
В локальных сетях канальный уровень поддерживает весьма мощный и законченный
набор функций по пересылке сообщений между узлами сети. В некоторых случаях
протоколы канального уровня локальных сетей оказываются самодостаточными
транспортными средствами и могут допускать работу непосредственно поверх себя
протоколов прикладного уровня или приложений без привлечения средств сетевого и
транспортного уровней. Для качественной передачи сообщений в сетях с
�Содержание
произвольной топологией функций канального уровня оказывается недостаточно. Это
правило также справедливо и для глобальных сетей, в которых протокол канального
уровня реализует достаточно простую функцию передачи данных между соседними
узлами.
Сетевой уровень
«Сетевой уровень (network layer) служит для образования единой транспортной
системы, объединяющей несколько сетей, называемой составной сетью, или
интернетом» [8].
«Технология межсетевого взаимодействия (Internetworking) –
технология,
позволяющая соединять в единую сеть множество сетей, построенных на основе
различных топологий» [9].
На рис. 3.4 показаны несколько сетей, каждая из которых использует собственную
технологию канального уровня: Ethernet, FDDI, Token Ring, ATM, Frame Relay. На базе
этих технологий каждая из указанных сетей может связывать между собой любых
пользователей, но только своей сети, и не способна обеспечить передачу данных в
другую сеть, из-за существенных отличий одной технологии от другой. Даже
наиболее близкие (и имеющие одну и ту же систему адресации) технологии локальных
сетей, например, такие, как: Ethernet, FDDI, Token Ring, отличаются друг от друга
форматом используемых кадров и логикой работы протоколов. Еще больше отличий
между технологиями LAN и WAN. Во многих технологиях глобальных сетей
задействована техника предварительно устанавливаемых виртуальных каналов,
идентификаторы которых применяются в качестве адресов. Все технологии имеют
собственные форматы кадров и собственные стеки протоколов.
Рис. 3.4. Необходимость сетевого уровня
�Содержание
Основная роль сетевого уровня заключается в том, чтобы с помощью
дополнительных средств связать между собой сети, построенные на существенно
разных технологиях.
Функции сетевого уровня реализуются:
•
группой протоколов;
•
специальными устройствами – маршрутизаторами.
Одной из функций маршрутизатора является физическое соединение сетей.
Маршрутизатор имеет несколько сетевых интерфейсов, подобных интерфейсам
компьютера, к каждому из которых может быть подключена одна сеть. Таким
образом, все интерфейсы маршрутизатора можно считать узлами разных сетей.
Маршрутизатор может быть реализован как аппаратно, так и программно. В состав
программного обеспечения маршрутизатора входят протокольные модули сетевого
уровня.
Итак, чтобы связать сети, показанные на рис. 3.4, необходимо соединить все эти сети
маршрутизаторами и установить протокольные модули сетевого уровня на все
конечные узлы пользователей, которые намерены связываться через составную сеть
(рис.3.5).
Рис. 3.5. Пример составной сети
Данные, которые необходимо передать через составную сеть, поступают на сетевой
уровень от вышележащего транспортного уровня. Эти данные снабжаются
�Содержание
заголовком сетевого уровня. Данные вместе с заголовком образуют пакет – так
называется PDU сетевого уровня. Заголовок пакета сетевого уровня имеет
унифицированный формат, не зависящий от форматов кадров канального уровня тех
сетей, которые могут входить в составную сеть, и содержит в себе данные об адресе
назначения пакета и другую служебную информацию.
Для того чтобы протоколы сетевого уровня могли доставлять пакеты любому узлу
составной сети, эти узлы должны иметь адреса, уникальные в пределах данной
составной сети. Такие адреса называются сетевыми, или глобальными. Каждый узел
составной сети, который намерен обмениваться данными с другими узлами составной
сети, должен иметь сетевой адрес наряду с адресом, назначенным ему на канальном
уровне. Например, на рис. 3.5 компьютер в сети Ethernet, входящей в составную сеть,
имеет адрес канального уровня МАС1 и адрес сетевого уровня NET-A1; аналогично в
сети ATM узел, адресуемый идентификаторами виртуальных каналов ID1 и ID2, имеет
сетевой адрес NET-A2. В пакете в качестве адреса назначения должен быть указан
адрес сетевого уровня, на основании которого определяется маршрут пакета.
Определение маршрута является важной задачей сетевого уровня. Маршрут
описывается последовательностью сетей (или маршрутизаторов), через которые
должен пройти пакет, чтобы попасть к адресату. Например, на рис. 3.5 штриховой
линией показано 3 маршрута, по которым могут быть переданы данные от
компьютера А к компьютеру Б. Маршрутизатор собирает информацию о топологии
связей между сетями и на ее основании строит таблицы коммутации, которые в
данном случае носят специальное название таблиц маршрутизации.
В соответствии с многоуровневым подходом сетевой уровень для решения своей
задачи обращается к нижележащему канальному уровню. Весь путь через составную
сеть разбивается на участки от одного маршрутизатора до другого, причем каждый
участок соответствует пути через отдельную сеть.
Для того чтобы передать пакет через очередную сеть, сетевой уровень помещает его в
поле данных кадра соответствующей канальной технологии, указывая в заголовке
кадра канальный адрес интерфейса следующего маршрутизатора. Сеть, используя
свою канальную технологию, доставляет кадр с инкапсулированным в него пакетом
по заданному адресу. Маршрутизатор извлекает пакет из прибывшего кадра и после
необходимой обработки передает пакет для дальнейшей транспортировки в
следующую сеть, предварительно упаковав его в новый кадр канального уровня в
общем случае другой технологии. Сетевой уровень управляет совместной работой
сетей, построенных на основе разных технологий.
�Содержание
3.5. Эталонная модель TCP/IP
Эталонная модель TCP/IP использовалась ранее в компьютерной сети ARPANET, а
теперь и во всемирной сети Интернет. Эталонная модель TCP/IP включает в себя
четыре уровня.
Интернет-уровень
Данный уровень эталонной модели TCP/IP называемый интернет-уровнем или
межсетевым уровнем, является основой всей архитектуры. Его задача заключается в
обеспечении возможности для каждого хоста посылать в любую сеть пакеты, которые
будут независимо двигаться к пункту назначения (например, в другой сети). Они
могут прибывать не в том порядке, в котором были отправлены. Если требуется
соблюдение порядка отправления, эту задачу выполняют более верхние уровни.
Межсетевой уровень определяет официальный формат пакета и межсетевой протокол
– IP (Internet Protocol). Задачей межсетевого протокола является доставка IP-пакетов к
пунктам назначения, что означает: выбор маршрута пакета и недопущение закупорки
транспортных артерий. Поэтому можно утверждать, что межсетевой уровень модели
TCP/IP функционально близок сетевому уровню модели OSI. Это соответствие
показано на рис. 3.6.
Рис. 3.6. Эталонная модель TCP/IP
Транспортный уровень
Уровень, расположенный над межсетевым уровнем модели TCP/IP, как правило,
называют транспортным. Он создан для того, чтобы одноранговые сущности на
приемных и передающих хостах могли поддерживать связь, подобно транспортному
уровню модели OSI. На этом уровне функционируют протоколы TCP и UDP:
�Содержание
1. «TCP (Transmission Control Protocol – протокол управления передачей), является
надежным протоколом с установлением соединений, позволяющим без ошибок
доставлять байтовый поток с одной машины на любую другую машину объединенной
сети» [11]. Он разбивает входной поток байтов на отдельные сообщения и передает их
межсетевому уровню. В пункте назначения получающий TCP-процесс собирает из
полученных сообщений выходной поток и управляет потоком.
2. «UDP (User Datagram Protocol – пользовательский протокол данных), является
ненадежным протоколом без установления соединения, не использующим
последовательное управление потоком протокола TCP, а предоставляющим свое
собственное» [9]. Он также широко используется в клиент-серверных запросах и
приложениях, в которых оперативность важнее аккуратности, например, при передаче
речи и видео. Со времени создания протокола IP этот протокол был реализован во
многих других сетях.
Прикладной уровень
В модели TCP/IP нет сеансового уровня и уровня представления. В этих уровнях
просто не было необходимости, поэтому они не были включены в модель.
Рис. 3.7. Протоколы и сети в модели TCP/IP
Над транспортным уровнем расположен прикладной уровень. Он содержит все
протоколы высокого уровня, например: протокол виртуального терминала (TELNET),
протокол передачи файлов (FTP) и протокол электронной почты (SMTP), как показано
на рис. 3.7. Протокол виртуального терминала позволяет пользователю
�Содержание
регистрироваться на удаленном сервере и работать на нем. Протокол переноса файлов
предоставляет эффективный способ перемещения информации с машины на машину.
Электронная почта изначально представляла собой разновидность передачи файлов,
однако позднее для нее был разработан специальный протокол. Со временем было
добавлено много других протоколов, например: DNS (Domain Name Service – служба
имен доменов), позволяющая преобразовывать имена хостов в сетевые адреса; NNTP
(Network News Transfer Protocol – сетевой протокол передачи новостей); HTTP –
протокол передачи гипертекста и др.
Хост-сетевой уровень
В эталонной модели TCP/IP не описывается подробно, что располагается ниже
межсетевого уровня. Сообщается только, что хост соединяется с сетью при помощи
протокола, позволяющего ему отправлять по сети IP-пакеты. Этот протокол никак не
определяется и может меняться от хоста к хосту и от сети к сети [11, с. 66].
�Содержание
Контрольные вопросы к главе 3
1. Сформулируйте определение стека протоколов.
2. Что такое служба (сервис)?
3. Сформулируйте определение протокола.
4. Что такое эталонная модель OSI?
5. В чем состоит назначение модели OSI?
6. Перечислите и охарактеризуйте уровни эталонной модели OSI.
7. Как называется PDU сетевого уровня модели OSI?
8. Перечислите и охарактеризуйте уровни эталонной модели TCP/IP.
9. Охарактеризуйте протоколы TCP и UDP. На каком уровне модели TCP/IP
реализуются данные протоколы?
10.Приведите примеры протоколов, которые реализованы на прикладном уровне
эталонной модели TCP/IP.
�Содержание
Глава 4. Технологии физического уровня
Компьютерная сеть включает в себя такие компоненты, как:
•
компьютеры;
•
коммуникационное оборудование;
•
операционные системы;
•
сетевые приложения.
В современных компьютерных сетях используются различные типы и классы
компьютеров. Компьютеры и их характеристики определяют возможности
компьютерных сетей [56].
4.1. Линии связи
4.2. Типы кабелей
4.3. Коммуникационное оборудование вычислительных сетей
Контрольные вопросы к главе 4
�Содержание
4.1. Линии связи
Техническая система, передающая информацию между узлами сети, определяется
такими понятиями, как: линия связи, составной канал, канал, звено.
•
«Звено (link) – это сегмент, обеспечивающий передачу данных между двумя
соседними узлами сети» [8]. Звено не содержит промежуточных устройств
коммутации и мультиплексирования.
•
«Канал (channel) – часть пропускной способности звена, используемой
независимо при коммутации» [9]. Например, звено первичной сети может состоять
из 30 каналов, каждый из которых обладает пропускной способностью 64 Кбит/с.
•
«Составной канал (circuit) – это маршрут между двумя конечными узлами
сети» [8]. Составной канал образуется отдельными каналами промежуточных
звеньев и внутренними соединениями в коммутаторах.
•
Линия связи может использоваться как синоним одного из вышеперечисленных
терминов.
На рис. 4.1 показаны два варианта линии связи. В первом случае (а) линия связи
состоит из сегмента кабеля длиной несколько десятков метров и представляет собой
звено. Во втором случае (б) линия связи представляет собой составной канал,
развернутый в сети с коммутацией каналов. Такой сетью может быть первичная сеть
или телефонная сеть.
Рис. 4.1. Состав линии связи
�Содержание
Однако для компьютерной сети эта линия представляет собой звено, так как соединяет
два соседних узла, и вся коммутационная промежуточная аппаратура является
прозрачной для этих узлов. Первичные сети проектируются исключительно для того,
чтобы предоставлять услуги каналов передачи данных для компьютерных и
телефонных сетей, про которые в таких случаях говорят, что они работают «поверх»
первичных сетей и являются наложенными сетями.
4.1.1.
«Линия связи состоит в общем случае из физической среды, по которой передаются
электрические информационные сигналы, аппаратуры передачи данных и
промежуточной аппаратуры» [9]. В зависимости от того, каким образом происходит
распространение электромагнитных волн, выделяют два типа среды передачи данных:
проводную и беспроводную. В первом случае физическая среда передачи данных
будет представлять собой кабель (набор проводов, изоляционных и защитных
оболочек и соединительных разъемов), а во втором – земную атмосферу или
космическое
пространство,
посредством
которых
распространяются
электромагнитные волны (рис. 4.2).
Рис. 4.2. Типы сред передачи данных
В современных телекоммуникационных системах данные передаются с помощью
электрического тока или напряжения, радиосигналов или световых сигналов – все эти
физические процессы представляют собой колебания электромагнитного поля
различной частоты.
Проводные (воздушные) линии связи представляют собой провода без каких-либо
изолирующих или экранирующих оплеток, проложенные между столбами и висящие в
воздухе. В XX веке подобые линии связи были основными для передачи телефонных
или телеграфных сигналов. На сегодняшний день кабельные линии связи практически
полностью вытеснили проводные. Однако в случае необходимости проводные линии
связи можно использовать для передачи компьютерного трафика.
Кабельные линии имеют достаточно сложную структуру. Кабель состоит из
проводников, заключенных в несколько слоев изоляции: электрической,
�Содержание
электромагнитной, механической и, возможно, климатической. Кроме того, кабель
может быть оснащен разъемами, позволяющими быстро выполнять присоединение к
нему различного оборудования. В компьютерных и телекоммуникационных сетях
применяются три основных типа кабеля: кабели на основе скрученных пар медных
проводов – неэкранированная витая пара (Unshielded Twisted Pair, UTP) и
экранированная витая пара (Shielded Twisted Pair, STP), коаксиальные кабели с
медной жилой, волоконно-оптические кабели. Первые два типа кабелей называют
также медными кабелями.
Радиоканалы наземной и спутниковой связи образуются с помощью передатчика и
приемника радиоволн. Существует большое разнообразие типов радиоканалов,
отличающихся как используемым частотным диапазоном, так и дальностью канала.
Диапазоны широковещательного радио (длинных, средних и коротких волн),
называемые также АМ-диапазонами, или диапазонами амплитудной модуляции
(Amplitude Modulation, AM) при невысокой скорости передачи данных обеспечивают
дальнюю связь. Более скоростными являются каналы, использующие диапазоны
очень высоких частот (Very High Frequency, VHF), для которых применяется
частотная модуляция (Frequency Modulation, FM). Для передачи данных также
используются диапазоны ультравысоких частот (Ultra High Frequency, UHF) или
диапазоны микроволн (свыше 300 МГц). При частоте свыше 30 МГц сигналы уже не
отражаются ионосферой Земли, и для устойчивой связи требуется наличие прямой
видимости между передатчиком и приемником. Поэтому такие частоты используют
либо спутниковые каналы, либо радиорелейные каналы, либо локальные или
мобильные сети, где это условие выполняется.
�Содержание
4.2. Типы кабелей
В качестве среды электрических или оптических сигналов между компьютерами и
другими сетевыми устройствами в современных компьютерных сетях используются
кабельные соединения. Различают следующие типы кабеля:
• коаксиальный кабель (coaxialcable);
• витая пара (twistedpair);
• волоконно-оптический или оптоволоконный кабель (fiberoptic).
Коаксиальный кабель состоит из несимметричных пар
проводников (рис. 4.3.). Каждая пара представляет собой
внутреннюю медную жилу и соосную с ней внешнюю
жилу, которая может быть полой медной трубой или
оплеткой,
отделенной
от
внутренней
жилы
диэлектрической изоляцией. Внешняя жила играет двоякую
роль – по ней передаются информационные сигналы, и она
является экраном, защищающим внутреннюю жилу от внешних электромагнитных
полей. Существует несколько типов коаксиального кабеля, отличающихся
характеристиками и областями применения: для локальных компьютерных сетей, для
глобальных телекоммуникационных сетей, для кабельного телевидения и т. п.
Рис. 4.3. Коаксиальный кабель
Однако выбор коаксиального кабеля для построения структурированной кабельной
системы зданий не является предпочтительным. Существуют следующие типы
коаксиального кабеля:
• «Толстый» коаксиальный кабель разработан для сетей Ethernet 10Base-5 с
волновым сопротивлением 50 Ом и внешним диаметром около 12 мм. Этот кабель
имеет достаточно толстый внутренний проводник диаметром 2,17 мм, который
обеспечивает хорошие механические и электрические характеристики (затухание на
частоте 10 МГц). Но данный тип кабеля достаточно трудно монтировать.
�Содержание
«Тонкий» коаксиальный кабель предназначен для сетей Ethernet 10Base-2.
Обладая внешним диаметром около 50 мм и тонким внутренним проводником
0,89 мм, этот кабель не так прочен, как «толстый» коаксиал, зато обладает гораздо
большей гибкостью, что удобно при монтаже. «Тонкий» коаксиальный кабель
также имеет волновое сопротивление 50 Ом, но его механические и электрические
характеристики значительно уступают характеристикам «толстого» коаксиального
кабеля. Затухание в этом типе кабеля выше, чем в «толстом» коаксиальном кабеле,
что приводит к необходимости уменьшать длину кабеля для получения
одинакового затухания в сегменте.
• Телевизионный кабель с волновым сопротивлением 75 Ом широко применяется
в кабельном телевидении. Существуют стандарты локальных сетей, позволяющие
использовать такой кабель для передачи данных.
Витая пара (twistedpair) – вид кабеля связи, представляющий собой одну или
несколько пар изолированных проводников, скрученных между собой (с небольшим
числом витков на единицу длины) и покрытых пластиковой оболочкой.
К целям скручивания проводников относят:
• повышения связи проводников одной пары (электромагнитная помеха одинаково
влияет на оба провода пары);
• уменьшения электромагнитных помех от внешних источников;
• уменьшения взаимных наводок при передаче дифференциальных сигналов.
Кабели на основе витой пары являются симметричными, то есть они состоят из двух
одинаковых в конструктивном отношении проводников. Симметричный кабель на
основе витой пары может быть как экранированным, так и неэкранированным.
•
Рис. 4.4. Кабель на основе неэкранированной витой пары
Кабель на основе неэкранированной витой пары (UTP Unshielded Twisted Pair)
(рис. 4.4) применяется для проводки внутри здания. В международных стандартах
данный тип кабеля разделяется на семь категорий:
�Содержание
1. Кабели категории 1 применяются в случае минимальных требований к скорости
передачи данных. Обычно это кабель для цифровой и аналоговой передачи голоса и
низкоскоростной (до 20 Кбит/с) передачи данных. До 1983 года это был основной тип
кабеля для телефонной разводки.
2. Кабели категории 2 впервые были применены фирмой IBM при построении
собственной кабельной системы. Главное требование к кабелям этой категории –
способность передавать сигналы со спектром до 1 МГц.
3. Кабели категории 3 были стандартизованы в 1991 году. Стандарт EIA-568
определил электрические характеристики кабелей для частот в диапазоне до 16 МГц.
Кабели неэкранированной витой пары категории 3 рассчитаны для передачи данных и
голоса.
4. Кабели категории 4 представляют собой несколько улучшенный вариант кабелей
категории 3: выдерживают тесты на частоте передачи сигнала 20 МГц и обеспечивают
повышенную помехоустойчивость и низкие потери сигнала. На практике
используются редко.
5. Кабели категории 5 были разработаны исключительно для поддержки
высокоскоростных протоколов. Их характеристики определяются в диапазоне до
100 МГц. Большинство высокоскоростных технологий (FDDI, Fast Ethernet, ATM и
Gigabit Ethernet) ориентируются на использование витой пары категории 5. На смену
кабеля категории 3 пришел кабель категории 5. В настоящее время на основе кабеля
категории 5 и оптоволоконного кабеля строятся кабельные системы крупных зданий.
6. Кабелю категории 6 соответствует частота до 250 МГц. Кабель данной категории
может быть как экранированным, так и неэкранированным.
7. Кабелю категории 7 соответствует частота до 600 МГц. Кабели категории 7
обязательно экранируются, причем как каждая пара, так и весь кабель в целом.
Основное назначение кабелей категорий 6 и 7 – поддержка высокоскоростных
протоколов на отрезках кабеля большей длины, чем кабель UTP категории 5.
Экранированная витая пара (STP Shielded Twisted Pair) (рис. 4.5) эффективно
защищает передаваемые сигналы от внешних помех, а также меньше излучает
электромагнитные колебания вовне, что, в свою очередь, защищает пользователей
сетей от вредного для здоровья излучения. Стоимость данного типа кабеля выше по
причине наличия заземляемого экрана.
Рис. 4.5. Кабель на основе экранированной витой пары
�Содержание
Основным стандартом, определяющим параметры экранированной витой пары для
применения внутри зданий, является фирменный стандарт IBM. В этом стандарте
кабели делятся не на категории, а на типы от 1 до 9.
Волоконно-оптический кабель состоит из тонких (5-60 микрон) гибких стеклянных
волокон (волоконных световодов), по которым распространяются световые сигналы
(рис. 4.6). Это самый дорогостоящий и вместе с тем самый качественный тип кабеля.
Оптоволокно обеспечивает передачу данных со скоростью до 10 Гбит/с и выше, и
наиболее эффективно обеспечивает защиту данных от внешних помех. По причине
особенностей распространения света такие сигналы легко экранировать.
Рис. 4.6. Волоконно-оптический кабель
Каждый световод состоит из центрального проводника света (сердцевины) –
стеклянного волокна, и стеклянной оболочки, обладающей меньшим показателем
преломления, чем сердцевина. Распространяясь по сердцевине, лучи света не выходят
за ее пределы, отражаясь от покрывающего слоя оболочки.
Волоконно-оптические линии связи имеют ряд преимуществ в сравнении с линиями
связи на основе металлических кабелей:
• большая пропускная способность;
• малое затухание;
• малые масса и габариты;
• высокая помехозащищенность;
• надежная техника безопасности;
• практически отсутствующие взаимные влияния [72].
�Содержание
4.3. Коммуникационное оборудование вычислительных сетей
К коммуникационному оборудованию компьютерных сетей относятся: модемы,
сетевые карты, сетевые кабели и промежуточная аппаратура сетей. В свою очередь, к
промежуточной аппаратуре компьютерных сетей относятся: приемопередатчики или
трансиверы (traceivers), повторители или репитеры (repeaters), концентраторы (hubs),
мосты (bridges), коммутаторы, маршрутизаторы (routers), шлюзы (gateways).
Сетевой адаптер (сетевая карта) – это устройство двунаправленного обмена данными
между компьютером и средой передачи данных вычислительной сети. Кроме
организации обмена данными между компьютером и вычислительной сетью, сетевой
адаптер выполняет функции буферизации (временное хранение данных) и сопряжения
компьютера с сетевым кабелем. Сетевыми адаптерами реализуются функции
физического уровня, а функции канального уровня семиуровневой модели OSI
реализуются сетевыми адаптерами и их драйверами.
Адаптеры снабжены собственным процессором и памятью. Карты классифицируются
по типу порта, посредством которого они соединяются с компьютером, например:
ISA, PCI, USB. Наиболее распространенные из них – это сетевые карты PCI. Карта,
как правило, устанавливается в слот расширения PCI, расположенный на материнской
плате компьютера, и подключается к сетевому кабелю разъемами типа RJ-45 или BNC.
Сетевые карты можно разделить на два типа:
•
адаптеры для клиентских компьютеров;
•
адаптеры для серверов.
В зависимости от применяемой технологии вычислительных сетей Ethernet, Fast
Ethernet или Gigabit Ethernet, сетевые карты обеспечивают скорость передачи данных:
10, 100 или 1 000 Мбит/с [54].
Промежуточное
коммуникационное
оборудования
вычислительных
сетей
используется с целью усиления и преобразования сигналов; для объединения узлов в
физические сегменты; для разделения вычислительных сетей на логические сегменты.
Потому что разделение вычислительных сетей на подсети способствует увеличению
производительности сети и объединению сегментов сетей и сетей в единую
вычислительную сеть.
«Switch (свитч, коммутатор) – устройство, предназначенное для соединения
нескольких узлов компьютерной сети в пределах одного сегмента» (рис. 4.7) [9]. В
отличие от концентратора, свитч распространяет трафик только к нужному порту, а не
ко всем, что препятствует образованию коллизий и не перегружает сеть.
�Содержание
Рис. 4.7. Коммутатор
Switch работает на канальном уровне эталонной модели OSI и может соединять
сегменты сети по MAC-адресам. Принцип работы коммутатора: коммутатор хранит в
памяти таблицу MAC, в которой прописано соответствие MAC-адреса узла и порта
компьютера. При первом включении switch таблица пуста, и он работает в режиме
обучения. Свитч отправляет пакеты на все порты, а потом анализирует их, определяя
MAC-адрес отправителя, и записывает его в таблицу. И теперь, если на один из портов
коммутатора поступит пакет, предназначенный для этого компьютера, этот пакет будет
отправлен только на соответствующий порт. В результате трафик локализуется.
Коммутаторы можно разделить на управляемые и неуправляемые. Управляемые
позволяют контролировать коммутацию на канальном и сетевом уровнях модели OSI.
Управление коммутатором может осуществляться посредством протокола Webинтерфейса, SNMP и RMON.
Repeater (повторитель) – устройство для соединения двух сегментов сети, как
правило шинных (рис. 4.8). Главная задача повторителя – восстановление исходного
уровня информационного сигнала, за счет чего возможно расширение сети. Repeater
применяется либо внутри одного сегмента шины, либо соединяет два. Ввиду того, что
топология «шина» используется сегодня достаточно редко, при построении сетей
повторители практически не применяются.
Рис. 4.8. Повторитель
�Содержание
Hub (концентратор) – многопортовое устройство для соединения нескольких
сегментов сети, количество которых равно количеству портов на самом концентраторе
(рис. 4.9). Концентраторы бывают 8-ми портовые, 16-ти портовые и 32-х портовые.
Пассивный концентратор не имеет функционального элемента, предназначенного для
определения узла сети и локализации трафика. По этой причине Hub может
распознать, только с какого порта поступил сигнал. Концентратор отправляет пакеты
на все сегменты сети, что приводит к бесполезной загрузке. Поэтому при большом
числе узлов в сети работоспособность сети снижается и возникает вероятность
возникновения коллизий. На сегодняшний день концентраторы заменены
коммутаторами.
Рис. 4.9. Концентратор
Bridge (мост) – сетевое оборудование для объединения сегментов локальной сети
(рис. 4.10). Сетевой мост работает на канальном уровне эталонной модели OSI,
обеспечивая ограничение домена коллизий (в случае сети Ethernet). Мосты направляют
фреймы данных в соответствии с MAC-адресами фреймов. Мосты обрабатывают
трафик, используя центральный процессор, коммутатор же использует для этих целей
коммутационную матрицу (аппаратную схему для коммутации пакетов). В настоящее
время мосты практически не используются, кроме ситуаций, когда соединяются
сегменты сети с разной организацией первого уровня, например, между xDSL
соединениями, оптикой, Ethernet.
Рис. 4.10. Мост
�Содержание
К апаратным средствам реализации компьютерных сетей также относят «router
(маршрутизатор) – сетевое устройство, которое принимает решение о пересылке
пакетов сетевого уровня (уровень 3 модели OSI) между различными сегментами сети
на основе информации о топологии сети и определенных правил» (рис. 4.11) [9].
Маршрутизатор работает на более высоком уровне, нежели коммутатор и сетевой
мост. Обычно маршрутизатор использует адрес получателя, указанный в пакетах
данных, и определяет по таблице маршрутизации маршрут, по которому следует
передать данные. Если в таблице маршрутизации для адреса нет описанного
маршрута, пакет отбрасывается. Существуют и другие способы определения
маршрута пересылки пакетов: когда, например, используется адрес отправителя,
протоколы верхних уровней и другая информация, содержащаяся в заголовках
пакетов сетевого уровня. Роутеры также могут осуществлять: трансляцию адресов
отправителя и получателя, фильтрацию транзитного потока данных на основе
определенных правил с целью ограничения доступа, шифрование/дешифрование
передаваемых данных.
Таблица маршрутизации содержит информацию, на основе которой маршрутизатор
принимает решение о дальнейшей пересылке пакетов. Таблица состоит из некоторого
числа записей – маршрутов, в каждой из которых содержится адрес сети получателя,
адрес следующего узла, которому следует передавать пакеты и некоторый вес записи
– метрика. Метрики записей в таблице играют роль в вычислении кратчайших
маршрутов к различным получателям. В зависимости от модели маршрутизатора и
используемых протоколов маршрутизации, в таблице маршрутизации также может
содержаться некоторая дополнительная служебная информация.
Рис. 4.11. Маршрутизатор
�Содержание
«Gateway (шлюз) – аппаратный маршрутизатор или программное обеспечение,
предназначенные для сопряжения компьютерных сетей, использующих разные
протоколы» (рис. 4.12) [8]. Сетевые шлюзы являются кроссплатформенными.
Основная задача сетевого шлюза – конвертировать протокол между сетями. Роутер
сам по себе принимает, проводит и отправляет пакеты только между сетями,
использующими одинаковые протоколы. Сетевой шлюз может с одной стороны
принять пакет, сформатированный под один протокол (например, Apple Talk) и перед
отправкой в другой сегмент сети конвертировать его в пакет другого протокола
(например, TCP/IP). Сетевые шлюзы могут быть аппаратным решением, программным
обеспечением или и тем и другим одновременно, но обычно это программное
обеспечение, которое устанавливается на роутер или компьютер. Сетевой шлюз
должен «понимать» все протоколы, используемые роутером [55].
Рис. 4.12. Шлюз
�Содержание
Контрольные вопросы к главе 4
1. Что называют звеном?
2. Сформулируйте определение составного канала
3. Из чего состоит линия связи?
4. Назовите типы связи.
5. Что представляют собой проводные (воздушные) линии?
6. Назовите и охарактеризуйте основные типы кабелей.
7. В чем состоит принципиальное отличие
неэкранированной витой пары и экранированной?
между
кабелем
на
основе
8. Перечислите основные преимущества волоконно-оптических линий связи по
сравнению с линиями связи на основе металлических кабелей?
9. Что относится к коммуникационному оборудованию компьютерных сетей?
10.Что относится к промежуточной аппаратуре компьютерных сетей?
11.В чем состоит главное отличие коммутатора от концентратора?
12.В чем заключается основная задача сетевого шлюза?
�Содержание
Глава 5. Беспроводная передача данных и беспроводные
технологии
Беспроводная связь стала использоваться для коммуникации ненамного позже, чем
проводная. Уже в 90-х годах XIX века были проведены первые эксперименты по
передаче телеграфных сообщений с помощью радиосигналов, а в 20-е годы XX века
началось применение радио для передачи голоса.
Сегодня существует большое число беспроводных телекоммуникационных систем, в
том числе не только широковещательных, таких как радио или телевидение.
Беспроводные системы также широко используются как транспортное средство для
передачи дискретной информации. Для создания протяженных линий связи
используются радиорелейные и спутниковые системы, существуют также
беспроводные системы доступа к сетям операторов связи и беспроводные локальные
сети.
5.1. Беспроводная линия связи
5.2. Беспроводные системы
5.2.1. Двухточечная связь
5.2.2. Связь одного источника и нескольких приемников
5.3. Спутниковые системы
5.3.1. Геостационарный спутник
5.3.2. Средневысотные спутники
5.3.3. Низкоорбитальные спутники
5.4. Технология Bluetooth
5.5. Технология Wi-Fi
5.5.1. Принцип работы Wi-Fi
5.5.2. Основные стандарты Wi-Fi
5.5.3. Преимущества и недостатки Wi-Fi
5.5.4. Юридический статус Wi-Fi
Контрольные вопросы к главе 5
�Содержание
5.1. Беспроводная линия связи
Беспроводная линия связи строится по следующей схеме: каждый узел оснащается
антенной, которая одновременно является передатчиком и приемником
электромагнитных волн. Электромагнитные волны распространяются в атмосфере или
в вакууме со скоростью 3×108 м/c во всех направлениях или же в пределах
определенного сектора.
Направленность или ненаправленность распространения зависит от типа антенны. На
рис. 5.1 показана параболическая антенна, которая является направленной. Другой
тип антенн – изотропные антенны, представляющие собой вертикальный проводник
длиной в четверть волны излучения, являются ненаправленными. Изотропные
антенны широко используются в автомобилях и портативных устройствах.
Распространение излучения во всех направлениях можно также обеспечить
посредством нескольких направленных антенн.
Рис. 5.1. Беспроводная линия связи
Так как при ненаправленном распространении электромагнитные волны заполняют
все пространство (в пределах определенного радиуса, определяемого затуханием
мощности сигнала), то это пространство может служить разделяемой средой.
Разделение среды передачи порождает те же противоречия, что и в локальных сетях,
однако здесь они усугубляются тем, что пространство, в отличие от кабеля, является
общедоступным, а не принадлежит одной организации.
Кроме того, проводная среда строго определяет направление распространения
сигнала в пространстве, а беспроводная среда является ненаправленной.
Для передачи дискретной информации с помощью беспроводной линии связи
необходимо модулировать электромагнитные колебания передатчика в соответствии с
потоком передаваемых битов. Эту функцию осуществляет DCE-устройство, которое
находится между антенной и DTE-устройством. В качестве DTE-устройства может
выступать коммутатор, компьютер или маршрутизатор компьютерной сети.
�Содержание
5.2. Беспроводные системы
5.2.1. Двухточечная связь
5.2.2. Связь одного источника и нескольких приемников
�Содержание
5.2.1. Двухточечная связь
Типичная схема проводного двухточечного канала применяется и для беспроводной
связи. По двухточечной схеме могут работать беспроводные каналы различного
назначения, использующие различные диапазоны частот. В телекоммуникационных
первичных сетях такая схема уже долгое время используется для создания
радиорелейных линий связи. Такую линию образуют несколько башен, на которых
установлены параболические направленные антенны (рис. 5.2). Каждая такая линия
работает в микроволновом диапазоне на частотах в несколько гигагерц. Направленная
антенна концентрирует энергию в узком пучке, что позволяет передавать информацию
на достаточно протяженные расстояния, обычно до 50 км. Высокие башни
обеспечивают прямую видимость антенн. Пропускная способность линии может быть
достаточно высокой, обычно она находится в пределах от нескольких мегабит в
секунду до сотен мегабит в секунду. Такие линии могут быть как магистральными, так
и линиями доступа. Операторы связи часто используют такие линии, когда проложить
оптоволокно не является возможным, например ввиду высокозатратности или из-за
природных условий.
Диапазоны 900 МГц и 5 ГГц не во всех странах являются свободными от
лицензирования.
Рис. 5.2. Радиорелейная линия связи
Радиорелейная линия связи может использоваться в городе для соединения двух
зданий. Так как высокая скорость в таком случае не всегда нужна (например, нужно
соединить небольшой сегмент локальной сети с основной локальной сетью
предприятия), то здесь могут применяться радиомодемы, работающие в АМдиапазоне. Для связи двух зданий может также использоваться лазер, обеспечивая
высокую информационную скорость (до 155 Мбит/с), но только при соответствующем
состоянии атмосферы.
�Содержание
Беспроводная двухточечная линия связи также может использоваться и для
соединения двух узлов (рис. 5.3). Такая линия образует простейший сегмент
локальной сети, поэтому расстояния и мощности сигнала здесь совершенно другие.
Для расстояний в пределах одного помещения могут использоваться как диапазон
инфракрасных
волн
(рис. 5.3а),
так
и
микроволновый
диапазон
(рис. 5.3б). Большинство
современных
ноутбуков
оснащено
встроенным
инфракрасным портом, поэтому такое соединение может быть образовано
автоматически, как только порты двух компьютеров окажутся в пределах прямой
видимости (или видимости отраженного луча). Микроволновый вариант работает в
пределах нескольких десятков или сотен метров. Однако при распространении
микроволнового сигнала в помещении необходимо учитывать многочисленные
факторы, которые создают помехи, например: дифракция, отражение, рассеивание, а
также эффекты проникновения волн через стены и межэтажные перекрытия.
Рис. 5.3. Беспроводная связь двух компьютеров
�Содержание
5.2.2. Связь одного источника и нескольких приемников
Схема беспроводного канала с одним источником и несколькими приемниками
характерна для такой организации доступа, при которой многочисленные
пользовательские терминалы соединяются с базовой станцией (Base Station, BS).
Беспроводные линии связи для схемы одного источника и нескольких приемников
используются как для фиксированного доступа, так и для мобильного.
На рис. 5.4 показан вариант фиксированного доступа с помощью микроволновых
линий связи. Оператор связи использует высокую башню для того, чтобы обеспечить
прямую видимость с антеннами, установленными на крышах зданий своих клиентов.
Подобный вариант может представлять собой набор двухточечных линий связи – по
количеству зданий, которые необходимо соединить с базовой станцией. Но, учитывая
тот фактор, что для каждого нового клиента нужно устанавливать новую антенну на
башне, этот вариант будет достаточно затратным. По этой причине для экономии
обычно применяют антенны, захватывающие определенный сектор, например в 45°.
Тогда за счет нескольких антенн оператор может обеспечить связь в пределах полного
сектора в 360°, конечно, на ограниченном расстоянии (обычно в несколько
километров).
Пользователи линий доступа могут обмениваться информацией только с базовой
станцией, а базовая станция обеспечивает взаимодействие между отдельными
пользователями.
Базовая станция обычно соединяется проводной связью с проводной частью сети,
обеспечивая коммуникацию с пользователями других базовых станций или
пользователями проводных сетей. Базовая станция называется также точкой доступа
(Access Point, АР). Точка доступа:
включает в себя DCE-оборудование, необходимое для образования линии связи;
• является коммутатором сети (телефонным коммутатором / коммутатором пакетов),
доступ к которой она обеспечивает.
•
Рис. 5.4. Фиксированный беспроводный доступ
�Содержание
5.3. Спутниковые системы
Спутниковая связь используется для организации высокоскоростных микроволновых
протяженных линий. Так как для таких линий связи нужна прямая видимость,
которую из-за кривизны Земли невозможно обеспечить на больших расстояниях, то
спутник как отражатель сигнала является естественным решением этой проблемы
(рис. 5.5).
Рис. 5.5. Планета Земля и спутник
Концепция использования искусственного спутника Земли для создания линий связи
появилась задолго до запуска в 1957 году первого такого спутника Советским
Союзом. Писатель-фантаст Артур Кларк, как и его знаменитые предшественники
Жюль Верн и Герберт Уэллс, которым удалось предопределить много технических
изобретений до их появления, в 1945 году описал геостационарный спутник, который
висит над одной точкой экватора и предоставляет связь на достаточно большие
расстояния.
Первый спутник, запущенный Советским Союзом в годы холодной войны, обладал
очень ограниченными телекоммуникационными возможностями – он передавал
радиосигнал «бип-бип», извещая мир о своем присутствии в космосе. После этого
события, в 1962 году, в США был запущен первый телекоммуникационный спутник
Telstar-1, который поддерживал 600 голосовых каналов.
С течением времени усложняются функции спутника как телекоммуникационного
узла. Сегодня спутник может выступать в качестве узла первичной сети, а также в
качестве телефонного коммутатора или коммутатора/маршрутизатора компьютерной
сети. Для этих целей, аппаратура спутников может взаимодействовать не только с
наземными станциями, но и между собой, образуя прямые космические
беспроводные линии связи.
�Содержание
Принципиальных отличий между техникой передачи микроволновых сигналов в
космосе и техникой передачи микроволновых сигналов на Земле нет. Но у
спутниковых линий связи есть характерная особенность: один из узлов такой линии
связи постоянно находится в полете, причем на значительно удаленном расстоянии от
других узлов (рис. 5.6).
Рис. 5.6. Спутник
Спутники связи обладают определенными свойствами, вследствие чего они широко
применяются в различных областях. Спутник связи включает в себя несколько
транспондеров, каждый из которых настроен на определенную часть частотного
спектра. Транспондеры усиливают сигналы и преобразуют их на новую частоту,
чтобы при отправке на планету отраженный сигнал не накладывался на прямой.
Нисходящий луч может быть как широким, покрывающим огромные пространства на
планете, так и узким, который можно принять в области, ограниченной лишь
несколькими сотнями километров. Последний метод называется трубой.
В соответствии с законом Кеплера, период обращения спутника равен радиусу орбиты
в степени 3/2. Из этого следует, что, чем выше орбита, тем дольше период. Вблизи
поверхности Земли период обращения вокруг нее составляет примерно 90 минут.
Следовательно, спутники, расположенные на малой высоте, слишком быстро
исчезают из вида приемно-передающих устройств, расположенных на Земле, поэтому
необходимо организовывать непрерывные зоны покрытия. На высоте 35 800 км
период составляет 24 часа. А на высоте 384 000 км спутник будет обходить Землю
целый месяц.
�Содержание
Период обращения спутника не является единственным критерием, по которому
определяют, где его разместить. Необходимо также учитывать пояса Ван Аллена (Van
Allen belts) – области скопления частиц с большим зарядом, находящихся в зоне
действия магнитного поля Земли (рис. 5.7). Любой спутник, попав в такой пояс,
довольно быстро будет уничтожен этими частицами. В результате учета этих факторов
были выделены три зоны, в которых можно безопасно размещать искусственные
спутники.
Рис. 5.7. Спутники связи и их свойства: высота орбиты, задержка, число спутников, необходимое для
покрытия всей поверхности земного шара
5.3.1. Геостационарный спутник
5.3.2. Средневысотные спутники
5.3.3. Низкоорбитальные спутники
�Содержание
5.3.1. Геостационарный спутник
Геостационарный спутник расположен над определенной точкой экватора и в
точности следует скорости вращения Земли (рис. 5.8). Это обусловлено следующими
факторами:
•
четверть поверхности Земли оказывается с такой высоты в зоне прямой
видимости, поэтому с помощью геостационарных спутников просто организовать
широковещание в пределах страны или континента;
•
сам спутник неподвижен для наземных антенн, что значительно облегчает
организацию связи, так как не нужно автоматически корректировать направление
наземной антенны, как это приходится делать для других типов спутников. Однако.
с появлением в 1990 году небольших всенаправленных антенн, теперь уже нет
необходимости в отслеживании за положением низкоорбитального спутника,
достаточно, чтобы он находился в зоне прямой видимости;
•
геостационарный спутник находится за пределами земной атмосферы, что
повышает срок его эксплуатации. Низкоорбитальные же спутники из-за трения о
воздух постоянно теряют высоту и им приходится восстанавливать ее с помощью
двигателей.
Рис. 5.8. Геостационарный спутник
�Содержание
Посредством использования нескольких антенн, геостационарные спутники обычно
поддерживают большое количество каналов. Раньше для работы с геостационарными
спутниками в качестве антенн требовались очень большие «тарелки» (диаметром до
10 м), что значительно затрудняло использование геостационарных спутников для
небольших предприятий. Но, благодаря появлению направленных антенн,
устанавливаемых на спутниках, диаметр «тарелок» значительно уменьшился.
Направленные антенны создают сигнал, который можно принимать с помощью
сравнительно небольших наземных антенн – апертурных терминалов (Very Small
Aperture Terminals, VSAT). В настоящее время наземные станции, оснащенные VSAT,
предоставляют разнообразный спектр услуг, например, телефония, конференции,
передача данных.
К недостаткам геостационарных спутников можно отнести колоссальную удаленность
спутника от поверхности Земли, что, в свою очередь, приводит к большим задержкам
распространения сигнала – от 230 до 280 мс. Поэтому при использовании
геостационарного спутника для передачи разговора или телевизионного диалога
возникают продолжительные паузы, мешающие общению. Кроме того, на таких
расстояниях потери сигнала высоки, что означает необходимость применения
мощных передатчиков и тарелок больших размеров. Также недостатком
геостационарного спутника с его круговой орбитой является достаточно низкое
качество связи для районов, близких к Северному и Южному полюсам. Сигналы в
таких районах проходят большие расстояния, чем в районах, расположенных в
экваториальных и умеренных широтах, и, как следствие, больше ослабляются.
Решением данного противоречия является спутник с ярко выраженной эллиптической
орбитой, который приближается к Земле как раз в районе Северного и Южного
полюсов.
Место на орбите геостационарного спутника также регулируется союзом ITU.
Сегодня наблюдается определенный дефицит таких мест, так как геостационарные
спутники не могут располагаться на орбите ближе, чем 2° друг к другу. Из этого
следует, что на орбите может находиться не более 180 геостационарных спутников
[47].
�Содержание
5.3.2. Средневысотные спутники
Средневысотные спутники размещаются на высоте от 5 000 км до 15 000 км и
функционируют по низким круговым и эллиптическим орбитам. Один такой спутник
может охватить около 25 % поверхности Земли. Для глобального охвата наиболее
населенных районов земного шара необходимо 7–12 средневсотных спутников.
Период обращения спутника на средневысотной орбите составляет около 6 часов, из
которых он лишь несколько минут проводит в тени Земли, поэтому длительность
циклов зарядки/разрядки солнечных батарей и их частота меньше, чем у
низкоорбитальных систем. Срок службы аппаратов до 12 лет. Полная задержка
радиосигнала составляет не более 130 мс.
�Содержание
5.3.3. Низкоорбитальные спутники
Низкоорбитальные спутники используют орбиты на высоте от 700 км до 1 500 км. Из
полного периода обращения (100 минут) на теневой стороне Земли находятся
30 минут. Аккумуляторные батареи на борту низкоорбитальных спутников должны
обеспечивать приблизительно 5 000 циклов зарядки/разрядки в год. Один аппарат
способен охватить не более 6–7 % территории Земли. Для полного покрытия
поверхности земли необходимо 48–60 низкоорбитальных спутников.
Ввиду относительно небольших расстояний от поверхности планеты, к основным
преимуществам низкоорбитальных спутников относят: пониженную мощность
передатчиков, малые размеры антенн и распространения сигнала около 20–25 мс.
Основной недостаток данного вида спутников – небольшая площадь покрытия,
диаметр которой составляет всего около 8 000 км.
Период оборота такого спутника вокруг Земли составляет от 1,5 до 2 часов, а время
видимости спутника наземной станцией – всего 20 минут. Это означает, что
постоянная связь с помощью низкоорбитальных спутников может быть обеспечена,
только когда на орбите их находится достаточно большое количество. Кроме того,
атмосферное трение снижает срок службы таких спутников до 8–10 лет.
Если основным назначением геостационарных спутников является широковещание и
удаленная связь, то низкоорбитальные спутники служат в качестве средства
поддержания мобильной связи.
В начале 90-х годов прошлого века достоинства компактных терминальных устройств
для низкоорбитальных спутников показались руководителям компании Motorola более
важными, чем их недостатки. Вместе с несколькими крупными партнерами эта
компания начала проект Indium, цель которого заключалась в создании всемирной
спутниковой сети, обеспечивающей мобильную связь в любой точке земного шара.
Ведь в конце 80-х годов XX века еще не существовало такой плотной системы сот
мобильной телефонии, как сегодня. В 1997 году группа из 66 спутников была
запущена, а в 1998 году началась коммерческая эксплуатация системы Iridium.
Спутники Iridium действительно покрывают всю поверхность земного шара, вращаясь
по 6 орбитам, проходящим через полюсы Земли. На каждой орбите находится по
11 спутников, передатчики которых работают на частоте 1,6 ГГц с полосой
пропускания 10 МГц. Эта полоса расходуется 240 каналами по 41 кГц каждый. За счет
многократного использования частот система Iridium поддерживает 253 440 каналов,
организуя системы скользящих по поверхности Земли сот. Для пользователей
системы Iridium основным видом услуги являлась телефонная связь и передача
данных со скоростью 2,4 Кбит/с. Спутники Iridium обладают значительным
интеллектом, они могут, пользуясь специальными межспутниковыми каналами,
передавать друг другу информацию со скоростью 25 Мбит/с. Поэтому телефонный
вызов идет от спутникового телефона Iridium прямо на спутник, находящийся в зоне
видимости. Затем этот спутник маршрутизирует вызов через систему промежуточных
�Содержание
спутников тому спутнику, который в данный момент ближе к вызываемому абоненту.
Система Iridium представляет собой сеть с полным собственным стеком протоколов,
поддерживающим всемирный роуминг. Однако коммерческие успехи Iridium
оказались незначительными, и через два года своего существования компания
обанкротилась. Расчет на мобильных телефонных абонентов оказался неверным – к
моменту начала работы наземная сеть сотовой связи уже покрывала большую часть
территории развитых стран. А услуги по передаче данных со скоростью 2,4 Кбит/с не
соответствовали потребностям пользователей конца XX века. Сегодня система Iridium
снова работает, теперь уже с новым владельцем и новым именем – Iridium Satellite. В
2017–2019 годах было осуществлено развертывание обновленной орбитальной
группировки Iridium NEXT из 75 спутников новой модели.
Другой известной системой низкоорбитальных спутников является Globalstar. В
отличии от Iridium, 48 низкоорбитальных спутников Globalstar выполняют
традиционные для геостационарных спутников функции – принимают телефонные
вызовы от мобильных абонентов и передают их ближайшей наземной базовой
станции. Маршрутизацию вызовов выполняет базовая станция, перенаправляющая
вызов базовой станции, ближайшей к спутнику, в зоне видимости которого находится
вызываемый абонент. Межспутниковые каналы не используются. Помимо телефонных
разговоров, Globalstar передает данные со скоростью 4,8 Кбит/с.
Еще одна сеть LEO – Orbcomm предоставляет сервис, ориентированный на передачу
коротких сообщений в режиме «машина–машина», например, между промышленными
установками или датчиками, расположенными в труднодоступных районах. Доставка
сообщений не всегда осуществляется в режиме реального времени. Если спутник
невидим, терминал Orbcomm просто хранит пакеты, пока космический аппарат не
войдет в зону видимости. Это приводит к чрезвычайно значительной
неравномерности в передаче данных. Вместо привычных для пользователей Интернета
задержек в доли секунды, в этой сети паузы иногда измеряются минутами.
�Содержание
5.4. Технология Bluetooth
Технология Bluetooth поддерживает множество приложений, например таких, как:
передача данных, графики, аудио, видео и т. д. и предназначена для унификации
возможностей ближней радиосвязи. Эта технология, прежде всего, призвана
обеспечить взаимодействие между устройствами, относящимися к разным отраслям
промышленности: компьютеры, мобильная связь, автомобильный рынок.
Устройство Bluetooth – это внедренное в микрочип радиоустройство ближнего
действия. Стандарты Bluetooth разрабатываются и публикуются промышленным
консорциумом Bluetooth SIG (Special Interest Group).
Работая в диапазоне 2,4 ГГц (диапазон ISM – общедоступные частоты для
маломощных устройств), два аппарата Bluetooth, находящиеся на расстоянии до 10 м,
могут передавать данные со скоростью до 720 Кбит/с, а при использовании
технологии EDR (Enhanced Data Rate – повышенная скорость передачи), которая
присутствует, начиная с версии 2.0, – до 2 200 Кбит/с. При применении устройства
Bluetooth с дополнительным усилителем мощности расстояние передачи может быть
увеличено до 100 м. Технология Bluetooth рассчитана на работу в среде со многими
пользователями, позволяя организовывать ad-hoc сети.
Слово
Bluetooth
–
перевод
на
английский
язык
датского
слова
«Blåtand» («Синезубый»). Это прозвище носил король Харальд I, правивший в X веке
Данией и частью Норвегии и объединивший враждовавшие датские племена в единое
королевство. Подразумевается, что Bluetooth делает то же самое с протоколами связи,
объединяя их в единый универсальный стандарт.
5.4.1 Принцип действия Bluetooth
Принцип действия Bluetooth основан на использовании радиоволн. Радиосвязь
Bluetooth осуществляется в ISM-диапазоне (англ. Industry, Science and Medicine),
который используется в различных бытовых приборах и беспроводных сетях
(свободный от лицензирования диапазон 2,4–2,4835 ГГц). В Bluetooth применяется
метод расширения спектра со скачкообразной перестройкой частоты (англ. Frequency
Hopping Spread Spectrum, FHSS). Метод FHSS прост в реализации, стоимость
оборудования сравнительно небольшая и он обеспечивает устойчивость к
широкополосным помехам.
Согласно алгоритму FHSS, в Bluetooth несущая частота сигнала скачкообразно
меняется 1 600 раз в секунду (всего выделяется 79 рабочих частот шириной в 1 МГц, а
в Японии, Франции и Испании полоса уже – 23 частотных канала).
Последовательность переключения между частотами для каждого соединения
является псевдослучайной и известна только передатчику и приемнику, которые
каждые 625 мкс (один временной слот) синхронно перестраиваются с одной несущей
частоты на другую. Таким образом, если рядом работают несколько пар приемник–
�Содержание
передатчик, то они не мешают друг другу. Этот алгоритм является также составной
частью системы защиты конфиденциальности передаваемой информации: переход
происходит по псевдослучайному алгоритму и определяется отдельно для каждого
соединения. При передаче цифровых данных и аудиосигнала со скоростью 64 кбит/с в
обоих направлениях, используются различные схемы кодирования: аудиосигнал не
повторяется, а цифровые данные в случае потери пакета будут переданы повторно.
Протокол Bluetooth поддерживает не только соединение «point-to-point», но и
соединение «point-to-multipoint» [74].
В середине июня 2016 года Bluetooth Special Interest Group (SIG) выпустила
улучшенную беспроводную технологию Bluetooth версии 5.0, которая в сравнении с
предыдущими версиями, работает быстрее и в большем диапозоне, а именно:
•
скорость передачи информации выросла до 2 Мбит/с;
•
дальность передачи с помощью Coded PHY и Forward Error Correction (FEC)
увеличилась в 4 раза;
•
все устройства, оборудованные чипами Bluetooth 5.0 совместимы с устройствами,
работающими со старыми протоколами и предыдущими версиями этой
технологии;
•
пропускная способность выросла в 8 раз.
В условиях стремительного развития рынка беспроводных гаджетов, Bluetooth 5.0 в
течение ближайшего времени может дополняться новыми апгрейдами,
направленными на стабилизацию соединения между подключаемыми устройствами.
�Содержание
5.5. Технология Wi-Fi
Wi-Fi (англ. Wireless Fidelity — «беспроводная
точность») – торговая марка Wi-Fi Alliance для
беспроводных сетей на базе стандарта IEEE
802.11.
Wi-Fi был создан в 1991 году NCR Corporation/
AT&T (впоследствии – Lucent Technologies и
Agere Systems) в Ньивегейн, Нидерланды.
Продукты, предназначавшиеся изначально для
систем
кассового
обслуживания,
были
выведены на рынок под маркой WaveLAN и
обеспечивали скорость передачи данных от 1 до 2 Мбит/с. Создатель Wi-Fi – Вик Хейз
(Vic Hayes) находился в команде, участвовавшей в разработке таких стандартов, как
IEEE 802.11b, IEEE 802.11a и IEEE 802.11g.
Wi-Fi – это современная, развивающаяся и перспективная беспроводная технология,
которая использует радиоканалы для передачи данных. Данная технология
предполагает наличие точки доступа/маршрутизатора Wi-Fi (стандарты 802.11a/b/g/n/
ас), которая обеспечивает стабильный доступ к сети из некоторой области радиусом
до 45 метров в помещении и около 90 метров на открытом пространстве.
5.5.1. Принцип работы Wi-Fi
5.5.2. Основные стандарты Wi-Fi
5.5.3. Преимущества и недостатки Wi-Fi
5.5.4. Юридический статус Wi-Fi
�Содержание
5.5.1. Принцип работы Wi-Fi
Обычно схема Wi-Fi сети содержит не менее одной точки доступа и не менее одного
клиента. Также возможно подключение двух клиентов в режиме точка-точка (Ad-hoc),
когда точка доступа не используется, а клиенты соединяются посредством сетевых
адаптеров «напрямую». Минимальная скорость передачи данных для сетей Wi-Fi
составляет 0,1 Мбит/с, так как точка доступа передает свой идентификатор сети (SSID)
с помощью специальных сигнальных пакетов на скорости 0,1 Мбит/с каждые 100 мс.
Зная SSID сети, клиент может выяснить, возможно ли подключение к данной точке
доступа. При попадании в зону действия двух точек доступа с идентичными SSID
приемник может выбирать между ними на основании данных об уровне сигнала.
Стандарт Wi-Fi дает клиенту полную свободу при выборе критериев для соединения.
Однако, стандарт не описывает все аспекты построения беспроводных локальных
сетей Wi-Fi. Поэтому каждый производитель оборудования решает эту задачу посвоему, применяя те подходы, которые он считает наилучшими с той или иной точки
зрения.
Способы организации беспроводных локальных сетей можно классифицировать по
различным основаниям.
По способу объединения точек доступа в единую систему можно выделить:
•
автономные точки доступа (децентрализованные);
•
точки доступа, работающие под управлением контроллера (централизованные);
•
бесконтроллерные, но не автономные (управляемые без контроллера).
По способу организации и управления радиоканалами можно выделить
беспроводные локальные сети:
•
со статическими настройками радиоканалов;
•
с динамическими (адаптивными) настройками радиоканалов;
•
со «слоистой» или многослойной структурой радиоканалов.
К точке доступа подключаются устройства-клиенты: нетбуки, планшеты, Smart TV,
компьютеры, ноутбуки, смартфоны и другие мобильные устройства, имеющие Wi-Fi
адаптеры (приемники). После подключения мгновенно обеспечивается доступ в сеть
Интернет или локальную сеть.
�Содержание
5.5.2. Основные стандарты Wi-Fi
IEEE 802.11 – определяет набор протоколов для самых низких скоростей передачи
данных и является базовым стандартом WLAN.
IEEE 802.11a – протокол не совместим с 802.11b и несет в себе более высокие
скорости передачи, чем 11b. Использует частотные каналы в спектре 5 GHz.
Максимальная пропускная способность до 54 Мбит/c.
IEEE 802.11b – стандарт использует более быстрые скорости передачи и вводит
больше технологических ограничений. Использует частотные каналы в спектре
2.4 GHz. Максимальная пропускная способность до 11 Мбит/c.
IEEE 802.11g – стандарт использует скорости передачи данных эквивалентные 11а.
Используются частотные каналы в спектре 2.4 GHz. Протокол совместим с 11b.
Максимальная пропускная способность до 54 Мбит/c.
IEEE 802.11n – коммерческий Wi-Fi стандарт, который использует частотные каналы
в спектрах 2.4 GHz и 5 GHz. Совместим с 11b/11a/11g. Максимальная пропускная
способность до 300 Мбит/ c.
IEEE 802.11ac – стандарт беспроводных локальных сетей Wi-Fi, работающий в
диапазоне частот 5 GHz. Основными преимуществами стандарта WiFi 802.11ас
являются высокие скорости передачи в радиоканале и большая агрегированная полоса
пропускания точки доступа, а также более совершенные механизмы контроля
активного и пассивного состояния клиентских устройств и, как следствие –
значительная экономия заряда батареи мобильного устройства. Стандарт позволяет
существенно расширить пропускную способность сети, начиная от 433 Мбит/с.
�Содержание
5.5.3. Преимущества и недостатки Wi-Fi
Преимущества сетей Wi-Fi:
возможность беспроводного доступа в сеть Интернет;
экономие средств и времени, так как не нужно осуществлять монтаж кабельных
линий;
• упрощеный процесс масштабирования сетей;
• глобальная совместимость девайсов. Wi-Fi – это семейство глобальных стандартов,
поэтому устройство, произведенное в США, должно прекрасно работать в странах
СНГ, и наоборот;
• излучение от Wi-Fi устройств в момент передачи данных в 100 раз меньше, чем у
сотового телефона.
•
•
Недостатки Wi-Fi:
•
•
•
•
•
•
•
Правовой аспект. В различных странах по-разному подходят к использованию
частотного диапазона и параметрам передатчиков/приемников беспроводного
сигнала стандартов IEEE 802.11. В одних странах, к примеру, требуется регистрация
всех Wi-Fi сетей, работающих вне помещений. В других налагается ограничение на
используемые частоты или мощность передатчика. В странах СНГ использование
Wi-Fi без разрешения на использование частот от Государственной комиссии по
радиочастотам возможно для организации сети внутри зданий, закрытых
складских помещений и производственных территорий.
Стабильность
связи.
Стандартные
home
Wi-Fi
маршрутизаторы
распространенных стандартов 802.11Ь или 802.11g имеют радиус действия порядка
от 40 метров до 50 метров в помещении и до 90 метров снаружи (в зависимости от
рабочей частоты). Некоторые электронные устройства (микроволновка) или
погодные явления ослабляют уровень сигнала.
Перекрестные помехи. При большой плотности точек доступа могут возникнуть
проблемы доступа к открытой точке доступа при наличии рядом хотспота,
работающего на том же или соседнем канале и использующем шифрование.
Факторы производства. К сожалению, производители не всегда четко
придерживаются стандартов, поэтому некоторые устройства могут работать
нестабильно или на меньших скоростях.
Энергопотребление. Достаточно высокое потребление энергии, что уменьшает
время жизни батарей и повышает температуру устройства.
Безопасность. Стандарт шифрования WEP является одним из самых
распространенных и относительно легко взламываемых стандартов. А
разработанные ранее точки доступа не поддерживают более надежный протокол
WPA, хотя на сегодняшний день наиболее оптимальным считается протокол WPA2.
Ограниченная функциональность. При передаче небольших пакетов данных к
ним присоединяется большое количество служебной информации, что ухудшает
качество связи. Поэтому Wi-Fi не рекомендуется использовать для работы в IPтелефонии, использующей протокол RTP: качество связи не гарантировано.
�Содержание
5.5.4. Юридический статус Wi-Fi
Юридический статус Wi-Fi различается в разных странах. В США диапазон 2.5 ГГц
разрешается использовать без лицензии, при условии, что мощность не превышает
определенную величину, и такое использование не создает помех тем, кто имеет
лицензию.
В России использование Wi-Fi без разрешения на использование частот от
Государственной комиссии по радиочастотам возможно для организации сети внутри
зданий, закрытых складских помещений и производственных территорий. Для
легального использования внеофисной беспроводной сети Wi-Fi необходимо получить
разрешение на использование частот.
�Содержание
Контрольные вопросы к главе 5
1. Какой тип связи возник раньше?
2. Назовите типы антенн.
3. Что такое точка доступа?
4. Перечислите основные типы спутников и их преимущества и недостатки.
5. Для чего предназначена технология Bluetooth?
6. Опишите принцип действия Bluetooth, на чем он основан?
7. Что является основным элементом организации сетей Bluetooth?
8. Опишите формат кадра Bluetooth, состоящего из одного слота.
9. Назовите основные области применения технологии Bluetooth.
10.Что такое технология Wi-Fi? Опишите принцип работы Wi-Fi.
�Содержание
Глава 6. Мобильные системы
6.1. Мобильная связь
6.2. Поколения связи
6.2.1. Поколение 1G
6.2.2. Поколение 2G
6.2.3. Поколение 2.5G
6.2.4. Поколение 3G
6.2.5. Поколение 3.5G
6.2.6. Поколение 4G. LTE
6.2.7. Поколение 5G
Контрольные вопросы к главе 6
�Содержание
6.1. Мобильная связь
«Мобильная связь – это радиосвязь между
абонентами, местоположение одного или нескольких
из которых меняется» [9]. Одним из видов
мобильной связи является сотовая связь.
«Сотовая связь — один из видов радиосвязи, в
основе которого лежит сотовая сеть» [8]. Ключевая
особенность сотовой сети заключается в том, что
общая
зона
покрытия
делится
на
соты,
определяющиеся зонами покрытия базовых станций.
Соты перекрываются и вместе образуют единую
сеть. На идеальной поверхности зона покрытия
одной базовой станции представляет собой круг,
поэтому составленная из них сеть имеет вид сот с
шестиугольными ячейками.
На сегодняшний день в большинстве схем мобильного доступа в основу положен
принцип сот, которые представляют собой небольшие по площади территории,
обслуживаемые одной базовой станцией. Концепция сот возникла не сразу.
Изначально первые мобильные телефоны взаимодействовали с одной базовой
станции, покрывающей значительную территорию. Идея небольших сот была впервые
сформулирована еще в 1945 году. Первые тестовые участки сотовой сети появились в
конце 60-х годов XX века, а их массовое коммерческое применение началось в начале
80-х годов прошлого века.
Принцип разбиения всей области охвата сети на небольшие соты дополняется идеей
многократного использования частоты. На рис. 6.1 показан вариант организации сот
при наличии всего трех частот, при этом ни одна из соседних пар сот не задействует
одну и ту же частоту. Многократное использование частот позволяет оператору
рационально расходовать выделенный ему частотный диапазон, при этом абоненты и
базовые станции соседних сот не испытывают проблем из-за интерференции
сигналов.
Конечно, базовая станция должна контролировать мощность излучаемого сигнала,
чтобы две несмежные соты, работающие на одной и той же частоте, не создавали друг
другу помех.
При гексагональной форме сот количество повторяемых частот может быть больше,
чем 3, например 4, 7, 9, 12, 13 и т. д.
Если известно минимальное расстояние D между центрами сот, работающих на одной
и той же частоте, то число сот (N) можно выбрать по формуле: N = D2/3R2, где R –
радиус соты.
�Содержание
Рис. 6.1. Многократное использование частот в сотовой сети
Небольшие по величине соты обеспечивают небольшие размеры и мощность
терминального устройства пользователя, что позволяет современным мобильным
телефонам быть такими компактными. Мобильные компьютерные сети пока не
получили такого распространения, как телефонные, но принципы организации
беспроводных линий связи в них остаются теми же. Главной проблемой мобильной
линии связи остается переход терминального устройства из одной соты в другую. Эта
процедура, которая называется эстафетной передачей, отсутствует при
фиксированном доступе и относится к протоколам более высоких уровней, нежели
физический [86].
Рассмотрим, как осуществляется звонок по мобильному телефону:
11.Пользователь набирает номер.
12.Телефонная трубка (HS – Hand Set) начинает поиск ближайшей базовой станции
(BS – Base Station). Сотовая башня представляет собой приемопередающее,
управляющее и коммуникационное оборудование, составляющее сеть. В состав
базовой станции входят контроллер базовой станции (BSC – Base Station Controller) и
несколько ретрансляторов (BTS – Base Transceiver Station). Базовые станции
управляются мобильным коммутирующим центром (MSC – Mobile Service Center).
Благодаря сотовой структуре ретрансляторы покрывают местность зоной уверенного
приема в одном или нескольких радиоканалах с дополнительным служебным каналом,
по которому происходит синхронизация, т. е. согласование протокола обмена
аппарата и базовой станции по аналогии с процедурой модемной синхронизации
(handshacking), в процессе которого устройства принимают соглашения о скорости
передачи, канале и т. д.
13.Мобильный аппарат находит базовую станцию и происходит синхронизация, после
чего контроллер базовой станции формирует полнодуплексный канал на мобильный
коммутирующий центр через фиксированную сеть.
14.Центр передает информацию о мобильном терминале в четыре регистра:
посетительский регистр подвижных абонентов или «гостей» (VLR – Visitor Layer
Register), «домашний» регистр местных подвижных абонентов (HRL – Home Register
�Содержание
Layer), регистр подписчика или аутентификации (AUC – AUthentiCator) и регистр
идентификации оборудования (EIR – Equipment Identification Register). Эта информация
уникальна и находится в пластиковой абонентской микроэлектронной телекарточке
или модуле (SIM – Subscriber Identity Module), по которому производятся проверка
данных абонента и тарификация. В отличие от стационарных телефонов, за
пользование которыми плата взимается в зависимости от нагрузки (числа занятых
каналов), поступающей по фиксированной абонентской линии, плата за пользование
мобильной связью взимается не с используемого телефонного аппарата, а с SIMкарты. SIM-карта представляет собой флэш-чип, выполненный по смарт-технологии
(SmartVoltage) и имеющий необходимый внешний интерфейс. Информация хранится в
стандарте уникального международного идентификатора абонента (IMSI – International
Mobile Subscriber Identification). В сотовой связи применяется 56 бит кодирование.
15.На основании этих данных формируется представление системы о мобильном
пользователе (его местоположение, статус в сети и т. д.) и происходит коммутация.
Если мобильный пользователь во время разговора перемещается из зоны действия
одного ретранслятора в зону действия другого, или даже между зонами действия
разных контроллеров, на качестве связи это никак не отражается, поскольку система
автоматически выбирает ту базовую станцию, связь с которой наиболее мощна. В
зависимости от загруженности каналов телефон выбирает между сетью 900 и
1 800 МГц, причем переключение возможно даже во время разговора абсолютно
незаметно для абонента.
Звонок из обычной телефонной сети мобильному пользователю осуществляется в
обратной последовательности: сначала определяются местоположение и статус
абонента на основании постоянно обновляющихся данных в регистрах, а затем
происходят соединение и поддержание связи.
Системы подвижной радиосвязи строятся по схеме «точка–многоточие» (pointmultipoint), поскольку абонент может находиться в любой точке соты, контролируемой
базовой станцией.
�Содержание
6.2. Поколения связи
Поколение сотовой связи – это набор функциональных возможностей работы сети, а
именно: регистрация абонента, установление вызова, передача информации между
мобильным телефоном и базовой станцией по радиоканалу, процедура установления
вызова между абонентами, шифрование, роуминг в других сетях, а также набор услуг,
предоставляемых абоненту [107].
На данный момент можно выделить четыре поколения мобильных телефонов
(рис. 6.2), осуществляющих:
1) аналоговую голосовую связь;
2) цифровую голосовую связь;
3) цифровую голосовую связь и обмен данными (доступ в сеть Интернет, электронная
почта и т. д.);
4) голосовая связь как один из видов данных.
1 апреля 2019 г. запущены в коммерческую эксплуатацию сети стандарта связи 5G
двух операторов в Южной Корее и компании Verizon в двух городах США. Эти сети
были развернуты на оборудовании Ericsson.
Рис. 6.2. Схема поколений связи
�Содержание
Рис. 6.3. Стандарты сотовой связи
�Содержание
6.2.1. Поколение 1G
6.2.2. Поколение 2G
6.2.3. Поколение 2.5G
6.2.4. Поколение 3G
6.2.5. Поколение 3.5G
6.2.6. Поколение 4G. LTE
6.2.7. Поколение 5G
�Содержание
6.2.1. Поколение 1G
3 апреля 1973 года был осуществлен первый в мире звонок с сотового телефона. Глава
подразделения мобильной связи компании Motorola Мартин Купер, находясь на
оживленной нью-йоркской улице, позвонил начальнику исследовательского отдела
AT&T Bell Labs Джоэлю Энгелю. Ведь именно эти две компании стояли у истоков
мобильной телефонии. Коммерческую реализацию данная технология получила
спустя 11 лет, в 1984 году, в виде мобильных сетей первого поколения. Сети 1G были
основаны на аналоговом способе передачи информации и представляли собой
аналоговые системы, задуманные и разработанные исключительно для осуществления
голосовых вызовов, а также других минимальных возможностей [107].
На тот момент времени об услугах передачи данных не было речи. Модемы уже
существовали, однако из-за того, что беспроводная связь более подвержена шумам и
искажениям, чем обычная проводная, скорость передачи данных была невероятно
низкой. К тому же стоимость минуты разговора в 80-х годах XX века была весьма
дорогостоящей.
Рис. 6.4. Стандарты сотовой связи поколения 1G
Все первые системы сотовой связи были аналоговыми. К ним относятся (рис. 6.4.):
•
AMPS (Advanced Mobile Phone Service – усовершенствованная мобильная
телефонная служба, диапазон 800 МГц) – это наиболее распространенный стандарт
в мире, обслуживающий почти половину всех абонентов сотовой связи, который
распространен в США, Канаде, Центральной и Южной Америке, Австралии,
России. Однако в России данный стандарт используется в качестве регионального
стандарта, в варианте D-AMPS;
•
TACS (Total Access Communications System – общедоступная система связи,
диапазон 900 МГц) – это второй по степени распространенности среди аналоговых
стандарт. Наиболее распространен в таких странах, как: Англия, Италия, Испания,
Австрия, Ирландия;
•
NMT 450 и NMT 900 (Nordic Mobile Telephone – мобильный телефон северных
стран, диапазоны 450 и 900 МГц соответственно) – третий по степени
распространенности среди аналоговых стандартов в мире. Он широко применяется
в Скандинавии и во многих других странах. Стандарты NMT 450 и GSM 900
являются федеральными стандартами сотовой связи, принятыми в России;
�Содержание
•
С-450 (диапазон 450 МГц) используется в Германии и Португалии;
•
RTMS (Radio Telephone Mobile System – мобильная радиотелефонная система,
диапазон 450 МГц) используется в Италии;
•
Radiocom 2 000 (диапазоны 170, 200, 400 МГц) используется во Франции.
Во всех аналоговых стандартах применяются частотная модуляция для передачи речи
и частотная манипуляция для передачи информации управления. Для передачи
информации различных каналов используются различные участки спектра частот –
применяется метод множественного доступа с частотным разделением каналов
(Frequency Division Multiple Access – FDMA), с полосами каналов в различных
стандартах от 12,5 до 30 кГц. Относительно низкая емкость, являющаяся прямым
следствием недостаточно рационального использования выделенной полосы частот
при частотном разделении каналов – основной недостаток аналоговых стандартов. С
течением времени появились цифровые сотовые системы второго поколения. Переход
к цифровым системам сотовой связи обусловлен масштабным внедрением цифровой
техники как в связь, так и в другие области, а также разработкой низкоскоростных
методов кодирования и появлением сверхминиатюрных интегральных схем для
цифровой обработки сигналов.
�Содержание
6.2.2. Поколение 2G
Первое поколение сотовых телефонных систем было аналоговым. Второе поколение
является цифровым. В первом и втором поколениях мобильных телефонов не были
разработаны регламентирующие стандарты. Сейчас используются четыре системы
второго поколения: D-AMPS, GSM, CDMA и PDC (рис. 6.5.).
Рис. 6.5. Стандарты сотовой связи поколения 2G
В США аналоговый стандарт AMPS получил настолько массовое распространение,
что замена его цифровым стандартом оказалась практически невозможной. Выход
был найден в разработке двухрежимной аналого-цифровой системы, позволяющей
совмещать работу аналоговой и цифровой систем в одном и том же диапазоне. Работа
над соответствующим стандартом была начата в 1988 году и закончена в 1992 году.
Стандарт получил наименование D-AMPS, или IS-54 (IS – сокращение от Interim
Standard, т. е. «промежуточный стандарт»). Его практическое применение началось в
1993 году. В Европе же ситуация осложнялась наличием множества несовместимых
аналоговых систем, и поэтому здесь был разработан единый общеевропейский
стандарт GSM (GSM 900 – диапазон 900 МГц). Соответствующая работа началась в
1982 году, к 1987 году были определены все основные характеристики системы, а в
1988 году приняты основные документы стандарта. Практическое применение
стандарта началось с 1991 года. Еще один вариант цифрового стандарта, по
техническим характеристикам схожий с D-AMPS, был разработан в Японии в 1993
году; первоначально он назывался JDC, а с 1994 года – PDC (Personal Digital Cellular –
буквально «персональная цифровая сотовая связь»).
Разработанный стандарт D-AMPS дополнительно усовершенствовался за счет
введения нового типа каналов управления. Дело в том, что цифровая версия IS-54
сохранила структуру каналов управления аналогового AMPS, что ограничивало
возможности системы. Новые цифровые каналы управления введены в версии IS-136,
которая была разработана в 1994 г. и начала применяться в 1996 г. При этом была
�Содержание
сохранена совместимость с AMPS и IS-54, но повышена емкость канала управления и
заметно были расширены функциональные возможности системы.
Стандарт GSM продолжал совершенствоваться. Соответствующий стандарт (в виде
дополнений к исходному стандарту GSM 900) был разработан в Европе в 1990–
1991 гг. Система получила название DCS 1 800 (Digital Cellular System – цифровая
система сотовой связи и начала функционировать с 1993 года. В 1996 г. она была
переименована как GSM 1 800. В США диапазон 1 800 МГц оказался занят другими
пользователями, но была найдена возможность выделить полосу частот в диапазоне
1 900 МГц, которая получила в Америке название диапазона систем персональной
связи, в отличие от диапазона 800 МГц, за которым сохранено название сотового
(cellular). Освоение диапазона 1 900 МГц началось с конца 1995 года.
�Содержание
6.2.3. Поколение 2.5G
Мобильные телефонные сети изначально были рассчитаны именно на передачу
голоса. Поэтому, хотя GSM и является цифровым стандартом, он предназначен для
передачи голоса во время телефонного разговора, и поэтому не предназначен для
длительных высокоскоростных соединений.
Поэтому для обеспечения голосовых разговоров в GSM-сетях для каждого сеанса
выделяется пара частот (для передачи данных в обе стороны), на которых и
устанавливается цифровое соединение со скоростью 9600 бит/с, и уже поверх него
передается закодированный и сжатый звук. Выделение отдельных частот обеспечивает
отдельный физический канал, поэтому при разговоре по мобильному телефону не
возникают типичные для IP-телефонии проблемы перегруженных каналов связи и, как
следствие, потеря данных. Для передачи закодированного голоса «телефонного»
качества достаточно скорости 9 600 бит/с.
GPRS (англ. General Packet Radio Service – пакетная радиосвязь общего пользования)
– надстройка над технологией мобильной связи GSM, осуществляющая пакетную
передачу данных. GPRS позволяет пользователю мобильного телефона производить
обмен данными с другими устройствами в сети GSM и с внешними сетями, в том
числе Интернет. GPRS предполагает тарификацию по объему переданной/полученной
информации, а не по времени. Служба передачи данных GPRS надстраивается над
существующей сетью GSM.
При использовании GPRS информация собирается в пакеты и передается через
неиспользуемые в данный момент голосовые каналы, такая технология предполагает
более эффективное использование ресурсов сети GSM. При этом приоритет передачи
– голосовой трафик или передача данных, выбирается оператором связи. В России
операторы связи в качестве приоритета определяют голосовой трафик, в связи с этим
скорость передачи зависит не только от возможностей оборудования, но и от загрузки
сети. Возможность использования сразу нескольких каналов обеспечивает достаточно
высокие скорости передачи данных, теоретический максимум при всех занятых
таймслотах TDMA составляет 171,2 кбит/c.
Абоненту, подключенному к GPRS, предоставляется виртуальный канал, который на
время передачи пакета становится реальным, а в остальное время используется для
передачи пакетов других пользователей. Поскольку один канал могут использовать
несколько абонентов, возможно возникновение очереди на передачу пакетов, и, как
следствие, задержка связи.
GPRS по принципу работы аналогична Интернет: данные разбиваются на пакеты и
отправляются получателю, где происходит их сборка. При установлении сессии
каждому устройству присваивается уникальный адрес. Протокол GPRS понятен для
TCP/IP, поэтому интеграция GPRS с Интернетом незаметна для пользователя.
EDGE (англ. Enhanced Data rates for GSM Evolution) – цифровая технология для
�Содержание
мобильной связи, которая функционирует как надстройка над 2G и 2.5G (GPRS)
сетями и поэтому ее можно отнести к поколению 2.75G. Эта технология работает в
TDMA и GSM сетях. Для поддержки EDGE в сети GSM требуются определенные
модификации и усовершенствования. EDGE был впервые представлен в 2003 году в
Северной Америке.
EDGE обеспечивает передачу данных со скоростью до 474 кбит/с в режиме пакетной
коммутации. Данная технология была принята ITU как часть семейства IMT-2000
стандартов 3G. Она также расширяет технологию передачи данных с коммутацией
каналов HSCSD, увеличивая пропускную способность этого сервиса.
В 2004 году наиболее активно EDGE был поддержан GSM-операторами Северной
Америки.
Несмотря на то, что EDGE не требует аппаратных изменений в NSS-части сети GSM,
модернизации должна быть подвергнута подсистема базовых станций (BSS).
Необходимо установить трансиверы, поддерживающие EDGE (8PSK модуляцию) и
обновить программное обеспечение. Также требуются телефоны, обеспечивающие
аппаратную и программную поддержку модуляции и кодовых схем, используемых в
EDGE.
Последующее развитие технологии CDMA происходит в рамках технологии
CDMA2000. При построении системы мобильной связи на основе технологии
CDMA2000 1Х первая фаза обеспечивает передачу данных со скоростью до 153 кбит/с,
что позволяет предоставлять услуги голосовой связи, передачу коротких сообщений,
работу с электронной почтой, Интернетом, базами данных, передачу данных и
неподвижных изображений.
Основными компонентами коммерческого успеха системы CDMA2000 послужили:
более широкая зона обслуживания, высокое качество речи, гибкость и низкая
стоимость внедрения новых услуг. Данная технология обеспечивает высокую
помехозащищенность, устойчивость канала связи от перехвата и прослушивания,
низкая излучаемая мощность радиопередатчиков абонентских устройств. Так, для
систем CDMA2000 максимальная излучаемая мощность составляет 250 мВт, в то
время как для систем GSM-900 этот показатель равен 2 Вт (в импульсе), а для GSM1800 1 Вт (в импульсе).
�Содержание
6.2.4. Поколение 3G
3G – набор услуг, которые объединяют как высокоскоростной мобильный доступ с
услугами сети Интернет, так и технологию радиосвязи, которая создает канал
передачи данных.
3G – это не просто быстрый доступ к Интернету, это кардинально новый подход к
общению, доступу к информации и т. д. Другими словами, те возможности и те
устройства, которые традиционно рассматривались как исключительно стационарные,
теперь становятся мобильными. Пользователь имеет возможность не только
разговаривать со своим собеседником, но и видеть его с помощью видеотелефона,
путешествовать по сети Интернет, вести бизнес, обучаться и т. д. Такие услуги
требуют высокоскоростной передачи данных. Для этого предусматривается
пошаговая модернизация существующих сетей мобильной связи, которые изначально
проектировались в расчете на узкополосную передачу данных, до широкополосных
сетей, обеспечивающих необходимую скорость для мобильных услуг мультимедиа и
доступа к Интернету.
Основой мобильной связи третьего поколения стала технология IP, которая основана
на пакетной передаче данных, что означает постоянное пребывание абонента в режиме
online.
Сети третьего поколения 3G работают на частотах дециметрового диапазона около
2 ГГц, передавая данные со скоростью 2 Мбит/с.
В мире существует два стандарта 3G: UMTS (или W-CDMA) и CDMA2000 (рис. 6.6).
Рис. 6.6. Стандарты сотовой связи поколения 3G
UMTS (универсальная система мобильной связи – Universal Mobile Telecommunications
System) – технология сотовой связи, относящаяся к поколению 3G. В качестве
�Содержание
способа передачи данных через воздушное пространство используется технология WCDMA. UMTS, используя разработки W-CDMA, позволяет поддерживать скорость
передачи информации на теоретическом уровне не менее 14 Мбит/с (при
использовании HSDPA). Но, максимальными скоростями считаются 384 Кбит/с для
мобильных станций технологии R99 и 3,6 Мбит/с для станций HSDPA в режиме
передачи данных от базовой станции к мобильному терминалу.
�Содержание
6.2.5. Поколение 3.5G
Переходное поколение 3.5G представлено стандартом HSDPA.
Для сотовых сетей сегодня существует несколько протоколов, увеличивающих
скорость передачи данных. Однако фактически ни один из них не способен экономить
ресурсы мобильной сети, что делает трафик дорогостоящим и неэффективным.
Протокол HSDPA способен повысить производительность сети именно за счет более
эффективного использования радиоканала, в частности сокращением задержек при
передаче пакетов. Технология HSDPA не несет в себе ничего нового, но изменяет
представление пользователя о мобильных сетях передачи данных третьего поколения.
HSDPA (англ. High-Speed Downlink Packet Access – высокоскоростная пакетная
передача данных от базовой станции к мобильному телефону) – стандарт мобильной
связи, рассматривается специалистами как один из переходных этапов к технологиям
мобильной связи четвертого поколения (4G). Максимальная теоретически возможная
скорость передачи данных по стандарту составляет 14,4 Мбит/с, на практике реальная
скорость составляет 3 Мбит/с.
По сравнению с UMTS, в сети HSDPA можно передавать в три раза больше данных и
поддерживать вдвое больше пользователей на одну соту.
Впервые HSDPA была описана в пятой версии стандартов 3GPP. В ее основе лежит
теория, согласно которой при сопоставимых размерах сот применение многокодовой
передачи позволяет достигать пиковых скоростей порядка 10 Мбит/с (теоретически
максимальная скорость передачи данных в этих условиях составляет 14,4 Мбит/с).
Стандарты 3GPP, которые станут продолжением пятой версии, нацелены на
дальнейшее увеличение пропускной способности: достижение пиковых скоростей
порядка 20-30 Мбит/с посредством технологии Multiple Input Multiple Output и иных
способов.
Кроме того, за счет высокой скорости HSDPA значительно улучшает качество
предоставляемых абоненту мультимедийных услуг.
HSUPA – технология высокоскоростной передачи пакетных данных, по каналу
абонент – базовая станция. Максимальная скорость стандарта HSUPA может
достигать 5,7 Мбит/с. Этот стандарт дает возможность выгрузки больших потоков
информации, что позволяет комфортно использовать современные программы,
поддерживающие видеосвязь.
HSPA+ – стандарт, который позволяет достигать скорости пакетной передачи данных
по нисходящему соединению 42,2 Мбит/с, по исходящему – 5,76 Мбит/с. Протокол
HSPA+ является поколением сотовой связи 3,75G [104].
�Содержание
6.2.6. Поколение 4G. LTE
4G (от англ. fourth generation – четвертое поколение) – поколение мобильной связи с
повышенными требованиями. К четвертому поколению принято относить
перспективные технологии, позволяющие осуществлять передачу данных со
скоростью, превышающей 100 Мбит/с – подвижным абонентам и 1 Гбит/с –
стационарным абонентам [13].
Начиная с 2008 года, во многих странах стал внедряться новый международный
стандарт беспроводной широкополосной сети 4G – это новое, четвертое, поколение
сотовой связи стало инновационной разработкой, и обеспечивает скорость передачи
данных от 100 Мбит/c до 1 Гбит/с. Такой диапазон скорости непосредственно связан
со скоростью передвижения абонента: если скорость абонента превышает 10 км/ч, то
скорость передачи данных ограничивается в 100 Мбит/c, в ином случае скорость
возрастает до 1 Гбит/с.
Несмотря на подобное ограничение, сеть 4G в несколько раз превзошла своих
предшественников. Сети 2G и 3G имеют заявленную скорость 15 Кбит/с и 2 Мбит/с,
соответственно. Такое превосходство в скорости 4G получила за счет того, что
полностью основана на протоколах пакетной передачи данных IPv4, в то время как ее
предшественники использовали аналоговые и цифровые способы коммутации пакетов
и каналов.
Принято считать, что технология WiMAX удовлетворяет требованиям стандарта 4G за
счет высокой скорости, и ее ошибочно называют сетью 4G, но дело в том, что
WiMAX не поддерживает сети прошлых поколений 2G и 3G, и она не предоставляет
стандартные услуги связи – звонки и SMS. Единственная технология,
соответствующая всем стандартам 4G – LTE десятой или более поздней версии.
Высокая скорость передачи данных этой сети позволяет совершать на мобильных
устройствах не только аудиозвонки, но и видеовызовы. Также технология четвертого
поколения позволит абонентам управлять бытовой техникой на расстоянии и смотреть
в высокой четкости многоканальные телетрансляции. Поэтому эта сеть будет
удовлетворять запросы всех пользователей, обеспечивая моментальную загрузку
файлов и открытие страниц, просмотр видео высокого качества.
На сегодняшний день сетью 4G покрыты все крупнейшие города мира. В России
первый запуск сети 4G на технологии LTE был произведен в Новосибирске, в декабре
2011 года, а в Москве только в 2012 году. С тех пор покрытие четвертого поколения
мобильных сетей постоянно растет и сейчас охватывает в России более 79 регионов и
90 городов.
Но есть одна особенность в работе сетей 4G на телефонах в России: изначально в
стандарте 4G была предусмотрена технология VoLTE для передачи голоса, но в
России и ряде других стран VoLTE не удается использовать из-за юридических
разногласий, поэтому было решено использовать 4G только для выхода в интернет, а
при звонке переключать сеть с 4G на 3G. Однако такое переключение вызывает
ощутимую задержку – от 5 до 10 секунд [103].
�Содержание
LTE
LTE (Long-Term Evolution – «долгосрочное развитие» сотовых сетей третьего
поколения, основанных на технологиях CDMA и UMTS) – это стандарт беспроводной
связи четвертого поколения 4G (рис. 6.7).
Рис. 6.7. Официальный логотип LTE
Стандарт LTE был впервые запущен в 2009 году в Осло и Стокгольме, а сегодня уже
распространен по всему миру, включая Россию. Скорость передачи данных в сетях
LTE варьируется от 10 до 100 Мбит/с. Дальнейшее развитие технологии LTE,
известное, как LTE-Advanced, предполагает скорости до 300 Мбит/с [32].
Список стран по доле абонентов 4G LTE в общем населении страны, измерение
произведено Juniper Networks в 2013 году и опубликовано Bloomberg (рис. 6.8): Южная
Корея – 62.0 %, Япония – 21.3 %, Австралия – 21.1 %, США – 19.0 %, Швеция –
14.0 %, Канада – 8.0 %, Великобритания – 5.0 %, Германия – 3.0 %, Россия – 2.0 %,
Филиппины – 1.0 % [30].
Рис. 6.8. Внедрение технологии LTE по состоянию на 7 декабря 2014 года.
Страны с коммерческой эксплуатацией LTE
Страны с происходящим или запланированным вводом LTE в коммерческую эксплуатацию
Страны, где происходят испытания LTE
�Содержание
Структура сети стандарта LTE выглядит следующим образом (рис. 6.9.):
Рис. 6.9. Структура сети стандарта LTE
Из этой схемы видно, что структура сети принципиально отличается от сетей
стандартов 2G и 3G. Существенные изменения претерпела подсистема базовых
станций и подсистема коммутации. Была изменена технология передачи данных между
оборудованием пользователя и базовой станцией. Также подверглись изменению и
протоколы передачи данных между сетевыми элементами. Вся информация (голос,
данные) передается в виде пакетов. Таким образом, уже нет разделения на части,
обрабатывающие либо только голосовую информацию, либо только пакетные данные.
Можно выделить следующие основные элементы сети стандарта LTE:
• Serving SAE Gateway или просто Serving Gateway (SGW) – обслуживающий
шлюз сети LTE. Предназначен для обработки и маршрутизации пакетных данных,
поступающих из/в подсистему базовых станций. SGW имеет прямое соединение с
сетями второго и третьего поколений того же оператора, что упрощает передачу
соединения в/из них по причинам ухудшения зоны покрытия, перегрузок и т. п. В
SGW нет функции коммутации каналов для голосовых соединений, т. к. в LTE вся
информация, включая голос, коммутируется и передается с помощью пакетов.
• Public Data Network SAE Gateway или просто PDN Gateway (PGW) – шлюз к
сетям передачи данных других операторов для сети LTE. Основная задача PGW
заключается в маршрутизации трафика сети LTE к другим сетям передачи данных,
таким как Интернет, а также сетям GSM, UMTS.
• Mobility Management Entity (MME) – узел управления мобильностью сети сотовой
связи стандарта LTE. Предназначен для обработки сигнализации, преимущественно
связанной с управлением мобильностью абонентов в сети.
•
Home Subscriber Server (HSS) – сервер абонентских данных сети сотовой связи
стандарта LTE. Представляет собой большую базу данных и предназначен для
хранения данных об абонентах. Кроме того, HSS генерирует данные, необходимые
для осуществления процедур шифрования, аутентификации и т. п. Сеть LTE может
включать один или несколько HSS. Количество HSS зависит от географической
структуры сети и числа абонентов.
�Содержание
Policy and Charging Rules Function (PCRF) – элемент сети сотовой связи
стандарта LTE, отвечающий за управление начислением платы за оказанные услуги
связи, а также за качество соединений в соответствии с заданными конкретному
абоненту характеристиками.
Для того чтобы данные могли быть транспортированы через интерфейс радио LTE,
используются различные «каналы». Они используются для того, чтобы выделять
различные типы данных и позволить им транспортироваться через сеть доступа более
эффективно. Использование нескольких каналов обеспечивает интерфейс более
высокого уровня в рамках протокола LTE и включают более четкую и определенную
сегрегацию данных.
Есть три категории, в которые могут быть сгруппированы различные каналы передачи
данных:
• Логические каналы – предоставляет услуги среднего уровня управления доступом
MAC (Medium Access Control) в пределах структуры протокола LTE. Логические
каналы по типу передаваемой информации делятся на логические каналы
управления и логические каналы трафика. Логические каналы управления
используются для передачи различных сигнальных и информационных сообщений.
По логическим каналам трафика передают пользовательские данные.
• Транспортные каналы – транспортные каналы физического уровня предлагают
передачу информации в MAC и выше. Информацию логических каналов после
обработки на RLC/MAC уровнях размещают в транспортных каналах для
дальнейшей передачи по радиоинтерфейсу в физических каналах. Транспортный
канал определяет, как и с какими характеристиками происходит передача
информации по радиоинтерфейсу. Информационные сообщения на транспортном
уровне разбивают на транспортные блоки. В каждом временном интервале
передачи (Transmission Time Interval, TTI) по радиоинтерфейсу передают хотя бы
один транспортный блок. При использовании технологии MIMO возможна
передача до четырех блоков в одном TTI.
• Физические каналы – это каналы передачи, которые переносят пользовательские
данные и управляющие сообщения. Они изменяются между восходящим и
нисходящим потоками, поскольку каждый из них имеет различные требования и
действует по-своему [31].
Основные перспективы развития сетей LTE в ближайшее время включают:
• появление нового федерального оператора LTE;
• совместное использование сетевой инфраструктуры (Network Sharing) для
сокращения расходов операторов;
• использование нижних диапазонов 1 800 МГц и 800 МГц для сокращения затрат
[41].
•
�Содержание
6.2.7. Поколение 5G
Группа исследователей из британского Университета Суррея добилась рекордного
показателя скорости передачи данных для беспроводных сетей. Работая над
стандартом связи 5G, им удалось достичь скорости 1 ТБ/с (или 125 ГБ/с).
Таким образом, был побит новый рекорд, установленный Samsung в октябре 2014
года. Тогда южнокорейская компания усовершенствовала технологию Wi-Fi, что
позволило передавать данные на скорости до 575 Мбит/с. То есть нынешнее
достижение британских разработчиков позволило превысить максимальные
показатели скорости Samsung более чем в 200 раз, а среднюю скорость передачи
данных в сетях 4G – в 65 000 раз.
Коммерческий запуск сетей стандарта 5G состоялся в 2019 году. Введение нового
стандарта позволит, к примеру, скачивать по 30 фильмов за секунду. Кроме того,
такая скорость передачи данных поможет значительно сократить временные задержки
при совершении финансовых сделок или сделает возможным поддержку совместных
игр с высоким графическим разрешением между пользователями смартфонов. Для
сетей 5G разрабатывается стандарт IMT-2020.
Время отклика в современных сетях составляет около 50 мс. Однако для вождения
беспилотных автомобилей или других автоматизированных транспортных
приложений такая задержка неприемлема и будет губительна, так как аппарат не
сможет быстро принять решение, анализируя возникшую вокруг дорожную ситуацию.
Безопасное время отклика должно быть не более 1 мс [52]. Среди основных
особенностей разрабатываемого стандарта можно выделить: высочайшие скорости
передачи данных (значительно больше 1 Гбит/с), сверхмалые задержки передачи
информации (~ 1 миллисекунда). Эти преимущества позволят решать множество
новых задач, предъявляющих высокие требования к надежности соединения в режиме
реального времени. Такие технологии, как дополненная и виртуальная реальности,
благодаря 5G смогут обеспечить полный эффект присутствия и обратной связи для
пользователя.
Помимо скорости передачи данных, сети 5G отличаются от предыдущих и рабочими
частотами, диапазон которых будет выше 6 ГГц. Кроме того, в них будет
использоваться технология MIMO, суть которой заключается в использовании сразу
нескольких антенн как на принимающей, так и на передающей сигнал сторонах.
Задачи, которые призвана решить технология 5G:
•
рост мобильного трафика;
•
увеличение числа устройств, подключаемых к сети;
•
сокращение задержек для реализации новых услуг;
•
нехватка частотного спектра.
�Содержание
Услуги в сетях 5G:
•
сверхширокополосная мобильная связь (Extreme Mobile Broadband, eMBB) –
реализация ультраширокополосной связи с целью передачи «тяжелого» контента;
•
массовая межмашинная связь (Massive Machine-Type Communications, mMTC) –
поддержка Интернета вещей (ультраузкополосная связь);
•
сверхнадежная межмашинная связь с низкими задержками (Ultra-Reliable Low
Latency communication, URLLC) – обеспечение особого класса услуг с очень
низкими задержками.
В январе 2015 г. стало известно, что российские операторы сотовой связи готовятся к
тестированию сетей 5G. Соглашение об этом уже подписано между «Мегафоном» и
производителем телекоммуникационного оборудования Huawei. В компаниях говорят,
что совместный проект станет первым опытом участия мобильного оператора из
России в создании сетей нового поколения [89].
�Содержание
Контрольные вопросы к главе 6
1. Понятия мобильная связь и сотовая связь – синонимичны?
2. Что представляет собой базовая станция?
3. Как осуществляется звонок по мобильному телефону?
4. Что такое поколение сотовой связи?
5. Какое поколение сотовых телефонных систем было аналоговым?
6. Что такое GPRS?
7. Какие стандарты относятся к поколению связи 3G? Опишите их.
8. Каким стандартом представлено поколение 3.5G?
9. Охарактеризуйте стандарт LTE. К какому поколению связи его относят?
10.Опишите структуру сети стандарта LTE.
�Содержание
Глава 7. Коммутация каналов и пакетов
7.1. Коммутация каналов
7.1.1. Элементарный канал
7.1.2. Составной канал
7.1.3. Неэффективность при передаче пульсирующего трафика
7.2. Коммутация пакетов
7.2.1. Буферизация пакетов
7.2.2. Дейтаграммная передача
7.2.3. Передача с установлением логического соединения
7.2.4. Передача с установлением виртуального канала
7.3. Сравнение сетей с коммутацией каналов и пакетов
Контрольные вопросы к главе 7
�Содержание
7.1. Коммутация каналов
Сети, построенные на принципе коммутации каналов, имеют давнюю историю, они и
сегодня нашли широкое применение в мире телекоммуникаций, являясь основой
создания высокоскоростных магистральных каналов связи. Первые сеансы связи
между компьютерами были осуществлены через телефонную сеть, то есть также с
применением техники коммутации каналов, а пользователи, получающие доступ в
Интернет по модему, продолжают обслуживаться этими сетями, так как их данные
доходят до оборудования провайдера по местной телефонной сети.
«В качестве информационных потоков в сетях с коммутацией каналов выступают
данные, которыми обмениваются пары абонентов» (термин «абонент» принят в
телефонии для обозначения конечного узла) [8]. Глобальным признаком потока
является пара адресов (телефонных номеров) абонентов, связывающихся между
собой. Для всех возможных потоков заранее определяются маршруты. Маршруты в
сетях с коммутацией каналов задаются либо «вручную» администратором сети, либо
находятся автоматически с привлечением специальных программных и аппаратных
средств. Маршруты фиксируются в таблицах, в которых признакам потока ставятся в
соответствии идентификаторы выходных интерфейсов коммутаторов. На основании
этих таблиц происходит продвижение и мультиплексирование данных. Однако, в сетях
с коммутацией каналов решение всех этих задач имеет свои особенности.
7.1.1. Элементарный канал
7.1.2. Составной канал
7.1.3. Неэффективность при передаче пульсирующего трафика
�Содержание
7.1.1. Элементарный канал
Одной из особенностей сетей с коммутацией каналов является понятие элементарного
канала.
«Элементарный канал (или просто канал) – это базовая техническая
характеристика сети с коммутацией каналов, представляющая собой некоторое
фиксированное в пределах данного типа сетей значение пропускной способности» [9].
Любая линия связи в сети c коммутацией каналов имеет пропускную способность,
кратную элементарному каналу, принятому для данного типа сети. В данном случае
термин «канал» рассматривается как значение единицы пропускной способности.
Значение элементарного канала (минимальная единица пропускной способности
линии связи) выбирается с учетом различных факторов. Очевидно, что элементарный
канал не стоит выбирать меньше минимально необходимой пропускной способности
для передачи ожидаемой предложенной нагрузки. Например, в традиционных
телефонных сетях наиболее распространенным значением элементарного канала
сегодня является скорость 64 Кбит/с – это минимально достаточная скорость для
качественной цифровой передачи голоса.
Задача оцифровывания голоса является частным случаем более общей задачи –
передачи аналоговой информации в дискретной форме. Она была решена в 60-е годы
прошлого века, когда голос начал передаваться по телефонным сетям в виде
последовательности единиц и нулей. Такое преобразование основано на
дискретизации непрерывных процессов как по амплитуде, так и по времени (рис. 7.1).
Рис. 7.1. Дискретная модуляция непрерывного процесса
�Содержание
Амплитуда исходной непрерывной функции измеряется с заданным периодом – за
счет этого происходит дискретизация по времени. Затем каждый замер
представляется в виде двоичного числа определенной разрядности, что означает
дискретизацию по значениям – непрерывное множество возможных значений
амплитуды заменяется дискретным множеством ее значений.
Для качественной передачи голоса используется частота квантования амплитуды
звуковых колебаний в 8 000 Гц (дискретизация по времени с интервалом 125 мкс). Для
представления амплитуды одного замера чаще всего используется 8 бит кода, что дает
256 градаций звукового сигнала (дискретизация по значениям). В этом случае для
передачи одного голосового канала необходима пропускная способность 64 Кбит/с:
8 000 х 8 = 64 000 бит/с или 64 Кбит/с. Такой голосовой канал называют элементарным
каналом цифровых телефонных сетей.
Линии связи в сетях с коммутацией пакетов имеют разную пропускную способность.
Выбирая линии связи с разными скоростными качествами, специалисты,
проектирующие сеть, стараются учесть разную интенсивность информационных
потоков, которые могут возникнуть в разных фрагментах сети – чем ближе к центру
сети, тем выше пропускная способность линии связи, так как магистральные линии
агрегируют трафик большого количества периферийных линий связи.
Особенностью сетей с коммутацией каналов является то, что пропускная способность
каждой линии связи должна быть равна целому числу элементарных каналов.
Так, линии связи, подключающие абонентов к телефонной сети, могут содержать 2,24
или 30 элементарных каналов, а линии, соединяющие коммутаторы, – 480 или
1 920 каналов.
Обратимся к фрагменту сети, изображенному на рис. 7.2.
Рис. 7.2. Составной канал сети с коммутацией каналов
�Содержание
Предположим, что эта сеть характеризуется элементарным каналом Р бит/с. В сети
существуют линии связи разной пропускной способности, состоящие из 2, 3, 4 и 5
элементарных каналов. На рисунке 7.2 показаны два абонента, A и B, генерирующие во
время сеанса связи информационный поток, для которого в сети был предусмотрен
маршрут, проходящий через четыре коммутатора S1, S2, S3 и S4. Предположим, что
интенсивность информационного потока между абонентами не превосходит 2Р бит/с.
Тогда для обмена данными абонентам А и В достаточно иметь в своем распоряжении
по паре элементарных каналов, «выделенных» из каждой линии связи, лежащей на
маршруте следования данных от пункта A к пункту В. На рисунке 7.2 элементарные
каналы, необходимые абонентам A и В, обозначены толстыми линиями.
�Содержание
7.1.2. Составной канал
«Составной
каналов» [8].
канал –
связь,
построенная
путем
коммутации
элементарных
В предыдущем примере для соединения абонентов A и В был создан составной канал
«толщиной» в два элементарных канала. Если изменить наше предположение и
считать, что предложенная нагрузка гарантированно не превысит Р бит/с, то
абонентам будет достаточно иметь в своем распоряжении составной канал
«толщиной» в один элементарный канал. В то же время абоненты, интенсивно
обменивающиеся данными, могут предъявить и более высокие требования к
пропускной способности составного канала. Для этого они должны в каждой линии
связи зарезервировать за собой большее (но непременно одинаковое для всех линий
связи) количество элементарных каналов.
Свойства составного канала:
•
•
•
•
•
•
•
составной канал на всем своем протяжении состоит из одинакового количества
элементарных каналов;
составной канал имеет постоянную и фиксированную пропускную способность на
всем своем протяжении;
составной канал создается временно на период сеанса связи двух абонентов;
на время сеанса связи все элементарные каналы, входящие в составной канал,
поступают в исключительное пользование абонентов, для которых был создан этот
составной канал;
в течение всего сеанса связи абоненты могут посылать в сеть данные со
скоростью, не превышающей пропускную способность составного канала;
данные, поступившие в составной канал, гарантированно доставляются
вызываемому абоненту без задержек, потерь и с той же скоростью (скоростью
источника) вне зависимости от того, существуют ли в это время в сети другие
соединения или нет;
после окончания сеанса связи элементарные каналы, входившие в соответствующий
составной канал, объявляются свободными и возвращаются в пул распределяемых
ресурсов для использования другими абонентами.
В сети может одновременно происходить несколько сеансов связи. Разделение сети
между сеансами связи происходит на уровне элементарных каналов. Например (см.
рис. выше), мы можем предположить, что после того, как в линии связи S2-S3 было
выделено два канала для связи абонентов A и В, оставшиеся три элементарных канала
были распределены между тремя другими сеансами связи, проходившими в это же
время и через эту же линию связи. Такое мультиплексирование позволяет
одновременно передавать через каждый физический канал трафик нескольких
логических соединений.
�Содержание
Мультиплексирование означает, что абоненты вынуждены конкурировать за
ресурсы, в данном случае за элементарные каналы. Возможны ситуации, когда
некоторая промежуточная линия связи уже исчерпала свободные элементарные
каналы, тогда новый сеанс связи, маршрут которого пролегает через данную линию
связи, не может состояться.
Для того чтобы распознать такие ситуации, обмен данными в сети с коммутацией
каналов предваряется процедурой установления соединения. В соответствии с этой
процедурой абонент, являющийся инициатором сеанса связи (например, абонент А),
посылает в коммутационную сеть запрос, представляющий собой сообщение, в
котором содержится адрес вызываемого абонента, например абонента В. Цель
запроса – проверить, возможно ли образовать составной канал между вызывающим и
вызываемым абонентами. Для этого требуется соблюдение следующих условий:
наличие требуемого числа свободных элементарных каналов в каждой линии связи,
лежащей на пути от А к B, и незанятость вызываемого абонента в другом соединении.
Запрос перемещается по маршруту, определенному для информационного потока
данной пары абонентов. При этом используются глобальные таблицы коммутации,
ставящие в соответствие глобальному признаку потока (адресу вызываемого
абонента)
идентификатор
выходного
интерфейса
коммутатора
(таблицы
маршрутизации).
Если в результате прохождения запроса от абонента А к абоненту В выяснилось, что
ничто не препятствует установлению соединения, происходит фиксация составного
канала. Для этого во всех коммутаторах вдоль пути от A до B создаются записи в
локальных таблицах коммутации, в которых указывается соответствие между
локальными
признаками
потока
–
номерами
элементарных
каналов,
зарезервированными для этого сеанса связи. Только после этого составной канал
считается установленным, и абоненты A и B могут начать свой сеанс связи.
Таким образом, продвижение данных в сетях с коммутацией каналов происходит в два
этапа:
1. В сеть поступает служебное сообщение – запрос, который несет адрес
вызываемого абонента и организует создание составного канала.
2. По подготовленному составному каналу передается основной поток данных, для
передачи которого уже не требуется никакой вспомогательной информации, в том
числе адреса вызываемого абонента. Коммутация данных в коммутаторах
выполняется на основе локальных признаков – номеров элементарных каналов.
Запросы на установление соединения не всегда завершаются успешно. Если на пути
между вызывающим и вызываемым абонентами отсутствуют свободные элементарные
каналы или вызываемый узел занят, то происходит отказ в установлении
соединения. Например, если во время сеанса связи абонентов A и В абонент С
пошлет запрос в сеть на установление соединения с абонентом D, то он получит отказ,
�Содержание
потому что оба необходимых ему элементарных канала, составляющих линию связи
коммутаторов S3 и S4, уже выделены соединению абонентов A и В (рис. 7.3).
Рис. 7.3. Отказ в установлении соединения сети с коммутацией каналов
При отказе в установлении соединения сеть информирует вызывающего абонента
специальным сообщением. Чем больше нагрузка на сеть, то есть чем больше
соединений она в данный момент поддерживает, тем больше вероятность отказа в
удовлетворении запроса на установление нового соединения.
Таким образом, была охарактеризована процедура установления соединения в
автоматическом динамическом режиме, основанном на способности абонентов
отправлять в сеть служебные сообщения – запросы на установление соединения и
способности узлов сети обрабатывать такие сообщения. Подобный режим
используется телефонными сетями: телефонный аппарат генерирует запрос, посылая в
сеть импульсы (или тоновые сигналы), кодирующие номер вызываемого абонента, а
сеть либо устанавливает соединение, либо сообщает об отказе сигналами «занято».
Однако это не единственно возможный режим работы сети с коммутацией каналов,
существует и другой статический ручной режим установления соединения. Этот
режим характерен для случаев, когда необходимо установить составной канал не на
время одного сеанса связи абонентов, а на более длительный срок. Создание такого
долговременного канала не могут инициировать абоненты, он создается
�Содержание
администратором сети. Очевидно, что статический ручной режим мало пригоден для
традиционной телефонной сети с ее короткими сеансами связи, однако он вполне
оправдан для создания высокоскоростных телекоммуникационных каналов между
городами и странами.
Технология коммутации каналов ориентирована на минимизацию случайных coбытий
в сети, то есть это технология, стремящаяся к детерминизму. Во избежание всяких
возможных неопределенностей значительная часть работы по организации
информационного обмена выполняется заранее, еще до того, как начнется собственно
передача данных. Сначала по заданному адресу проверяется доступность
необходимых элементарных каналов на всем пути от отправителя до адресата. Затем
эти каналы закрепляются на все время сеанса для исключительного использования
двумя абонентами и коммутируются в один непрерывный «трубопровод» (составной
канал), имеющий «шлюзовые задвижки» на стороне каждого из абонентов. После этой
исчерпывающей подготовительной работы остается сделать самое малое: «открыть
шлюзы» и позволить информационному потоку свободно и без помех «перетекать»
между заданными точками сети (рис. 7.4).
Рис. 7.4. Сеть с коммутацией каналов как система трубопроводов
�Содержание
7.1.3. Неэффективность при передаче пульсирующего трафика
Сети с коммутацией каналов наиболее эффективно передают пользовательский трафик
в том случае, когда скорость его постоянна в течение всего сеанса связи и
максимально соответствует фиксированной пропускной способности физических
линий связи сети. Эффективность работы сети снижается, когда информационные
потоки, генерируемые абонентами, приобретают пульсирующий характер.
Так, разговаривая по телефону, люди постоянно меняют темп речи, перемежая
быстрые высказывания паузами. В результате соответствующие «голосовые»
информационные потоки становятся неравномерными, а значит, снижается
эффективность передачи данных. Правда, в случае телефонных разговоров это
снижение оказывается вполне приемлемым и позволяет широко использовать сети с
коммутацией каналов для передачи голосового трафика.
Гораздо сильнее снижает эффективность сети с коммутацией каналов передача так
называемого компьютерного трафика, то есть трафика, генерируемого
приложениями, с которыми работает пользователь компьютера. Этот трафик
практически всегда является пульсирующим. Например, когда вы загружаете из
Интернета очередную страницу, скорость трафика резко возрастает, а после
окончания загрузки падает практически до нуля. Если для описанного сеанса доступа
в Интернет вы задействуете сеть с коммутацией канала, то большую часть времени
составной канал между вашим компьютером и веб-сервером будет простаивать. В то
же время часть производительности сети окажется закреплена за вами и останется
недоступной другим пользователям сети. Сеть в такие периоды похожа на пустой
эскалатор метро, который движется, но полезную работу не выполняет, другими
словами, «перевозит воздух».
Для эффективной передачи неравномерного компьютерного трафика была специально
разработана техника коммутации пакетов.
�Содержание
7.2. Коммутация пакетов
Сети с коммутацией пакетов, так же, как и сети с коммутацией каналов, состоят из
коммутаторов, связанных физическими линиями связи. Однако передача данных в
этих сетях происходит совершенно по-другому. Образно говоря, по сравнению с
сетью с коммутацией каналов, сеть с коммутацией пакетов ведет себя менее
«ответственно». Например, она может принять данные для передачи, не заботясь о
резервировании линий связи на пути следования этих данных и не гарантируя
требуемую пропускную способность. Сеть с коммутацией пакетов не создает заранее
для своих абонентов отдельных, выделенных исключительно для них каналов связи.
Данные могут задерживаться и даже теряться по пути следования. Как же при таком
хаосе и неопределенности сеть с коммутацией пакетов выполняет свои функции по
передаче данных?
Важнейшим принципом функционирования сетей с коммутацией пакетов является
представление информации, передаваемой по сети, в виде структурно отделенных
друг от друга порций данных, называемых пакетами (наряду с термином «пакет»
используются также термины «кадр», «фрейм», «ячейка» и др. В данном контексте
различия в значении этих терминов несущественны).
Каждый пакет снабжен заголовком (рис. 7.5), в котором содержится адрес назначения
и другая вспомогательная информация (длина поля данных, контрольная сумма и др.),
используемая для доставки пакета адресату. Наличие адреса в каждом пакете является
одним из важнейших особенностей техники коммутации пакетов, так как каждый пакет
может быть обработан коммутатором независимо от других пакетов, составляющих
сетевой трафик. Помимо заголовка у пакета может иметься еще одно дополнительное
поле, размещаемое в конце пакета, и поэтому называемое концевиком. В концевике
обычно помещается контрольная сумма, которая позволяет проверить, была ли
искажена информация при передаче через сеть или нет.
Рис. 7.5. Разбиение данных на пакеты
�Содержание
В зависимости от конкретной реализации технологии коммутации пакетов пакеты
могут иметь фиксированную или переменную длину, кроме того, может меняться
состав информации, размещенной в заголовках пакетов. Например, в технологии ATM
пакеты (называемые там ячейками) имеют фиксированную длину, а в технологии
Ethernet установлены лишь минимально и максимально возможные размеры пакетов
(кадров).
Пакеты поступают в сеть без предварительного резервирования линий связи и не с
фиксированной заранее заданной скоростью, как это делается в сетях с коммутацией
каналов, а в том темпе, в котором их генерирует источник. Предполагается, что сеть с
коммутацией пакетов, в отличие от сети с коммутацией каналов, всегда готова принять
пакет от конечного узла.
Как и в сетях с коммутацией каналов, в сетях с коммутацией пакетов для каждого из
потоков вручную или автоматически определяется маршрут, фиксируемый в
хранящихся на коммутаторах таблицах коммутации. Пакеты, попадая на коммутатор,
обрабатываются и направляются по тому или иному маршруту на основании
информации, содержащейся в их заголовках, а также в таблице коммутации (рис. 7.6).
Рис. 7.6. Передача данных по сети в виде пакетов
�Содержание
Пакеты, принадлежащие как одному и тому же, так и разным информационным
потокам, при перемещении по сети могут «перемешиваться» между собой,
образовывать очереди и «тормозить» друг друга. На пути пакетов могут встретиться
линии связи, имеющие разную пропускную способность. В зависимости от времени
суток может сильно меняться и степень загруженности линий связи. В таких условиях
не исключены ситуации, когда пакеты, принадлежащие одному и тому же потоку,
могут перемещаться по сети с разными скоростями и даже прийти к месту назначения
не в том порядке, в котором они были отправлены.
Разделение данных на пакеты позволяет передавать неравномерный компьютерный
трафик более эффективно, чем в сетях с коммутацией каналов. Это объясняется тем,
что пульсации трафика от отдельных компьютеров носят случайный характер и
распределяются во времени так, что их пики чаще всего не совпадают. Поэтому, когда
линия связи передает трафик большого количества конечных узлов, то в суммарном
потоке пульсации сглаживаются, и пропускная способность линии используется более
рационально, без длительных простоев. Этот эффект иллюстрируется рис. 7.7, на
котором показаны неравномерные потоки пакетов, поступающие от конечных узлов 3,
4 и 10 в сети, изображенной на рис. 7.6.
Рис. 7.7. Сглаживание трафика в сетях с коммутацией пакетов
Предположим, что эти потоки передаются в направлении коммутатора 8, а
следовательно, накладываются друг на друга при прохождении линии связи между
коммутаторами 5 и 8. Получающийся в результате суммарный поток является более
равномерным, чем каждый из образующих его отдельных потоков.
7.2.1. Буферизация пакетов
7.2.2. Дейтаграммная передача
7.2.3. Передача с установлением логического соединения
7.2.4. Передача с установлением виртуального канала
�Содержание
7.2.1. Буферизация пакетов
Неопределенность и асинхронность перемещения данных в сетях с коммутацией
пакетов предъявляет особые требования к работе коммутаторов в таких сетях.
Главное отличие пакетных коммутаторов от коммутаторов в сетях с коммутацией
каналов состоит в том, что они имеют внутреннюю буферную память для временного
хранения пакетов,
Действительно, пакетный коммутатор не может принять решения о продвижении
пакета, не имея в своей памяти всего пакета. Коммутатор проверяет контрольную
сумму, и только если она говорит о том, что данные пакета не искажены, начинает
обрабатывать пакет и по адресу назначения определяет следующий коммутатор.
Поэтому каждый пакет последовательно, бит за битом, помещается во входной буфер.
Имея в виду это свойство, говорят, что сети с коммутацией пакетов используют
технику сохранения с продвижением (store-and-forward). Заметим, что для этой цели
достаточно иметь буфер размером в один пакет.
Коммутатору нужны буферы для согласования скоростей передачи данных в линиях
связи, подключенных к его интерфейсам. Действительно, если скорость поступления
пакетов из одной линии связи в течение некоторого периода превышает пропускную
способность той линии связи, в которую эти пакеты должны быть направлены, то во
избежание потерь пакетов на целевом интерфейсе необходимо организовать выходную
очередь (рис.7.8).
Рис. 7.8. Буферы и очереди пакетов в коммутаторе
�Содержание
Буферизация необходима пакетному коммутатору также для согласования скорости
поступления пакетов со скоростью их коммутации. Если коммутирующий блок не
успевает обрабатывать пакеты (анализировать заголовки и перебрасывать пакеты на
нужный интерфейс), то на интерфейсах коммутатора возникают входные очереди.
Очевидно, что для хранения входной очереди объем буфера должен превышать
размер одного пакета. Существуют различные подходы к построению
коммутирующего блока. Традиционный способ основан на одном центральном
процессоре, который обслуживает все входные очереди коммутатора. Такой способ
построения может приводить к большим очередям, так как производительность
процессора разделяется между несколькими очередями. Современные способы
построения коммутирующего блока основаны на многопроцессорном подходе, когда
каждый интерфейс имеет свой встроенный процессор для обработки пакетов, кроме
того, существует центральный процессор, координирующий работу интерфейсных
процессоров.
Использование
интерфейсных
процессоров
повышает
производительность коммутатора и уменьшает очереди во входных интерфейсах.
Однако такие очереди все равно могут возникать, так как центральный процессор попрежнему остается «узким местом».
Поскольку объем буферов в коммутаторах ограничен, иногда происходит потеря
пакетов из-за переполнения буферов при временной перегрузке части сети, когда
совпадают периоды пульсации нескольких информационных потоков. Для сетей с
коммутацией пакетов потеря пакетов является обычным явлением, и для компенсации
таких потерь в данной сетевой технологии предусмотрен ряд специальных
механизмов, которые мы рассмотрим позже.
Пакетный коммутатор может работать на основании одного из трех методов
продвижения пакетов:
•
дейтаграммная передача;
•
передача с установлением логического соединения;
•
передача с установлением виртуального канала.
�Содержание
7.2.2. Дейтаграммная передача
Дейтаграммный способ передачи данных основан на том, что все передаваемые
пакеты продвигаются (передаются от одного узла сети другому) независимо друг от
друга на основании одних и тех же правил, процедура обработки пакета определяется
только значениями параметров, которые он несет в себе, и текущим состоянием сети
(например, в зависимости от ее нагрузки пакет может стоять в очереди на
обслуживание большее или меньшее время). Однако никакая информация об уже
вырезанных пакетах сетью не хранится и в ходе обработки очередного пакета во
внимание не принимается. То есть каждый отдельный пакет рассматривается сетью
как совершенно независимая единица передачи – дейтаграмма.
Решение о продвижении пакета принимается на основе таблицы коммутации, ставящей
в соответствие адресам назначения пакетов информацию, однозначно определяющую
следующий по маршруту транзитный (или конечный) узел. В качестве такой
информации могут выступать идентификаторы интерфейсов данного коммутатора или
адреса входных интерфейсов коммутаторов, следующих по маршруту.
Рис. 7.9. Дейтаграммный принцип передачи пакетов
�Содержание
На рис. 7.9. показана сеть, в которой шесть конечных узлов (N1-N6) связаны семью
коммутаторами (S1-S7). Показаны также несколько перемещающихся по разным
маршрутам пакетов с разными адресами назначения (N1-N5), на пути которых лежит
коммутатор S1.
При поступлении каждого из этих пакетов в коммутатор S1 выполняется просмотр
соответствующей таблицы коммутации и выбор дальнейшего пути перемещения. Так
пакет с адресом N5 будет передан коммутатором S1 на интерфейс, ведущий к
коммутатору S6, где в результате подобной процедуры этот пакет будут направлен
конечному узлу получателю N5.
В таблице коммутации для одного и того же адреса назначения может содержаться
несколько записей, указывающих соответственно на различные адреса следующего
коммутатора. Такой подход называется балансом нагрузки и используется для
повышения производительности и надежности сети. В примере, показанном на
рисунке, пакеты, поступающие в коммутатор S1 для узла назначения с адресом N2, в
целях баланса нагрузки распределяются между двумя следующими коммутаторами –
S2 и S3, что снижает нагрузку на каждый из них, а значит, сокращает очереди и
ускоряет доставку. Некоторая «размытость» путей следования пакетов с одним и тем
же адресом назначения через сеть является прямым следствием принципа
независимой обработки каждого пакета, присущего дейтаграммному методу. Пакеты,
следующие по одному и тому же адресу назначения, могут добираться до него
разными путями также вследствие изменения состояния сети, например отказа
промежуточных коммутаторов.
Дейтаграммный метод работает быстро, так как никаких предварительных действий
перед отправкой данных проводить не требуется. Однако при таком методе трудно
проверить факт доставки пакета узлу назначения. Этот метод не гарантирует
доставку пакета, он делает это по мере возможности – для описания такого свойства
используется термин доставка с максимальными усилиями (besteffort).
�Содержание
7.2.3. Передача с установлением логического соединения
Следующий рассматриваемый нами способ продвижения пакетов основывается на
знании устройствами сети «истории» обмена данными, например, на запоминании
узлом-отправителем числа отправленных, а узлом-получателем – числа полученных
пакетов. Такого рода информация фиксируется в рамках логического соединения.
Процедра согласования двумя конечными узлами сети некоторых параметров
процесса обмена пакетами называется установлением логического соединения.
Параметры, о которых договариваются два взаимодействующих узла, называются
параметрами логического соединения.
Наличие логического соединения позволяет более рационально, по сравнению с
дейтаграммным способом, обрабатывать пакеты. Например, при потере нескольких
предыдущих пакетов может быть снижена скорость отправки последующих. Или
благодаря нумерации пакетов и отслеживанию номеров отправленных и принятых
пакетов можно повысить надежность путем отбрасывания дубликатов,
упорядочивания поступивших и повторения передачи потерянных пакетов.
Параметры соединения могут быть: постоянными, то есть не изменяющимися в
течение всего соединения (например, идентификатор соединения, способ шифрования
пакета или максимальный размер поля данных пакета), или переменными, то есть
динамически
отражающими
текущее
состояние
соединения
(например,
последовательные номера передаваемых пакетов).
Когда отправитель и получатель фиксируют начало нового соединения, они, прежде
всего, «договариваются» о начальных значениях параметров процедуры обмена и
только после этого начинают передачу собственно данных.
Передача с установлением соединения более надежна, но требует больше времени для
передачи данных и вычислительных затрат от конечных узлов, что иллюстрирует
рис. 7.10.
Рис. 7.10. Передача без установления соединения (а) и с установлением соединения (б)
�Содержание
Процедура установления соединения состоит обычно из трех шагов.
1. Узел-инициатор соединения отправляет узлу-получателю служебный пакет с
предложением установить соединение.
2. Если узел-получатель согласен с этим, то он посылает в ответ другой служебный
пакет, подтверждающий установление соединения и предлагающий некоторые
параметры, которые будут использоваться в рамках данного логического соединения.
Это могут быть, например, идентификатор соединения, количество кадров, которые
можно отправить без получения подтверждения и т. п.
3. Узел-инициатор соединения может закончить процесс установления соединения
отправкой третьего служебного пакета, в котором сообщит, что предложенные
параметры ему подходят.
Логическое соединение может быть рассчитано на передачу данных как в одном
направлении – от инициатора соединения, так и в обоих направлениях. После
передачи некоторого законченного набора данных, например определенного файла,
узел-отправитель инициирует разрыв данного логического соединения, посылая
соответствующий служебный кадр.
Заметим, что, в отличие от передачи дейтаграммного типа, в которой поддерживается
только один тип кадра – информационный, передача с установлением соединения
должна поддерживать как минимум два типа кадров – информационные кадры
переносят собственно пользовательские данные, а служебные предназначаются для
установления (разрыва) соединения.
После того как соединение установлено и все параметры согласованы, конечные узлы
начинают передачу собственно данных. Пакеты данных обрабатываются
коммутаторами точно так же, как и при дейтаграммной передаче: из заголовков
пакетов извлекаются адреса назначения и сравниваются с записями в таблицах
коммутации, содержащих информацию о следующих шагах по маршруту. Так же как
дейтаграммы, пакеты, относящиеся к одному логическому соединению, в некоторых
случаях (например, при отказе линии связи) могут доставляться адресату по разным
маршрутам.
Однако передача с установлением соединения имеет важное отличие от
дейтаграммной передачи, поскольку в ней помимо обработки пакетов на
коммутаторах имеет место дополнительная обработка пакетов на конечных узлах.
Например, если при установлении соединения была оговорена передача данных в
зашифрованном виде, то шифрование пакетов выполняется узлом-отправителем, а
расшифровка – узлом-получателем. Аналогично для обеспечения в рамках
логического соединения надежности всю работу по нумерации пакетов,
отслеживанию номеров доставленных и недоставленных пакетов, посылки копий и
отбрасывания дубликатов берут на себя конечные узлы.
�Содержание
Механизм установления логических соединений позволяет реализовывать
дифференцированное обслуживание информационных потоков. Разное обслуживание
могут получить даже потоки, относящиеся к одной и той же паре конечных узлов.
Например, пара конечных узлов может установить два параллельно работающих
логических соединения, в одном из которых передавать данные в зашифрованном
виде, а в другом – открытым текстом.
Как видим, передача с установлением соединения предоставляет больше
возможностей в плане надежности и безопасности обмена данными, чем
дейтаграммная передача. Однако этот способ более медленный, так как он
подразумевает дополнительные вычислительные затраты на установление и
поддержание логического соединения.
�Содержание
7.2.4. Передача с установлением виртуального канала
Следующий способ продвижения данных основан на частном случае логического
соединения в число параметров которого входит жестко определенный для всех
пакетов маршрут. То есть все пакеты, передаваемые в рамках данного соединения,
должны проходить по одному и тому же закрепленному за этим соединением пути.
Единственный заранее проложенный фиксированный маршрут, соединяющий
конечные узлы в сети с коммутацией пакетов, называют виртуальным каналом (virtual circuit и
Виртуальные каналы прокладываются для устойчивых информационных потоков. С
целью выделения потока данных из общего трафика каждый пакет этого потока
помечается специальным видом признака – меткой.
Так же как в сетях с установлением логических соединений, прокладка виртуального
канала начинается с отправки из узла-источника специального пакета – запроса на
установление соединения. В запросе указываются адрес назначения и метка потока,
для которого прокладывается этот виртуальный канал. Запрос, проходя по сети,
формирует новую запись в каждом из коммутаторов, расположенных на пути от
отправителя до получателя. Запись говорит о том, каким образом коммутатор должен
обслуживать пакет, имеющий заданную метку. Образованный виртуальный канал
идентифицируется той же меткой.
После прокладки виртуального канала сеть может передавать по нему
соответствующий поток данных. Во всех пакетах, которые переносят
пользовательские данные, адрес назначения уже не указывается, его роль играет метка
виртуального канала. При поступлении пакета на входной интерфейс коммутатор
читает значение метки из заголовка пришедшего пакета и просматривает свою таблицу
коммутации, по которой определяет, на какой выходной порт передать пришедший
пакет.
Рис. 7.11. Принцип работы виртуального канала
�Содержание
На рис. 7.11 показана сеть, в которой проложены два виртуальных канала
(VirtualChannel, VC), идентифицируемых метками VC1 и VC2. Первый проходит от
конечного узла с адресом N1 до конечного узла с адресом N2 через промежуточные
коммутаторы S1 и S2. Второй виртуальный канал VC2 обеспечивает продвижение
данных по пути N1-S1-S3-S5-N3. В общем случае, между двумя конечными узлами
может быть проложено несколько виртуальных каналов, например еще один
виртуальный канал между узлами N1 и N2 мог бы проходить через промежуточный
коммутатор S3. На рисунке показаны два пакета, несущие в своих заголовках метки
потоков VC1 и VC2, которые играют роль адресов назначения.
Таблица коммутации в сетях, использующих виртуальные каналы, отличается от
таблицы коммутации в дейтаграммных сетях. Она содержит записи только о
проходящих через коммутатор виртуальных каналах, а не обо всех возможных адресах
назначения, как это имеет место в сетях с дейтаграммным алгоритмом продвижения.
Обычно в крупной сети количество проложенных через узел виртуальных каналов
существенно меньше общего количества узлов, поэтому и таблицы коммутации в этом
случае намного короче, а следовательно, анализ такой таблицы занимает у
коммутатора меньше времени. По той же причине метка короче адреса конечного
узла, и заголовок пакета в сетях с виртуальными каналами переносит по сети вместо
длинного адреса компактный идентификатор потока.
В одной и той же сетевой технологии могут быть задействованы разные способы
продвижения данных. Так, дейтаграммный протокол IP используется для передачи
данных между отдельными сетями, составляющими Интернет. В то же время
обеспечением надежной доставки данных между конечными узлами этой сети
занимается протокол TCP, устанавливающий логические соединения без фиксации
маршрута. И наконец, Интернет – это пример сети, применяющей технику
виртуальных каналов, так как в состав Интернета входит немало сетей ATM и
FrameRelay, поддерживающих виртуальные каналы.
�Содержание
7.3. Сравнение сетей с коммутацией каналов и пакетов
В заключение данной главы приведем таблицу (табл. 7.1), в которой сведены свойства
обоих видов сетей. На основании этих данных можно аргументированно утверждать,
в каких случаях рациональнее использовать сети с коммутацией каналов, а в каких – с
коммутацией пакетов.
Таблица 7.1
Сравнение сетей с коммутацией каналов и пакетов
Коммутация каналов
Необходимо
соединение
предварительно
Коммутация пакетов
устанавливать Отсутствует этап установления
(дейтаграммный способ)
Адрес требуется только на этапе установления Адрес и
другая служебная
соединения
передаются с каждым пакетом
соединения
информация
Сеть может отказать абоненту в установлении Сеть всегда готова принять данные от абонента
соединения
Гарантированная
пропускная
способность Пропускная способность сети для абонентов
(полоса пропускания) для взаимодействующих неизвестна, задержки передачи носят случайный
абонентов
характер
Трафик реального
задержек
времени
Высокая надежность передачи
передается
без Ресурсы сети используются эффективно при
передаче пульсирующего трафика
Возможные потери данных из-за переполнения
буферов
Нерациональное использование
пропускной Автоматическое динамическое распределение
способности
каналов, снижающее
общую пропускной способности физического канала
эффективность сети
между абонентами
�Содержание
Контрольные вопросы к главе 7
1. Назовите принципы коммутации.
2. Сформулируйте понятия элементарного канала.
3. Опишите схему составного канала сети с коммутацией каналов.
4. Назовите свойства составного канала.
5. Что такое мультиплексирование?
6. Что такое процедура установления соединения?
7. Что такое пульсирующий трафик?
8. Опишите процесс разбиения данных на пакеты при технологии коммутации
пакетов.
9. Опишите процесс передачи данных по сети в виде пакетов.
10.Что такое буфер?
11.На основании каких методов продвижения пакетов может работать пакетный
коммутатор?
12.Приведите сравнительную характеристику сетей с коммутацией каналов и пакетов.
�Содержание
Глава 8. Протокол межсетевого взаимодействия
8.1. Назначение, функции и особенности протокола IP
8.2. Протокол IPv4
8.3. Протокол IPv6
Контрольные вопросы к главе 8
�Содержание
8.1. Назначение, функции и особенности протокола IP
В качестве главной функции межсетевого протокола IP (Internet Protocol) сетевого
уровня является продвижение пакета между сетями – от одного маршрутизатора к
другому до тех пор, пока пакет не попадет в сеть назначения. Межсетевой протокол IP
развертывается как на хостах, так и на всех маршрутизаторах (шлюзах); в этом
заключается его главная отличительная особенность от протоколов прикладного и
транспортного уровней. Протокол IP – это дейтаграммный протокол, работающий без
установления соединений по принципу доставки с максимальными усилиями.
Протокол IP является определяющим во всей иерархии протоколов семейства TCP/IP.
Это обусловлено тем, что межсетевой протокол IP предназначен для управления
рассылкой TCP/IP пакетов по сети Интернет. К основным функциям протокола IP
относят:
•
определение пакета (дейтаграммы);
•
определение адресной схемы, которая используется в сети Интернет;
•
передача данных между канальным уровнем (уровнем доступа к сети) и
транспортным уровнем (т. е. мультиплексирование транспортных дейтаграмм во
фреймы канального уровня);
•
маршрутизация пакетов по сети, т. е. передача пакетов от одного шлюза к другому
с целью передачи пакета машине-получателю;
•
«нарезка» и сборка из фрагментов пакетов транспортного уровня.
Межсетевой протокол IP характеризуется отсутствием ориентации на физическое или
виртуальное соединение. Этот факт означает, что, прежде чем послать пакет в сеть,
модуль операционной системы, реализующий протокол IP, не проверяет возможность
установки соединения, т. е. никакой управляющей информации, кроме той, что
содержится в самом IP-пакете, по сети не передается. К тому же протокол IP не
проверяет целостность информации в поле данных пакета. Ввиду этого, протокол IP
относится к протокам ненадежной доставки или доставки с максимальными
усилиями. Целостность данных проверяется протоколами транспортного уровня
(TCP) или протоколами приложений.
Маршрутизация – ресурсоемкая процедура, в течение которой вся информация о
маршруте, по которому должен пройти пакет, поступает из самой сети в момент
прохождения пакета. Коммутация же используется для предварительного
установления маршрута следования данных, по которому впоследствии эти данные
отправляют.
Так, принцип маршрутизации определил лидерские позиции глобальной сети
Интернет в сравнении с другими сетевыми технологиями. Однако, маршрутизация
требует анализа каждого пакета, который проходит через шлюз или маршрутизатор, а
�Содержание
при коммутации анализируется только управляющая информация, устанавливается
канал (физический или виртуальный) и все пакеты пересылаются по этому каналу без
анализа маршрутной информации. Этот недостаток протокола IP является
одновременно и его достоинством, так как при неустойчивой работе компьютерной
сети пакеты могут пересылаться по разным маршрутам, а затем инкапсулироваться в
единое сообщение. При коммутации маршрут придется вычислять заново для каждого
пакета; в этом случае коммутация будет более ресурсозатратной, чем маршрутизация
[5, с. 246–247].
�Содержание
8.2. Протокол IPv4
IPv4 – четвертая и самая распространенная версия протокола IP [26].
«Межсетевая дейтаграмма (или IP-дейтаграмма) – протокольный блок данных IP» [8].
Также как в кадре канального уровня, в IP-дейтаграмме содержится поле заголовка и
поле данных. В свою очередь заголовок дейтаграммы содержит: адреса отправителя,
получателя и поле типа, которое идентифицирует содержимое дейтаграммы. Отличие
между ними состоит в том, что заголовок дейтаграммы содержит IP-адреса, а
заголовок кадра – физические адреса.
Рис. 8.1. Формат дейтаграммы
Формат дейтаграммы представлен на рис. 8.1 и имеет следующие поля:
•
Поле «Версия» (VERS) указывает версию протокола IP. Сейчас повсеместно
используется версия 4 и готовится переход на версию 6, называемую также IPng (IP
next generation).
•
Поле длины заголовка «Длина» также занимает 4 бита и хранит длину заголовка
дейтаграммы в 32-битных словах.
•
Поле «Тип сервиса» (SERVICE TYPE) занимает 1 байт и задает приоритетность
пакета и вид критерия выбора маршрута. Первые три бита этого поля образуют
подполе приоритета пакета (PRECEDENCE). Приоритет может иметь значения от 0
(нормальный пакет) до 7 (пакет управляющей информации). Маршрутизаторы и
компьютеры могут принимать во внимание приоритет пакета и обрабатывать более
важные пакеты в первую очередь. Поле Тип сервиса содержит также три бита,
определяющие критерий выбора маршрута. Установленный бит D (delay) говорит о
том, что маршрут должен выбираться для минимизации задержки доставки
данного пакета, бит T – для максимизации пропускной способности, а бит R – для
максимизации надежности доставки.
•
Поле «Общая длина» (TOTAL LENGTH) занимает 2 байта и указывает общую длину
пакета с учетом заголовка и поля данных.
�Содержание
•
Поле «Идентификатор» (IDENTIFICATION) занимает 2 байта и используется для
распознавания пакетов, образовавшихся путем фрагментации исходного пакета. Все
фрагменты должны иметь одинаковое значение этого поля.
•
Поле «Флаги» (FLAGS) занимает 3 бита, оно указывает на возможность
фрагментации пакета, а также на то, является ли данный пакет промежуточным или
последним фрагментом исходного пакета.
•
Поле «Смещение фрагмента» (FRAGMENT OFFSET) занимает 13 бит и
используется для указания в байтах смещения поля данных этого пакета от начала
общего поля данных исходного пакета, подвергнутого фрагментации. Используется
при сборке/разборке фрагментов пакетов при передачах их между сетями с
различными величинами максимальной длины пакета.
•
Поле «Время жизни» (TIME TO LIVE) занимает 1 байт и указывает предельный
срок, в течение которого пакет может перемещаться по сети. Время жизни данного
пакета измеряется в секундах и задается источником передачи средствами
протокола IP. На шлюзах и в других узлах сети по истечении каждой секунды из
текущего времени жизни вычитается единица; единица вычитается также при
каждой транзитной передаче (даже если не прошла секунда). При истечении
времени жизни пакет аннулируется [78].
•
Значение в поле «Протокол» указывает, какой протокол высокого уровня
использовался при создании сообщения, передаваемого в области «Данные»
дейтаграммы. То есть значение в поле «Протокол» специфицирует формат области
«Данные». Соответствие между протоколом высокого уровня и целым числом,
используемым в поле «Протокол», должно устанавливаться централизованно,
ввиду гарантировать действие соглашения по всему Интернету.
•
Поле «Контрольная сумма заголовка» удостоверяет целостность значений полей
заголовка. Контрольная сумма IP формируется путем представления заголовка как
последовательности 16-битовых чисел (с сетевым порядком байт), сложения их
вместе, используя арифметику с дополнительным представлением отрицательных
чисел, и получения отрицания числа. При вычислении контрольной суммы поле
«Контрольная сумма заголовка» предполагается равным нулю. Необходимо
помнить, что эта контрольная сумма применима только к числам, находящимся в
заголовке IP, а не в данных. Разделение контрольной суммы для заголовка и для
данных имеет свои преимущества и недостатки. Так как заголовок обычно
занимает меньше октетов, чем данные, наличие отдельной контрольной суммы для
него уменьшает время обработки в маршрутизаторах, которые вычисляют только
контрольную сумму заголовка. Это разделение также позволяет протоколам более
высокого уровня выбирать свои собственные схемы расчета контрольной суммы
для данных. Главным недостатком является то, что протоколы более высокого
уровня вынуждены добавлять свои контрольные суммы или рисковать тем, что они
не смогут обнаружить искажения данных.
�Содержание
•
Поля «Адрес отправителя IР» и «Адрес получателя IР» содержат 32-битовые IPадреса отправителя и конечного получателя дейтаграммы IPv4. Хотя дейтаграмма
может проходить через большое число промежуточных шлюзов или
маршрутизаторов, поля отправителя и получателя никогда не изменяются; они
указывают IP-адреса истинного источника и конечного назначения.
•
Поле «Опции IР», рассматриваемое ниже, имеет переменную длину.
•
Поле «Заполнение» зависит от выбранных опций. Оно представляет собой биты,
содержащие нули, которые могут потребоваться для дополнения заголовка
дейтаграммы до длины, кратной 32 бит.
�Содержание
8.3. Протокол IPv6
В июле 1992 г. Тематическая группа по технологии Интернет (IETF) выступила с
инициативой на разработку требований к протоколам семейства TCP/IP нового
поколения, названным IPNextGeneration (IPng).
Одна из главных причин, почему IETF взялась за усовершенствование протокола IPv4,
состояла в стремительном росте Интернета. Несмотря на то, что пространство
адресов еще не исчерпано, потребность увеличения числа IP- адресов также диктуется
тем фактом, что имеет место резервирование адресов блоками фиксированной
величины, например, компания получает блок адресов класса В из 65 000 уникальных
адресов IPv4. Даже если компания использует не все зарезервированные адреса (что
весьма вероятно) никто другой ими воспользоваться не может. Осознание этого факта
послужило основным стимулом для разработки новой версии межсетевого протокола
IPv6.
Одной из основных отличительных черт IPv6 является использование 128-разрядного
адресного пространства по сравнению с 32-разрядным адресным пространством IPv4.
Увеличение размера адреса с 32 до 128 бит позволяет не только существенно
расширить адресное пространство, но и ввести больше иерархических уровней, чем
адреса сети, подсети и рабочей станции в IPv4. Аналогично классической схеме
адресации в IPv4, адрес IPv6 идентифицирует подключенный к сети интерфейс, а не
компьютер. Основным отличием является тот факт, что интерфейс IPv6 не только
может, но и должен иметь столько адресов, сколько это необходимо для обеспечения
маршрутизации или сетевого управления. Адреса IPv6 принадлежат одной из
следующих категорий: unicast, multicast и anycast.
• Unicast означает адрес в привычном смысле значения этого понятия. Данные
адреса идентифицируют в точности один интерфейс в сфере своего действия и
предназначены для информационного обмена точка–точка.
• Категория multicast идентифицирует адреса группы интерфейсов и предназначена
для групповой рассылки информации. Пакет данных, посланный по такому адресу,
должен быть доставлен по каждому из адресов интерфейсов, входящих в
идентифицируемую группу.
• Адреса anycast также представляют группу интерфейсов, однако они доставляют
информацию только на ближайший интерфейс из идентифицируемой группы.
Нотация адресов IPv6 представляет собой разделенные на 8 групп 16-битовые числа,
записываемые
в
шестнадцатеричной
системе
счисления,
например
0123:4567:89AD:CDEF:0123:4567:89AB:CDEF. При записи адреса в целях экономии
места принято опускать незначащие нули.
Для уменьшения нагрузки на маршрутизаторы каждый IP-адрес должен не просто
указывать место назначения, но и содержать достаточно информации для определения
маршрута доставки пакетов. Один из способов достижения этой цели заключается в
территориально-централизованном подходе к начальному распределению IP-адресов и
установлению жесткой зависимости между всеми уровнями организаций-поставщиков
�Содержание
услуг и их клиентами. Данный принцип был заложен на ранней стадии разработки
спецификаций IPv6 и претерпел в настоящее время некоторые несущественные
изменения. Необходимо заметить, что описываемая схема начального распределения
адресов, называемая «aggregatable global unicast addresses», описывает лишь одну
восьмую часть адресного пространства IPv6. Остальные адреса либо зарезервированы
под определенные нужды, либо еще не распределены (доля последних составляет
около 70 % всего адресного пространства). Формат адреса IPv6 представлен на
рис. 8.2.
Рис. 8.2. Формат адреса IPv6
Первый компонент адреса IPv6 является префиксом «aggregatable global unicast
addresses» и имеет фиксированное значение (001).
Второй компонент называется Агрегат данных высшего уровня (TLA – Top Level
Aggregator). Согласно начальному плану распределения IP-адресов, требовалось
выделить фиксированные префиксы для трех основных регистров: Интернет NIC
(Network Information Center), обслуживающего Северную Америку, NCC (Network
Coordination Center), координирующий деятельность ассоциации европейских сетей
RIPE и APNIC, представляющий страны Азии и Тихого океана. Префиксы TLA
присваивают ограниченному числу поставщиков услуг, которые, в свою очередь,
сами назначают адреса своим клиентам.
Третий компонент адреса – Агрегат данных следующего уровня (NLA –
NextLevelAggregator) – представляет собой гибкую структуру для использования
сложившейся иерархии организаций – поставщиков услуг. Путем иерархического
разбиения отведенного для NLA адресного пространства можно эффективно
распределять сетевые адреса и управлять маршрутизацией потоков данных в пределах,
контролируемых национальным или территориальным регистром.
Четвертый компонент адреса называется Агрегат данных уровня станции (SLA – Site
Local Aggregator) и предназначен для назначения рабочей станции. При этом адрес
рабочей станции выступает в роли атома системы адресов IPv6: при любом изменении
полного адреса (например, в результате смены поставщика услуг Интернета)
модификации подлежат только поля TLA и NLA. Компоненты SLA и Interface ID
включают в себя МАС-адрес спецификации IEEE 802 и должны оставаться
неизменными, что обеспечит глобально-уникальное именование активного сетевого
оборудования.
Формат дейтаграммы протокола IPv6 показан на рис. 8.3. По новому формату можно
судить о наиболее существенных изменениях в протоколе IP.
•
Расширенные возможности адресации. В дейтаграмме протокола IPv6 размер IP-
�Содержание
адреса увеличен с 32 до 128 бит. Это гарантирует, что адресного пространства
будет хватать всем и всегда. Теперь можно дать IP-адрес каждой песчинке на
планете. В дополнение к индивидуальным и групповым адресам в протоколе IPv6
появился новый тип адресов, называемых адресами свободной рассылки (anycast
addresses), позволяющих пересылать дейтаграмму любому члену группы хостов.
•
Упрощенный 40-разрядный заголовок. Несколько полей протокола IPv4 были
опущены или сделаны необязательными, о чем будет сказано далее. Получившийся
в результате 40-разрядный заголовок фиксированной длины обеспечивает
ускоренную
обработку
IP-дейтаграммы.
Новый
способ
кодирования
необязательных полей обеспечивает их более гибкую обработку.
•
Метка потока и приоритет. Определение потока в протоколе IPv6 довольно
расплывчато. В RFC 1752 и RFC 2460 утверждается, что поле метки потока
позволяет «маркировать пакеты, для которых отправителю требуется специальная
обработка, например, обслуживание с отличным от предоставляемого по
умолчанию уровнем качества или обслуживание в реальном времени». С одной
стороны, обрабатываться в качестве потока могут, например, транслируемые
аудио- или видеоданные, трафик высокоприоритетного пользователя (например,
платящего за более качественное обслуживание своего трафика). С другой
стороны, традиционные приложения, такие как приложения передачи файлов и
электронной почты, в качестве потока могут не обрабатываться. Ясно лишь то, что
разработчики протокола IPv6 предвидят необходимость в дифференцировании
потоков, несмотря на то что точное понятие потока еще не определено. В заголовке
IPv6 также есть восьмиразрядное поле класса трафика. Подобно полю TOS (Type
Of Service – тип службы) протокола IPv4 это поле может использоваться для
предоставления приоритета определенным пакетам потока, а также для
предоставления приоритета дейтаграммам определенных приложений (например,
ICMP-пакетам) по сравнению с дейтаграммами других приложений (например,
пакетам с сетевыми новостями).
Рис. 8.3. Формат дейтаграммы протокола IPv6
�Содержание
Как упоминалось выше, формат IPv6-дейтаграмм проще формата IPv4-дейтаграмм.
Ниже перечислены поля IPv6-дейтаграммы.
•
Версия. Это 4-разрядное поле идентифицирует номер версии протокола IP и для
протокола IPv6 содержит значение 6. Обратите внимание, если поместить в это
поле значение 4, то мы не получим корректную дейтаграмму протокола IPv4.
•
Класс трафика. Это 8-разрядное поле отчасти напоминает поле TOS протокола
IPv4.
•
Метка потока. Как упоминалось выше, это 20-разрядное поле используется для
идентификации «потока» дейтаграмм.
•
Длина полезной нагрузки. Это 16-разрядное поле обрабатывается как целое число
без знака и содержит количество байтов в 1Ру6-дейтаграмме, следующих за 40разрядным заголовком дейтаграммы.
•
Следующий заголовок. Это поле идентифицирует протокол, которому доставляется
содержимое (поле данных) дейтаграммы (например, TCP или UDP). Для этого поля
используются те же значения, что и для поля протокола в IPv4-зaгoловке.
•
Ограничение на число ретрансляционных участков. Содержимое этого поля
уменьшается на единицу на каждом маршрутизаторе, через который проходит
дейтаграмма. Когда содержимое этого поля достигает нуля, дейтаграмма
уничтожается.
•
Адреса отправителя и получателя. Различные форматы 128-разрядных IPv6-адресов
описаны в RFC 2373.
•
Данные. Это полезная нагрузка IPv6-дейтаграммы. Когда дейтаграмма достигает
пункта назначения, полезная нагрузка извлекается из нее и передается протоколу,
указанному в поле следующего заголовка.
Сравнивая формат IPv6-дейтаграммы с форматом дейтаграммы протокола IPv4,
можно заметить, что некоторые поля IPv4-дейтаграммы не включены в IPv6дейтаграмму:
•
Фрагментация / повторная сборка. Протокол IPv6 не позволяет производить на
маршрутизаторах фрагментацию и повторную сборку. Если принятая
маршрутизатором IPv6-дейтаграмма слишком велика для передачи по выходной
линии, маршрутизатор просто отбрасывает такую дейтаграмму и посылает обратно
отправителю ICMP-сообщение об ошибке (пакет слишком велик). Отправитель
может послать данные еще раз, используя IP-дейтаграммы меньшего размера.
Такие операции, как фрагментация и повторная сборка дейтаграмм, требуют много
времени. Избавление маршрутизаторов от необходимости выполнять подобные
действия существенно ускоряет работу протокола IP.
•
Контрольная сумма заголовка. Поскольку протоколы транспортного уровня
�Содержание
(например, TCP и UDP), а также протоколы канального уровня (например, Ethernet)
в архитектуре протоколов Интернета считают контрольную сумму передаваемых
данных, разработчики протокола IP посчитали, что реализация той же функции на
сетевом уровне будет излишней. Опять же, центральной задачей была быстрая
обработка IP-пакетов. Как было показано в подразделе «Адресация в протоколе
IPv4» раздела «Интернет-протокол», поскольку IPv4-заголовок содержит поле
времени жизни (TTL), аналогичное полю ограничения на число ретрансляционных
участков в протоколе IPv6, контрольную сумму IPv4-заголовка приходилось
пересчитывать на каждом маршрутизаторе. Как и фрагментация, и повторная
сборка, эта операция также отнимает много времени.
•
Параметры. Поле параметров более не входит в стандартный IP-заголовок. Однако
от него не отказались полностью. Вместо этого поле необязательных параметров
может быть одним из «следующих заголовков» (наравне с ТСР-или UDPзаголовками), на которые может ссылаться IРv6-заголовок. В результате удаления
этого поля длина IP-заголовка стала фиксированной (40 байт) [4, с. 378–381].
�Содержание
Контрольные вопросы к главе 8
1. Назовите основной протокол сетевого уровня.
2. Перечислите функции протокола IP.
3. Что такое межсетевая дейтаграмма?
4. Опишите формат дейтаграммы.
5. В связи с чем возникла потребность в разработке новой версии протокола IP, IPv6?
6. В чем состоит основное отличие протокола IPv4 от IPv6?
7. Назовите категории адресов IPv6.
8. Опишите формат адреса IPv6.
9. Опишите формат дейтаграммы протокола IPv6.
�Содержание
Глава 9. Адресация в сетях на примере стека протоколов TCP/
IP
Важную часть технологии TCP/IP составляют задачи адресации, к числу которых
относятся следующие:
•
Согласованное использование адресов различного типа. Эта задача включает
отображение адресов разных типов, например преобразование сетевого IP-адреса в
локальный, доменного имени – в IP-адрес.
•
Обеспечение уникальности адресов. В зависимости от типа адреса требуется
обеспечивать однозначность адресации в пределах компьютера, подсети,
корпоративной сети или Интернета.
•
Конфигурирование сетевых интерфейсов и сетевых приложений.
9.1. Стек протоколов TCP/IP
9.2. Типы адресов стека TCP/IP
9.2.1. Локальные адреса
9.2.2. Сетевые IP-адреса
9.2.3. Доменные имена
9.3. Формат IP-адреса
9.4. Классы IP-адресов
9.5. Использование масок при IP-адресации
9.6. Отображение IP-адресов на локальные адреса
9.7. Протокол DHCP
9.7.1. Режимы DHCP
9.7.2. Алгоритм динамического назначения адресов
Контрольные вопросы к главе 9
�Содержание
9.1. Стек протоколов TCP/IP
Сегодня стек TCP/IP широко используется как в глобальных, так и в локальных сетях.
Этот стек имеет иерархическую структуру, в которой определено 4 уровня (рис. 9.1).
Рис. 9.1. Стек протоколов TCP/IP
Прикладной уровень стека TCP/IP соответствует трем верхним уровням модели OSI
прикладному, представления и сеансовому. Он объединяет сервисы, предоставляемые
системой пользовательским приложениям. За долгие годы применения в сетях
различных стран и организаций стек TCP/IP накопил большое количество протоколов
и служб прикладного уровня. К ним относятся такие распространенные протоколы,
как протокол передачи файлов (File Transfer Protocol, FTP), протокол эмуляции
терминала telnet, простой протокол передачи почты (Simple Mail Transfer Protocol,
SMTP), протокол передачи гипертекста (Hypertext Transfer Protocol, HTTP) и многие
другие. Протоколы прикладного уровня развертываются на хостах. В Интернете (а
значит, и в стеке протоколов TCP/IP) конечный узел традиционно называют хостом, а
маршрутизатор – шлюзом. Далее мы будем использовать пары терминов «конечный
узел» – «хост» и «маршрутизатор» – «шлюз» как синонимы, чтобы отдать дань
уважения традиционной терминологии Интернета и в то же время не отказываться от
современных терминов.
Транспортный уровень стека TCP/IP может предоставлять вышележащему уровню два
типа сервиса:
•
гарантированную доставку обеспечивает
(TransmissionControlProtocol, TCP);
протокол
управления
передачей
•
доставку по возможности, или с максимальными усилиями, обеспечивает протокол
пользовательских дейтаграмм (UserDatagramProtocol, UDP).
Для того чтобы обеспечить надежную доставку данных, протокол TCP
предусматривает установление логического соединения, что позволяет ему
нумеровать пакеты, подтверждать их прием квитанциями, в случае потери
организовывать повторные передачи, распознавать и уничтожать дубликаты,
�Содержание
доставлять прикладному уровню пакеты в том порядке, в котором они были
отправлены. Благодаря этому протоколу объекты на хосте-отправителе и хостеполучателе могут поддерживать обмен данными в дуплексном режиме. TCP дает
возможность без ошибок доставить сформированный на одном из компьютеров
поток байтов на любой другой компьютер, входящий в составную сеть.
Второй протокол этого уровня, UDP, является простейшим дейтаграммным
протоколом, который используется тогда, когда задача надежного обмена данными
либо вообще не ставится, либо решается средствами более высокого уровня –
прикладным уровнем или пользовательскими приложениями.
В функции протоколов TCP и UDP входит также исполнение роли связующего звена
между прилегающими к транспортному уровню прикладным и сетевым уровнями. От
прикладного протокола транспортный уровень принимает задание на передачу данных
с тем или иным качеством прикладному уровню-получателю. Нижележащий сетевой
уровень протоколы TCP и UDP рассматривают как своего рода инструмент, не очень
надежный, но способный перемещать пакет в свободном и рискованном путешествии
по составной сети.
Программные модули, реализующие протоколы TCP и UDP, подобно модулям
протоколов прикладного уровня, устанавливаются на хостах.
Сетевой уровень, называемый также уровнем Интернета, является стержнем всей
архитектуры TCP/IP. Именно этот уровень, функции которого соответствуют сетевому
уровню модели OSI, обеспечивает перемещение пакетов в пределах составной сети,
образованной объединением нескольких подсетей. Протоколы сетевого уровня
поддерживают интерфейс с вышележащим транспортным уровнем, получая от него
запросы на передачу данных по составной сети, а также с нижележащим уровнем
сетевых интерфейсов, о функциях которого мы расскажем далее.
Основным протоколом сетевого уровня является межсетевой протокол (Internet
Protocol, IP). В его задачу входит продвижение пакета между сетями – от одного
маршрутизатора к другому до тех пор, пока пакет не попадет в сеть назначения. В
отличие от протоколов прикладного и транспортного уровней, протокол IP
развертывается не только на хостах, но и на всех маршрутизаторах (шлюзах).
Протокол IP – это дейтаграммный протокол, работающий без установления
соединений по принципу доставки с максимальными усилиями. Такой тип сетевого
сервиса называют также «ненадежным».
К сетевому уровню TCP/IP часто относят протоколы, выполняющие вспомогательные
функции по отношению к IP. Это, прежде всего, протоколы маршрутизации RIP и
OSPF, предназначенные для изучения топологии сети, определения маршрутов и
составления таблиц маршрутизации, на основании которых протокол IP перемещает
пакеты в нужном направлении. По этой же причине к сетевому уровню могут быть
отнесены протокол межсетевых управляющих сообщений (Internet Control Message
Protocol, ICMP), предназначенный для передачи маршрутизатором источнику
сведений об ошибках, возникших при передаче пакета, и некоторые другие
протоколы.
�Содержание
Идеологическим отличием архитектуры стека TCP/IP от многоуровневой архитектуры
других стеков является интерпретация функций самого нижнего уровня – уровня
сетевых интерфейсов, он отвечает только за организацию взаимодействия с подсетями
разных технологий, входящими в составную сеть. TCP/IP рассматривает любую
подсеть, входящую в составную сеть как средство транспортировки пакетов между
двумя соседними маршрутизаторами.
Задачу организации интерфейса между технологией TCP/IP и любой другой
технологией промежуточной сети упрощенно можно свести к двум задачам:
•
упаковка (инкапсуляция) IР-пакета в единицу передаваемых данных промежуточной
сети;
•
преобразование сетевых адресов в адреса технологии данной промежуточной сети.
Каждый коммуникационный протокол оперирует некоторой единицей передаваемых
данных (рис. 9.2).
Рис. 9.2. PDU на каждом уровне
�Содержание
Потоком данных, информационным потоком, или просто потоком, называют данные,
поступающие от приложений на вход протоколов транспортного уровня – TCP и UDP.
Протокол TCP «нарезает» из потока данных сегменты.
Единицу данных протокола UDP часто называют дейтаграммой, или датаграммой.
Дейтаграмма – это общее название для единиц данных, которыми оперируют
протоколы без установления соединений. К таким протоколам относится и протокол
IP, поэтому его единицу данных иногда тоже называют дейтаграммой, хотя
достаточно часто используется другой термин – пакет.
В стеке TCP/IP единицы данных любых технологий, в которые упаковываются IРпакеты для их последующей передачи через сети составной сети, принято называть
также кадрами, или фреймами. При этом не имеет значения, какое название
используется для этой единицы данных в технологии составляющей сети. Для TCP/IP
фреймом является и кадр Ethernet, и ячейка ATM, и пакет Х.25 в тех случаях, когда они
выступают в качестве контейнера, в котором IP-пакет переносится через составную
сеть.
�Содержание
9.2. Типы адресов стека TCP/IP
Для идентификации сетевых интерфейсов используются три типа адресов:
1) локальные (аппаратные) адреса;
2) сетевые адреса (IР-адреса);
3) символьные (доменные) имена.
9.2.1. Локальные адреса
9.2.2. Сетевые IP-адреса
9.2.3. Доменные имена
�Содержание
9.2.1. Локальные адреса
В большинстве технологий LAN (Ethernet, FDDI, TokenRing) для однозначной
адресации интерфейсов используются МАС-адреса.
MAC-адрес (от англ. Media Access Control – управление доступом к среде, также
Hardware Address) – это уникальный идентификатор, присваиваемый каждой единице
активного оборудования компьютерных сетей.
При проектировании стандарта Ethernet было предусмотрено, что каждая сетевая
карта (равно как и встроенный сетевой интерфейс) должна иметь уникальный
шестибайтный номер (MAC-адрес), прошитый в ней при изготовлении. Этот номер
используется для идентификации отправителя и получателя фрейма, и предполагается,
что при появлении в сети нового компьютера (или другого устройства, способного
работать в сети) сетевому администратору не придется настраивать MAC-адрес.
Уникальность MAC-адресов достигается тем, что каждый производитель получает в
координирующем комитете IEEE Registration Authority диапазон из шестнадцати
миллионов (224) адресов, и по мере исчерпания выделенных адресов может запросить
новый диапазон. Поэтому по трем старшим байтам MAC-адреса можно определить
производителя [33].
Существует немало технологий (Х.25, ATM, framerelay), в которых применяются
другие схемы адресации. Роль, которую играют эти адреса в TCP/IP, не зависит от
того, какая именно технология используется в подсети, поэтому они имеют общее
название – локальные (аппаратные) адреса, т. е. «действующие не во всей составной
сети, а лишь в пределах подсети». В данном случае под словом «локальная»
подразумевается указание на роль, которую играет эта подсеть в архитектуре
составной сети.
Термин «аппаратный» подчеркивает концептуальное представление разработчиков
стека TCP/IP о подсети как о некотором вспомогательном аппаратном средстве,
единственной функцией которого является перемещение IP-пакета через подсеть до
ближайшего шлюза (маршрутизатора). И не важно, что реально нижележащая
локальная технология может быть достаточно сложной, все ее сложности технологией
TCP/IP игнорируются.
�Содержание
9.2.2. Сетевые IP-адреса
Чтобы технология TCP/IP могла решать свою задачу объединения сетей, ей
необходима собственная глобальная система адресации, не зависящая от способов
адресации узлов в отдельных сетях. Эта система адресации должна позволять
универсальным и однозначным способом идентифицировать любой интерфейс
составной сети. Очевидным решением является уникальная нумерация всех сетей
составной сети, а затем нумерация всех узлов в пределах каждой из этих сетей. Пара,
состоящая из номера сети и номера узла, отвечает поставленным условиям и может
являться сетевым адресом.
В качестве номера узла может выступать либо локальный адрес этого узла (такая
схема принята в стеке IPX/SPX), либо некоторое число, никак не связанное с
локальной технологией и однозначно идентифицирующее узел в пределах данной
подсети. В первом случае сетевой адрес становится зависимым от локальных
технологий, что ограничивает его применение. Например, сетевые адреса IPX/SPX
рассчитаны на работу в составных сетях, объединяющих сети, в которых
используются только МАС-адреса или адреса аналогичного формата. Второй подход
более универсален, он характерен для стека TCP/IP.
В технологии TCP/IP сетевой адрес называют IP-адресом.
Если рассматривать IP-сеть, то можно отметить, что маршрутизатор по определению
входит сразу в несколько сетей, следовательно, каждый его интерфейс имеет
собственный IP-адрес. Конечный узел также может входить в несколько IP-сетей. В
этом случае компьютер должен иметь несколько IP- адресов – по числу сетевых
связей. Таким образом. IP-адрес идентифицирует не отдельный компьютер или
маршрутизатор, а одно сетевое соединение.
Каждый раз, когда пакет направляется адресату через составную сеть, в его заголовке
указывается IP-адрес узла назначения. По номеру сети назначения каждый очередной
маршрутизатор находит IP-адрес следующего маршрутизатора. Перед тем как
отправить пакет в следующую сеть маршрутизатор должен определить на основании
найденного IP-адреса следующего маршрутизатора его локальный адрес. Для этой
цели протокол IP, как показано на рис. 9.3, обращается к протоколу разрешения
адресов (ARP).
Рис. 9.3. Преобразование адресов
�Содержание
9.2.3. Доменные имена
Для идентификации компьютеров аппаратное и программное обеспечение в сетях
ТСР/IP полагается на IP-адреса. Например, команда ftp://192.45.66.17 будет
устанавливать сеанс связи с нужным ftp-сервером, а команда http://203.23.106.33
откроет начальную страницу на корпоративном веб-сервере. Однако пользователи
обычно предпочитают работать с более удобными символьными именами
компьютеров.
Символьные идентификаторы сетевых интерфейсов в пределах составной сети
строятся по иерархическому принципу. Составляющие полного символьного (или
доменного) имени в IP-сетях разделяются точкой и перечисляются в следующем
порядке: сначала простое имя хоста, затем имя группы хостов (например, имя
организации), потом имя более крупной группы (домена) и так до имени домена
самого высокого уровня (например, домена, объединяющего организации по
географическому принципу: RU – Россия, UK – Великобритания, US – США).
Примером доменного имени может служить имя base2.sales.zil.ru.
Между доменным именем и IP-адресом узла нет никакой функциональной
зависимости, поэтому единственный способ установления соответствия – это
таблица. В сетях TCP/IP используется специальная система доменных имен (Domain
Name System, DNS), которая устанавливает это соответствие на основании
создаваемых администраторами сети таблиц соответствия. Поэтому доменные имена
называют также DNS-именами.
В общем случае сетевой интерфейс может иметь несколько локальных адресов,
сетевых адресов и доменных имен.
�Содержание
9.3. Формат IP-адреса
В заголовке IP-пакета для хранения IP-адресов отправителя и получателя отводятся
два поля, каждое имеет фиксированную длину 4 байта (32 бита). IP-адрес состоит из
двух логических частей – номера сети и номера узла в сети.
Наиболее распространенной формой представления IP-адреса является запись в виде
четырех чисел, представляющих значения каждого байта в десятичной форме и
разделенных точками, например:
128.10.2.30
Этот же адрес может быть представлен в двоичном формате:
10000000 000010100000001000011110
а также в шестнадцатеричном формате:
80.0A.02.1D
Заметим, что запись адреса не предусматривает специального разграничительного
знака между номером сети и номером узла. Вместе с тем при передаче пакета по сети
часто возникает необходимость разделить адрес на эти две части.
Способы определения маршрутизаторами номера сети и номера узла IP-адреса:
1. Использование фиксированной границы: при этом все 32-битное поле адреса
заранее делится на две части не обязательно равной, но фиксированной длины, в
одной из которых всегда будет размещаться номер сети, в другой – номер узла.
Решение очень простое, но хорошее ли? Поскольку поле, которое отводится для
хранения номера узла, имеет фиксированную длину, все сети будут иметь одинаковое
максимальное число узлов. Если, например, под номер сети отвести один первый
байт, то все адресное пространство распадется на сравнительно небольшое (28) число
сетей огромного размера (224 узлов). Если границу передвинуть дальше вправо, то
сетей станет больше, но все равно все они будут одинакового размера. Очевидно, что
такой жесткий подход не позволяет дифференцированно удовлетворять потребности
отдельных предприятий и организаций. Именно поэтому он не нашел применения,
хотя и использовался на начальном этапе существования технологии TCP/IP (RFC
760).
2. Использование маски, которая позволяет максимально гибко устанавливать
границу между номером сети и номером узла. При таком подходе адресное
пространство можно использовать для создания множества сетей разного размера.
Маска – это число, применяемое в паре с IP-адрссом, причем двоичная запись маски
содержит непрерывную последовательность единиц в тех разрядах, которые должны в
IP-адресе интерпретироваться как номер сети. Граница между последовательностями
единиц и нулей в маске соответствует границе между номером сети и номером узла в
IР-адресе.
�Содержание
3. Применение классов адресов (RFC 791). Этот способ представляет собой
компромисс по отношению к двум предыдущим: размеры сетей хотя и не могут быть
произвольными, как при использовании масок, но и не должны быть одинаковыми,
как при установлении фиксированных границ. Вводится пять классов адресов: А, В, С,
D, Е. Три из них – А, В и С – предназначены для адресации сетей, а два – D и Е –
имеют специальное назначение. Для каждого класса сетевых адресов определено
собственное положение границы между номером сети и номером узла.
�Содержание
9.4. Классы IP-адресов
Признаком, на основании которого IP-адрес относят к тому или иному классу,
являются значения нескольких первых битов адреса. Таблица 9.1 иллюстрирует
структуру IP-адресов разных классов.
Таблица 9.1. Классы IP-адресов
Классы IP-адресов
К классу А относится адрес, в котором старший бит имеет значение 0. В адресах
класса А под идентификатор сети отводится 1 байт, а остальные 3 байта
интерпретируются как номер узла в сети. Сети, все IP-адреса которых имеют значение
первого байга в диапазоне от 1 (00000001) до 126 (01111110), называются сетями
класса А. Значение 0 (00000000) первого байта не используется, а значение 127
(01111111) зарезервировано для специальных целей. Сетей класса А сравнительно
немного, зато количество узлов в них может достигать 224, то есть 16 777 216 узлов.
К классу В относятся все адреса, старшие два бита которых имеют значение 10. В
адресах класса В под номер сети и под номер узла отводится по 2 байта. Сети,
значения первых двух байтов адресов которых находятся в диапазоне от 128.0
(10000000 00000000) до 191.255 (10111111 11111111), называются сетями класса В. Ясно,
что сетей класса В больше, чем сетей класса А, а размеры их меньше. Максимальное
количество узлов в сетях класса В составляет 216 (65 536)
К классу С относятся все адреса, старшие три бита которых имеют значение 110. В
адресах класса С под номер сети отводится 3 байта, а под номер узла – 1 байт. Сети,
старшие
три
байта
которых
находятся
в
диапазоне
от
192.0.0
(11000000 00000000 00000000) до 223.255.255 (11011111 11111111 11111111), называются
сетями класса С. Сети класса С наиболее распространены, и наименьшее
максимальное число узлов в них равно 28 (256).
Если адрес начинается с последовательности 1110, то он является адресом класса D и
�Содержание
обозначает особый групповой адрес (multicast address). В то время как адреса классов
А, В и С служат для идентификации отдельных сетевых интерфейсов, то есть
являются индивидуальными адресами (unicast address), групповой адрес
идентифицирует группу сетевых интерфейсов, которые в общем случае могут
принадлежать разным сетям. Интерфейс, входящий в группу, получает наряду с
обычным индивидуальным IP-адресом еще один групповой адрес. Если при отправке
пакета в качестве адреса назначения указан адрес класса D, то такой пакет должен
быть доставлен всем узлам, которые входят в группу.
Если адрес начинается с последовательности 11110, то это значит, что данный адрес
относится к классу Е. Адреса этого класса зарезервированы для будущих применений.
Чтобы получить из IP-адреса номер сети и номер узла, требуется не только разделить
адрес на две соответствующие части, но и дополнить каждую из них нулями до
полных 4 байт. Возьмем, например, адрес класса В 129.64.134.5. Первые два байта
идентифицируют сеть, а последующие два – узел. Таким образом, номером сети
является адрес 129.64.0.0, а номером узла – адрес 0.0.134.5.
�Содержание
9.5. Использование масок при IP-адресации
Снабжая каждый IP-адрес маской, можно отказаться от понятий классов адресов и
сделать более гибкой систему адресации.
Пусть, например, для IР-адреса 129.64.134.5 указана маска 255.255.128.0, то есть в
двоичном виде IР-адрес 129.64.134.5 – это:
10000001.01000000.10000110.00000101,
а маска 255.255.128.0 в двоичном виде выглядит так:
11111111.11111111.10000000.00000000.
Если игнорировать маску и интерпретировать адрес 129.64.134 5 на основе классов, то
номером сети является 129.64.0.0, а номером узла – 0.0.134.5 (поскольку адрес
относится к классу В).
Если же использовать маску, то 17 последовательных двоичных единиц в маске
255.255.128.0, «наложенные» на IР-адрес 129.64.134.5, делят его на две части,
номер сети:
10000001.01000000.1
и номер узла:
0000110.00000101.
В десятичной форме записи номера сети и узла, дополненные нулями до 32 бит,
выглядят соответственно как 129.64.128.0 и 0.0.6.5
Наложение маски можно интерпретировать как выполнение логической операции И
(AND). Так, в предыдущем примере номер сети из адреса 129.64.134.5 является
результатом выполнения логической операции AND с маской 255.255.128.0:
10000000 010000001000011000000101
AND
11111111.11111111.10000000.00000000
Для стандартных классов сетей маски имеют следующие значения:
1) класс А – 11111111. 00000000.00000000. 00000000 (255.0.0.0);
2) класс В – 11111111.11111111. 00000000.00000000 (255.255.0.0);
3) класс С – 11111111.11111111 11111111.00000000 (255.255.255.0).
Для записи масок используются и другие форматы. Например, удобно
интерпретировать значение маски, записанной в шестнадцатеричном коде:
FF.FF.00.00 – маска для адресов класса В Еще чаще встречается обозначение
185.23.44.206/16 – данная запись говорит о том, что маска для этого адреса содержит
16 единиц или что в указанном IP-адресе под номер сети отведено 16 двоичных
разрядов.
�Содержание
9.6. Отображение IP-адресов на локальные адреса
Одной из главных задач, которая ставилась при создании протокола IP, являлось
обеспечение совместной согласованной работы в сети, состоящей из подсетей, в
общем случае использующих разные сетевые технологии. Взаимодействие технологии
TCP/IP с локальными технологиями подсетей происходит многократно при
перемещении IP-пакета от составной сети. На каждом маршрутизаторе протокол IP
определяет, какому следующему маршрутизатору в этой сети надо направить пакет. В
результате решения этой задачи протоколу IP становится известен IP-адрес интерфейса
следующего маршрутизатора (или конечного узла, если эта сеть является сетью
назначения). Чтобы локальная технологии сети смогла доставить пакет на следующий
маршрутизатор, необходимо:
• упаковать пакет в кадр соответствующего для данной сети формата (например
Ethernet);
• снабдить данный кадр локальным адресом следующего маршрутизатора.
Решением этих задач, занимается уровень сетевых интерфейсов стека TCP/IP.
9.6.1. Протокол разрешения адресов ARP
Для определения локального адреса по IP-адресу используется протокол разрешения
адресов (AddressResolutionProtocol, ARP). Протокол разрешения адресов реализуется
различным образом в зависимости от того, работает ли в данной сети протокол
локальной сети (Ethernet, TokenRing, FDDI) с возможностью широковещания или же
какой-либо из протоколов глобальной сети (FrameRelay, ATM), которые, как правило,
не поддерживают широковещательный доступ.
Рассмотрим работу протокола ARP в локальных сетях с широковещанием.
Рис. 9.4. Работа протокола ARP в локальных сетях с широковещанием
�Содержание
На рис. 9.4. показан фрагмент IP-сети, включающий две сети – Ethernet1 (из трех
конечных узлов А, В и С) и Ethernet2 (из двух конечных узлов D и E). Сети
подключены соответственно к интерфейсам 1 и 2 маршрутизатора. Каждый сетевой
интерфейс имеет IP-адрес и МАС-адрес. Пусть в какой-то момент IP-модуль узла С
направляет пакет узлу D. Протокол IP узла С определил IP-адрес интерфейса
следующего маршрутизатора – это IP1. Теперь, прежде чем упаковать пакет в кадр
Ethernet и направить его маршрутизатору, необходимо определить соответствующий
МАС-адрес. Для решения этой задачи протокол IP обращается к протоколу ARP.
Протокол ARP поддерживает на каждом интерфейсе сетевого адаптера или
маршрутизатора отдельную ARP-таблицу, в которой в ходе функционирования сети
накапливается информация о соответствии между IP-адресами и МАС-адресами
других интерфейсов данной сети. Первоначально при включении компьютера или
маршрутизатора в сеть все его ARP-таблицы пусты.
1. На первом шаге происходит передача от протокола IP протоколу ARP примерно
такого сообщения: «Какой МАС-адрес имеет интерфейс с адресом IP1?»
2. Работа протокола ARP начинается с просмотра собственной ARP-таблицы.
Предположим, что среди содержащихся в ней записей отсутствует запрашиваемый IРадрес.
3. В этом случае исходящий IP-пакет, для которого оказалось невозможным
определить локальный адрес из ARP-таблицы, запоминается в буфере, а протокол ARP
формирует ARP-запрос, вкладывает его в кадр протокола Ethernet и
широковещательно рассылает.
4. Все интерфейсы сети Ethernet 1 получают ARP-запрос и направляют его «своему»
протоколу ARP. ARP сравнивает указанный в запросе адрес IP1 с IP-адресом
интерфейса, на который поступил этот запрос. Протокол ARP, который констатировал
совпадение (в данном случае это ARP маршрутизатора 1), формирует ARP-ответ.
В ARP-ответе маршрутизатор указывает локальный адрес MAС1 своего интерфейса и
отправляет его запрашивающему узлу (в данном примере узлу С), используя его
локальный адрес. Широковещательный ответ в этом случае не требуется, так как
формат ARP-запроса предусматривает поля локального и сетевого адресов
отправителя. Заметим, что зона распространения ARP-запросов ограничивается сетью
Ethernet 1, так как на пути широковещательных кадров барьером стоит маршрутизатор.
На рис. 9.5. показан кадр Ethernet с вложенным в него ARP-сообщением. ARP-запросы
и ARP-ответы имеют один и тот же формат.
Рис. 9.5. Кадр Ethernet с вложенным в него ARP-сообщением
�Содержание
В результате обмена ARP-сообщениями модуль IP, пославший запрос с интерфейса,
имеющего адрес 194.85.135.75, определил, что IР-адресу 194.85.135.65 соответствует
МАС-адрес 00E0F77F1920. Этот адрес затем помещается в заголовок кадра Ethernet,
ожидавшего отправления IР-пакета.
Чтобы уменьшить число ARP-обращений в сети, найденное соответствие между IPадресом и МАС-адресом сохраняется в ARP-таблице соответствующего интерфейса, в
данном случае – это запись:
194.85.135.65 – 00E0F77F1920
Данная запись в ARP-таблице появляется автоматически, спустя несколько
миллисекунд после того как модуль ARP проанализирует ARP-ответ. Теперь, если
вдруг вновь возникнет необходимость послать пакет по адресу 194.85.135.65, то
протокол IP прежде, чем посылать широковещательный запрос, проверит, нет ли уже
такого адреса в ARP-таблице.
ARP-таблица пополняется не только за счет поступающих на данный интерфейс ARPответов, но и в результате извлечения полезной информации из широковещательных
ARP-запросов. Действительно, в каждом запросе содержатся IP-адрес и МАС-адрес
отправителя. Все интерфейсы, получившие этот запрос, могут поместить информацию
о соответствии локального и сетевого адресов отправителя в собственную ARPтаблицу. В частности, все узлы, получившие ARP-запрос, могут пополнить свою
ARP-таблицу записью.
В ARP-таблицах существует два типа записей: динамические и статические.
Статические записи создаются вручную с помощью утилиты arp и не имеют срока
устаревания, точнее, они существуют до тех пор, пока компьютер или маршрутизатор
остается включенным. Динамические записи должны периодически обновляться. Если
запись не обновлялась в течение определенного времени (порядка нескольких минут),
то она исключается из таблицы. Таким образом, в ARP-таблице содержатся записи не
обо всех узлах сети, а только о тех, которые активно участвуют в сетевых операциях.
Поскольку такой способ хранения информации называют кэшированием, ARPтаблицы иногда называют ARP-кэшем.
Совсем другой способ разрешения адресов используется в глобальных сетях, в
которых не поддерживается широковещательная рассылка. Здесь администратору сети
чаще всего приходится вручную формировать и помещать на какой-либо сервер ARPтаблицы, в которых он задает, например, соответствие IP-адресов адресам X.25,
имеющих для протокола IP смысл локальных адресов. В то же время сегодня
наметилась тенденция автоматизации работы протокола ARP и в глобальных сетях.
Для этой цели среди всех маршрутизаторов, подключенных к какой-либо глобальной
сети, выделяется специальный маршрутизатор, который ведет ARP-таблицу для всех
остальных узлов и маршрутизаторов этой сети.
При таком централизованном подходе вручную нужно задать для всех узлов и
�Содержание
маршрутизаторов только IP-адрес и локальный адрес выделенного для этих целей
маршрутизатора. При включении каждый узел и маршрутизатор регистрирует свои
адреса в выделенном маршрутизаторе. Всякий раз, когда возникает необходимость
определения по IР-адресу локального адреса, модуль ARP обращается к выделенному
маршрутизатору с запросами, автоматически получает ответ без участия
администратора. Работающий таким образом маршрутизатор называют ARPсервером.
В некоторых случаях возникает обратная задача – нахождение IP-адреса по
известному локальному адресу. Тогда в действие вступает реверсивный протокол
разрешения адресов (Reverse Address Resolution Protocol, RARP). Этот протокол
используется, например, при старте бездисковых станций, не знающих в начальный
момент времени своего IР-адреса, но знающих МAC-адрес своего сетевого адаптера.
�Содержание
9.7. Протокол DHCP
Для нормальной работы сети каждому сетевому интерфейсу компьютера и
маршрутизатора должен быть назначен IP-адрес.
Процедура присвоения адресов происходит в ходе конфигурирования компьютеров и
маршрутизаторов. Назначение IP-адресов может происходить вручную в результате
выполнения процедуры конфигурирования интерфейса, для компьютера сводящейся,
например, к заполнению системы экранных форм. При этом администратор должен
помнить, какие адреса из имеющегося множества он уже использовал для других
интерфейсов, а какие еще свободны. При конфигурировании помимо IP-адресов
сетевых интерфейсов (и соответствующих масок) устройству сообщается ряд других
конфигурационных параметров. При конфигурировании администратор должен
назначить клиенту не только IP-адрес, но и другие параметры стека TCP/IP,
необходимые для его эффективной работы, например маску и IP-адрес
маршрутизатора по умолчанию, IP-адрес DNS-сервера, доменное имя компьютера и
т. п. Даже при не очень большом размере сети эта работа представляет для
администратора утомительную процедуру.
Протокол динамического конфигурирования хостов (Dynamic Host Configuration
Protocol, DHCP) автоматизирует процесс конфигурирования сетевых интерфейсов,
обеспечивая отсутствие дублирования адресов за счет централизованного управления
их распределением. Работа DHCP описана в RFC 2131 и 2132.
9.7.1. Режимы DHCP
9.7.2. Алгоритм динамического назначения адресов
�Содержание
9.7.1. Режимы DHCP
Протокол DHCP работает в соответствии с моделью клиент–сервер. Во время старта
системы
компьютер,
являющийся
DHCP-клиентом,
посылает
в
сеть
широковещательный запрос на получение IP-адреса. DHCP-сервер откликается и
посылает
сообщение-ответ,
содержащее
IP-адрес
и
некоторые
другие
конфигурационные параметры.
При этом сервер DHCP может работать в разных режимах, включая:
•
ручное назначение статических адресов;
•
автоматическое назначение статических адресов;
•
автоматическое распределение динамических адресов.
Во всех режимах работы администратор при конфигурировании DHCP-сервера
сообщает ему один или несколько диапазонов IP-адресов, причем все эти адреса
относятся к одной сети, то есть имеют одно и то же значение в поле номера сети.
В ручном режиме администратор, помимо пула доступных адресов, снабжает DHCPсервер информацией о жестком соответствии IP-адресов физическим адресам или
другим идентификаторам клиентских узлов. DHCP-сервер, пользуясь этой
информацией, всегда выдаст определенному DHCP-клиенту один и тот же
назначенный ему администратором IP-адрес (а также набор других конфигурационных
параметров).
В режиме автоматического назначения статических адресов DHCP-сервер
самостоятельно без вмешательства администратора произвольным образом выбирает
клиенту IP-адрес из пула наличных IP-адресов. Адрес дается клиенту из пула в
постоянное пользование, то есть между идентифицирующей информацией клиента и
его IP-адресом по-прежнему, как и при ручном назначении, существует постоянное
соответствие. Оно устанавливается в момент первого назначения DHCP-сервером IPадреса клиенту. При всех последующих запросах сервер возвращает клиенту тот же
самый IP-адрес.
При динамическом распределении адресов DHCP-сервер выдает адрес клиенту на
ограниченное время, называемое сроком аренды. Когда компьютер, являющийся
DHCP-клиентом, удаляется из подсети, назначенный ему IP-адрес автоматически
освобождается. Когда компьютер подключается к другой подсети, то ему
автоматически назначается новый адрес. Ни пользователь, ни сетевой администратор
не вмешиваются в этот процесс.
Это дает возможность впоследствии повторно использовать этот IP-адрес для
назначения другому компьютеру. Таким образом, помимо основного преимущества
DHCP – автоматизации рутинной работы администратора по конфигурированию стека
TCP/IP на каждом компьютере, режим динамического распределения адресов в
принципе позволяет строить IP-сеть, количество узлов в которой превышает
количество имеющихся в распоряжении администратора IP-адресов.
�Содержание
9.7.2. Алгоритм динамического назначения адресов
Администратор управляет процессом конфигурирования сети, определяя два
основных конфигурационных параметра DHCP-сервера: пул адресов, доступных
распределению, и срок аренды. Срок аренды диктует, как долго компьютер может
использовать назначенный IP-адрес, перед тем как снова запросить его от DHCPсервера. Срок аренды зависит от режима работы пользователей сети. Если это
небольшая сеть учебного заведения, куда со своими компьютерами приходят
многочисленные студенты для выполнения лабораторных работ, то срок аренды
может быть равен длительности лабораторной работы. Если же это корпоративная
сеть, в которой сотрудники предприятия работают на регулярной основе, то срок
аренды может быть достаточно длительным – несколько дней или даже недель.
DHCP-сервер должен находиться в одной подсети с клиентами, учитывая, что клиенты
посылают ему широковещательные запросы (рис. 9.6). Для снижения риска выхода
сети из строя из-за отказа DHCP-сервера в сети иногда ставят резервный DHCPсервер (такой вариант соответствует сети 1).
Рис. 9.6. Схема взаимного расположения DHCP-серверов и DHCP-клиентов
Иногда наблюдается и обратная картина: в сети нет ни одного DHCP-сервера. В этом
случае его подменяет связной DHCP-агент – программное обеспечение, играющее
роль посредника между DHCP-клиентами и DHCP-серверами (пример такого
варианта – сеть 2). Связной агент переправляет запросы клиентов из сети 2 DHCPсерверу сети 3. Таким образом, один DHCP-сервер может обслуживать DHCPклиентов нескольких разных сетей.
�Содержание
Вот как выглядит упрощенная схема обмена сообщениями между клиентскими и
серверными частями DHCP.
1. Когда компьютер включают, установленный на нем DHCP-клиент посылает
ограниченное широковещательное сообщение DHCP-поиска (IP-пакет с адресом
назначения, состоящим из одних единиц, который должен быть доставлен всем узлам
данной IP-сети).
2. Находящиеся в сети DHCP-серверы получают это сообщение. Если в сети DHCPсерверы отсутствуют, то сообщение DHCP-поиска получает связной DHCP-агент. Он
пересылает это сообщение в другую, возможно, значительно отстоящую от него сеть
DHCP-серверу, IP-адрес которого ему заранее известен.
3. Все DHCP-серверы, получившие сообщение DHCP-поиска, посылают DHCPклиенту, обратившемуся с запросом, свои DHCP-предложения. Каждое предложение
содержит IP-адрес и другую конфигурационную информацию. (DHCP-сервер,
находящийся в другой сети, посылает ответ через агента.)
4. DHCP-клиент собирает конфигурационные DHCP-предложения от всех DHCPсерверов. Как правило, он выбирает первое из поступивших предложений и
отправляет в сеть широковещательный DHCP-запрос. В этом запросе содержатся
идентификационная информация о DHCP-сервере, предложение которого принято, а
также значения принятых конфигурационных параметров.
5. Все DHCP-серверы получают DHCP-запрос, и только один выбранный DHCPсервер посылает положительную DHCP-квитанцию (подтверждение IP-адреса и
параметров аренды), а остальные серверы аннулируют свои предложения, в частности
возвращают в свои пулы предложенные адреса.
6. DHCP-клиент получает положительную DHCP-квитанцию и переходит в рабочее
состояние.
Время от времени компьютер пытается обновить параметры аренды у DHCP-сервера.
Первую попытку он делает задолго до истечения срока аренды, обращаясь к тому
серверу, от которого он получил текущие параметры. Если ответа нет или ответ
отрицательный, он через некоторое время снова посылает запрос. Так повторяется
несколько раз, и, если все попытки получить параметры у того же сервера
оказываются безуспешными, клиент обращается к другому серверу. Если и другой
сервер отвечает отказом, то клиент теряет свои конфигурационные параметры и
переходит в режим автономной работы.
Также DHCP-клиент может по своей инициативе досрочно отказаться от выделенных
ему параметров.
В сети, где адреса назначаются динамически, нельзя быть уверенным в адресе,
который в данный момент имеет тот или иной узел. И такое непостоянство IP-адресов
влечет за собой некоторые проблемы.
�Содержание
Во-первых, возникают сложности при преобразовании символьного доменного имени
в IP-адрес. Действительно, представьте себе функционирование системы DNS,
которая должна поддерживать таблицы соответствия символьных имен IP-адресам в
условиях, когда последние меняются каждые два часа! Учитывая это обстоятельство,
для серверов, к которым пользователи часто обращаются по символьному имени,
назначают статические IP-адреса, оставляя динамические только для клиентских
компьютеров. Однако в некоторых сетях количество серверов настолько велико, что
их ручное конфигурирование становится слишком обременительным. Это привело к
разработке усовершенствованной версии DNS (так называемой динамической
системы DNS), в основе которой лежит согласование информационной адресной базы
в службах DHCP и DNS.
Во-вторых, трудно осуществлять удаленное управление и автоматический мониторинг
интерфейса (например, сбор статистики), если в качестве его идентификатора
выступает динамически изменяемый IP-адрес.
Наконец, для обеспечения безопасности сети многие сетевые устройства могут
блокировать (фильтровать) пакеты, определенные поля которых имеют некоторые
заранее заданные значения. Другими словами, при динамическом назначении адресов
усложняется фильтрация пакетов по IP-адресам.
Последние две проблемы проще всего решаются отказом от динамического
назначения адресов для интерфейсов, фигурирующих в системах мониторинга и
безопасности [9, с. 508– 512].
�Содержание
Контрольные вопросы к главе 9
1. Сформулируйте задачи адресации, которые имеют место в технологии TCP/IP.
2. Назовите уровни стека протоколов TCP/IP.
3. Приведите примеры протоколов прикладного уровня стека TCP/IP.
4. Охарактеризуйте протоколы TCP и UDP.
5. Приведите примеры протоколов сетевого уровня стека TCP/IP.
6. Какова основная задача уровня сетевых интерфейсов?
7. Сформулируйте определения потока данных. Какое название соответствует PDU на
каждом уровне.
8. Назовите типы адресов стека TCP/IP.
9. Что такое MAC-адрес?
10.Что такое IP-адрес?
11.Как определить доменное имя узла, зная его IP-адрес?
12.Опишите формат IP-адреса.
13.Назовите способы определения маршрутизаторами номера сети и номера узла IPадреса.
14.Что такое маска?
15.Охарактеризуйте каждый класс IP-адресов.
16.Опишите работу протокола ARP в локальных сетях с широковещанием.
17.В каких случаях может использоваться реверсивный протокол разрешения
адресов?
18.В соответствии с какой моделью работает протокол DHCP?
�Содержание
Глава 10. Проектирование локальных сетей в программе
логического моделирования телекоммуникационной сети
NetEmul
Лабораторная работа № 1. Программа логического моделирования телекоммуникационной сети
«NetEmul»
Лабораторная работа № 2. Соединение ЭВМ в сеть
Лабораторная работа № 3. Использование маршрутизаторов. Статическая маршрутизация
Лабораторная работа № 4. Разрешение адресов по протоколу ARP. APR-спуфинг
Лабораторная работа № 5. Динамическая маршрутизация по протоколу RIP. Получение сетевых
настроек по DHCP
�Содержание
Лабораторная работа № 1. Программа логического моделирования
телекоммуникационной сети «NetEmul»
Цель работы: научиться работать в программе логического моделирования
телекоммуникационной сети «NetEmul».
Средства для выполнения работы:
• аппаратные: компьютер с установленной ОС Windows XP.
• программные: программа логического моделирования телекоммуникационной сети
«NetEmul».
Теоретические сведения
Общие понятия
Соединение конечных узлов через сеть транзитных узлов называют коммутацией.
Последовательность узлов, лежащих на пути от отправителя к получателю, образует
маршрут.
Задача маршрутизации включает в себя две подзадачи:
• определение маршрута;
• оповещение сети о выбранном маршруте.
Определить маршрут означает выбрать последовательность транзитных узлов и их
интерфейсов, через которые надо передавать данные, чтобы доставить их адресату.
Среди множества возможных подходов к решению задачи коммутации абонентов в
сетях выделяют два основополагающих, к которым относят коммутацию каналов и
коммутацию пакетов.
Различают топологию физических связей (физическую структуру сети) и топологию
логических связей сети (логическую структуру сети).
Конфигурация физических связей определяется электрическими соединениями
компьютеров и может быть представлена в виде графа, узлами которого являются
компьютеры и коммуникационное оборудование, а ребра соответствуют отрезкам
кабеля, связывающим пары узлов.
Логические связи представляют собой пути прохождения информационных потоков
по сети; они образуются путем соответствующей настройки коммуникационного
оборудования.
Основными средствами физической структуризации локальных сетей являются
повторители (repeater) и концентраторы (concentrator), или хабы (nub).
Адаптер (adapter) – устройство либо программа, предназначенные для согласования
параметров входных и выходных сигналов в целях сопряжения объектов.
По выполняемым функциям сетевые адаптеры разделяются на две группы:
1) реализующие функции физического и канального уровней;
2) реализующие функции первых четырех уровней модели OSI.
�Содержание
Концентраторы (хабы) (concentrator) – устройство либо функциональный блок, у
которого суммарная пропускная способность входных каналов выше пропускной
способности выходного канала.
Трансивер (приемопередатчик) – это устройство, предназначенное для приема пакетов
от контроллера рабочих станций и передачи их в шину. Он также разрешает коллизии
в шине. Конструктивно приемопередатчик и контроллер могут объединяться на одной
плате или находиться в различных узлах.
Репитер (повторитель) (repeater) – устройство с автономным питанием,
обеспечивающее передачу данных между сегментами определенной длины. Он служит
для объединения в одну сеть нескольких сегментов кабеля и увеличения тем самым
общей длины сети.
Логическая структуризация сети – процесс разбиения сети на сегменты с
локализованным трафиком. Логическая структуризация сети проводится путем
использования мостов, коммутаторов, маршрутизаторов и шлюзов.
Мост (bridge) –
• это устройства для логической структуризации сети;
• ретрансляционная система, соединяющая два канала передачи данных.
Коммутатор (switch) – по принципу обработки кадров ничем не отличается от моста.
Основное его отличие от моста состоит в том, что он является своего рода
коммуникационным мультипроцессором, так как каждый его порт оснащен
специализированным процессором, который обрабатывает кадры по алгоритму моста
независимо от процессоров других портов.
Шлюз (gateway) – ретрансляционная система, обеспечивающая взаимодействие двух
информационных систем. Шлюзы применяются для различных сетей.
Маршрутизатор (роутер) (router) – ретрансляционная система, соединяющая две
коммуникационные сети либо их части. Маршрутизаторы образуют логические
сегменты посредством явной адресации, поскольку используют не плоские
аппаратные, а составные числовые адреса.
Протокол разрешения адресов ARP
Для определения локального адреса по IP-адресу используется протокол разрешения
адресов (Address Resolution Protocol, ARP).
Протокол ARP поддерживает на каждом интерфейсе сетевого адаптера или
маршрутизатора отдельную ARP-таблицу, в которой в ходе функционирования сети
накапливается информация о соответствии между IP-адресами и МАС-адресами
других интерфейсов данной сети. Первоначально при включении компьютера или
маршрутизатора в сеть все его ARP-таблицы пусты.
1. На первом шаге происходит передача от протокола IP протоколу ARP примерно
такого сообщения: «Какой МАС-адрес имеет интерфейс с адресом IP1?»
2. Работа протокола ARP начинается с просмотра собственной ARP-таблицы.
Предположим, что среди содержащихся в ней записей отсутствует запрашиваемый IPадрес.
�Содержание
3. В этом случае исходящий IP-пакет, для которого оказалось невозможным
определить локальный адрес из ARP-таблицы, запоминается в буфере, а протокол ARP
формирует ARP-запрос, вкладывает его в кадр протокола Ethernet и
широковещательно рассылает.
4. Все интерфейсы сети l получают ARP-запрос и направляют его «своему» протоколу
ARP. ARP сравнивает указанный в запросе адрес IP1 с IP-адресом интерфейса, на
который поступил этот запрос. Протокол ARP, который констатировал совпадение,
формирует ARP-ответ. В ARP-ответе маршрутизатор указывает локальный адрес
MAC1 своего интерфейса и отправляет его запрашивающему узлу, используя его
локальный адрес. Широковещательный ответ в этом случае не требуется, так как
формат ARP-запроса предусматривает поля локального и сетевого адресов
отправителя. Заметим, что зона распространения ARP-запросов ограничивается
сетью l, если на пути широковещательных кадров барьером стоит маршрутизатор.
Ответ присылает узел, опознавший свой IP-адрес. Если в сети нет машины с искомым
IP-адресом, то ARP-ответа не будет. Протокол IP уничтожает IP-пакеты, направляемые
по этому адресу. Запись в ARP-таблице появляется автоматически, спустя несколько
миллисекунд после того, как модуль ARP проанализирует ARP-ответ.
ARP-таблица пополняется не только за счет поступающих на данный интерфейс ARPответов, но и в результате извлечения полезной информации из широковещательных
ARP-запросов.
В ARP-таблицах существует два типа записей: динамические и статические.
Статические записи создаются вручную с помощью утилиты ARP и не имеют срока
устаревания, точнее, они существуют до тех пор, пока компьютер или маршрутизатор
остается включенным. Динамические записи должны периодически обновляться.
Если запись не обновлялась в течение определенного времени (порядка нескольких
минут), то она исключается из таблицы. Таким образом, в ARP-таблице содержатся
записи не обо всех узлах сети, а только о тех, которые активно участвуют в сетевых
операциях.
Программа NetEmul
Эмулятор сети Netemul – программа, которая позволяет моделировать компьютерную
сеть, настраивать ее и смотреть за происходящими в ней процессами. Программа
Netemul обладает следующими возможностями:
•
добавление и настройка
концентраторов;
•
настройка IP-адресов, подсетей и шлюзов;
визуализация движения пакетов по сети;
работают протоколы RIP, ARP, DHCP;
встроенный скриптовый язык;
подробный лог всех проходящих по сети пакетов;
поддерживает 4 языка: русский, английский, испанский и бразильский.
•
•
•
•
•
компьютеров,
маршрутизаторов,
коммутаторов
и
�Содержание
Программа работает в операционных системах Windows, Linux, Mac OS, и
предназначена для проектирования сетей, а также для их тестирования. Задав все
необходимые параметры (хост, протокол и др.) по смонтированному вами сетевому
оборудованию, можно проверить и увидеть работу сети (отправка и получение
пакетов – все визуально). Коммутаторы и концентраторы имеют от 2 до 48 портов,
для маршрутизаторов – до 9.
Так выглядит компьютер в программе.
Основная
функция
концентратора
–
это
повторение
сигналов,
поступающих на один из его портов, на всех остальных портах или на следующем в
логическом кольце порте синхронно с сигналами-оригиналами. Все компьютеры,
подключенные к концентраторам, образуют единый логический сегмент, в котором
любая пара взаимодействующих устройств полностью блокирует возможность обмена
данными для других компьютеров.
Сетевой коммутатор, или свитч – устройство, предназначенное для
соединения нескольких узлов компьютерной сети в пределах одного сегмента. В
отличие от концентратора, который распространяет трафик от одного подключенного
устройства ко всем остальным, коммутатор передает данные только непосредственно
получателю. Это повышает производительность и безопасность сети, избавляя
остальные сегменты сети от необходимости обрабатывать данные, которые им не
предназначались. Коммутатором может быть как специализированное устройство, так
и универсальный компьютер со встроенным программным механизмом коммутации, в
этом случае коммутатор называется программным. Компьютер может совмещать
функции коммутации данных с выполнением своих обычных функций как конечного
узла.
Маршрутизатор, или роутер –
сетевое устройство, на основании
информации о топологии сети и определенных правил принимающее решения о
пересылке пакетов сетевого уровня (уровень 3 модели OSI) между различными
сегментами сети.
Практическая часть работы
Задание 1. Установить программу «Netemul». Для того чтобы установить программу
«Netemul», нужно:
для операционной системы Windows:
1) распаковать проект в рабочий каталог;
2) выполнить несколько простых действий по установке файлов проекта:
3) создать ярлыки на рабочем столе или в меню Пуск.
�Содержание
для операционной системы Linux:
1) распаковать архив с исходным кодом программы в одноименный каталог,
созданный в домашней директории;
2) перейти в каталог с проектом;
3) при выполнении следующих команд удовлетворить необходимые зависимости;
qmake;
make;
make install.
Рис. 1. Обозначения и интерфейс программы «Netemul»
1. Запустите программу и создайте новую сцену («Новый» в пункте меню «Файл»).
2. На панели инструментов выберите Компьютер.
Задание 2. Компьютеру с именем адаптера eth0 назначить следующий IP-адрес:
192.168.1.0
По умолчанию у компьютера есть только один интерфейс. Для того чтобы добавить
адаптер, нужно выбрать пункт меню «Интерфейсы» в контекстном меню либо на
панели параметров. Для настройки IP-адреса интерфейса откройте окно
«Интерфейсы».
�Содержание
Рис. 2. Окно настроек сетевого интерфейса компьютера
3. Таблицы ARP и маршрутизации представляются нам в следующей форме (рис. 3,
рис. 4):
Рис. 3. ARP таблица
Рис. 4. Таблица маршрутизации
�Содержание
Как видим (рис. 3), таблица ARP пока пустая, не было ни одной передачи данных, и в
ней нет ни одного соответствия физического адреса интерфейса и его IP-адреса.
4. На панели инструментов выберите еще один компьютер.
Задание 3. Компьютеру с именем адаптера eth1 назначить следующий IP-адрес:
192.168.1.100
Задание 4. После того как компьютеры расставлены, поставьте концентратор и
соедините каждый компьютер с концентратором, выбрав на панели инструментов
иконку провода. При выборе какого-либо инструмента он остается активным, пока не
будет выбран другой. Для того чтобы соединить два устройства кабелем, нужно
выполнить следующие действия:
•
щелкнуть кнопкой мыши на одном устройстве;
•
провести линию до того устройства, с которым хотим соединить первое;
•
щелкнуть по этому устройству кнопкой мыши.
Рис. 5. Соединение двух компьютеров концентратором
Задание 5. Произведите передачу данных с одного компьютера на другой (рис. 6).
После чего снова проверьте таблицу ARP (рис.7), найдите в ней новую динамическую
запись.
Рис. 6. Передача данных с одного компьютера на другой
�Содержание
Рис. 7. ARP таблица
В таблице, как и ожидалось, появился адрес (рис. 7). Это произошло в результате
работы протокола ARP.
Задание 6. Добавьте в сеть еще два компьютера с именами адаптеров eth2 и eth7
соответственно, соединив каждый компьютер с концентратором, и назначьте им
следующие IP-адреса: 192.168.1.123 и 192.168.1.125.
Рис. 8. Простейшая сеть
Задание 7. Построить более сложную сеть, добавив еще 4 компьютера с именами
адаптеров eth4, eth5, eth6, eth7, коммутатор и маршрутизатор. Выставить IP-адреса и
маски подсети в соответствующих строках каждого интерфейса. После нажатия на
кнопку «Оk» или «Применить», можно наблюдать, как индикатор поменял цвет с
желтого на зеленый и от устройства, которому сейчас дали адрес, «побежал» кадр
�Содержание
ARP-протокола. Это нужно для того, чтобы выявить, нет ли в сети повторения
адресов.
Различают следующие индикаторы устройств:
•
красный индикатор означает, что устройство не подключено;
•
желтый – устройство подключено, но не настроено;
•
зеленый – знак того, что устройство подключено, настроено и готово к работе.
Только у коммутатора этот индикатор зеленый, потому что для его работы (простое
повторение сигнала на всех своих портах) не нужно каких-либо настроек. А вот для
того, чтобы компьютеры, подключенные к нему, смогли работать, необходимо их
сконфигурировать.
Рис. 9. Сеть
Задание 8. Разбейте сеть на 2 подсети. Допустим, есть пул адресов сети класса С.
Разбейте его на 2 части: 192.168.1.0-192.168.1.127 и 192.168.1.128-192.168.1.255 с
маской 255.255.255.128.
После того, как расставили все IP-адреса конечным узлам, уже в принципе есть
работающие подсети. Но только каждая работает автономно, и послать сообщения из
одной такой подсети в другую не сможем. В подсети левее маршрутизатора у всех
узлов должен быть шлюз 192.168.1.126, правее – 192.168.1.254. После того, как задали
�Содержание
шлюзы, получаем полностью рабочую сеть.
Рис. 10. Шлюз
Сейчас можно посмотреть, насколько правильно она функционирует, увидеть работу
различных сетевых устройств и поэкспериментировать с сетью. При наведении мыши
на рабочую область появится оранжевый кружок, это значит, что надо указать, от
какого компьютера данные будут отправлены (рис. 11).
Задание 9. Отправьте данные с компьютера с именем адаптера eth6 на компьютер с
именем адаптера eth4:
Рис. 11. Сеть, разбитая на две подсети (выбор отправителя данных)
Появится диалоговое окно отправки данных (рис. 12). Можно менять объем пакетов в
зависимости от поставленной задачи. Нажмите «Далее».
�Содержание
Рис. 12. Диалоговое окно параметров отправки данных
Затем появится зеленый кружок, т. е. нужно выбрать получателя (рис. 13).
Рис. 13. Сеть, разбитая на две подсети (выбор получателя данных)
Щелкните по выбранному компьютеру. Появляется диалог. В этом диалоговом окне
нужно указать интерфейс, на который будут отправляться данные. Так как у данного
компьютера один адаптер, то на него и отправьте пакеты. Далее нажмите кнопку
«Отправка» и наблюдайте бегущие кадры между компьютерами (рис. 14).
На рисунке 14 можно видеть красные точки, символизирующие передачу данных
пользователя. Желтые же точки – для служебных пакетов, поддерживающих
функционирование сети, в данном случае служебные пакеты содержат информацию
�Содержание
протокола RIP, установленного на маршрутизаторах сети.
Рис. 14. Отправка данных по сети
При помощи функции «Показать журнал» можем наблюдать все процессы,
произведенные данным устройством: прием/передача пакетов, сверка протоколов, их
IP-адреса, шлюзы и т. д.
Задание 10. Отправьте данные размером 55 Кбайт с помощью протокола UDP с
интерфейса компьютера-отправителя eth7 на интерфейс компьютера-получателя eth4.
Задание 11. Отправьте данные размером 15 Кбайт с помощью протокола TCP с
интерфейса компьютера-отправителя eth6 на интерфейс компьютера-получателя eth5.
Контрольные вопросы
1. Какие из утверждений о маршруте, на ваш взгляд, не всегда верны?
•
Маршрут – это последовательность промежуточных узлов (интерфейсов), которые
проходят данные по пути от отправителя к получателю
•
При определении маршрута всегда выбирается один из нескольких возможных
путей
•
Каждый маршрут назначается для определенного потока данных
•
Из нескольких возможных маршрутов всегда выбирается оптимальный.
�Содержание
2. Опишите основные подходы и критерии, используемые при выборе маршрута.
3. Какие из этих утверждений могут быть в некоторых случаях верными?
•
Маршруты фиксируются в коммутаторах путем жесткого соединения пар
интерфейсов
•
Маршруты определяются администратором и заносятся вручную в специальную
таблицу
•
Таблица маршрутов строится автоматически сетевым программно-аппаратным
обеспечением
•
Для каждого коммутатора строится своя таблица маршрутов, которая на нем и
хранится
4. Какое из этих устройств можно назвать коммутатором?
•
электрический выключатель
•
маршрутизатор
•
мост
•
мультиплексор
•
ни одно из названных
5. Назовите основные топологии связей.
6. Сформулируйте определение логической структуризации сети.
7. В чем состоит главное отличие моста от коммутатора?
8. На какие группы разделяются сетевые адаптеры по выполняемым функциям?
9. Сформулируйте определения шлюза.
10.Возможно ли в ARP-таблице появление динамической записи о соответствии IPадреса из диапазона адресов другой сети?
11.Что будет происходить при наличии двух записей с одинаковыми адресами IP и
разными MAC?
12.Что будет происходить при наличии двух записей с одинаковыми адресами MAC и
разными IP?
13.Чем отличается динамическая и статическая запись в таблице?
14.Какое значение имеет имя сетевого адаптера?
15.Что влечет за собой уменьшение/увеличение времени жизни записи в таблице?
�Содержание
Лабораторная работа № 2. Соединение ЭВМ в сеть
Цель работы: ознакомиться с основами работы с программным эмулятором
локальных вычислительных сетей NetEmul; научиться строить простейшие модели
локальной вычислительной сети; выявить отличия в построении локальной
вычислительной сети на концентраторах и коммутаторах.
Теоретический материал
Запуск эмулятора NetEmul
Для запуска эмулятора NetEmul необходимо либо воспользоваться соответствующим
пунктом главного меню операционной системы, либо выполнить в терминале
команду netem ul.
Порядок выполнения лабораторной работы
С помощью инструмента «Вставить текстовую надпись» добавить на рабочее поле
эмулятора надпись, содержащую:
1) номер группы;
2) Ф. И. О. студента, выполняющего работу;
3) номер варианта согласно номеру студента в журнале.
Таблица 1
Варианты задания (указаны согласно номеру студента в журнале)
№
Адрес сети/маска
№
Адрес сети/маска
№
Адрес сети/маска
1
10.0.1.0/27
11
10.1.1.64/27
21
10.2.1.128/27
2
10.0.2.32/27
12
10.1.2.96/27
22
10.2.2.160/27
3
10.0.3.64/27
13
10.1.3.128/27
23
10.2.3.192/27
4
10.0.4.96/27
14
10.1.4.160/27
24
10.2.4.224/27
5
10.0.5.128/27
15
10.1.5.192/27
25
10.2.5.0/27
6
10.0.6.160/27
16
10.1.6.224/27
26
10.2.6.32/27
7
10.0.7.192/27
17
10.1.7.0/27
27
10.2.7.64/27
8
10.0.8.224/27
18
10.1.8.32/27
28
10.2.8.96/27
9
10.0.9.0/27
19
10.1.9.64/27
29
10.2.9.128/27
10
10.0.0.32/27
20
10.1.0.96/27
30
10.2.0.160/27
�Содержание
Соединение двух ЭВМ напрямую
1. Выбрать исходные данные для выполнения работы согласно своему варианту.
(а) в общем виде
(б) в NetEmul
Рис. 1. Схема модели локальной вычислительной сети при соединении двух ЭВМ напрямую
2. Добавить на рабочее поле эмулятора два компьютера (рис. 1), использовав кнопку
«Добавить компьютер» на панели инструментов.
3. Соединить добавленные компьютеры как показано на рисунке 1.
Для этого нужно:
1) нажать кнопку «Создать соединение» на панели инструментов;
2) навести указатель на один из компьютеров;
3) левой кнопкой мыши перевести курсор на второй компьютер – за курсором от
первого компьютера должна тянуться прямая линия;
4) отпустить левую кнопку мыши, после чего должно появиться окно начальных
настроек с выбором соединяемых интерфейсов;
5) подтвердить соединение между интерфейсами eth0 и eth0, нажав «Соединить»;
6) если все сделано правильно, то компьютеры теперь соединены, на каждом конце
соединения показан номер используемого интерфейса (в данном случае 0), а
индикатор соединения на иконке компьютера сменил цвет с красного на желтый
(соединение есть, но интерфейсы не настроены).
4. Настроить компьютеры, задав каждому IP-адрес и маску подсети в соответствии с
вариантом. Для этого нужно:
1) выбрать инструмент «Перемещение объектов» на панели инструментов;
2) выделить первый компьютер;
3) вызвать контекстное меню и выбрать пункт «Интерфейсы»;
4) в появившемся окне указать в сответствующих полях IP-адрес и маску подсети;
5) подтвердить ввод последовательным нажатием кнопок «Применить» и «ОК»;
�Содержание
6) если все сделано правильно, то индикатор соединения на иконке компьютера
должен сменить цвет с желтого на зеленый (соединение есть, и интерфейсы
настроены);
7) добавить возле каждого компьютера надпись с его IP-адресом и маской подсети
как показано на рис. 1.
5. Проверить работоспособность построенной модели локальной сети, передав
пакеты от одного компьютера до другого. Для этого нужно:
1) выбрать инструмент «Отправить данные» на панели инструментов;
2) под курсором (на рабочем поле программы) должен появиться красный круг;
3) навести курсор с красным кругом на передающий компьютер;
4) в появившемся окне «Отправка» указать: протокол TCP, размер данных 5 KB;
5) нажать «Далее» – окно пропадет, а кружок под курсором сменит цвет на зеленый;
6) навести курсор с зеленым кругом на принимающий компьютер;
7) в появившемся окне подтвердить интерфейс на принимающем компьютере eth0,
нажав «Отправка»;
8) проследить за перемещением пакетов.
Построение локальной вычислительной сети на концентраторах
(а) в общем виде
(б) в NetEmul
Рис. 2. Схема модели локальной сети на основе концентраторов
1. Выбрать исходные данные для выполнения работы согласно своему варианту.
2. Добавить на рабочее поле эмулятора шесть компьютеров и три концентратора как
показано на рис. 2.
3. Соединить устройства как показано на рис. 2.
�Содержание
4. Настроить компьютеры, задав каждому IP-адрес и маску подсети в соответствии с
вариантом.
5. Добавить возле каждого компьютера надпись с его IP-адресом и маской подсети.
6. Проверить работоспособность построенной модели локальной сети, передав пакеты
(TCP, 5 KB) от одного компьютера до другого. Проследить за перемещением пакетов
и сделать выводы об особенностях работы локальной вычислительной сети на основе
концентраторов.
Построение локальной вычислительной сети на коммутаторах
(а) в общем виде
(б) в NetEmul
Рис. 3. Схема модели локальной вычислительной сети на основе коммутаторов
1. Выбрать исходные данные для выполнения работы согласно своему варианту.
2. Добавить на рабочее поле эмулятора пять компьютеров и два коммутатора как
показано на рис. 3.
3. Соединить устройства как показано на рис. 3.
4. Настроить компьютеры, задав каждому IP-адрес и маску подсети в соответствии с
вариантом.
5. Добавить возле каждого компьютера надпись с его IP-адресом и маской подсети.
6. Проверить работоспособность построенной модели локальной вычислительной
сети, передав пакеты (TCP, 5 KB) от одного компьютера до другого. Проследить за
перемещением пакетов и сделать выводы об особенностях работы локальной сети на
основе коммутаторов.
После выполнения работы продемонстрировать преподавателю работоспособность
построенной модели.
Проект сохранить для отчета.
�Содержание
Содержание отчета
1. Цель работы.
2. По каждому пункту лабораторной работы должна быть приведена схема модели с
указанием IP-адресов устройств и номеров интерфейсов.
3. По каждому пункту лабораторной должны быть приведены выводы по работе.
Контрольные вопросы
1. Что такое IP-адрес?
2. Что такое маска подсети?
3. Как работает концентратор?
4. Как работает коммутатор?
�Содержание
Лабораторная работа № 3. Использование маршрутизаторов.
Статическая маршрутизация
Цель работы: ознакомиться с работой маршрутизаторов; научиться формировать
статические маршруты и прописывать их в таблицы маршрутизации сетевых
устройств.
Теоретический материал
Запуск эмулятора NetEmul
Для запуска эмулятора NetEmul необходимо либо воспользоваться соответствующим
пунктом главного меню операционной системы, либо выполнить в терминале
команду netemul.
Порядок выполнения лабораторной работы
С помощью инструмента «Вставить текстовую надпись» добавить на рабочее поле
эмулятора надпись, содержащую:
1. Номер группы.
2. Ф. И. О студента, выполняющего работу.
Построение модели сети
1. Выбрать исходные данные для выполнения работы
2. Используя соответствующие инструменты на панели эмулятора, построить сеть в
соответствии с рис. 1. В свойствах каждого маршрутизатора необходимо указать
количество интерфейсов, равное 4.
3. Настроить интерфейсы компьютеров и маршрутизаторов, задав каждому IP-адрес и
маску подсети. Добавить возле каждого компьютера и интерфейса роутера надписи с
их IP-адресом и маской подсети.
4. Проверить работоспособность построенной модели локальной вычислительной
сети, передав пакеты (TCP, 5 KB) от одного устройства до другого в пределах одной
подсети.
Рис. 1. Связь сетей посредством маршрутизаторов
�Содержание
Формирование таблицы статической маршрутизации
1. Задать на каждом компьютере маршрут «по-умолчанию» (IP сети = 0.0.0.0; маска
подсети = 0.0.0.0).
2. Задать на каждом маршрутизаторе статические маршруты до удаленных от него
сетей.
3. Проверить работоспособность построенной модели локальной сети, передав пакеты
(TCP, 5 KB) между удаленными друг от друга сетями. Проследить за перемещением
пакетов и сделать выводы об особенностях работы локальной вычислительной сети
на основе маршрутизаторов.
После выполнения работы продемонстрировать преподавателю работоспособность
построенной модели.
Проект сохранить для отчета.
Содержание отчета
2. Цель работы.
3. По каждому пункту лабораторной должна быть приведена схема модели с
указанием IP-адресов устройств и номеров интерфейсов.
4. По каждому пункту лабораторной должны быть приведены выводы по работе.
Контрольные вопросы
1. Что такое IP-адрес?
2. Что такое маска подсети?
3. Как работает маршрутизатор?
4. Принципы статической маршрутизации?
�Содержание
Лабораторная работа № 4. Разрешение адресов по протоколу ARP.
APR-спуфинг
Цель работы: ознакомиться с механизмом работы протокола ARP; научиться
формировать и отправлять пользовательские пакеты; ознакомиться с журналом
работы сетевого устройства в эмуляторе; научиться проводить сетевую атаку вида
ARP-спуфинг.
Теоретический материал
Запуск эмулятора NetEmul
Для запуска эмулятора NetEmul необходимо либо воспользоваться соответствующим
пунктом главного меню операционной системы либо выполнить в терминале команду
netemul.
Протокол ARP
ARP (Address Resolution Protocol – протокол определения адреса) – протокол в
компьютерных сетях, предназначенный для определения MAC- адреса сетевого
устройства по известному IP-адресу.
Наибольшее распространение ARP получил благодаря повсеместности сетей IP,
построенных поверх Ethernet, поскольку в подавляющем большинстве случаев при
таком сочетании используется ARP. В семействе протоколов IPv6 протокола ARP не
существует, его функции возложены на ICMPv6.
Описание протокола было опубликовано в ноябре 1982 г. в RFC 826. ARP был
спроектирован для случая передачи IP-пакетов через сегмент Ether- net. При этом
общий принцип, предложенный для ARP, был использован и для сетей других типов.
Существуют следующие типы сообщений ARP: запрос ARP (ARP-request) и ответ ARP
(ARP-reply). Система-отправитель при помощи запроса ARP запрашивает физический
адрес системы-получателя. Ответ (физический адрес узла-получателя) приходит в виде
ответа ARP.
Принцип работы протокола: узел (хост А), которому нужно выполнить отображение
IP-адреса на MAC-адрес, формирует ARP-запрос, вкладывает его в кадр протокола
канального уровня, указывая в нем известный IP- адрес (хост В), и рассылает запрос
широковещательно (в поле MAC-адрес назначения заголовка Ethernet указывается
широковещательный MAC-адрес FF:FF:FF:FF:FF:FF). Все узлы локальной сети
получают ARP-запрос и сравнивают указанный там IP-адрес с собственным. В случае
их совпадения узел (хост В) формирует ARP-ответ, в котором указывает свой IP-адрес
и свой локальный адрес и отправляет его уже направленно, так как в ARP-запросе
отправитель (хост А) указывает свой локальный адрес. Схема работы протокола
показана на рис. 2.
�Содержание
Рис. 1. Схема работы протокола ARP
Таблица 1
Значения полей заголовка кадра ARP
Поле
Значение
HTYPE
Номер протокола передачи канального уровня (0x0001 для протокола Ethernet)
PTYPE
Код протокола сетевого уровня (0x0800 для протокола IPv4)
HLEN
Длина физического адреса в байтах. Адреса Ethernet имеют длину 6 байт
PLEN
Длина логического адреса в байтах. IPv4 адреса имеют длину 4 байта
OP CODE
Код операции: 0x01 в случае ARP-запроса и 0x02 в случае ARP-ответа
Sender MAC
Физический адрес отправителя
Sender IP
Сетевой адрес отправителя
Target MAC
Физический адрес получателя. При запросе поле заполняется нулями
Target IP
Сетевой адрес получателя
�Содержание
Самопроизвольный ARP (gratuitous ARP) – такое поведение ARP, когда ARP-ответ
присылается, когда в этом (с точки зрения получателя) нет особой необходимости.
Самопроизвольный ARP-ответ – это пакет-ответ ARP, присланный без запроса. Он
применяется для определения конфликтов IP- адресов в сети: как только станция
получает адрес по DHCP или адрес присваивается вручную, рассылается ARP-ответ
gratuitous ARP.
Самопроизвольный ARP может быть полезен в следующих случаях:
• обновление ARP-таблиц, в частности, в кластерных системах;
• информирование коммутаторов;
• извещение о включении сетевого интерфейса.
Несмотря на эффективность самопроизвольного ARP, он является осо- бенно
небезопасным, поскольку с его помощью можно уверить удаленный узел в том, что
MAC-адрес какой-либо системы, находящейся с ней в одной сети, изменился, и
указать, какой адрес используется теперь.
Сетевая атака ARP-спуфинг
Сетевая атака ARP-спуфинг
самопроизвольного ARP.
(ARP-spoofing)
основана
на
использовании
Чтобы перехватить сетевые пакеты, которые атакуемый хост (А) отправляет на хост В,
атакующий хост (С) формирует ARP-ответ, в котором ставит в соответствие IP-адресу
хоста В свой MAC-адрес. Далее этот пакет отправляется на хост А. В том случае, если
хост А поддерживает самопроизвольный ARP, он модифицирует собственную ARPтаблицу и помещает туда запись, где вместо настоящего MAC-адреса хоста B стоит
MAC-адрес атакующего хоста C.
Теперь пакеты, отправляемые хостом А на хост В, будут передаваться хосту С. Схема
атаки показана на рис. 2.
Рис. 2. Схема сетевой атаки ARP-спуфинг
�Содержание
Порядок выполнения лабораторной работы
С помощью инструмента «Вставить текстовую надпись» добавить на рабочее поле
эмулятора надпись, содержащую:
1. Номер группы.
2. Ф. И. О. студента, выполняющего работу.
3. Номер варианта согласно номеру студента в журнале.
Таблица 2
Варианты задания (указаны согласно номеру студента в журнале)
№
Адрес сети/маска
№
Адрес сети/маска
№
Адрес сети/маска
1
10.0.1.0/27
11
10.1.1.64/27
21
10.2.1.128/27
2
10.0.2.32/27
12
10.1.2.96/27
22
10.2.2.160/27
3
10.0.3.64/27
13
10.1.3.128/27
23
10.2.3.192/27
4
10.0.4.96/27
14
10.1.4.160/27
24
10.2.4.224/27
5
10.0.5.128/27
15
10.1.5.192/27
25
10.2.5.0/27
6
10.0.6.160/27
16
10.1.6.224/27
26
10.2.6.32/27
7
10.0.7.192/27
17
10.1.7.0/27
27
10.2.7.64/27
8
10.0.8.224/27
18
10.1.8.32/27
28
10.2.8.96/27
9
10.0.9.0/27
19
10.1.9.64/27
29
10.2.9.128/27
10
10.0.0.32/27
20
10.1.0.96/27
30
10.2.0.160/27
Построение модели сети
1. Выбрать исходные данные для выполнения работы согласно своему варианту.
Полученную согласно варианту сеть с маской /27 разбить на две подсети с
маской /28 каждая.
Рис. 3. Сеть для изучения протокола ARP
�Содержание
2. Используя соответствующие инструменты на панели эмулятора, построить сеть в
соответствии с рис. 3. В свойствах маршрутизатора необходимо указать количество
интерфейсов, равное 2.
3. Настроить интерфейсы компьютеров и маршрутизаторов, задав каждому IP-адрес и
маску подсети (слева – первая подсеть в заданной сети, справа – вторая подсеть).
Добавить возле каждого компьютера и интерфейса роутера надписи с их IP-адресом и
маской подсети.
4. Настроить на компьютерах маршруты «по-умолчанию» (IP сети = 0.0.0.0; маска
подсети = 0.0.0.0). Можно воспользоваться «Таблицей маршрутизации» либо вызвать
свойства компьютера двойным щелчком, указать шлюз по умолчанию и включить
маршрутизацию.
5. Включить маршрутизацию на маршрутизаторе.
6. Проверить работоспособность построенной модели локальной вычислительной
сети, передав пакеты (TCP, 5 KB) от компьютера в левой подсети до компьютера в
правой подсети.
7. Задать каждому компьютеру имя-описание,
контекстного меню «Задать описание».
воспользовавшись
пунктом
Определение MAC-адреса с помощью ARP-запроса
1. Запустить для компьютеров 1 и 2 журналы пакетов (пункт меню «По- казать
журнал»).
2. Очистить ARP-таблицу компьютера 1.
3. Выделить компьютер 1 и с помощью инструмента «Конструктор пакетов»
сформировать пакет ARP-запроса для определения MAC-адреса компьютера 2.
Помните, что ARP-запрос рассылается широковещательно (MAC- адрес получателя в
заголовке Ethernet – FF:FF:FF:FF:FF:FF), а MAC-адрес искомого узла в заголовке ARP
приравнивается к нулевому 00:00:00:00:00:00. MAC-адрес компьютера 1 указан в окне
«Интерфейсы» для компьютера 1.
4. Запустить ARP-запрос, проследить за ним и за сгенерированным для него ARPответом по схеме сети и журналам компьютеров 1 и 2.
5. Открыть ARP-таблицу компьютера 1 и убедиться, что запись добавилась в таблицу.
6. Сохранить скриншот экрана (с открытыми журналами) для отчета.
Реализация атаки ARP-спуфинг
1. Запустить для компьютеров 1 и 2 журналы пакетов (пункт меню «Показать
журнал»). При необходимости очистить их.
2. Очистить ARP-таблицу компьютера 1.
�Содержание
3. Выделить компьютер 2 и с помощью инструмента «Конструктор пакетов»
сформировать пакет ARP-ответа, в котором будут указаны:
•
MAC отправителя – MAC компьютера 2;
•
IP отправителя – IP интерфейса роутера в левой подсети;
•
MAC получателя – MAC компьютера 1;
•
IP получателя – IP компьютера 1.
4. Запустить ARP-ответ, проследить за ним. Может возникнуть окно о дублировании
IP-адресов в сети – это происходит в том случае, если из-за действий коммутатора
пакет-атаку получает и роутер. Окно быстро закрыть.
5. Сразу же запустить передачу пакетов (UDP, 5 KB) от компьютера 1 на компьютер 3.
Убедиться, что пакеты вначале приходят на компьютер 2 и лишь потом (если на
компьютере 2 включена маршрутизация) отправляются на компьютер 3 (через
маршрутизатор).
6. Сохранить скриншот экрана (с открытыми журналами) для отчета.
После выполнения работы продемонстрировать преподавателю работоспособность
построенной модели.
Проект сохранить для отчета.
Содержание отчета
1. Цель работы.
2. Разбиение заданной сети /27 на две подсети /28.
3. Схема модели с указанием IP-адресов устройств и номеров интерфейсов.
4. Скриншоты с результатами разрешения адреса и сетевой атаки.
5. По каждому пункту лабораторной должны быть приведены выводы по работе.
Контрольные вопросы
6. Протокол ARP.
7. Формат пакета ARP.
8. Самопроизвольный ARP.
9. IP-адрес.
10.MAC-адрес.
11.ARP-спуфинг.
�Содержание
Лабораторная работа № 5. Динамическая маршрутизация по
протоколу RIP. Получение сетевых настроек по DHCP
Цель работы: ознакомиться с механизмом динамической маршрутизации по
протоколу RIP; научиться настраивать компьютеры и серверы для автоматизации
получения компьютерами сетевых настроек.
Теоретический материал
Запуск эмулятора NetEmul
Для запуска эмулятора NetEmul необходимо либо воспользоваться соответствующим
пунктом главного меню операционной системы, либо выполнить в терминале
команду netemul.
Порядок выполнения лабораторной работы
С помощью инструмента «Вставить текстовую надпись» добавить на рабочее поле
эмулятора надпись, содержащую:
1. Номер группы.
2. Ф. И. О. студента, выполняющего работу.
3. Номер варианта согласно номеру студента в журнале.
Таблица 1
Варианты задания (указаны согласно номеру студента в журнале)
№
Адрес сети/маска
№
Адрес сети/маска
№
Адрес сети/маска
1
10.0.1.0/26
11
10.1.1.128/26
21
10.2.1.0/26
2
10.0.2.64/26
12
10.1.2.192/26
22
10.2.2.64/26
3
10.0.3.128/26
13
10.1.3.0/26
23
10.2.3.128/26
4
10.0.4.192/26
14
10.1.4.64/26
24
10.2.4.192/26
5
10.0.5.0/26
15
10.1.5.128/26
25
10.2.5.0/26
6
10.0.6.64/26
16
10.1.6.192/26
26
10.2.6.64/26
7
10.0.7.128/26
17
10.1.7.0/26
27
10.2.7.128/26
8
10.0.8.192/26
18
10.1.8.64/26
28
10.2.8.192/26
9
10.0.9.0/26
19
10.1.9.128/26
29
10.2.9.0/26
10
10.0.0.64/26
20
10.1.0.192/26
30
10.2.0.64/26
�Содержание
Построение модели сети
1. Выбрать исходные данные для выполнения работы согласно своему варианту.
Полученную, согласно варианту, сеть с маской /26 разбить на 8 подсетей с
маской /29 каждая.
Рис. 1. Модель сети для изучения работы протоколов RIP и DHCP
2. Используя соответствующие инструменты на панели эмулятора, построить сеть в
соответствии с рис. 1.
3. Распределить полученные ранее адреса сетей между сетями SR1–SR5 и SH11–SH13.
Добавить возле каждой сети надпись с ее IP-адресом.
4. Настроить интерфейсы маршрутизаторов, задав каждому IP-адрес и маску подсети
в соответствии с выбранным распределением.
Настройка динамической маршрутизации по протоколу RIP
1. На каждом маршрутизаторе добавить и запустить программу RIP. Пункт
контекстного меню «Программы». Кнопка «Добавить». Не забудьте поставить флаг
для активации программы.
2. Включить маршрутизацию на маршрутизаторе.
3. Открыть журнал одного из маршрутизаторов. Проследить за перемещением пакетов
протокола RIP по сети.
4. Поочередно открыть таблицы маршрутизации каждого маршрутизатора и
убедиться, что таблица заполнилась.
�Содержание
Настройка автоматического получения сетевых настроек по протоколу DHCP
1. На маршрутизаторах, которые отвечают за сети SH11–SH13 добавить и запустить
программу DHCP-сервер. Не забудьте поставить флаг для активации программы.
2. В настройках каждого DHCP-сервера указать интерфейс, «смотря- щий» в сторону
сети SH, тип адресов – динамические, диапазон адресов, выделяемых для
динамической адресации, маску подсети и IP-адрес шлюза.
3. На каждом компьютере добавить и запустить программу DHCP-клиент. Не забудьте
поставить флаг для активации программы.
4. В настройках каждого DHCP-клиента укажите интерфейс, который должен
автоматически получать сетевые настройки.
5. Открыть диалог настройки интерфейсов каждого компьютера и убедиться, что
стоит флаг «Получать настройки автоматически».
6. Дождаться, пока все компьютеры не получат сетевые настройки.
7. Проверить работоспособность построенной модели ЛВС, передав пакеты (TCP,
5 KB) между компьютерами в разных подсетях.
После выполнения работы продемонстрировать преподавателю работоспособность
построенной модели. Проект сохранить для отчета.
Содержание отчета
1. Цель работы.
2. Схема модели с указанием IP-адресов устройств и номеров интерфейсов.
3. По каждому пункту лабораторной должны быть приведены выводы по работе.
Контрольные вопросы
4. Протокол RIP.
5. Протокол DHCP.
6. DHCP. Алгоритм динамического назначения адресов.
�Содержание
Глава 11. Система управления контентом Joomla
CMS (от англ. Content Management System) – система управления содержимым
(контентом) – программное обеспечение или информационная система, которая
используется для организации и обеспечения процесса по совместному созданию,
управлению и редактированию содержимого сайта. Их основной задачей является
контроль контента, поступающего на сайт, для обеспечения достоверности и
своевременности информации, размещенной на сайте.
По виду CMS различают:
• открытые CMS: имеют открытый исходный код, доступный пользователям для
просмотра, редактирования, изучения и создания нового программного
обеспечения на его основе (например, Wordpress, Drupal, Joomla).
• Проприетарные (или закрытые) движки: эти программы, как правило, платные –
частная собственность их правообладателей и создателей. Исходный код таких
движков закрыт для изучения, просмотра, модификации и редактирования
(например, Microsoft SharePoint Server, UlterSuite CMS, Site Sapiens ECMP).
По способу работы шаблона различают движки:
• с автономной обработкой данных: предназначены для создания статических
сайтов;
• интерактивные CMS: предназначены для создания динамических сайтов;
• гибриды: сочетают функции автономных и интерактивных движков.
В зависимости от уровня сложности, системы управления контентом можно
разделить на три группы:
• первая группа – это статическая веб-страница, которую, как правило, делает ITспециалист, а затем, при необходимости, он же и вносит туда изменения;
• ко второй группе следует отнести сайты, на которых администратор может
самостоятельно изменять содержание, но не его структуру и дизайн;
• к третьей группе относятся системы, позволяющие администратору вносить
изменения в структуру сайта, добавлять и удалять разделы в рамках дизайна и
навигации.
Лабораторная работа № 1. Первоначальные настройки и установка шаблона сайта
Лабораторная работа № 2. Добавление категорий и удаление демонстрационного контента
Лабораторная работа № 3. Добавление материалов и создание меню
Лабораторная работа № 4. Создание пунктов меню и установка баннера
Лабораторная работа № 5. Модули и расширения в Joomla
Лабораторная работа № 6. Плагины в Joomla
Лабораторная работа № 7. Компоненты в Joomla
Контрольные вопросы к главе 11
�Содержание
Лабораторная работа № 1. Первоначальные настройки и установка
шаблона сайта
Цель работы: получить необходимые навыки настройки сайта на CMS Joomla и
установить шаблон для сайта.
Средства для выполнения работы:
• аппаратные: компьютер с установленной ОС Windows;
• программные: браузер, сервер.
По окончании выполнения лабораторной работы вам нужно будет предоставить отчет
о выполненной работе. Отчет включает в себя два файла, один из которых – это
cкриншот выбранного вами шаблона, а другой – ответы на контрольные вопросы,
представленные в конце лабораторной работы.
Теоретические сведения
Шаблоны (Templates)
Одним из главных элементов конструкции сайта является шаблон сайта. Joomla
основана на шаблонах. Они представляют собой основу стиля страниц сайта и Панели
администратора, определяют структуру сайта (позиции), порядок вывода материалов
и модулей (для этого указывается конкретная позиция). Шаблоны и связанные с ними
файлы являются основой для визуальной оболочки, т. е. дизайна и внешнего вида
сайта. Управление шаблонами осуществляется отдельно от управления контентом
сайта. Шаблон – это средство формирования внешнего вида сайта. Эта его функция
реализуется в основном за счет HTML и CSS. Joomla поставляется с несколькими
предварительно установленными шаблонами. Шаблоны можно настраивать, например
изменять логотип и цвета фона. Также в шаблонах определяется визуальное
оформление. Структура шаблона хранится в папке \templates\.
Внутри каждой папки шаблона, в зависимости от вида шаблона, можно увидеть
следующие файлы:
Рис. 1. Совокупность файлов, расположенных в папке шаблона
�Содержание
В папке images находятся картинки, используемые в шаблоне, например баннеры. В
шаблоне определяются допустимые позиции отображаемых модулей.
Файлы шаблонов обычно находятся в директории шаблонов (templates), которая
расположена в корневой директории Joomla. Каждый шаблон состоит из следующих
файлов:
Таблица 1
Файлы шаблонов
Название файла
Описание
Index.php
Файл содержит HTML, PHP и, возможно, JavaScript код, являющийся
основой для дизайна сайта. В комбинации с .css и файлами картинок этот
файл определяет весь дизайн и расположение контента на сайте
templateDetails.xml
Этот файл служит для распознания шаблона системой Joomla и содержит
ссылки на все используемые в шаблоне файлы: index.php, .css и т. д.
template_thumbnail.png Это файл-картинка, который служит для отображения скриншота сайта в
менеджере шаблонов. Наличие данного файла в папке шаблона
обязательно
template_css.css
Каскадные листы стиля (CSS), расположенные в папке css, содержат код,
который служит для обработки визуальных элементов сайта: размеров
шрифтов, цветов и т. д. Количество .css файлов не ограничено. Но для
корректной работы CSS необходимо разместить ссылки на данные файлы в
index.php.
Файлы картинок
Эти файлы изображений, предназначенные для обеспечения отображения
визуальных элементов дизайна, размещены в папке images вашего шаблона.
Картинки могут быть в форматах .gif, .jpg, или .png.
Остов шаблона находится в файле index.php и написан на языке php. У каждого
шаблона позиции для расширений уникальны и имеют конкретное предназначение.
Управление шаблонами осуществляется посредством «Менеджера шаблонов».
Менеджер шаблонов
Для входа в «менеджер шаблонов» нужно нажать на кнопку «Менеджер шаблонов» в
«Панели управления», или через «Расширения»→«Менеджер шаблонов».
Стили
Стили – это функция системы, которая позволяет видоизменять имеющиеся шаблоны.
Каждый шаблон имеет, как минимум, один стиль. Гибкость настройки стиля зависит
от каждого конкретного шаблона. Примеры настройки – выбор цветовой схемы
страниц, выбор логотипа. Задать стиль по умолчанию можно при помощи менеджера
шаблонов: текстовое меню административного раздела → пункт «Расширения» →
подпункт «Менеджер шаблонов» → вкладка «Стили». Отделить стили для
административного раздела от шаблонов для стороны посетителей можно при
помощи фильтра «Выбор области системы». Новые стили создаются копированием
имеющихся. Стили можно применять к тем или иным пунктам меню и, следовательно,
к тем или иным страницам или разделам [2, с. 122].
�Содержание
Рис. 2. Менеджер шаблонов: стили
После входа откроется страница со следующими элементами:
•
заголовок и кнопки для управления шаблонами;
•
поле выбора: стили или шаблоны;
•
поле навигации;
•
таблица с установленными шаблонами.
В таблице с установленными шаблонами показаны имеющиеся на данный момент
шаблоны, область системы, их состояние, назначение и ID. Звездочка означает, что
шаблон активный и используется по умолчанию. Зеленая галочка
– использование на некоторых страницах сайта.
Поле навигации используется для удобства поиска нужного шаблона в том случае,
если количество шаблонов достаточно велико.
Кнопки управления шаблонами предназначены:
• использовать по умолчанию – для использования и обозначения активного
шаблона;
• изменить – для перехода к редактированию выбранного шаблона;
• дублировать – для создания копии шаблона;
• удалить – для удаления выбранного шаблона;
• настройки – для настроек прав доступа к шаблону.
При переходе на вкладку «Шаблоны» откроется страница.
�Содержание
Рис. 3. Менеджер шаблонов: Шаблоны
На этой странице отображены названия шаблонов, область применения, версия, дата и
автор создания версии шаблона. Здесь можно просмотреть, как будет выглядеть
страница сайта с выбранным шаблоном. То есть осуществить предварительный
просмотр шаблона и расположение позиций для модулей (Настройки → Просмотр
позиций → Вкл.).
Нажмите «Сохранить и закрыть». Обновите страницу. Нажмите на «Предварительный
просмотр» для шаблона beez5. Кликнув по ссылке «Параметры Beez5», откроется
окно с описанием шаблона, таблицей стилей и основными файлами шаблона. Так как
шаблоны имеют открытый код, то имеется возможность редактировать шаблон
самостоятельно. При этом, конечно, обладая навыками и знаниями верстки CSS и
HTML.
Приступать к изменению стилей шаблона нужно при полном заполнении шаблона
модулями, контентом и изображениями [65].
Составляющие Joomla
Основными составляющими Joomla являются: статьи, категории, пользователи,
навигация, модули, плагины, компоненты, настройки и др. Рассмотрим подробнее
каждое из составляющих Joomla.
Статьи
На странице, выводимой Joomla, может быть одна статья, а может быть несколько,
выводимых перечнем. Хранящиеся в базе данных статьи могут быть доступны или
недоступны посетителям: опубликованы или сняты с публикации (кнопки
�Содержание
«Опубликовать» и «Снять с публикации» в административном разделе). Статьи
можно выводить на главную страницу, отправлять в архив, удалять и восстанавливать.
Их также можно копировать и перемещать.
Категории
Для более логичного отображения статей можно создавать так называемые категории
и «привязывать» к ним статьи. Статья может быть привязана только к одной
категории. Глубина вложенности категорий неограниченна. Статьи из одной или
нескольких категорий могут относиться к тому или иному пункту меню и выводиться
в формате, выбранном администратором. Кликнув по ссылке, посетитель получит
доступ ко всем статьям, относящимся к данному пункту меню, «привязанным» к
разным категориям.
Пользователи
Пользователи нужны для того, чтобы создавать контент. На сайте под управлением
Joomla есть по меньшей мере один пользователь – тот, который был создан в процессе
установки системы. У этого пользователя права главного администратора: он может
вносить изменения в конфигурацию системы. Прочие пользователи в зависимости от
имеющихся у них прав могут создавать материалы либо на стороне посетителя, либо
при помощи соответствующего интерфейса в административном разделе. Для
создания учетной записи пользователя требуются: логин, пароль и адрес электронной
почты. Каждый пользователь принадлежит к той или иной группе и имеет тот или
иной уровень полномочий, что дает ему возможность ограничивать доступ к
публикуемым им материалам по критерию принадлежности к пользовательской
группе [2, с. 45].
Типы пользователей и уровни доступа
Пользователи Joomla могут быть разделены на две основные категории:
• гости;
• зарегистрированные пользователи.
Гости – это посетители сайта Joomla. В зависимости от того, как Супер
Администратор настроил сайт, часть контента может быть доступна для просмотра
только зарегистрированными пользователями, в то время как гости могут
просматривать лишь ограниченный объем информации.
Зарегистрированные пользователи после регистрации на сайте получают имя
пользователя и пароль. Имя пользователя и пароль позволяют зарегистрированным
пользователям входить (login) на сайт, получая тем самым особые привилегии перед
гостями.
Зарегистрированные пользователи тоже могут быть разделены на две категории:
• внешние пользователи (Front-end Users);
• внутренние пользователи (Back-end Users).
�Содержание
Внутренние пользователи
Внешние пользователи получают некоторые привилегии над гостями, которые могут
включать в себя возможность создания и публикации контента на сайте. Например,
провайдеры контента, их основная цель – это размещать новый контент на сайте, но не
администрировать его или менять дизайн.
Провайдеры контента могут размещать информацию на сайте с помощью встроенного
редактора WYSIWG, что не требует знаний HTML.
Внешних пользователей, в свою очередь, можно разделить на 4 уровня:
Зарегистрированные (Registered), Авторы (Authors), Редакторы (Editors), Публикаторы
(Publishers).
Таблица 2
Зарегистрированные внешние пользователи
Пользователь
Доступ и возможности
Зарегистрированный У зарегистрированного пользователя нет прав на создание, редактирование
или публикацию контента на сайте Joomla. Они могут добавлять новые вебссылки в публикации и имеют доступ к контенту, закрытому для гостей
Автор
Авторы могут создавать контент, указывать некоторые особенности
отображения этого контента и дату публикации контента на сайте
Редактор
Редакторы имеют те же права, что и Авторы, при этом они могут
редактировать как свой контент, так и контент добавленный
Публикатор
Публикаторы имеют все возможности Авторов и Редакторов, при этом именно
они могут опубликовать контент на сайте
Внутренние пользователи
Внутренние пользователи – это Менеджеры, Администраторы и Супер
Администраторы. Эти виды пользователей имеют доступ как к внешнему, так и к
внутреннему интерфейсам сайта. Данные пользователи также имеют разные
привилегии, в зависимости от уровня.
Таблица 3
Внутренние зарегистрированные пользователи
Пользователь
Менеджер
Доступ и возможности
Менеджер имеет все права публикатора, а также доступ к панели администратора.
Менеджеры имею доступ ко всем элементам панели управления, связанным с
контентом сайта, но они не могут изменять шаблоны и конфигурации страниц или
добавлять и удалять расширения Joomla. Менеджеры также не могут добавлять
пользователей или редактировать их учетные записи
Администратор Администраторы имею более широкий спектр возможностей, чем Менеджеры.
Администраторы могут добавлять или удалять расширения, изменять шаблоны и
конфигурации страниц, и даже создавать или редактировать учетные записи
пользователей не выше своего уровня. Они не могут редактировать учетные записи
Супер Администраторов и менять некоторые глобальные настройки сайта
�Содержание
Супер
Супер Администратор имеет те же права, что и root в системе Linux. Он может
Администратор выполнять любые административные функции в Joomla. Только Супер
Администраторы имеют возможность создавать новых пользователей с правами
Супер Администраторов или присваивать такие права другим пользователям
Единственный пользователь, который существует в Joomla после установки – это
Супер Администратор. Это тот самый «admin», созданный нами при инсталляции
Навигация
Для «передвижения» по сайту нужна система навигации: набор ссылок, ведущих на
публикуемые страницы. В Joomla эту функцию исполняет меню. Можно создать
неограниченное количество меню и создать неограниченное количество их сочетаний.
Каждое меню можно вывести на стороне посетителя при помощи так называемого
модуля в той или иной определяемой шаблоном части страницы.
Модули (Modules)
Модуль – это блок содержимого, который можно расположить рядом с выводимой на
странице статьей. Например, меню на стороне посетителя – это модуль. Интерфейс
входа в систему и регистрации в левой части – это тоже модуль. Вы можете создавать
столько модулей с разными функциями, сколько нужно и размещать их в областях
страниц, определяемых применяемым шаблоном. Модуль – это одно из средств
расширения функциональных возможностей Joomla. В большинстве случаев модуль
выполняет функции отображения информации и является дополнением к
установленным компонентам. Как правило, модули располагаются в левой и правой
колонке при трехколоночной верстке. Примером модулей является навигационное
меню, календарь, список популярных статей и т. д. При публикации модуля можно
указать, в какой позиции шаблона сайта и на каких страницах он будет отображаться.
Кроме того, большинство установленных в системе модулей можно скопировать –
опубликовать несколько раз с разными параметрами (например, модуль вывода
популярных статей можно опубликовать для разных разделов) [18].
Модули расширяют возможности Joomla. Модуль – это небольшой элемент контента,
который можно разместить в любом месте сайта, если это позволяет шаблон. Модули
очень легко устанавливаются в системе из панели администратора.
Модули Joomla могут включать: Главное меню (Main Menu), Верхнее меню (Top Menu),
Систему выбора шаблонов (Template Chooser), Опросы (Polls), Экстренные сообщения
(Newsflash), Счетчик хитов (Hit Counter).
Плагины
Плагины выполняют практические функции, но обычно невидны посетителям.
WYSIWYG-редактор, например, – плагин. Плагины – это расширения, которые можно
устанавливать неограниченное количество раз. В исходную комплектацию Joomla
входит множество полезных плагинов.
�Содержание
Компоненты
Компоненты – это расширения, позволяющие создать на вашем сайте, например,
форум, галерею и т. д. В исходную комплектацию Joomla входит несколько
расширений этого типа. Например, форма обратной связи. Компонентов, которые
могут расширить набор функций сайта, существует множество.
Настройки
Кнопки с такой подписью в административном разделе вызывают интерфейсы
настройки, позволяющие менять параметры системы и ее отдельных элементов,
например: учетных записей, категорий, модулей, компонентов и др. [2, с. 45].
Протокол SMTP
SMTP (от англ. Simple Mail Transfer Protocol – простой протокол передачи почты) –
это широко используемый сетевой протокол, предназначенный для передачи
электронной почты в сетях TCP/IP [36].
Основная задача протокола SMTP заключается в том, чтобы обеспечивать передачу
электронных сообщений (почту). Для работы через протокол SMTP клиент создает
TCP соединение с сервером через порт 25. Затем клиент и SMTP сервер
обмениваются информацией пока соединение не будет закрыто или прервано.
Основной процедурой в SMTP является передача почты (Mail Procedure). Далее идут
процедуры форвардинга почты (Mail Forwarding), проверка имен почтового ящика и
вывод списков почтовых групп. Самой первой процедурой является открытие канала
передачи, а последней – его закрытие [67].
Выполнение работы
Первоначальные настройки сайта
Задание 1. Установить первоначальные настройки сайта. Зайдите на страницу общих
настроек: Система→Общие настройки.
Рис. 4. Административный раздел
�Содержание
Здесь есть меню из пяти пунктов: сайт, система, сервер, права, фильтры текста.
Войдите на вкладку Сайт.
Несколько важных аспектов:
•
если подвести указатель мыши к названию настройки, появится краткая подсказка;
•
некоторые настройки помечены звездочкой – это обязательные настройки.
Раздел общих настроек «Сайт»
I. «Настройки сайта»
•
В первом поле «Название сайта» напишите название сайта.
•
Переключатель «Сайт выключен (offline)» установите в положении «Нет».
•
В настройке «Показывать offline-сообщение» установите переключатель в
положение «Пользовательское сообщение», а ниже введите текст сообщения.
•
Опция «Изображение при выключенном сайте»: эта настройка позволяет
выбрать подходящее изображение, которое будет отображаться в сообщении о
выключенном сайте. Естественно, что изображение предварительно должно быть
загружено через «Медиа-менеджер».
•
Опция « Визуальный редактор по умолчанию», т. е. редактор, который будет
установлен по умолчанию для каждого нового пользователя. В выпадающем
списке выберите «TinyMCE».
•
Опция « CAPTCHA» позволяет отделять действия людей от действий роботов,
предотвращает автоматические регистрации на сайте, автоматическую отправку
сообщений и т. д. Выберите «CAPTCHA-reCAPTCHA».
•
Настройку «Уровень доступа по умолчанию» оставьте в значении «Public». Эта
опция устанавливает доступ на чтение для новых материалов, доступ к новым
пунктам меню и новым объектам сайта.
•
Настройка «Длина списка по умолчанию» определяет количество элементов,
которое будет отображаться, на тех страницах панели управления, где установлен
вывод в виде списка. Установите 30.
•
В настройке «Ограничение ленты новостей» устанавливается ограничение для
новостной ленты сайта на Joomla, т. е. какое количество новостей отображать в
ленте, например 10.
•
В настройке «E-mail ленты новостей» выберите адрес электронной почты ленты
новостей. Точнее это адрес электронной почты автора новости. Если выбрать «Email автора», то будет отображаться e-mail конкретного автора материала.
Естественно, что автор должен быть зарегистрирован на сайте. Если выбрать «Email сайта», то будет отображаться e-mail сайта.
�Содержание
Рис. 5. Настройки сайта
II. «Настройка метаданных»
Эти настройки влияют на продвижение сайта, на его позиционирование в поисковых
системах. Настройки этой группы являются общими для всего сайта, т. е. там, где не
будут явно заданы значения этой группы опций, будут использоваться значения
общих настроек. Следует помнить, что в пределах сайта все описания и заголовки
должны быть уникальными. В небольших сайтах имеет смысл использовать
стандартные функции работы с метаданными, а в более развитых сайтах лучше
использовать специальные компоненты для работы с метаданными.
�Содержание
•
Первая настройка «Мета-тег Description для сайта» задает описание для страниц
сайта. В общих настройках Joomla лучше оставить это поле пустым, но в
дальнейшем для каждого материала делать соответствующее метаописание.
•
Опция «Мета-тег Keywords» определяет ключевые слова. Так же, как и
метаописание, желательно оставить поле пустым.
•
Значение настройки «Мета-тег Robots» выберите «Index, Follow»; этим вы
разрешите роботам поисковых систем индексировать документ и переходить по
ссылкам.
•
Настройка «Авторские права» работает в связке с переключателем «Показывать
мета-тег Author». Если требуется передавать информацию об авторе материала, то
следует установить переключатель «Показывать мета-тег Author» в положение «Да»
и в поле ввода «Авторские права» добавить информацию об авторе.
•
«Показывать версию Joomla» установите на свое усмотрение.
Рис. 6. Настройка метаданных
�Содержание
III. «Настройки SEO»
• Опция «Включить SEF (ЧПУ)»: задача этой системы в том, чтобы сделать
адреса страниц сайта, работающего на Joomla более эргономичными для
восприятия. Установите переключатель в значение «Нет».
• Опция «Перенаправление URL» включает или выключает перенаправление
адресов, соответствующих определенным условиям, и перенаправляет их так,
как необходимо. Включение этой настройки влияет на работу стандартного
компонента Joomla «Перенаправление». Установите переключатель в значение
«Да».
• Переключатель «Добавлять суффикс к URL» установите в значение «Да».
Теперь в зависимости от типа документа в адрес страницы будет добавляться
нужное окончание. Например, для простых страниц будет добавлен суффикс
.html.
• «Алиасы в Unicode» – выбор режима создания Алиасов объектов сайта:
транслитерация заголовка в латинские символы или хранение в кодировке
Unicode. Оставьте в положении «Нет».
• Включать название сайта в заголовок страницы (до или после названия
текущей страницы) выберите на свое усмотрение.
Рис. 7. Настройки SEO
�Содержание
IV. «Настройки cookie»
Настройки cookie на этой странице оставьте без изменения, эти настройки нужны при
использовании поддоменов. Сохраните изменения и перейдите на вкладку «Система»
[62].
Раздел общих настроек «Система»
A.
«Настройка системы»
• Поле ввода «Путь к каталогу логов» содержит путь к журналам Joomla. Обратите
внимание на запись пути! Так, если вы организовывали локальный хостинг для
Joomla на Windows, то и путь будет записан в соответствии с правилами этой
операционной системы.
• В поле выбора «Сервер справки» выберите название сервера справки, откуда
будут считываться страницы справочного пособия.
Рис. 8. Настройка системы
II. «Параметры отладки»
• Опция «Отладка системы» установите в положение «Нет».
• Опция «Отладка языка» установите в положение «Нет». Отладку имеет смысл
включать на локальном хостинге, при некорректной работе системы. Тогда в
нижней части страницы будет выводиться отладочная
информация,
диагностические сообщения и т. п. Причем такая информация будет выводиться не
только в административной части, но и на всех страницах сайта.
Рис. 9. Параметры отладки
�Содержание
B.
«Настройки кэша»
При разработке сайта кэширование будет только мешать, поэтому:
1. Опцию «Кэш» выставите в значение «Кэширование отключено», если сайт
размещен на локальном сервере, а если сайт перенесен на глобальный хостинг,
тогда для ускорения работы ресурса кэширование нужно включить.
2. «Обработчик кэширования» оставьте без изменения – значение «Файл».
3. «Время кэширования» также оставьте без изменения – значение 15.
Рис. 10. Настройки кэша
C.
«Настройки сессии»
•
Опция «Время жизни сессии» по-другому можно назвать временем бездействия,
т. е. через определенное в этой настройке время, если не будут производиться
никакие действия с помощью клавиатуры или мыши, сессия пользователя будет
закрыта. Это относится и к сессии на сайте, и к сессии в административной панели.
На время разработки сайта можно выставить значение этой опции, например 90
минут.
•
Настройку «Обработчик сессий» оставьте в значении по умолчанию – «База
данных». Сохраните изменения и перейдите на вкладку «Сервер» [62].
Рис. 11. Настройки сессии
�Содержание
Раздел общих настроек «Сервер»
Вкладка «Сервер» общих настроек Joomla содержит важную техническую
информацию, которая требуется для правильной работы сайта. Настройки этой
группы стыкуются с настройками веб-сервера.
I. «Настройки сервера»
• Опция «Путь к каталогу временных файлов» зависит от стиля системы, в
Windows кроме конечной папки отделяется слешем.
• Опцию «Gzip-сжатие страниц» оставьте выключенной. Если сайт перенесен на
глобальный хостинг, эту настройку можно включить.
• В выпадающем списке «Сообщения об ошибках» можно выбрать уровень
детализации отладочных сообщений. Эта настройка будет работать, если включена
опция «Отладка системы» на вкладке «Система». Оставьте эту настройку в
значении по умолчанию.
Опция «Включить SSL»: для административной панели или для всего сайта на
Joomla, можно включить доступ по защищенному протоколу SSL (Secure Sockets Layer
– уровень защищенных сокетов – криптографический протокол, который
обеспечивает установление безопасного соединения между клиентом и сервером. SSL
изначально разработан компанией Netscape Communications. Впоследствии на
основании протокола SSL 3.0 был разработан и принят стандарт RFC, получивший
имя TLS. Протокол обеспечивает конфиденциальность обмена данными между
клиентом и сервером, использующими TCP/IP, причем для шифрования используется
асимметричный алгоритм с открытым ключом [37]), но прежде нужно включить SSL
на веб-сервере. В данном случае оставьте значение «Нет».
Рис. 12. Настройки сервера
�Содержание
II. «Настройка расположение»
Опция «Часовой пояс сервера»: из выпадающего списка выберите часовой пояс, в
котором находится наш веб-сервер, т. е. часовой пояс вашего расположения или
оставьте значение «Всемирное время, Coordinated UTC».
Рис. 13. Настройка расположения
III. «Настройка FTP»
Для локального хостинга работа с сайтом по FTP необязательна.
1. Значение опции «Включить FTP» оставьте в положении «Нет».
2. Значение опции «FTP-хост» соответствует 127.0.0.1.
3. Значение опции «FTP-порт» соответствует 21.
4. Значения трех последних опций оставьте незаполненными.
Рис. 14. Настройка FTP
IV. «Настройки базы данных»
Потребность в правке этих настроек практически отсутствует. Эти настройки больше
нужны в качестве справочной информации. Обратите внимание на значение опции
«Префикс таблиц базы данных», он может пригодиться при восстановлении сайта.
Рис. 15. Настройки базы данных
�Содержание
V. «Настройка почты»
На локальном хостинге можно настроить почту двумя способами: с помощью PHP
или с помощью SMTP.
Для настройки электронной почты сайта с помощью PHP:
•
выберите значение «PHP Mail» в настройке «Способ отправки»;
•
в поле «E-mail сайта» введите реальный адрес электронной почты;
•
заполните поле опции «Отправитель письма»;
•
опция «Авторизация на SMTP-сервере»: установите переключатель в положение
«Нет»;
•
значение порта SMTP-сервера соответствует 25;
•
введите имя пользователя и пароль для SMTP;
•
в поле «SMTP-сервер» укажите localhost.
Рис. 16. Настройка почты
Настройка электронной почты сайта с помощью SMTP
•
в настройке «Способ отправки» выберите значение «SMTP»;
•
в поле «E-mail сайта» введите реальный адрес электронной почты;
•
заполните поле опции «Отправитель письма»;
•
авторизация на SMTP-сервере требуется в подавляющем большинстве случаев,
поэтому установите переключатель в положение «Да»; если авторизация не
требуется, поставьте «Нет»;
•
в выпадающем списке «Защита SMTP» выберите тот тип защиты, который
поддерживает поставщик услуг электронной почты. Для начала можно настроить
отправку сообщений без защиты, выбрав «Нет», а впоследствии включить защиту.
�Содержание
•
значение поля «Порт SMTP-сервера» для большинства незащищенных серверов
будет 25, а для серверов, работающих через SSL, будет 465.
•
в поля «Имя пользователя SMTP» и «Пароль для SMTP» введите
соответственно логин и пароль учетной записи электронной почты, указанной
выше в поле «E-mail сайта».
•
в поле «SMTP-сервер» введите имя smtp сервера поставщика услуг [62].
Рис. 17. Настройка почты при значении «SMTP»
Перейдите на вкладку «Права».
4. Раздел общих настроек «Права»
На вкладке «Права» можно задать права группам пользователей для выполнения
определенных общих стандартных действий. Например, вход в панель управления или
управление компонентами и т. д. Набор этих действий ограничен и отображается при
редактировании прав группы.
Работа с правами пользователей актуальна тогда, когда над сайтом работают
несколько человек: добавляют материал, работают с определенными расширениями и
�Содержание
т. д. Сейчас, когда на сайте установлены демонстрационные материалы, можно
познакомиться с примерами настройки. Структура групп является древовидной, т. е.
есть корневая группа «Все», которая содержит несколько групп, которые, в свою
очередь, могут содержать в себе еще группы, а те, в свою очередь, еще. По
умолчанию подгруппы наследуют права своей группы. Вот эти права и можно
изменить. В группе «Все» все настройки имеют значение «Не определено». Если
значение не определено, то это равнозначно, что установлено значение «Запрещено».
Измените два параметра «Вход на сайт» и «Вход в панель управления». Значение «Не
определено» может быть установлено только для группы «Все», и только на вкладке
«Права» общих настроек Joomla. На вкладке «Права» очень много подсказок,
всплывающих при наведении указателя мыши на опцию. Самостоятельно
ознакомьтесь с демонстрационными настройками прав и перейдите к вкладке
«Фильтры текста» [62].
Рис. 18. Настройка прав доступа
Раздел общих настроек «Фильтры текста»
Настройки на вкладке «Фильтры текста» предназначены для ограничения
использования HTML-тегов и атрибутов в тексте материалов. «Фильтры текста»
актуальны для сайтов, на которых зарегистрированные пользователи могут добавлять
текстовый материал или для сайтов, администрируемых более чем одним человеком.
С помощью настроек вкладки «Фильтры текста» для определенных на сайте групп
пользователей можно, например, разрешить или запретить работу с HTML тегами,
разрешить работу только с определенными тегами (белый список), запретить работу с
�Содержание
некоторыми тегами (черные списки). Если для группы пользователей установлен
запрет на все или избранные HTML-теги, то эти теги будут удалены при сохранении
текста пользователем. Рассмотрим подробнее тип фильтра «Черный список». Есть два
значения черных списков: «Черный список (по умолчанию)» и «Черный список
(пользовательский)». «Черный список (по умолчанию)» уже заполнен несколькими
запрещающими значениями тегов и атрибутов, которые нельзя удалить из набора.
Такой черный список можно лишь расширить, вводя дополнительные запрещенные
теги в поле «Фильтр тегов» или дополнительные запрещенные атрибуты в поле
«Фильтр атрибутов». Для своего набора запрещенных тегов и атрибутов следует
использовать «Черный список (пользовательский)», запрещенные значения которого
вводятся в те же поля: «Фильтр тегов» и «Фильтр атрибутов».
Задание 2. Установить шаблон сайта. Для этого выполните следующие действия:
1. Откройте в административном разделе Расширения → Менеджер расширений:
Рис. 19. Пункт меню расширения
2. Выберите один из архивов шаблонов → Загрузить и установить:
Рис. 20. Панель управления
�Содержание
В результате вы увидите сообщение об успешной установке.
3. Откройте меню в административном разделе Менеджер шаблонов
Рис. 21. Менеджер расширений: установка
Система имеет несколько демонстрационных тем, одна из которых активирована.
4. Отметьте галочкой установленную тему и нажмите на звездочку справа:
Рис. 22. Шаблоны
Внешний вид сайта видоизменился. Аналогично можно устанавливать и другие темы
[97].
Пример: Поменяем установленный для сайта шаблон на шаблон Shape5_intrigue:
1. В меню выберем Расширения→ Менеджер шаблонов.
�Содержание
2. Перейдем на вкладку «Шаблоны» и выберем «Предварительный просмотр»
шаблона Pretium, отобразятся позиции модулей шаблона.
3. Перейдем на вкладку «Стили».
4. Отметим галочкой выбранный стиль и нажмем на звездочку для назначения
использования данного стиля по умолчанию.
5. Обновим в браузере вкладку сайта и увидим, что сайт видоизменился.
Рис. 23. Стили шаблонов
Рис. 24. Шаблон сайта
�Содержание
Контрольные вопросы
1. Что такое шаблон в Joomla и для чего он предназначен?
2. Посредством чего в Joomla осуществляется управление шаблонами?
3. Какой значок в таблице с установленными шаблонами означает, что шаблон
активный и используется по умолчанию?
4. Назовите основные составляющие сайта Joomla.
5. На какие две основные категории делятся пользователи Joomla?
6. За счет чего в Joomla реализуется функция формирования внешнего вида сайта?
7. Для чего предназначены стили шаблона?
�Содержание
Лабораторная работа № 2. Добавление категорий и удаление
демонстрационного контента
Цель работы: научиться осуществлять удаление ненужного демонстрационного
контента и разработать структуру категорий и научиться их добавлять.
Средства для выполнения работы:
•
аппаратные: компьютер с установленной ОС Windows;
•
программные: браузер, сервер.
По окончании выполнения лабораторной работы вам нужно будет предоставить отчет
о выполненной работе. Отчет включает в себя два файла, один из которых – это
cкриншот хотя бы одной из созданных категорий, а другой – ответы на контрольные
вопросы, представленные в конце лабораторной работы.
Теоретические сведения
Контент
Контент – это наполнение или содержание какого-либо информационного ресурса –
текст, графика, музыка, видео, звуки и т. д. (например: контент интернет-сайта);
мобильный контент – мультимедийное наполнение, адаптированное для
использования в мобильных устройствах (телефоны, смартфоны, коммуникаторы и
т. д.) – текст, графика, музыка, рингтоны, видео, игры, дополнительное программное
обеспечение. Для контента важными параметрами являются объем, актуальность,
доступность, дизайн, привлекательность [106].
Типы контента
Joomla в исходной комплектации работает со статьями, категориями, каталогами
ссылок, баннерами, контактной информацией и новостными лентами. Модули можно
использовать для создания контента. Для того чтобы сделать сайт содержательнее,
публикуя фотографии и другие виды мультимедиа, в Joomla есть медиа-менеджер.
Также можно расширить набор функций исходной комплектации, используя так
называемые CCK, программные комплекты для управления контентом, среди
которых – K2, FlexiContent, CCK jSeblod и многие другие.
Справочные статьи о владельце сайта обычно создаются единожды, а потом время от
времени корректируются и дополняются. Чаще всего в меню есть ссылка на них.
Справочные данные как правило статичные. Пресс-релизы и записи в блогах,
напротив, относятся к динамическому контенту.
В отличие от динамических материалов, информация о дате создания и авторе
статичного материала не имеет особого значения. Для статичных материалов в меню
создаются ссылки. Ссылки на динамические материалы обычно публикуются в
обновляющихся списках [2, с. 62].
�Содержание
Менеджер категорий
Категории в CMS Joomla предназначены для создания иерархий материала и для
удобства поиска материалов. Joomla имеет неограниченную вложенность категорий,
которая выглядит примерно так:
Категория 1 (содержит Материал 1)
--Подкатегория 1 (содержит Материал 2)
---Подкатегория 3 (содержит Материал 3)
--Подкатегория 2
Категория 2
Каждая из категорий и подкатегорий может иметь неограниченное количество
материалов. Чтобы попасть в «Менеджер категорий», в горизонтальном меню панели
управления выберите пункт «Материалы» и подпункт «Менеджер категорий» (также
вы можете воспользоваться кнопками быстрого доступа). Перед вами откроется
страница Менеджера категорий, главная часть которой – список категорий и
подкатегорий. Здесь вы сможете создавать, редактировать и удалять категории,
менять вложенность и сортировку, а также выполнять другие действия.
В верхней части расположен ряд кнопок:
•
Создать – создать новую категорию;
•
Изменить – изменить отмеченную категорию;
•
Опубликовать – опубликовать отмеченные категории;
•
Снять с публикации – снять отмеченные категории с публикации;
•
В архив – поместить отмеченные категории в архив;
•
Разблокировать – разблокировать отмеченные категории;
•
В корзину – переместить отмеченные категории в корзину;
•
Перестроить – применить выбранный порядок категорий;
•
Настройки – настройки менеджера категорий;
•
Справка – документация на английском языке.
Рис. 1. Кнопки для управления категориями
Под кнопками, в левой части, находятся вкладки для быстрого перехода в менеджер
материалов и избранными материалами.
�Содержание
Внизу страницы вы можете выполнить пакетные действия с категориями [84].
Рис. 2. Пакетная обработка выделенных категорий
Для отображения статей можно выбирать разные форматы вывода. В перечне на
странице менеджера меню можно увидеть, какие форматы для каких пунктов меню
выбраны.
Выбрать формат вывода можно на странице редактирования пункта меню.
Рис. 3. Форматы вывода категорий
Возможны следующие форматы вывода:
• «Список всех категорий». Этот формат предполагает вывод всех подкатегорий
выбранной категории;
• «Блог категорий» (часто используется на главных страницах). Данный формат
предполагает вывод всех статей, относящихся к выбранной категории;
• «Список материалов категории». Данный формат предполагает вывод всех статей,
относящихся к выбранной категории, в виде таблицы.
Отображение анонсов подкатегорий и статей можно гибко настраивать для каждого
формата отображения [2, с. 103].
�Содержание
Создание категорий
Для того чтобы создать новую категорию, выберите в меню Материалы → Менеджер
категорий → Создать категорию.
Перед вами появится окно создания категории.
Рис. 4. Создание категории материалов
На данной странице присутствуют следующие опции и поля для заполнения:
• Заголовок – название создаваемой категории;
• Алиас – псевдоним в адресной строке браузера (если оставить пустым –
сгенерируется автоматически);
• Родитель – если это будет поддиректория, то в этом поле следует указать
родительскую категорию;
• Состояние – опубликована или нет категория;
• Доступ – определяет права доступа к категории;
• Права – присваивает специальные права (ACL);
• Язык – определяет язык категории;
• ID – показывает идентификационный номер категории;
• Описание – информация о категории (эта информация также может отображаться
на вашем сайте). Описание вводится с использованием WYSIWYG редактора.
�Содержание
Работа с WYSIWYG редактором
Рис. 5. WYSIWYG редактор
Внимание! Не вставляйте в редактор тексты из буфера обмена, так как это
приведет к большому количеству излишних тегов и сделает текст
«нестабильным» – он будет разъезжаться.
Для переноса текста необходимо перейти в режим редактирования html. Нажмите
.
кнопку
В появившееся окно скопируйте текст из буфера обмена.
Рис. 6. Редактор html кода
�Содержание
Закройте окно, нажав
.
После чего отредактируйте текст, так, как вам нужно, используя инструменты
редактора.
После того, как необходимые поля (достаточно заполнить только поле «Заголовок»)
заполнены, нажмите кнопку «Сохранить и закрыть».
Для более удобной навигации по категориям вы можете применить специальные
фильтры. Вы можете отфильтровать категории по их состоянию, вложенности и
другим параметрам, а также выполнить поиск по их названиям [84].
Пример создания категории: создадим категорию «Эталонная модель OSI»
Рис. 7. Создание новой категории
Далее кликнем по кнопке «Сохранить и закрыть», после чего увидим созданную
категорию и информацию об успешном создании категории.
Рис. 8. Созданная категория
�Содержание
Пример создания категорий и подкатегорий:
Создадим несколько категорий по теме «Эталонные модели». Итак, создадим две
категории «Эталонная модель OSI» и «Эталонная модель TCP/IP».
В категории «Эталонная модель OSI» создадим еще семь подкатегорий:
1. Физический уровень.
2. Уровень передачи данных.
3. Сетевой уровень.
4. Транспортный уровень.
5. Сеансовый уровень.
6. Уровень представления.
7. Прикладной уровень.
Аналогично в категории «Эталонная модель TCP/IP» создадим еще четыре
подкатегории:
1. Межсетевой уровень.
2. Транспортный уровень.
3. Прикладной уровень.
4. Хост-сетевой уровень.
Для
того
чтобы
создать
новую
категорию,
выберем
в
меню
Материалы→Менеджер категорий→Создать категорию. Появится окно создания
категории.
Создадим сначала категорию «Эталонная модель OSI»:
Рис. 9. Создание категории «Эталонная модель OSI»
�Содержание
Для удобства можно нажать не «Сохранить»,
а кнопку «Сохранить и создать»,
эта функция сохраняет и сразу же создает новый документ, в данном случае это
категория. Далее создадим категорию «Эталонная модель TCP/IP».
Рис. 10. Создание категории «Эталонная модель TCP/IP»
Рис. 11. Созданные категории
�Содержание
После создания двух главных категорий нужно создать подкатегории. Повторяем
предыдущие действия, только в поле «Родитель» указываем родительскую категорию,
в первом случае это «Эталонная модель OSI», а во втором – «Эталонная модель TCP/
IP».
В итоге получили две ветки категорий:
Рис. 12. Созданные категории и подкатегории
Выполнение работы:
Задание 1. Удалить лишний демонстрационный контент с сайта. Для этого выполните
следующие действия:
1. Войдите в панель управления. Для этого введите соответствующие логин и пароль.
2. В меню панели управления выберите Материалы → Избранные материалы.
3. Отмечаем заголовки статей, что на главной странице, и отправляем все в корзину:
Рис. 13. Менеджер материалов: Избранные материалы
�Содержание
4. В меню панели управления выберите Меню → Менеджер меню.
5. Выберите все заголовки «Меню» и отправьте их в корзину.
Рис. 14. Панель управления
6. Убедитесь, что оставляете опубликованным только пункт меню «Главная». Этот
демо-пункт нужно будет удалить после того, как вы создадите свою главную страницу.
В нижней части страницы (страницы редактирования меню в разделе
администрирования) есть выпадающий список, при помощи которого можно
определить количество пунктов перечня, выводимых на одной странице.
1. Откройте в административной панели Компоненты→ Контакты→Категории и
отправьте все представленные пункты в корзину.
2. Откройте в административной панели Компоненты → Баннеры и отправьте все
представленные пункты в корзину.
3. Для того чтобы наверняка удалить со стороны посетителей всю снятую с
публикации информацию, нужно очистить кэш: текстовое меню административного
раздела → пункт «Сайт» → подпункт «Обслуживание» → подпункт «Очистить весь
кэш» [2, с. 39].
В результате получаем практически чистый сайт, который только предстоит наполнить
информацией [97].
Задание 2. Продумайте и создайте структуру ваших категорий.
Задание 3. Укажите по своему усмотрению права доступа к категории.
�Содержание
Рис. 15. Права доступа к категории
Контрольные вопросы
1. Что такое контент?
2. Назовите основные типы контента и приведите примеры.
3. Для чего в CMS Joomla предназначены категории?
4. Какие форматы вывода категорий существуют?
5. Что представляет собой алиас как опция при создании категории материала?
6. Приведите примеры параметров, по которым можно отфильтровать категории.
�Содержание
Лабораторная работа № 3. Добавление материалов и создание
меню
Цель работы: разработать структуру категорий, научиться их добавлять и создавать
меню.
Средства для выполнения работы:
• аппаратные: компьютер с установленной ОС Windows;
• программные: браузер, сервер.
По окончании выполнения лабораторной работы вам нужно будет предоставить отчет
о выполненной работе. Отчет включает в себя два файла:
1. скриншот одного из созданных материалов;
2. ответы на контрольные вопросы, представленные в конце лабораторной работы.
Теоретические сведения
Менеджер материалов
Информация в Joomla представляет собой материалы принадлежащих категории,
которые, в свою очередь, также могут принадлежать категории и т. д.
Как правило, сначала формируется структура категорий, а затем происходит их
наполнение материалами.
Менеджер материалов предназначен для создания и дальнейшего управления
материалами в Joomla. Каждый материал может быть присоединен к определенной
категории, а также может иметь ряд уникальных настроек. Для того чтобы создать
материалы в созданных категориях, нужно зайти в Менеджер материалов, в
горизонтальном меню панели управления выбрать пункт «Материалы» и подпункт
«Менеджер материалов» (также вы можете воспользоваться иконками быстрого
доступа). Перед вами откроется страница Менеджера материалов, главная часть
которой – список всех материалов сайта и отображение категории, к которой
привязан материал. Здесь вы сможете создавать, редактировать и удалять материалы,
менять сортировку, а также выполнять ряд других действий. В установленных «Демоданных» уже имеется ряд категорий.
Рис. 1. Менеджер материалов
�Содержание
Менеджер материалов состоит из нескольких колонок:
•
Заголовок – отображается заголовок материала, кликнув по которому вы перейдете
к редактированию материала;
•
Состояние – отображает состояние публикации материала (если материал не
опубликован, то он будет храниться в системе, но не будет отображаться на сайте
до тех пор, пока вы не поставите статус «опубликовано»): кликая по значкам,
можно менять статус материалов;
•
Избранные – этим значком помечены материалы, которые отображаются на
главной странице сайта (эта страница помечена как главная в менеджере меню);
•
Категория – выводится название категории, которая присвоена материалу;
•
Порядок – порядок сортировки материалов (кликнув по заголовку колонки можно
вручную настроить порядок материалов);
•
Доступ – отображает уровень доступа материала пользователям;
•
Автор – отображает автора созданного материала;
•
Дата – выводит дату создания материала;
•
Количество просмотров
пользователями сайта;
•
Язык – отображает принадлежность к языку сайта;
•
ID – уникальный номер материала.
–
показывает
количество
просмотров
материала
В верхней части расположен ряд кнопок:
•
Создать – создание новой категории;
•
Изменить – изменение отмеченной категории;
•
Опубликовать – опубликование отмеченной категории;
•
Снять с публикации – снять отмеченные категории с публикации;
•
Избранные – вывести на главную страницу отмеченные материалы;
•
В архив – поместить отмеченные категории в архив;
•
Разблокировать – разблокировка отмеченной категории;
•
В корзину – перемещение отмеченной категории в корзину;
•
Настройки – настройки менеджера категорий;
•
Справка – документация на английском языке.
Под кнопками, в левой части, находятся вкладки для быстрого перехода в менеджер
категорий и к избранным материалам.
Нажав на кнопку Настройки, появится всплывающее окно с множеством вкладок:
�Содержание
Рис. 2. Настройки менеджера материалов
•
•
•
•
•
•
•
•
•
Материалы – задание параметров отображения страницы с материалом на сайте;
Форма редактирования – настройки, определяющие вид формы редактирования
материалов;
Категория – параметры, которые определяют представление одной категории на
сайте;
Категории – эти настройки позволяют задать отображение нескольких категорий;
Блог/Избранное – для установки внешнего вида блога и показа избранных
материалов;
Макет списка – настройки по умолчанию для отображения списка материалов/
категорий;
Общие настройки – устанавливается порядок, сортировка и т. п. для списка и
блога;
Интеграция – определение способа интеграции с другими расширениями Joomla;
Права – установка уровня доступа для различных групп пользователей.
�Содержание
Настройки в указанных вкладках устанавливают значения по умолчанию для
материалов, категорий, блога и др. Однако все эти параметры, кроме интеграции,
могут быть заданы отдельно в пункте меню или при создании материала/категории.
Окно создания материала
Для того чтобы создать новый материал, нужно в меню выбрать Материалы →
Менеджер материалов → Создать материал, появится окно создания материала.
Рис. 3. Окно создания материала
На данной странице присутствуют следующие опции и поля для заполнения:
• Заголовок (title) – название создаваемого материала;
• Алиас – псевдоним в адресной строке браузера (если оставить пустым –
сгенерируется автоматически);
• Категория – указывается категория, к которой принадлежит материал;
• Состояние – опубликован материал или нет;
• Доступ – уровень доступа к создаваемой статье (уровни создаются/изменяются в
Менеджере пользователей);
�Содержание
•
•
•
•
•
Права – установка уникальных прав групп пользователей на работу с материалом;
Избранные – можно добавить в подраздел избранных;
Язык – установить язык для материала.
ID – уникальный номер будет присвоен после сохранения.
Текст материала – содержимое самого материала (текст, изображения и т. д.).
Далее располагаются параметры, разбитые на подгруппы:
• Параметры публикации – здесь выбирается автор статьи, дата создания, начало и
завершение публикации.
• Параметры отображения материала – установка параметров отображения, если
они отличаются от настроек по умолчанию. Параметры отображения материала
влияют на возможности по манипуляции с данным материалом.
• Параметры редактирования – настройка формы создания/редактирования
материалов.
• Метаданные – здесь указываются описание, ключевые слова, параметры robots.txt
и другое.
Подведя курсор мыши к любой из опций, можно получить по ней дополнительную
информацию.
Рис. 4. Справочный материал относительно опций
�Содержание
После того, как необходимые поля (достаточно заполнить только поля «Заголовок»,
«Категория» и «Текст материала») заполнены, нужно нажать кнопку «Сохранить и
закрыть».
Для более удобной навигации по списку материалов можно применить специальные
фильтры.
В поле «фильтр» можно вписать название или часть названия материала для поиска.
Также есть возможность отфильтровать материалы по ряду параметров, которые были
описаны выше, например, вывести только опубликованные материалы из конкретной
категории.
В самом низу страницы вы можете настроить права доступа к материалу [84].
Меню
Основным навигационным средством сайтов, построенных на основе Joomla,
являются меню.
Создавать их можно в любом нужном количестве. Каждое меню может содержать
неограниченное количество пунктов и подпунктов и позволяет фильтровать
выводимые пункты по критерию принадлежности к тому или иному уровню. Каждый
пункт меню может относиться к компоненту или являться прямой ссылкой на
страницу. К пункту меню, в свою очередь, могут быть привязаны определенные
модули и шаблоны. При сохранении демонстрационных данных образцы пунктов
меню присутствуют.
Рассмотрим два примера реализации главной навигации.
Варианты навигации:
1. Статичный каталог или «книжная» структура. Такой вариант навигации подойдет
для публикации на сайте книги, руководства или каталога. Этот вариант подходит
для сайта, состоящего из небольшого количества страниц.
2. Меню, ссылающееся на разделы. В данном варианте навигации предполагается, что
нужно организовать статьи при помощи категорий, а уже категории «привязать» к
пунктам меню. Этот вариант навигации подходит для сайта с тысячью страниц [2,
с. 126].
Модуль меню Joomla
Меню бывают:
1. Мнимые – они не выводятся на сайт, а создаются только для того, чтобы добавить
в них пункты и тем самым создать новые страницы сайта.
2. Действительные – выводятся на сайт и используются для навигации.
Меню выводится на сайт с помощью соответствующего одноименного модуля.
�Содержание
Рис. 5. Выбор типа модуля
После выбора типа модуля нужно перейти к настройкам модуля меню:
Рис. 6. Настройки модуля «Меню»
�Содержание
Заголовок – если заголовок меню.
• Показывать заголовок – соответственно показывать заголовок, указанный выше, на
страницах сайта или нет.
• Позиция – позиция для модуля меню зависит от используемого шаблона Joomla.
Чаще всего определить место под будущее меню не составит труда: под главное
меню выделяется место в шапке сайта, а под дополнительные – левые или правые
колонки.
• Состояние – выбираем «Опубликовано», чтобы сразу после сохранения меню
появилось на страницах сайта.
• Доступ – если это не системное меню для администраторов Joomla, а обычное для
всех пользователей сайта, то оставляем уровень доступа – «Для всех».
• Порядок – определяет порядок следования модулей на одной позиции.
• Начало/завершение публикации – если меню не носит временный характер, то
данные опции трогать не стоит.
• Последние опции не требуют вмешательства пользователя.
Пример создания материала
Создадим материал «Физический уровень» в категории «Эталонная модель OSI». Для
этого перейдем в раздел создания материалов.
•
Рис. 7. Окно создания материала
�Содержание
Заполним необходимые поля. Для вставки текста материала из буфера обмена
воспользуемся редактором html кода. В редакторе html кода изменим размер и цвет
шрифта
Рис. 8. Редактор html кода
Рис. 9. Создание материала
Сохраним и перейдем в раздел Менеджер материалов: Материалы. Как видно,
материал является опубликованным (Состояние – зеленый маркер).
�Содержание
Рис. 10. Отображение созданного материала в Менеджере материалов
Пример связывания категорий, подкатегорий с материалами: свяжем созданные
ранее категории «Эталонная модель OSI», «Эталонная модель TCP/IP» и их
подкатегории с материалами.
Для того чтобы создать новый материал, выберем в меню Материалы→Менеджер
материалов → Создать материал, появится окно создания материала.
Создадим материал «Задачи интернет-уровня» и свяжем его с подкатегорией
«Межсетевой уровень». Для этого нужно в пункте «Категория» выбрать нужную
категорию или подкатегорию и связать ее с материалом:
Рис. 11. Создание материала
�Содержание
Для подкатегории «Транспортный уровень» категории «Эталонная модель TCP/IP»
создадим два материала «Протокол TCP» и «Протокол UDP»:
Рис. 12. Создание материала
Рис. 13. Создание материала
�Содержание
В результате материалы в менеджере материалов будут выглядеть так:
Рис. 14. Менеджер материалов
В правом столбце отображаются материалы Joomla, а в левом – категории Joomla, к
которым принадлежат эти материалы.
Выполнение работы
Задание 1. Создайте материалы для вашего сайта.
Для того чтобы создать материал, нужно из верхнего меню административного
раздела выбрать: Материалы → Менеджер материалов → Создать материал. В
появившемся окне и создается материал.
Рис. 15. Окно создания материала
�Содержание
После заполнения необходимых полей нажмите вверху одну из трех кнопок
«Сохранить», «Сохранить и закрыть» или «Сохранить и создать».
Для редактирования материала достаточно нажать на его заголовке в Менеджере
материалов или отметить галочкой и нажать вверху иконку «Изменить», после чего
выполнить редактирование и сохранить.
Задание 2. Логически связать созданные материалы с категориями и подкатегориями.
Задание 3. Создать меню сайта.
Отображение материалов осуществляется через меню, связанное с той или иной
категорией. Для этого необходимо выполнить следующие действия:
1. Переходим в административном разделе Менеджер меню → Создать меню.
Рис. 16. Пункт административного раздела Меню
2. Заполним необходимые параметры меню и сохраним.
Рис. 17. Параметры меню
3. Создадим новый модуль «Меню». Для этого перейдем в «Менеджер модулей».
Рис. 18. Выбор пункта Менеджер модулей в административном разделе
�Содержание
4. В появившемся окне нажмем «Создать».
5. При выборе типа модуля укажем тип «Меню».
Рис. 19. Выбор типа модуля
И при этом попадем в настройки модуля «меню».
Рис. 20. Настройки модуля «Меню»
6. В «Заголовок» указываем название создаваемого меню.
«Пользовательское меню». Настройте параметр «Показывать заголовок».
Например,
7. В опции «Позиция» нужно определиться с выбором позиции, т. е. необходимо
�Содержание
выбрать местоположение данного меню на сайте. Обратите внимание, что выбор
позиции меню на сайте определяется в соответствии с установленным шаблоном.
Внимание! Joomla основана на Шаблонах. В каждом из них выделяются
позиции, в которые можно разместить ваши модули, например меню.
Параметры настроек и привязку к пунктам меню задайте самостоятельно.
Рис. 21. Модуль «Меню»
Контрольные вопросы
1. Для чего в Joomla предназначен менеджер материалов?
2. Что такое ID материала?
3. Перечислите обязательные для заполнения поля при создании материала.
4. Назовите основное навигационное средство сайтов, построенных на основе Joomla.
5. Охарактеризуйте варианты навигации, которые существуют в Joomla.
6. Какие компоненты могут быть привязаны к пункту меню?
7. Охарактеризуйте возможности в Joomla относительно создания меню.
�Содержание
Лабораторная работа № 4. Создание пунктов меню и установка
баннера
Цель работы: разработать структуру меню, создать пункты меню и настроить
порядок их отображения, связав каждый пункт меню с необходимыми категориями и
материалами и разместить баннер.
Средства для выполнения работы:
•
аппаратные: компьютер с установленной ОС Windows;
•
программные: браузер, сервер.
По окончании выполнения лабораторной работы вам нужно будет предоставить отчет
о выполненной работе. Отчет включает в себя два файла:
1) скриншот всех созданных пунктов меню;
2) скриншот установленного баннера.
Теоретические сведения
Менеджер меню
Joomla позволяет создавать различные меню и привязывать пункты меню практически
к любой части сайта, выводя, например, отдельный материал сайта или категорию с
несколькими материалами, организовывая новостной блог, есть возможность вывода
установленных компонентов, например фото галереи и т. д.
Кроме того, CMS Joomla позволяет создавать неограниченное количество не только
пунктов меню, но и сами меню, например, можно организовать горизонтальное и
вертикальное меню.
Чтобы посмотреть какие меню есть у вас на сайте, достаточно навести стрелку на
пункт «Меню» в горизонтальном меню системы управления.
Рис. 1. Панель управления
�Содержание
Для того чтобы посмотреть созданные в меню пункты, выберите желаемое меню.
Перед вами появится список пунктов меню с их вложенностью, если такая
существует.
Рис. 2. Пункты меню
Список подразделен на несколько колонок:
•
Заголовок – название пункта меню, которое также отображает в меню на сайте;
•
Состояние – опубликован или нет данный пункт меню;
•
Порядок – пронумерованный порядок пунктов меню, возможно задать вручную
собственный порядок или переместить, используя стрелочки;
•
Доступ – уровень доступа к пункту меню, например, можно сделать доступным
определенный пункт меню только зарегистрированным пользователям;
•
Тип пункта меню – показывает, какой тип меню привязан к пункту. Он отвечает за
то, какого рода информация будет выводится в области контента страницы. Типов
всего 29. Каждый тип имеет свои обязательные параметры, которые позволяют
конкретизировать информацию, выводимую на страницы. Например, тип –
материал, отвечает за вывод созданных материалов в область контента страницы,
его обязательные параметры позволяют выбрать, какой именно из имеющихся
материалов будет добавлен на эту страницу.
�Содержание
Рис. 3. Выбор типа пункта меню
•
Главная – возможно назначить любой пункт меню в качестве главной страницы;
•
Язык – показывает язык пункта меню;
•
ID – уникальный номер пункта меню.
Настройка порядка отображения пунктов меню
Список пунктов меню является строго упорядоченным – соблюдается иерархия и
порядок следования.
Иерархия пунктов меню представляет своего рода древо, в котором каждый пункт
является братом (стоит на одной ступени иерархии), родительским (более высокий
уровень) или дочерним (стоит на ступень ниже и является подпунктом родительского
элемента) элементом для других пунктов меню.
�Содержание
Рис. 4. Иерархия пунктов меню
В качестве примера на рисунке для пункта «Физический уровень»: «Уровень передачи
данных», «Сетевой уровень», «Транспортный уровень», «Сеансовый уровень»,
«Уровень представления» и «Прикладной уровень» – братья, а «Эталонная модель
OSI» – родительский элемент.
Порядок следования определяет расположение пунктов в меню, стоящих на одной
ступени иерархии и относящихся к одному родительскому элементу. Порядок можно
поменять, используя стрелки, или вручную, введя номера в одноименном столбце
списка доступных пунктов меню.
Медиа-менеджер
Медиа-менеджер – это миниатюрная система управления цифровыми активами в
составе Joomla. Для того чтобы работать с контентом, потребуется хранилище для
файлов. Под файлами подразумеваются изображения, документы в формате PDF и
многое другое. Обычно цифровые активы состоят из файлов и дополнительных
метаданных. Медиа-менеджер – простой в использовании инструмент для управления
ими.
Joomla на сервере под медиафайлы выделяет отдельную папку /images. Работать с ней
можно как напрямую, например через ftp-клиент FileZilla, так и через
административный раздел Joomla. В административном разделе нужно выбрать
Материалы→Медиа-менеджер.
�Содержание
Рис. 5. Медиа-менеджер
В разделе медиа-менеджера справа можно увидеть дерево каталогов, которое
располагается в папке /images, слева содержимое выбранного каталога, а снизу кнопка
«Создать каталог» и форма для загрузки новых файлов на сервер.
Медиа-менеджер работает через браузер и отображает файлы в виде эскизов или в
виде списка. Папки открываются кликом. Вы можете создать столько папок, сколько
захотите. В режиме отображения в виде списка можно удалять папки и файлы.
В тулбаре расположены три кнопки:
•
Справка – краткая инструкция по работе с медиа-менеджером на английском языке;
•
Удалить – удаляет выбранный каталог или файл. Заметьте, здесь нет никакой
корзины, поэтому удаляется сразу и навсегда.
•
Настройки – выбор и задание определенных параметров.
�Содержание
Настройки медиа-менеджера
Рис. 6. Окно настроек медиа-менеджера
•
Разрешенные расширения – список расширений файлов через запятую, доступных
для загрузки на сервер;
•
Максимальный размер (в МB) – Joomla будет препятствовать загрузке файлов,
размер которых превышает указанную в этом пункте величину. Дабы снять
ограничения, укажите «0». Кроме этого, сам сервер может накладывать свои
ограничения на максимально разрешенный размер загружаемых файлов;
•
Путь к каталогу с файлами и с изображениями – можно переопределить папку для
хранения медиа-файлов. Лучше оставить значение данного пункта по умолчанию.
Далее идут опции фильтрации и ограничений:
•
Ограничение
загрузки
–
делает
недоступной
загрузку
медиа-файлов
для
�Содержание
пользователей с правами ниже «Менеджер»;
•
Проверять тип файла (MIME) – осуществлять фильтрацию загружаемых на сервер
файлов по их типу и расширению. Разрешенные/запрещенные типы и расширения
указываются в опциях ниже.
•
Также имеется фильтрация изображений, которая производится по расширению –
опция «Разрешенные расширения изображений»;
•
Использовать Flash-загрузчик – позволяет загружать несколько файлов за один раз
[90].
Выполнение работы
Задание 1. Разработайте структуру меню, создайте пункты меню и настройте порядок
их отображения, связав каждый пункт меню с необходимыми категориями и
материалами.
Для того чтобы наполнить пунктами созданное на предыдущей лабораторной работе
меню, в административной панели выберите созданное меню из списка уже
имеющихся и нажмите на кнопку «Создать пункт меню».
Рис. 7. Окно создания пункта меню
Перед вами появится страница со следующими значениями:
•
Тип пункта меню – нажав на кнопку «Выбрать», появится окно с выбором типа
меню.
•
Заголовок меню – заголовок пункта меню.
•
Алиас – название пункта в адресной строке (генерируется автоматически).
�Содержание
•
Примечание – пользовательская заметка.
•
Ссылка – ссылка пункта меню.
•
Состояние – опубликован пункт или нет.
•
Доступ – уровень доступа к пункту.
•
Меню – к какому меню относится данный пункт.
•
Родительский элемент – выбор родительского пункта для создания подпункта.
•
Целевое окно – возможность выбрать, как будет открыта страница.
•
Главная страница – возможность сделать пункт меню главной страницей.
•
Язык – язык пункта.
•
Стиль шаблона – выбор стиля шаблона.
Самые распространенные типы пунктов меню – это произвольный материал или блог
материалов категории.
Чтобы выбрать тип пункта меню, нужно нажать на кнопку «Выбрать» в строке «Тип
пункта меню».
Рис. 8. Выбор типа пункта меню
�Содержание
Перед вами появится окно с возможными вариантами типов пунктов меню. Для того
чтобы привязать к пункту меню определенный материал сайта, нужно выбрать тип
«Материал». Далее появится страница с возможностью привязать к пункту меню
определенный материал.
Рис. 9. Создание пункта меню
Для того чтобы выбрать необходимый материал для пункта меню, в правой колонке
«Обязательные параметры» нажмите на кнопку «Выбрать/изменить».
Рис. 10. Создание пункта меню
В появившемся окне выберите тот материал, который хотите привязать к пункту
меню. Не забудьте заполнить поле заголовка меню и задать другие необходимые
параметры. Для сохранения пункта меню нажмите на кнопку «Сохранить и закрыть»
либо «Сохранить и создать» [84].
Установка баннера
Задание 2. Установить созданный баннер в верхней части сайта вместо демо-баннера.
На рис. 11 пример того, как выглядит демо-баннер сайта.
�Содержание
Рис. 11. Исходный баннер сайта
Для того чтобы установить собственный баннер сайта вместо баннера установленного
шаблона:
1. Выберите в меню административного раздела Расширения→Менеджер шаблонов.
2. Запомните название установленного по умолчанию шаблона для области системы –
сайт.
Рис. 12. Список установленных шаблонов
�Содержание
3. Откройте папку templates, в которой хранятся шаблоны для сайта. Если Joomla
установлена на локальном сервере, то полный путь до данной папки: C:/webservers/
home/localhost/www/joomla/templates/
Если Joomla установлена на сервере АлтГПУ, то путь до данной папки: Y:/www/
templates/
4. В папке templates найдите папку, которая соответствует названию установленного
по умолчанию шаблона.
5. В папке вашего шаблона откройте папку images.
6. В данной папке найдите картинку баннера, установленного по умолчанию.
Рис. 13. Файлы папки images
7. Замените картинку в папке images на собственную картинку для баннера с тем же
именем и размерами.
�Содержание
Рис. 14. Баннер сайта
8. Обновите в браузере вид сайта.
Рис. 15. Отображение нового баннера на сайте
�Содержание
Лабораторная работа № 5. Модули и расширения в Joomla
Цель работы: научиться использовать модули и располагать их на сайте с учетом
выбора позиции.
Средства для выполнения работы:
•
аппаратные: компьютер с установленной ОС Windows;
•
программные: браузер, сервер.
По окончании выполнения лабораторной работы вам нужно будет предоставить отчет
о выполненной работе. Отчет включает в себя два файла:
1) скриншот размещенного на сайте модуля;
2) ответы на контрольные вопросы.
Теоретические сведения
Менеджер расширений
Для перехода к менеджеру расширений достаточно нажать на одноименную кнопку в
главной панели управления, а также из
административного
раздела:
Расширения→Менеджер расширений.
Менеджер расширений разделен на 5 вкладок:
Рис. 1. Вкладки менеджера расширений
По умолчанию откроется первая вкладка для установки новых расширений.
Существует 3 способа установки расширений: Загрузить файл пакета, Установить из
каталога, Установить из URL.
�Содержание
Вкладка Установка
•
Загрузить файл пакета
Для установки нажать кнопку «Выберите файл» и найти на компьютере
предварительно скачанный архив с расширением. После этого нажать «Загрузить» и
установить.
Рис. 2. Установка расширений: Загрузить файл пакета
•
Установить из каталога
Здесь нужно указать путь к каталогу на сервере, в котором располагается архив с
расширением. Для установки нажать «Установить».
Рис. 3. Установка расширений: Установить из каталога
•
Установить из URL
Здесь указывается абсолютный путь (ссылка) на архив расширения, после указания
нажать кнопку «Установить».
�Содержание
Рис. 4. Установка расширений: Установить из URL
Вкладка Обновление
Рис. 5. Вкладка Обновление
При наличии новых обновлений системы или расширений они будут отображены
здесь. Для установки обновления нужно выделить объект галочкой и нажать наверху
кнопку «Обновить».
Вкладка Управление
После перехода на эту вкладку откроется таблица со всеми расширениями,
установленными на сайте. Управлять ими можно с помощью верхних кнопок:
�Содержание
Рис. 6. Управление расширениями
•
для выключения выбранного расширения нужно нажать кнопку «Выключить»;
•
включение происходит аналогичным образом, также можно нажимать кнопку в
колонке «Состояние»;
•
Обновить Кэш – для обновления информации о выбранных объектах;
•
для полного удаления
«Деинсталлировать».
выбранного
расширения
нужно
нажать
кнопку
В большом списке расширений тяжело найти нужное, чтобы быстро найти искомый
объект, достаточно ввести его название в поле Поиска и выполнить поиск.
Если название расширения неизвестно, то удобно будет воспользоваться навигацией:
•
в первом выпадающем списке выбирается расположение объекта (сайт или
административный раздел);
•
во втором – выбор состояния (включено или отключено расширение);
•
дальше выбирается его тип (компонент, модуль, шаблон, файл и т. д.);
•
последний список удобен для поиска плагинов, здесь выбирается каталог
назначения.
Вкладка Поиск
Если расширение, например модуль, не был установлен, а его файлы просто были
загружены в папку с модулями, то он работать не будет. Для его активации нужно
выполнить поиск среди расширений для обнаружения с последующей установкой.
Если имеются подобные расширения, нужно нажать кнопку «Найти» и при
обнаружении объектов выполнить их установку.
�Содержание
Рис. 7. Вкладка Поиск
Вкладка База данных
Здесь отображается актуальная версия Joomla, драйвер базы данных и информация о
последних изменениях в базе данных. В случае конфликтов появится кнопка
«Исправить», с помощью которой можно решить некоторые проблемы.
Рис. 8. Вкладка База данных
Вкладка Предупреждения
В случае обнаружения системой конфликтов здесь будут указаны предупреждения о
проблемах, которые по возможности должны быть устранены.
Рис. 9. Вкладка Предупреждения
�Содержание
Кнопка настройки:
•
в первой вкладке устанавливается в часах кэширование информации об
обновлениях;
•
во второй можно установить права доступа пользователей к менеджеру
расширений.
Менеджер модулей
Модули предназначены для отображения текста, изображений и другой информации в
установленных позициях на сайте. Для управления модулями в административной
панели существует специальный раздел – Менеджер модулей. Из менеджера модулей в
Joomla можно изменять параметры в установленных модулях, отключать их и
создавать новые.
В менеджер модулей можно перейти из главной панели управления, нажав на
соответствующую иконку или из верхнего меню административного раздела:
Расширения→Менеджер модулей.
Вы увидите таблицу из установленных модулей, а также их позицию на сайте,
состояние (опубликовано / не опубликовано) и другие параметры, которые
устанавливаются при настройке модуля.
Рис. 10. Список модулей
Настройка модуля
Все модули имеют стандартные и индивидуальные параметры. Стандартные
параметры, одинаковые для каждого модуля, и имеют вид:
�Содержание
Рис. 11. Стандартные параметры модуля
•
•
•
•
•
•
•
•
Заголовок – Название модуля (можно изменить на свое).
Показывать заголовок – будет ли показано название модуля на сайте.
Позиция – выбор места на сайте, где будет отображаться модуль (в окне выбора
позиции есть навигация, которая ускоряет поиск нужной позиции).
Состояние – здесь выбирается, опубликован ли модуль или находится в корзине.
Доступ – установка права доступа для определенных групп.
Порядок – если на выбранной позиции уже расположены другие модули, то здесь
можно установить порядок.
Начало публикации – установка времени, когда будет опубликован модуль.
Завершение публикации – устанавливается время, когда модуль будет снят с
публикации.
�Содержание
Язык – определения языка для модуля.
• Примечание – для добавления пометки, которая будет отображена в списке модулей
в административном разделе.
• ID – уникальный идентификатор, присваивается после сохранения.
• Описание модуля – отображается информация о назначении модуля.
Далее расположены вкладки Настройки и Привязка к пунктам меню. В пункте
Привязка модуля из выпадающего списка выбирается состояние модуля на страницах
пунктов меню. Будьте внимательны, часто после публикации модуля пользователи не
видят его на сайте – не забывайте сделать модуль доступным для выбранных или всех
страниц.
Выполнив настройку модуля, нужно сохранить изменения.
Кроме редактирования установленных модулей в Менеджере модулей можно
создавать новые. Для создания модуля нажмите на кнопку «Создать» и выберите один
из типов модуля.
С помощью кнопки «Дублировать» можно создавать копии выбранных модулей.
Дублированные модули сохранят все настройки, но будут не опубликованы.
Кнопка «Настройки» содержит лишь настройку прав доступа на управление
расширениями для различных групп пользователей.
•
Навигация и обработка модулей
Для поиска модуля по заголовку введите его название в поле Поиск и нажмите
«Искать». Кроме того, для выбора определенных модулей в Joomla предусмотрена
удобная система Фильтрации:
Рис. 12. Панель навигации
�Содержание
Сначала выбирается взаимодействие модуля – Сайт или Панель управления. Затем
выбирается состояние – опубликован, не опубликован или в корзине. С помощью
следующего выпадающего списка можно отобрать модули определенной позиции.
Далее выбирается тип модуля, который, как правило, совпадает с заголовком.
Последние две опции определяют отображение модулей по уровню доступа и языку.
Над списком модулей расположена Пакетная обработка.
Рис. 13. Пакетная обработка выбранных модулей
Отметив модули галочкой, для них можно изменить уровень доступа, язык и позицию.
После выбора нужного(-ых) критерия(-ев) установить точку на Копировать (при этом
будут созданы копии с новыми параметрами) или Переместить (все изменения будут
выполнены для отмеченных модулей) и нажать «Выполнить» [59].
Модули для материалов и категорий
Материалы – Материалы в архиве
Данный модуль представляет собой календарь, в котором заключены материалы,
попавшие в архив. В параметрах выбирается количество месяцев для отображения.
Материалы – Новости
Модуль позволяет отображать материалы из определенной категории. В настройках
отбираются категории для вывода, выводить или нет изображение, настройка
заголовка, выбирается количество материалов и их порядок.
�Содержание
Материалы – Последние новости
В этом модуле показываются последние (созданные, опубликованные, измененные)
материалы. В основных параметрах выбирается необходимая категория, количество
материалов и их порядок, способ показа избранных материалов и авторы.
Материалы – Самые читаемые
В модуле будут представлены материалы, которые имеют наибольшее количество
просмотров (хитов). Настройки: выбор категории, количества материалов и
отображать или нет избранные материалы.
Материалы – Связанные материалы
Здесь отображаются ссылки на материалы, связанные со статьей, которая открыта на
странице. Связи зависят от ключевых слов, т. е. чтобы связать материалы, у них
должны быть хотя бы одно общее ключевое слово (словосочетание). Ключевые слова
указываются в Метаданных. В основных параметрах можно выбрать, показывать или
нет дату создания.
Материалы – Список материалов категории
Модуль, имеющий большое количество настроек и предназначенный для показа
списка материалов категорий. Параметры для удобства разделены на подразделы:
• Основные параметры
1) обычный – отображает материалы выбранной категории с настроенными
параметрами;
2) динамический – показ материалов, которые относятся к открытой на странице
категории.
• Параметры динамического режима: если выбрать Показать, то модуль будет
отображаться только на страницах категорий.
• Параметры фильтрации: выбирается отображение избранных материалов, отбор
включенных/исключенных категорий и определение показа подкатегорий,
фильтрация по автору, указание ID материалов, которые нужно исключить, и
фильтр по дате.
• Параметры сортировки: сначала выбирается порядок показа, а затем способ по
возрастанию или убыванию.
• Параметры группировки: материалы могут быть сгруппированы по дате, автору и
категории, а затем выстроены по возрастанию или убыванию.
• Параметры отображения: выбор способа показа заголовка, даты, определение
показа различных элементов, установка ограничения текста и настройка
Подробнее.
Категории
Модуль предназначен для показа подкатегорий выбранной категории. В основных
параметрах выбирается Родительская категория, отображение описания и вложенных
подкатегорий, а также количество показываемых подкатегорий и глубина вложенности
(до какого уровня подкатегории будут отображаться в модуле).
�Содержание
Модуль «HTML-код»
Данный модуль позволяет выводить на сайте HTML-код или его фрагмент (в
большинстве случаев для правильной работы кода визуальный редактор должен быть
отключен). В параметрах указывается, требуется ли обработка плагинами, а также
можно загрузить фоновое изображение.
Модуль «Обертка (Wrapper)»
Модуль позволяет выводить выбранное содержимое (сайт или файл) в IFrame-окне. В
настройках указывается ссылка на ресурс, ширина и высота окна и использование
полос прокрутки.
Рис. 14. Модуль «Обертка (Wrapper)»
Модуль «Произвольное изображение»
Этот модуль способен отображать в заданной позиции случайное изображение из
заданной папки. В параметрах указывается формат изображения, путь к папке, ширина
и высота. Также здесь можно прикрепить ссылку на сторонний сайт или файл.
Модуль «Переключение языков»
Рис. 15. Модуль «Переключение языков»
�Содержание
Данный модуль показывает доступные языки контента, между которыми можно
переключаться. Доступные языки можно посмотреть в Менеджере языков во вкладке
Языки контента. Для работы модуля должен быть настроен и активирован плагин
Система – Фильтр языков.
В основных параметрах модуля указывается начальный и заключительный текст, если
включить выпадающий список, то остальные параметры будут недоступны. Если
выпадающий список отключен, то становятся доступными:
•
отображение флагов;
•
показ строкой;
•
активный язык;
•
полное название языка.
Модуль «Статистика»
В этом модуле выводится информация о сервере, информация о пользователях,
просмотрах, статьях и ссылках. В настройках выбираются поля для показа –
информация о сервере, о сайте и счетчик просмотров, показания которого можно
увеличить, указав число в поле ниже.
Модуль «RSS-ленты»
Данный модуль создает RSS-ленту для страницы, на которой он размещен. В
основных параметрах можно указать вступительный текст и выбрать формат ленты –
RSS 2.0 или Atom 1.0.
Модуль «RSS-лента новостей»
Этот модуль имеет похожее название с предыдущим, однако выполняет обратную
функцию: показывает загруженную ленту новостей.
В основных параметрах указывается путь к RSS-потоку, выбор отображения
заголовка, описания и логотипа ленты новостей, указание количества выводимых
материалов и ограничение слов (если 0, то будет отображаться весь текст).
Модуль «Поиск»
Предназначен для добавления в выбранной позиции формы поиска. В параметрах
можно указать заголовок перед полем поиска, ширину этого поля, текст по
умолчанию, добавление кнопки поиска, указывая ее позицию, и текст на ней. При
включении OpenSearch (автопоиск) некоторые браузеры смогут выполнять поиск по
сайту.
Модуль «Умный поиск»
С помощью этого модуля происходит поиск по сайту с использованием современного
мощного поискового механизма.
�Содержание
Рис. 16. Модуль «Умный поиск»
В параметрах модуля выбирается фильтр, показывать или нет автоматические
подсказки и расширенный поиск. Его значения означают:
•
Ссылка на компонент – будет показана ссылка на отдельную страницу компонента.
•
Показать – инструменты расширенного поиска будут доступны в модуле.
•
Скрыть – расширенный поиск не доступен.
Модуль «Баннеры»
Рис. 17. Модуль «Баннеры»
Баннеры, которые созданы в компоненте Баннеры, отображаются в этом модуле. В
основных параметрах устанавливается:
•
Где открывать ссылку – способ открытия ссылки.
�Содержание
•
Кол-во – количество баннеров для показа в модуле.
•
Клиент – выбор определенного клиента.
•
Категория – категории баннеров для показа в модуле.
•
Поиск по тегу – отображение баннеров, исходя из ключевых слов.
•
Случайно – выбор сортировки по порядку или случайно.
•
Текст заголовка – текст или HTML-код идет перед баннерами.
•
Нижний колонтитул – текст или HTML-код отображается после баннеров.
Модуль «Ссылки»
Для вывода ссылок определенной категории компонента Ссылки. В настройках
указывается категория ссылок, количество, порядок и направление показа, способ
открытия ссылки в целевом окне. Можно закрыть или открыть индексацию (follow/
nofollow), отображать или скрыть описание и количество просмотров, а также вести
или нет подсчет кликов [59].
Пользовательские модули
Вход на сайт
Модуль для авторизации и регистрации на сайте. В основных параметрах можно
указать вступительный и заключительный текст, страницу перенаправления при входе/
выходе, отображать или нет приветствие, в котором выбрать показ имени или логина
пользователя. Выбирая защищенную форму регистрации, на сайте должен быть
настроен протокол https.
Кто на сайте
Данный модуль отображает количество авторизованных пользователей и гостей,
которые находятся на сайте. В параметрах выбирается режим показа – количество
посетителей / логины пользователей / и то и другое.
Новые пользователи
Этот модуль предназначен для показа последних зарегистрированных пользователей.
В настройках выбирается количество человек для показа и фильтр групп [59].
Примеры модулей и их предназначения
1. Модуль VTEM Shutter
Данный модуль предназначен для создания на сайте слайд-шоу с интересным
эффектом. Данное расширение, которое совместимо со всеми версиями от Joomla 1.5
до Joomla 2.5, позволяет поочередно отображать изображения с переключением
между ними – эффектом жалюзи. Модуль имеет гибкие и в то же время простые в
настройке параметры.
�Содержание
Рис. 18. Отображение модуля на сайте
Особенности модуля
• Установка необходимых размеров (высоты/ширины).
• Изображение в модуле растягивается по всей ширине.
• Выбор одного из семи эффектов переходов между картинками.
• Настройка времени открытия/закрытия жалюзи.
• Показ изображений из указанной папки.
Установка и настройка
Данный модуль устанавливается таким же способом, как и остальные расширения,
после чего нужно активировать его в Менеджере модулей, а также приступить к
настройкам:
Рис. 19. Окно настроек модуля
�Содержание
Module unique ID – уникальный ID, если планируется использование модуля более 1
раза.
• Width – ширина модуля (в пикселях).
• Height – высота модуля (в пикселях).
• Images Directory – путь к папке с изображениями.
• Sort Criteria – тип сортировки (по алфавиту или по дате создания).
• Sort Order – сортировать по возрастанию/убыванию или случайно.
• Manual Sort Order – сортировка вручную (например, image1.jpg, img2.jpg...).
• Shutter open – время открытия жалюзи (в мс).
• Shutter close – скорость закрытия жалюзи (в мс).
• Shutter image – выбор 1 из 7 стилей жалюзи.
• Jquery load – загружать или нет библиотеку jQuery.
• Module Class Suffix – указание дополнительного суффикса к классу модуля.
2. Модуль BJ Calendar with ToolTips
BJ Calendar with ToolTips – модуль Календарь для Joomla. Данный модуль совместим
со всеми браузерами и поддерживает специальные символы.
•
Рис. 20. Окно настроек модуля
�Содержание
Рис. 21. Окно настроек параметров модуля
Рис. 22. Отображение модуля на сайте
�Содержание
3. Модуль S5 Quick Contact
Рис. 23. Модуль Обратная связь
С помощью модуля S5 Quick Contact можно отобразить контактную форму обратной
связи для ваших посетителей. Используется как один из способов оставаться в
контакте с вашими посетителями. Модуль полностью имеет настраиваемые параметры
языка, отправляет письма на указанный аккаунт администратора, а также в модуль
встроены три способа защиты от спама.
Выполнение работы
По окончании работы вышлите на проверку скриншот размещенного модуля.
Задание. Разместить хотя
соответствующую позицию.
бы
один
модуль
на
сайте,
выбрав
для
него
Пример установки модуля Art clock:
1. В меню административной панели выберем Расширения→Менеджер расширений.
2. На вкладке Установка в поле Загрузить файл пакета кликнем Выберите файл (T:/
freesoft/joomla/модули/joomla 3.1.5).
3. Кликнем Открыть→Загрузить и установить.
4. В меню административной панели выберем Расширения→Менеджер модулей.
5. Кликнем по кнопке Создать.
6. Выберем тип модуля Art Clock.
�Содержание
Рис. 24. Выбор типа модуля
7. Заполните необходимые поля по своему усмотрению.
Рис. 25. Модуль Art Clock
�Содержание
8. Кликнем Сохранить и закрыть.
9. В результате модуль будет отображаться на сайте в виде:
Рис. 26. Модуль Art Clock
Контрольные вопросы
1. Назовите основные способы установки расширений.
2. Для чего предназначены модули в Joomla?
3. Какие параметры имеют модули?
4. Приведите примеры модулей, относящихся к классу «Модули для материалов и
категорий».
5. Для чего предназначен модуль «Обертка (Wrapper)»?
6. С помощью какого модуля можно осуществлять вывод на сайте HTML-кода или его
фрагмента?
7. Какой стандартный параметр модуля позволяет выбрать место на сайте? Где
именно будет отображаться модуль?
�Содержание
Лабораторная работа № 6. Плагины в Joomla
Цель работы: научиться устанавливать плагины и осуществлять их настройки.
Средства для выполнения работы:
• аппаратные: компьютер с установленной ОС Windows;
• программные: браузер, сервер.
По окончании выполнения лабораторной работы вам нужно будет предоставить отчет
о выполненной работе. Отчет включает в себя два файла:
1. скриншот установленного плагина;
2. ответы на контрольные вопросы.
Теоретические сведения
Менеджер плагинов
Плагин (plug-in) – это небольшая вспомогательная программа, которая предназначена
для расширения возможностей базовой программы.
В установленном сайте имеется большое количество различных плагинов. Зная
предназначение плагина и установив его, можно расширить потенциал использования
сайта в целом.
Для управления плагинами в Joomla предусмотрена функция «Менеджер плагинов».
Вход осуществляется через меню административного раздела→«Расширения» →
«Менеджер плагинов».
Рис. 1. Менеджер плагинов
�Содержание
В таблице отображены графы:
•
«Название плагина» – перечислены все имеющиеся плагины на сайте.
•
«Состояние» – показано состояние плагина на данный момент (в работе или
выключено).
•
«Тип» – предназначение плагина.
•
«Элемент» – принадлежность плагина к основной программе.
•
«Доступ» – показана доступность плагина.
•
«ID» – идентификатор плагина в сайте.
Управление плагинами осуществляется при помощи кнопок: «Изменить», «Включить»,
«Выключить», «Разблокировать».
Встроенные (стандартные) плагины Joomla 2.5
В предыдущих версиях Joomla плагины назывались мамботами, поэтому это одно и то
же. Плагин – это определенный программный код, который будет выполняться только
при возникновении определенного события. Например, таким событием может быть
встреченная в тексте статьи команда вызова данного плагина, который в результате
вставит в содержимое статьи что-то свое. Плагины расширяют возможности
компонентов. Термин плагин обозначает не только разновидность расширения
CMS Joomla: в браузерах также есть плагины, например, для воспроизведения видео.
Все плагины, используемые в Joomla, можно разбить на одиннадцать групп.
1. «Аутентификация» (authentication).
2. «CAPTCHA» (captcha).
3. «Контент» (content).
4. «Кнопки» (editors-xtd).
5. «Редакторы» (editors).
6. «Расширения» (extension).
7. «Умный поиск» (finder).
8. «Панель иконок» (quickicon).
9. «Поиск» (search).
10.«Система» (system).
11.«Пользователь» (user).
Англоязычные названия групп совпадают с названиями папок, в которых хранятся
файлы плагинов. Например, те, что имеют отношение к аутентификации, хранятся в
�Содержание
папке по адресу «/plugins/authentication/». Плагины, в отличие от модулей, не создаются
в административном разделе: это невозможно, да и необходимости в этом нет. Они
устанавливаются при помощи менеджера расширений.
Плагины группы «Аутентификация» (Authentication)
Авторизация – это процесс подтверждения прав пользователя на выполнение
некоторых действий. Ей предшествует аутентификация, цель которой – установить,
верны ли реквизиты доступа входящего в систему. Для успешной аутентификации
пользователю необходимы логин и пароль. Успешная авторизация объясняется его
принадлежностью к пользовательской группе с определенными правами. Joomla
предлагает три варианта аутентификации, реализуемые соответствующими плагинами
Эти плагины отключать не рекомендуется, так как отключив все плагины этого типа,
вы рискуете потерять доступ к сайту.
Плагин «Joomla»
Данный плагин реализует стандартный для Joomla метод аутентификации – при
помощи логина и пароля.
Плагин «GMail»
Плагин «GMail» позволяет входить в систему, пользуясь логином и паролем учетной
записи для сервисов Google. Предварительная регистрация для этого не требуется.
Учетная запись создается при первой аутентификации. Пароль хранится в базе данных
в зашифрованном виде, поэтому «взломать» учетную запись пользователя сервисов
Google, зарегистрированного на сайте под управлением Joomla, невозможно.
Использование этого плагина упрощает процесс получения доступа к системе. К
сожалению, в модуле аутентификации нет подсказки о том, что такой ее вариант
возможен. Это придется указать отдельно, например, в подписи или предваряющем
тексте.
Плагин «LDAP»
LDAP – это протокол прикладного уровня для получения данных из службы каталогов
и их (данных) редактирования. Он используется компаниями для управления
корпоративной информацией.
Чтобы воспользоваться этим типом аутентификации, потребуется сервер LDAP, а
также особые настройки плагина LDAP.
Плагины группы «Captcha»
Плагин «reCAPTCHA»
«reCAPTCHA» появился в текущей версии Joomla. Плагин предназначен для
проведения теста CAPTCHA, цель которого – выяснить, кто его проходит: компьютер
или человек. Возможно, вы сталкивались с подобными тестами. Это цветные
изображения в формах регистрации, содержащие искаженный текст. CAPTCHA
�Содержание
используется на многих сайтах для защиты от спам-ботов, автоматических программ
для генерации спама. Дело в том, что компьютерные программы не так сильны в
распознании текста, содержащего искаженные символы, как человек. Плагин
«reCAPTCHA» использует одноименный сервис. Для его запуска нужны открытый и
секретный ключи, которые можно получить, перейдя по следующему адресу: http://
google.com/recaptcha.
Плагины группы «Контент» (content)
Все плагины группы «Контент», кроме плагина «Joomla», работают со статьями, а
также с модулем вывода произвольного HTML.
Плагин «Умный Поиск»
Благодаря этому плагину возможно индексирование контента. Он появился в версии
Joomla 2.5 и является основой «Умного поиска».
Плагин «Joomla»
У плагина «Joomla» – две функции.
1. Препятствовать удалению категории, если она не пуста. Категория не является
пустой, если к ней относится хотя бы одна статья или подкатегория. Отключить
эту функцию можно в настройках плагина в форме «Основные параметры».
2. Отправлять
сообщения всем подписанным на системные рассылки
пользователям в случае сохранения статьи, созданной на стороне посетителей.
Плагин «Загрузка модулей»
Этот плагин вставляет в текст HTML-вывод модулей, относящихся к определенной
позиции шаблона. При помощи него, например, удобно выводить рекламу прямо в
статьях.
Плагин «Скрытие электронной почты»
Плагин превращает вводимые при создании статей адреса электронной почты в
ссылки, которые видят люди, но вряд ли «видят» спам-боты. Для маскировки
используется JavaScript.
Плагин «Подсветка кода (GeSHi)»
Подсветку кода, заключенного в тег <pre>, [с соответствующим атрибутом] реализует
плагин, построенный на основе GeSHi.
«Разрыв страницы»
Плагин предназначен для разбиения статьи на несколько фрагментов для вывода на
нескольких страницах. Помимо разбиения на страницы плагин позволяет задавать
заголовки и псевдонимы заголовков для внутристатейного оглавления. Настройка
разбиения производится во всплывающем окне разрыва страницы в интерфейсе
�Содержание
создания/редактирования статей. В редакторе метка разрыва выглядит как обычный
горизонтальный разделитель. В коде она представлена тегом подобным следующему:
<hr title="Page Title" alt="Table of Contents Alias" class="system-pagebreak" />
Для использования плагина необходимо активировать еще и плагин «Разрыв
страницы» в группе «Кнопки» (editors-xtd).
Плагин «Навигация по страницам»
Этот плагин выводит под статьями навигационные ссылки «Предыдущая» и
«Следующая».
Плагин «Рейтинг»
Плагин «Рейтинг» позволяет посетителям оценивать статьи.
Плагины группы «Редакторы» (Editors)
В исходную комплектацию CMS Joomla входят два редактора. Редактор по умолчанию
задается в общих настройках системы: меню административного раздела → пункт
«Сайт» → подпункт «Общие настройки» → вкладка «Сайт» → панель «Настройки
сайта» → поле «Редактор по умолчанию». Если тому или иному пользователю не
подходит редактор по умолчанию, то его можно в индивидуальном порядке изменить
в настройках его учетной записи: текстовое меню административного раздела →
пункт «Пользователи» → подпункт «Менеджер пользователей» → учетная запись
пользователя → форма «Основные настройки» → поле «Редактор».
Плагин редактора «CodeMirror»
«CodeMirror» [англоязычный сайт проекта] – это библиотека JavaScript, которую
можно использовать для создания относительно приятного редактора такого
контента, как компьютерные программы, разметка HTML и пр. Для включения
редактора «CodeMirror» необходимо активировать одноименный плагин. Настройка
редактора производится на странице параметров плагина в форме «Основные
параметры».
Плагин «Без редактора»
Этот плагин необходимо активировать, если вы хотите, чтобы в качестве редактора
выступало обычное многострочное текстовое поле.
Плагин TinyMCE
TinyMCE – межплатформенный, браузерный редактор текста и HTML, работающий в
режиме WYSIWYG. В Joomla TinyMCE является редактором по умолчанию.
Плагины группы «Кнопки» (Editors-Extd)
В данную группу входят четыре плагина. Их задача – вывод кнопок под окном
редактора на страницах создания/редактирования статей.
�Содержание
Плагин «Материал»
Плагин выводит кнопку вставки ссылки на уже опубликованную статью. Клик по
кнопке открывает всплывающее окно со списком статей.
Плагин «Изображение»
Данный плагин предназначен для вывода кнопки вставки изображений. Клик по
кнопке открывает всплывающее окно, при помощи которого можно выбрать
изображение из папки на сайте или загрузить его, затем задать параметры вывода и
вставить в статью.
Плагин «Разрыв страницы»
Кнопка, выводимая данным плагином, открывает окно функции «Разрыва страницы»
с полями для ввода заголовка и псевдонима заголовка для внутристатейного
оглавления.
Плагин «Подробнее»
Плагин выводит под окном редактора кнопку для отделения анонса от основного
текста и вставки ссылки «Подробнее».
Плагины группы «Расширение» (Extension)
Плагины этой группы предназначены для управления расширениями.
Плагин «Joomla»
Плагин «Joomla» работает с сайтами обновления расширений.
Плагины группы «Умный поиск» (Finder)
Англоязычное название группы, «finder», происходит от названия расширения,
которое, войдя в исходную комплектацию Joomla, стало называться «Умный
поиск» (Smart search). Плагины «Умный поиск» предназначены для поиска контента,
относящегося к менеджеру материалов (статьи), менеджеру категорий, а также к
компонентам «Ссылки», «Баннеры», «Контакты», «Ленты новостей», и должны быть
активированы для того, чтобы производился поиск. Для поиска контента,
относящегося к сторонним расширениям, потребуются специально созданные для них
плагины.
Плагины группы «Панель иконок» (Quickicon)
Задача плагинов этой группы – проверка наличия новых версий системы и сторонних
расширений. В случае, если таковые имеются, на главной странице
административного раздела появятся предупреждающие об этом пиктограммы.
�Содержание
Плагины группы «Поиск» (search)
Плагины этой группы относятся к компоненту «Поиск», традиционному поисковому
компоненту Joomla. Они предназначены для поиска контента, относящегося к
менеджеру материалов (статьи), менеджеру категорий, а также к компонентам
«Ссылки», «Баннеры», «Контакты», «Ленты новостей». При необходимости плагины
можно включать и отключать, включая в поиск и исключая из него соответствующие
типы контента. Как и в случае с «Умным поиском», для обработки данных,
относящихся к сторонним компонентам, потребуются специальные поисковые
плагины.
Плагины группы «Система» (System)
Плагины этой группы тесно связаны с платформой Joomla и обычно влияют на работу
всей системы.
Плагин «Языковой фильтр»
При помощи этого плагина контент фильтруется по признаку принадлежности к тому
или иному языку. Включать «Языковой фильтр» необходимо только когда
активирован модуль «Выбор языка».
Плагин «Политика P3P»
P3P или Platform for Privacy Preferences (платформа для предпочтений
конфиденциальности) – это протокол, позволяющий веб-сайтам объявлять об их
намерении получить доступ к данным о пользователе. Благодаря «Политике P3P»
Joomla выдает специальный набор тегов политики P3P в заголовке HTTP. Плагин
нужен для правильного установления сессии с некоторыми браузерами, например
Internet Explorer версий 6 и 7.
Плагин «Выход изсистемы»
Плагин «Выход из системы» перенаправляет пользователя на главную страницу, в
случае если тот решает выйти из системы на странице с ограниченным доступом.
Плагин «Отладка»
Благодаря этому плагину доступен столь нужный разработчикам режим отладки.
Выбрать, какая информация будет отображаться, можно на странице настроек.
Плагин «Журнал»
Плагин регистрирует системные события. Путь к папке, хранящей файлы журналов,
можно задать в настройках системы: меню административного раздела → пункт
«Сайт» → подпункт «Общие настройки» → вкладка «Система» → форма «Настройки
системы» → поле «Путь к каталогу логов». Пример фрагмента журнала, файл
«error.php»:
#Version: 1.0
#Date: 2012-03-06 12:39:38
#Fields: date time
level c-ip
status comment
#Software: Joomla 1.2.5 RC1 [ Ember ] 06-Jun-2011 23:00 GMT
2012-03-06 12:39:38 — 97.133.131.32 Joomla FAILURE: Empty password not allowed
�Содержание
Плагин «Перенаправление URL»
В сочетании с менеджером перенаправления URL (компонент) плагин реализует
функцию перенаправления.
Плагин «Подсветка»
Данный плагин предназначен для подсветки текста, например врезультатах «Умного
поиска».
Плагин «Запомнить меня»
Функция «Запомнить меня» состоит в сохранении логина и пароля
зарегистрированного посетителя в cookies на локальном компьютере. Она
выполняется в случае, когда в одноименном окне метки в форме аутентификации
стоит галочка. Плагин «Запомнить меня» предназначен для реализации
вышеуказанной функции.
Плагин «SEF»
SEF – акроним, обозначающий «дружественный» поисковым системам формат URL.
Если в общих настройках сайта (меню административного раздела → пункт «Сайт» →
подпункт «Общие настройки» → вкладка «Сайт» → форма «Настройки SEO») выбран
данный формат, то благодаря плагину «SEF» в него будут переведены все адреса
страниц.
Плагин «Кэш»
Этот плагин обеспечивает кэширование страниц. В его настройках можно выбрать
браузеры посетителей кэшировать страницы или нет.
Плагин «Подмена кода языка»
Плагин «Подмена кода языка» позволяет переопределять значения атрибутов xml:lang и
lang тега <html> в случае, если пакет локализации содержит неподходящие. Функция
полезная с точки зрения поисковой оптимизации.
Плагины группы «Пользователь» (User)
Плагины группы «Пользователь» выполняют функции, относящиеся к пользователям.
Плагин «Данные пользователя»
Плагин «Данные пользователя» выводит дополнительные поля в форме регистрации и
сохраняет введенные туда данные. Выбрать, какие поля будут выведены на странице
настройки, в форме «Основные параметры». Плагин «Данные пользователя» может
работать в сочетании с плагином «Создание контакта», благодаря чему для каждой
учетной записи будет создаваться запись контактных данных.
�Содержание
Плагин «Создание контакта»
Плагин предназначен для автоматического создания записи контактных данных
(компонент «Контакты») для вновь зарегистрированных пользователей. Работает в
сочетании с плагином «Данные пользователя».
Плагин «Joomla»
Позволяет выполнять авторизацию пользователей через стандартную систему
авторизации Joomla [66].
Визуальный редактор TinyMCE
Joomla предоставляет три стандартных средства для работы с материалами:
1) визуальный многофункциональный редактор TinyMCE;
2) редактор с подсветкой синтаксиса кода CodeMirror;
3) работы с материалами без редактора.
Выбрать редактор можно в настройках своего профиля, используя опцию «Редактор
по умолчанию».
Рис. 2. Настройки редактора по умолчанию
�Содержание
TinyMCE – визуальный редактор Joomla
Преимущества TinyMCE:
1) возможность работать с материалами Joomla не зная основы html. TinyMCE во
многом копирует интерфейс текстовых редакторов;
2) в версиях Joomla 2.5.х TinyMCE является одним из стандартных редакторов и
доступен сразу после установки Joomla;
3) функционал TinyMCE очень разнообразен.
Недостатки:
1. TinyMCE не дает полного контроля над кодом создаваемого материла, а
автоматически создает его излишне «загрязненным» тегами с атрибутами стилей.
Все стили следует выносить в отдельный файл и привязывать их к используемым
html-тегам за счет классов и идентификаторов.
2. Невозможность вставки скриптов на php или javascript. При сохранении они просто
удаляются.
Работа с TinyMCE
Материал в TinyMCE показывается точно так, как он будет отображаться на странице
сайта. Нет никакого html кода, только функциональные кнопки над окном ввода текста,
которые позволяют его отформатировать. По интерфейсу и принципу работы
TinyMCE напоминает текстовые редакторы, самые популярные из которых Microsoft
Word и его бесплатный аналог OpenOffice Word.
Рис. 3. Редактор TinyMCE
При наведении на любую кнопку курсора мыши появляется всплывающая подсказка
на русском языке.
Редактирование html кода
Пусть вы не видите html-код, но для форматирования текста именно он и
используется. Для того чтобы его увидеть и в случае необходимости отредактировать,
используйте кнопку HTML или просто выключите на время редактор кнопкой
«Выключить редактор».
�Содержание
Рис. 4. Редактор TinyMCE
Для того чтобы при выключенном редакторе скрипты все-таки можно было вставить,
нужно использовать второй редактор – CodeMirror.
Вставка картинок
Для загрузки картинки на сервер и последующей вставки ее в текст материала
используется кнопка «Изображение».
Рис. 5. Редактор TinyMCE
В центральном поле появившегося окна представлена структура каталогов папки /
images, в которой хранятся все изображения Joomla. В нижнем углу можно увидеть
кнопку «Обзор», используя которую выберете необходимую картинку со своего
компьютера. Для загрузки ее на сервер нажмите на появившуюся кнопку «Загрузить».
Теперь изображение автоматически загрузится на сервер и будет доступно в
центральной области. Выберете картинку, укажите для нее описание, заголовок и
выравнивания и нажмите кнопку «Вставить» в правом верхнем углу.
�Содержание
Рис. 6. Вставка изображения на сайт
Для дальнейшей настройки изображения выделите его и воспользуйтесь кнопкой
«Добавить/изменить изображение». Откроется окно, в котором помимо заголовка и
выравнивания можно настроить размеры, границу и отступы (указывайте с величиной
измерения, например 2px, 5px).
Расширенный режим TinyMCE
В менеджере плагинов, в списке «Редактор – TinyMCE» откроем его настройки. В
Основных параметрах в опции Режим редактора выбираем расширенный.
Рис. 7. Параметры плагина TinyMCE
�Содержание
Теперь TinyMCE выглядит следующим образом.
Рис. 8. Расширенный режим редактора TinyMCE [90].
Примеры плагинов
1.
Плагин SocButtons – кнопки социальных сетей Facebook, Twitter, ВКонтакте,
Google +1 и др.
В наше время влияние социальных сетей на распространение информации очень
велико и все больше сайтов устанавливают кнопки социальных сетей себе на сайт,
чтобы расширить свою аудиторию за счет уже существующих пользователей.
Рис. 9. Плагин SocButtons
Плагин SocButtons может выводить кнопки социальных сетей в 2-х видах – в виде
кнопки и в виде маленького блока. Кнопка Share от Facebook и Мой Мир имеют
только один вид отображения. Рассмотрим поподробнее, что может мой плагин
SocButtons:
• вставить кнопку Share от Facebook – с ее помощью можно поделиться ссылкой;
• вставить кнопку Like от Facebook – с ее помощью можно показать, что вам
нравится статья на сайте;
• вставить кнопку от Twitter – кнопка позволяет написать твит с заголовком статьи и
ее ссылкой;
• вставить кнопку Google +1 – позволяет поделиться ссылкой с друзьями, друзья
увидят в результатах поиска, что вам нравится данная страница;
• вставить кнопку ВКонтакте +1 – с ее помощью можно показать в социальной сети
ВКонтакте, что вам нравиттся статья на сайте;
• вставить кнопку от Мой Мир – то же самое, что и Share от Facebook, но от русской
социальной сети Мой Мир
�Содержание
2.
Плагин SocComments – комментарии Facebook и ВКонтакте для сайта на
Joomla
Плагин SocComments помогает добавить комментарии Facebook и ВКонтакте в статьи
для сайта на Joomla. Плагин SocComments позволяет добавить к вашим статьям
формы комментариев от социальных сетей Facebook и ВКонтакте, что позволяет
быстро и удобно производить комментирование ваших статей.
Рис. 10. Отображение плагина на сайте
Окно номер 1 – активна вкладка с комментариями Facebook.
• Окно номер 2 – активна вкладка с комментариями ВКонтакте.
Возможности:
• выключать формы комментариев ненужной социальной сети;
• задавать размеры форм комментариев;
• задавать количество комментариев для отображения;
• выбор цветового оформления (Facebook);
• выбор языка (Facebook);
• включить/выключить прикрепления медиаконтента к комментариям (ВКонтакте);
• включить/выключить публикации на стене (ВКонтакте);
• исключать категории отображения;
• исключать разделы отображения;
• исключать статьи отображения.
Не использовать плагин SocComments вместе с кнопкой социальных сетей Facebook
Share, так как появляется конфликт между скриптами Facebook Share и Facebook
Comments.
•
�Содержание
3. Плагин jHackGuard
Обеспечивает защиту сайтов Joomla, защищая их от различных методов взлома.
Плагин устанавливается стандартным образом через Менеджер расширений. Плагин
по умолчанию отключен.
Настройки включения и отключения:
• Log file – имя файла, в котором будет находиться информация о деятельности
плагина. Имя файла по умолчанию jHackGuard-log.php. Он хранится в папке
журналов.
• Enable Logging – (Включение ведения журнала): запись в файл информации о
деятельности.
• Filter $_POST – фильтр защиты от взлома через HTTP POST.
• Filter $_GET – фильтр защиты от переменных, передаваемых в скрипт через URL
параметры.
• Filter $_COOKIE – фильтр защиты переменных Cookies HTTP.
• Filter eval() – фильтр, который проверяет безопасность выполнения строки как phpкод.
• Filter base64_decode – фильтр просмотра зашифрованного кода в формате base64.
• Filter SQL commands – фильтр выполнение команд SQL. Это защищает от атак SQLинъекций.
• Allow_url_fopen – блокирует возможность скачивать файлы с удаленного FTP или
веб-сервера, а также защищает ваш веб-сайт от кодов с инъекцией.
• Allow_url_include – отключает возможность для включения URL-адреса в запросах
PHP. Таким образом, ваш сайт будет защищен от удаленных атак с включением
URL.
• Strip code from user-agent – предотвращает возможные атаки любого PHP и HTML
кода от пользователя.
• Strict XSS mode – фильтрует код JavaScript от нежелательных (вредоносных)
символов.
• Scan input keys – проверка входных ключей для вредоносных символов.
• Disable upload for guests – отключение загрузки файлов для гостей.
Зарегистрированные пользователи и администраторы будут по-прежнему иметь
возможность загружать файлы без каких-либо проблем.
• Link back to SiteGround – добавляет ссылку на наш сайт.
Желательно в настройках оставить все по умолчанию. Для корректной работы плагина
jHackGuard на вашем сервере должен быть отключен: register globals.
�Содержание
Выполнение работы
Задание. Установить для сайта хотя бы один плагин.
Пример установки плагина:
Установим плагин SocButtons – кнопки социальных сетей Facebook, Twitter,
ВКонтакте, Google +1 и др.
1. В меню административной панели выберем Расширения→Менеджер расширений.
2. На вкладке Установка в поле Загрузить файл пакета кликнем Выберите файл.
3. Кликнем Открыть→Загрузить и установить.
4. В меню административной панели выберем Расширения→Менеджер плагинов.
5. Из списка плагинов выберем нужный.
6. Настроим необходимые параметры плагина по своему усмотрению.
7. Кликнем Сохранить и закрыть.
8. В результате плагин будет отображаться на сайте в следующем виде:
Рис. 11. Плагин SocButtons
Контрольные вопросы
1.
2.
3.
4.
5.
6.
Что такое плагины в Joomla и для чего они предназначены?
На какие группы делятся все плагины?
Для чего предназначен плагин «reCAPTCHA»?
Назовите функции плагина Joomla.
Для чего предназначен плагин «Запомнить меня»?
Назовите стандартные средства в Joomla, предназначенные для работы с
материалами.
7. Назовите основные преимущества и недостатки редактора TinyMCE.
8. Почему редактор TinyMCE называют визуальным редактором?
�Содержание
Лабораторная работа № 7. Компоненты в Joomla
Цель работы: научиться устанавливать компоненты и осуществлять их настройки.
Средства для выполнения работы:
•
аппаратные: компьютер с установленной ОС Windows;
•
программные: браузер, сервер.
По окончании выполнения лабораторной работы вам нужно будет предоставить отчет
о выполненной работе. Отчет включает в себя три файла:
1) скриншот установленного компонента phocagallery;
2) скриншот установленного компонента по выбору;
3) ответы на контрольные вопросы.
Теоретические сведения
Компоненты Joomla
В исходную комплектацию Joomla входит множество расширений. С некоторыми из
расширений вы уже знакомы, например с менеджером пользователей, управляющим
пользователями; с менеджером категорий, для работы с категориями и пр. Если вы
кликните по пункту «Компоненты» в текстовом меню административного раздела, то
увидите следующие пункты: «Баннеры», «Контакты», «Сообщения», «Ленты
новостей», «Перенаправление», «Поиск», «Умный поиск» и «Ссылки». Все это –
компоненты.
Рис. 1. Компоненты исходной комплектации
�Содержание
Компонент «Баннеры»
Компонент «Баннеры» предназначен для публикации рекламных баннеров на сайте.
Баннер может быть изображением или HTML-кодом. Баннеры, выбираемые из набора
заданных в административном разделе, на стороне посетителя будут чередоваться.
Каждый из них представляет собой ссылку на сайт одного из рекламодателей.
Компонент «Баннеры» позволяет настраивать вывод отдельных баннеров, категорий
баннеров и баннеров, принадлежащих тем или иным клиентам, а также предоставляет
статистику.
Прежде чем создавать отдельные баннеры, необходимо создать категорию для них:
текстовое меню административного раздела →пункт «Компоненты» →подпункт
«Баннеры» →вкладка «Категории».
Компонент «Контакты»
Каждому сайту нужна страница обратной связи (контактные данные и форма отправки
сообщений). Простую страницу обратной связи создать вполне легко: нужно создать
запись контактных данных, «привязать» ее к категории, создать пункт меню.
Возможности данного компонента разноообразны. Как и при работе с прочим
контентом, вы можете создавать вложенные категории и пункты меню различных
типов. В настройках компонента (текстовое меню административного раздела →пункт
«Компоненты» →подпункт «Контакты» →пиктограмма на панели инструментов с
подписью «Настройки») вы, например, можете выбрать вариант внешнего вида
страницы контактных данных – слайдер, вкладки, простая страница – а также задать
множество других параметров.
Для создания страницы обратной связи нужна запись контактных данных и адрес
электронной почты. Запись контактных данных может быть связана с учетной
записью пользователя. Для случая, когда меняются какие-либо контактные данные
пользователя, например, номер телефона, есть возможность менять их, не входя в
раздел администрирования, всего лишь зарегистрировавшись на стороне посетителей.
Такую возможность в Joomla предоставляет плагин «Пользователь – Профиль». Для
этого нужно активировать его: текстовое меню административного раздела →пункт
«Расширения» →подпункт «Менеджер плагинов» → плагин «Пользователь –
Профиль». После этого на странице редактирования учетной записи на стороне
посетителя появится новая форма с полями для данных пользователя, которые будут
доступны компоненту «Контакты».
Компонент «Сообщения»
«Сообщения» – компонент, входящий в исходную комплектацию Joomla, на основе
которого построена система обмена сообщениями между пользователями, имеющими
доступ к административному разделу. Доступ к личным настройкам можно получить,
кликнув по пиктограмме «Мои настройки» на панели инструментов компонента:
текстовое меню административного раздела→пункт «Компоненты»→подпункт
�Содержание
«Сообщения». Соответствующим образом настроенный компонент отправляет копии
сообщений на адрес электронной почты пользователя и может удалять полученные
сообщения по истечении установленного срока. Настройки также позволяют
заблокировать прием сообщений.
Компонент «Ленты новостей»
Новостные ленты очень удобны. Они позволяют следить за меняющейся
информацией, например новостями. Компонент сбора новостей Joomla («Ленты
новостей») является агрегатором новостей, конечно, не такой продвинутый как Google
Reader, но все же довольно полезный.
Компонент «Ленты новостей» позволяет выводить на сайте, управляемом Joomla,
анонсы новостей, публикуемых на других сайтах.
При помощи полей панели «Параметры публикации» нужно задать количество
анонсов, выводимых агрегатором, а также временной промежуток между
обновлениями кэша. Joomla будет кэшировать то количество материалов, которое вы
определите в настройках.
Компонент «Ленты новостей» предлагает три формата вывода:
1) «список всех категорий лент новостей»;
2) «список лент новостей в категории»;
3) «лента новостей».
Создавая ленту, в параметрах отображения можно выбрать, будут ли выводиться
изображения, содержащиеся в анонсах новостной ленты. Там же можно ограничить
количество символов в выводимом тексте. Возможность ограничения очень полезна в
случае, когда в новостной ленте содержатся длинные анонсы, а также в случае вывода
ленты модулем «RSS-лента новостей».
Менеджер перенаправлений
Функция Менеджера перенаправлений – перенаправление браузера с адреса, по
которому ничего не публикуется, на адрес какой-либо существующей страницы.
Возможно, страница, на которую привела «битая» ссылка, когда-то существовала и
стала частью индекса поисковой системы или ее адрес был зафиксирован на
некотором сайте. Проблема несуществующих страниц обычно возникает после
запуска новой версии сайта. В случае обращения посетителя по адресу
несуществующей страницы Joomla выводит сообщение об ошибке «404 Not Found».
Вместе с этим в реестре менеджера перенаправлений производится запись,
содержащая сбойный адрес. Увидеть записи можно на странице компонента:
текстовое меню административного раздела →пункт «Компоненты» →подпункт
«Перенаправление».
Для работы менеджера необходимо активировать плагин «Перенаправление»:
�Содержание
текстовое меню административного раздела → пункт «Расширения» → подпункт
«Менеджер плагинов» → пиктограмма в строке «Перенаправление» в столбце
«Состояние».
При помощи интерфейса менеджера в имеющиеся записи можно добавлять адреса
существующих страниц (адреса для перенаправления). В следующий раз при попытке
открыть отсутствующую страницу компонент перенаправит браузер посетителя по
адресу, заданному администратором.
Записи перенаправления можно создавать и не дожидаясь попыток посетителей
открыть несуществующие страницы. Это имеет смысл, если вы знаете, какие страницы
исчезли или сменили адрес. Менеджер перенаправлений использует серверную
систему интерпретации адресов. Выяснить, какой именно сервер используется, можно
на странице информации о системе: текстовое меню административного раздела
→пункт «Сайт» →подпункт «Системная информация» →строка «Веб-сервер». Если
вы пользуетесь «Apache», то в корневой папке сайта найдите файл «htaccess.txt» и
переименуйте его в «.htaccess». Для этого можно воспользоваться FTP-клиентом или
командным процессором. Если вы пользуетесь «Internet Information Server», то
переименуйте «web.config.txt» в «web.config» и перед активацией установите модуль
«URL Rewrite Module» для IIS.
Затем разрешите использование системы интерпретации адресов: текстовое меню
административного раздела →пункт «Сайт» →подпункт «Общие настройки»
→вкладка «Сайт» →набор полей «Настройки SEO» →поле «Перенаправление URL»
→селективная кнопка «Да».
Поиск
С точки зрения посетителей, поиск по сайту – одна из самых востребованных
функций. По умолчанию в Joomla применен полнотекстовый поиск. Это означает, что
слова, вводимые в поисковую форму, система ищет прямо в базе данных. Многие
поисковые системы предварительно создают индекс и производят поиск совпадений
по нему. Результаты – записи индекса со ссылками на подходящие страницы сайта –
выводятся в виде перечня. Преимущество поиска по индексу – бо ́льшая скорость.
Преимущество полнотекстового метода – отсутствие необходимости своевременно
обновлять индекс: если обновлений не производить, то в выдачи будет попадать не
весь контент.
Для того чтобы узнать, что ищут посетители сайта, построенного на основе Joomla,
необходимо включить сбор статистики. Сделать это можно в настройках компонента
поиска: текстовое меню административного раздела →пункт «Компоненты»
→подпункт «Поиск» →пиктограмма «Настройки» на панели инструментов →вкладка
«Компонент» →поле «Собирать статистику поиска» → селективная кнопка «Да». В
результате все запросы будут регистрироваться, а перечень их будет выводиться на
странице компонента.
�Содержание
Если в комплекте стороннего расширения есть поисковый плагин, то после установки
первого последний встраивается в поисковую систему Joomla. Благодаря
использованию плагинов поисковая система Joomla проста в пользовании, а набор ее
функций легко расширяется.
Умный поиск
«Умный поиск» – новый поисковый компонент в составе исходной комплектации
Joomla. В его основе – более гибкий и более быстрый алгоритм. Среди возможностей
компонента – автоматическое дополнение поисковых запросов и использующая
стемминг функция «Возможно, вы имели в виду...». «Умный поиск» использует два
алгоритма стемминга. Один предназначен исключительно для английского языка.
Другой, так называемый «Snowball», помимо английского, поддерживает: русский,
датский, немецкий, испанский, финский, французский, венгерский, итальянский,
норвежский, голландский, португальский, румынский, турецкий. Для работы
«Snowball» необходимо специальное расширение интерпретатора PHP для стемминга.
Гибкость и скорость «Умного поиска» не будут доступны без индексации контента.
По умолчанию компонент «Умный поиск» выключен. Для его активации необходимо
включить одноименный плагин, относящийся к группе «content», а также пять
плагинов, относящихся к группе «finder».
Для работы «Умного поиска» необходима индексация контента. Она производится
автоматически во время сохранения статей, категорий, контактных данных, лент
новостей и т. д. Первоначальную индексацию можно провести, кликнув по
пиктограмме «Индексировать» на панели инструментов, на странице компонента:
текстовое меню административного раздела → пункт «Компоненты» → подпункт
«Умный поиск». После активации и индексации необходимо решить, как реализовать
интерфейс «Умного поиска» на стороне посетителей: при помощи модуля, при
помощи ссылки на страницу компонента или при помощи обоих.
Отключение традиционного поискового компонента
Для отключения традиционного поискового компонента необходимо:
•
отключить или удалить все модули типа «Поиск» (текстовое меню
административного раздела → пункт «Расширения» → подпункт «Менеджер
модулей» → выпадающий список «Выбор типа» → значение «Поиск»);
•
отключить или удалить все плагины типа «search» (текстовое меню
административного раздела → пункт «Расширения» → подпункт «Менеджер
плагинов» → выпадающий список «Выбор типа» → значение «search»);
•
удалить из меню ссылки, относящиеся к традиционному поисковому компоненту.
Компонент «Ссылки»
При помощи компонента «Ссылки» вы можете создать на своем сайте, управляемом
�Содержание
Joomla, каталог ссылок или раздел загрузок. Для этого в нем предусмотрена
возможность создания вложенных категорий, а также возможность учета переходов
по опубликованным ссылкам. При помощи интерфейса создания/редактирования
пункта меню можно выбрать вариант макета страницы и определить прочие
параметры вывода.
Компонент предлагает три варианта макета страницы: «Список категорий ссылок»,
«Список ссылок в категории», «Создать ссылку».
«Компоненты» → подпункт «Ссылки» → пиктограмма «Настройки» → вкладка
«Права». Кроме вкладки «Права» в окне настроек есть еще пять. Каждая из них
содержит поля для настройки.
На странице менеджера модулей можно найти модуль «Ссылки» («Weblinks») для
публикации ссылок из категории по выбору [2].
Выполнение работы:
Задание 1. Установить и разместить на сайте хотя бы один из предложенных
компонентов.
Примеры компонентов
1. Компонент JComments
JComments – компонент комментариев Joomla. Он предоставляет гибкую систему для
разграничения прав доступа, широкие возможности пользовательских настроек.
JComments работает на AJAX и обладает многими другими возможностями.
Совместим с joomla content, K2, AcePolls, Phoca Download, VirtueMart и Community
Builder.
Основные возможности компонента JComments:
•
Компонент Jcomments позволяет настраивать и управлять комментариями для всей
категории или для каждой конкретной страницы.
•
Возможность автоматической публикации комментариев для выбранной группы
пользователей.
•
Настройка прав редактирования или
определенных групп пользователей.
•
Настройка защиты от флуда (временный интервал между комментариями) и защита
от спамботов с помощью капчи.
•
Уведомления на e-mail администраторам сайта о появлении новых комментариев и
их быстрая модерация.
•
Возможность e-mail и RSS-подписки пользователей на уведомления о появлении
новых комментариев.
удаления
своих
комментариев
для
�Содержание
•
Возможность редактирования комментариев с лицевой части сайта.
•
Настройка постраничного отображения комментариев, разбиение на страницы и
настройка отображения положения постраничной навигации.
•
Изменение порядка отображения комментариев
комментарии вначале или в конце списка).
(показывать
•
Поддержка графических
отображения в списке.
настройки
•
Поддержка и создание собственных BBCode, а также настройка прав доступа
различным группам пользователей к этим тегам.
•
Поддержка горячих клавиш для отправки комментариев и вставки тегов BBCode.
•
Использование технологии AJAX, что позволяет добавлять и редактировать
комментарии без перегрузки страницы.
•
Настройка и отображение правил добавления комментариев для различных групп
пользователей.
•
Возможность включения поддержки RSS-лент комментариев для каждой страницы
или общей RSS-ленты для всех комментариев.
•
Поддержка шаблонов оформления для настройки и изменения внешнего вида.
•
Включение и отключение полей: заголовок, e-mail и сайт в форме редактирования.
•
Фильтр автоматической замены нежелательных слов на указанный текст.
•
Многоязыковая поддержка (более 50 языков).
•
Возможность поиска по комментариям с помощью поискового плагина.
смайлов
и
возможность
последние
порядка
их
Дополнительные функции компонента JComments:
•
Автоматическая замена повторяющихся переводов строк на один.
•
Настройка ограничения длины имени пользователя.
•
Возможность указывать запрещенные к использованию имена пользователей.
•
Возможность задать максимально допустимую длину комментария.
•
Выделение внешних ссылок в тексте комментариев.
•
Проверка на наличие дубликатов при добавлении комментариев.
•
Встроенная защита e-mail адресов в комментариях от спамботов.
•
Механизм борьбы с очень длинными ссылками и словами, позволяющий избежать
разрыва дизайна.
•
Возможность автоматического вырезания вложенных цитат в комментариях.
�Содержание
•
Автоматическое удаление из текста комментария запрещенных к использованию
или неподдерживаемых тегов BBCode.
Рис. 2. JComments отображение на сайте
2. Компонент PhocaGallery
Пример установки и настройки компонента PhocaGallery:
Установим компонент Phoca Gallery. У Phoca Gallery очень много функций. Кроме
различных базовых функций галереи она поддерживает Google Maps (можно указать,
где были сделаны фотографии – прямо на карте Google), Youtube, Facebook, Интернетмагазин VirtMart, также есть возможность загрузки фото по FTP. В меню
административной панели выберем Расширения→Менеджер расширений. На вкладке
Установка в поле Загрузить файл пакета кликнем Выберите файл, далее
Открыть→Загрузить и установить и загружаем архив нужного компонента. После
этого вы увидите две большие кнопки: Install и Upgrade. Для установки кликаем по
кнопке Install и получаем сообщение о том, что компонент установлен.
�Содержание
Рис. 3. Информация об успешной установке компонента
Далее установите русификатор данного компонента. Теперь галерея полностью готова
к работе.
Панель управления галереей. У галереи Phoca Gallery, как у любого другого
комплексного расширения, есть своя панель управления (Control Panel).
Рис. 4. Панель управления галереей
�Содержание
Для управления галерей используются следующие кнопки:
•
Images – управление загруженными изображениями;
•
Categories – управление категориями картинок;
•
Themes – темы (вы можете изменять темы оформления галереи, как темы сайта);
•
Category Rating – управление системой рейтинга категорий;
•
Image Rating – управление рейтингом изображений;
•
Category Comments – комментарии к категориям;
•
Image Comments – управление комментариями к картинкам;
•
Users – управление пользователями PhocaGallery;
•
Facebook – здесь можно настроить отображение Facebook-альбомов (если они
размещены на странице в Facebook);
•
Tags – текстовые метки;
•
Multiple Add – позволяет добавить сразу несколько изображений.
•
Info – различная информация, в том числе выводятся подсказки по оптимизации
параметров Phoca Gallery.
Создание категорий
Фотографии в обычной жизни мы помещаем в фотоальбомы. В PhocaGallery альбомы
называются категориями. Как и с материалами, нужно сначала создать категории, а
потом поместить в них фотографии. Вы можете создать любые категории на ваше
усмотрение: Природа, Семья и т. д.
Кликните на кнопке Categories на панели управления галереей. Вы увидите окно
Менеджера управления категориями галереи (в данном случае можно провести
аналогию с фотоальбомами, в которые вы будете добавлять свои изображения),
оформленное в стиле Joomla.
Для создания категории нажмите кнопку Создать. При создании галереи вы можете
указать не только ее название (Title), но и родительскую категорию (Parent Category),
что позволяет организовать древовидную структуру галереи. Кроме того, вы можете
задать права доступа к категории.
Access Rights – права доступа к категории (для просмотра). Вы можете выбрать
вариант All Registered Users (все зарегистрированные пользователи), Nobody (никто),
Super User (администратор, то есть вы) или же указать имена пользователей (можно
выбирать несколько пользователей), которым разрешен доступ. Если ничего не
выбрано, то доступ разрешен всем пользователям.
Upload Rights – право загрузки изображений в категорию. Можно выбрать те же
значения, что и в предыдущем случае.
�Содержание
Delete Rights – право на удаление изображений.
Рис. 5. Создание категории
Каждую категорию можно скрывать и публиковать на сайте, как и любой другой
контент сайта. Для редактирования категории используется кнопка Edit.
Загрузка фотографии в категорию
Для загрузки фотографии в созданную категорию перейдите на вкладку Images. Для
каждого изображения выводится заголовок, название файла, список функций,
сведения о публикации изображения, категория, количество просмотров (хиты) и
уникальный идентификатор.
Список функций над изображением. Подведите указатель мыши к кнопкам, и вы
увидите подсказку, описывающую функцию:
•
Rotate Left – повернуть изображение влево.
•
Rotate Right – повернуть изображение вправо.
•
Recreate Thumbnails – удалить и создать заново миниатюру.
•
Reload Site – перезагрузить сайт.
�Содержание
Для загрузки одной картинки кликните по кнопке Создать, если же вам нужно
загрузить несколько картинок, то кликните по кнопке Multiple Add. Сначала нужно
ввести название картинки (при добавлении одной картинки), потом – выбрать
категорию (Category), в которую нужно ее добавить, а потом уже кликать по кнопке
Выбрать файл, вызывающей форму загрузки файла.
Рис. 6. Загрузка изображения
Поля Latitude и Longitude позволяют установить географические координаты места,
где была сделана фотография. Координаты можно узнать, нажав кнопку Set
Coordinates. Сохраняем созданный пункт.
Рис. 7. Добавление одной картинки,
�Содержание
Галерея позволяет связать загружаемое изображение с видеороликом, загруженным
на Youtube. Для этого сначала загрузите видео на Youtube, а затем укажите его код в
поле Video Code (Youtube). После щелчка на кнопке Select Filename появится форма
загрузки картинки. Для выбора файла кликните на кнопке Select File, затем – на кнопке
Start Upload для его загрузки на сайт.
Для загрузки картинок проще всего использовать FTP-клиент. Для этого нужно
загрузить картинки в каталог /images/phocagallery, а потом, используя кнопку Создать,
добавить картинки в соответствующие категории, при этом не ограничен размер
файла (при загрузке картинки через браузер, общий размер загружаемых картинок не
должен превышать 3 Мб). После загрузки изображения галерея автоматически создаст
его миниатюру (пиктограмму).
Для загрузки нескольких фотографий нажмите кнопку Multiple Add. Нажмите кнопку
Add Images и добавьте с ее помощью несколько изображений. Для работы этой
функции важно, чтобы Flash-модуль вашего браузера был включен! Для начала
загрузки нужно нажать кнопку Start Upload.
Рис. 8. Мультизагрузка
После того как фотографии будут загружены, их нужно выбрать, ввести заголовок,
выбрать категорию и нажать кнопку Сохранить и закрыть.
Далее вы увидите процесс создания миниатюр, а затем и сами загруженные
фотографии.
Создание ссылки в меню
Мы создали категории и добавили некоторые изображения. Теперь создадим ссылку в
меню, вызывающую галерею. В административном разделе откройте редактор
пунктов меню и кликните по кнопке Создать. При выборе пункта меню выберите
вариант List of Categories (для просмотра списка альбомов) или List of Images (для
просмотра сразу изображений).
�Содержание
Рис. 9. Выбор типа элемента меню
Далее введите название пункта меню (например Photos) и при необходимости
установите остальные параметры, после чего кликните по кнопке Сохранить и
Закрыть.
Теперь перейдите на сайт и кликните по новому пункту меню, вы увидите список всех
непустых категорий изображений.
Откройте галерею для просмотра всех ее фотографий. Для просмотра конкретной
фотографии кликните по ней.
Рис. 10. Просмотр категории фото
�Содержание
Рис. 11. Просмотр фотографии
3. Компонент Allvideoshare_2.3.0
Компонент AllVideoShare – бесплатный видеоплеер и видеогалерея для Joomla 3.x.
Поддерживает большое количество форматов (FLV, MP4, 3G2, 3GP, AAC, F4B, F4P,
f4v, M4A, M4V, MOV (H.264), SDP, VP6), а также имеется поддержка функции HD.
•
Возможности:
•
Обработка различных медиаформатов: FLV, MP4, 3G2, 3GP, AAC, F4B, F4P, f4v,
M4A, M4V, MOV (H.264), SDP, VP6.
•
Цвет оформления по своему усмотрению.
•
Гибкие возможности добавления видео или просто предоставление Видео URLссылки (или) с использованием метода ЗАГРУЗИТЬ.
•
Youtube API для воспроизведения видео Youtube.
•
Классификация видео.
•
Загрузка видео пользователем.
•
Player Plugin для вставки в материалы статей.
�Содержание
•
Facebook комментарии.
•
Настраиваемый пользователем стиль оформления прямо на сайте.
•
Многоязычный и SEF совместимый.
Добавление компонента All Video Share в качестве пункта меню
Если добавить компонент в качестве пункта меню, то появятся следующие
возможности при открытии данного пункта:
•
Откроется отдельная страница с миниатюрными изображениями ваших видео
(Видео Layout).
•
Откроется отдельная страница с миниатюрными изображениями ваших категорий
для видео(Категории Layout).
•
А также можно сделать, чтобы открывалась страница, на которой будут указаны
пользователи, загрузившие видео. После нажатия на ссылку пользователя
откроются его видео (Пользователь Layout).
По окончании выполнения задания вышлите на проверку скриншот установленного
компонента по выбору.
�Содержание
Контрольные вопросы к главе 11
1. Какие стандартные компоненты исходной комплектации существуют в Joomla 2.5?
2. Для чего предназначен компонент «Баннеры»?
3. На основе какого стандартного компонента Joomla построена система обмена
сообщениями между пользователями, имеющими доступ к административному
разделу?
4. Какие варианты макета страницы существуют в компоненте «Ссылки»?
5. Для чего предназначен компонент «Менеджер перенаправлений»?
6. Назовите предназначение и особенности компонента Phoca Gallery.
7. Какие существуют преимущества использования компонента JCE?
8. Приведите примеры компонентов в Joomla.
�Содержание
Список использованной литературы
1.
Гончаров, А. Самоучитель HTML [Текст] / А. Гончаров. – Санкт-Петербург :
Питер, 2002. – 240 с.
2.
Граф, Х. Руководство для начинающего пользователя Joomla! 2.5 [Текст] /
Х. Граф ; пер. А. Баскинов. – Сocoate, 2012. – 278 с.
3.
Гультяев, А. К. Виртуальные машины: несколько компьютеров в одном [Текст] /
А. Гультяев. – Санкт-Петербург : Питер, 2006. – 224 с.
4.
Куроуз, Дж. Ф. Компьютерные сети: многоуровневая архитектура Интернета
[Текст] / Дж. Ф. Кроуз, К. В. Росс ; [пер. с англ. А. Кузнецова, А. Леонтьева]. – 2-е
изд. – Москва ; Санкт-Петербург : Питер Принт, 2004. – 764 с.
5.
Максимов, Н. В. Компьютерные сети [Текст] : учебное пособие для студентов
учреждений
среднего
профессионального
образования /
Н. В. Максимов,
И. И. Попов. – 3-е изд., испр. и доп. – Москва : ФОРУМ, 2008. – 448 с.
6.
Матросов, А. В. HTML 4.0. [Текст] / А. В. Матросов,
А. О. Сергеев,
М. П. Чаунин. – Санкт-Петербург : БХВ-Петербург, 2003. – 672 с.
7.
Мержевич, В. В. HTML и CSS на примерах [Текст] / В. В. Мержевич. – СанктПетербург : БХВ-Петербург, 2005. – 448 с.
8.
Олифер, В. Г. Компьютерные сети: принципы, технологии, протоколы [Текст] :
учебное пособие для студентов вузов / В. Г. Олифер, Н. А. Олифер. – 3-е изд. – СанктПетербург : Питер, 2008. – 957 с. : ил. – (Учебник для вузов).
9.
Олифер, В. Г. Компьютерные сети: принципы, технологии, протоколы [Текст] :
учебное пособие для студентов вузов / В. Г. Олифер, Н. А. Олифер. – 4-е изд. – СанктПетербург : Питер, 2010. – 944 с.
10. Петюшкин, А. В. HTML: экспресс-курс [Текст] / А. В. Петюшкин. – СанктПетербург : БХВ-Петербург, 2003. – 256 с.
11. Таненбаум, Э. С. Компьютерные сети [Текст] / Э. С. Таненбаум ; [пер. с англ.
В. Шрага]. – 4-е изд. – Санкт-Петербург : Питер, 2005. – 992 с. – (Классика computer
science).
12. Шнайер, Б. Секреты и ложь: безопасность данных в цифровом мире [Текст] /
Б. Шнайер ; [пер. с англ. Н. Дубнова]. – Санкт-Петербург : Питер, 2003. – 368 с.
13. 4G [Электронный ресурс] // Википедия: свободная энциклопедия : [сайт]. –
Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/4G, свободный. – Загл. с
экрана (дата обращения: 03.06.2019).
14. BGP [Электронный ресурс] // Xgu.ru : [сайт]. – Электрон. дан. – Режим доступа:
http://xgu.ru/wiki/BGP, свободный. – Загл. с экрана (дата обращения: 12.03.2015).
15. Border Gateway Protocol [Электронный ресурс] // Википедия: свободная
энциклопедия : [сайт]. – Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/
Border_Gateway_Protocol, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
�Содержание
16. Carrier Sense Multiple Access [Электронный ресурс] // Википедия: свободная
энциклопедия : [сайт]. – Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/
Carrier_Sense_Multiple_Access, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
17. CMS [Электронный ресурс] // Joomla.ru : [сайт]. – Электрон. дан. – Режим
доступа: http://joomla.ru/, свободный. – Загл. с экрана (дата обращения: 13.12.2013).
18. CMS! по-русски [Электронный ресурс] // Joomla.ru : [сайт]. – Электрон. дан. –
Режим доступа: http://joomlaportal.ru/content/view/174/68/, свободный. – Загл. с экрана
(дата обращения: 25.01.2015).
19. CSMA/CD [Электронный ресурс] // Википедия: свободная энциклопедия :
[сайт]. – Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/CSMA/CD,
свободный. – Загл. с экрана (дата обращения: 03.06.2019).
20. Css [Электронный ресурс] // Webnames.ru : [сайт]. – Электрон. дан. – Режим
доступа: http://know-html.ru/csssound.php, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
21. Css online [Электронный ресурс] : учебник. – Электрон. дан. – Режим доступа:
http://cssonline.net.ru, свободный. – Загл. с экрана (дата обращения: 15.12.2014)
22. FileZilla [Электронный ресурс] // Википедия: свободная энциклопедия : [сайт]. –
Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/FileZilla, свободный. – Загл.
с экрана (дата обращения: 23.07.2018).
23. FTP [Электронный ресурс] // Википедия: свободная энциклопедия : [сайт]. –
Электрон. дан. – Режим доступа: http://ru.wikipedia.org/wiki/FTP, свободный. – Загл. с
экрана (дата обращения: 03.06.2019).
24. HDLC [Электронный ресурс] // Масич Григорий Федорович : [персональный
сайт]. – Электрон. дан. – Режим доступа: http://www.icmm.ru/~masich/win/lexion/hdlc/
hdlc.html, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
25. HDLC [Электронный ресурс] // Википедия: свободная энциклопедия : [сайт]. –
Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/HDLC, свободный. – Загл.
с экрана (дата обращения: 03.06.2019).
26. IPv4 [Электронный ресурс] // Википедия: свободная энциклопедия : [сайт]. –
Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/IPv4, свободный. – Загл. с
экрана (дата обращения: 03.06.2019).
27. Joomla! [Электронный ресурс] // Joomla.ru : [сайт]. – Электрон. дан. – Режим
доступа:
http://joomla.ru/docs/administrator/joomla3-start/1742-chto-takoe-joomla,
свободный. – Загл. с экрана (дата обращения: 03.06.2019).
28. Joomla [Электронный ресурс] // Википедия: свободная энциклопедия : [сайт]. –
Электрон. дан. – Режим доступа: http://ru.wikipedia.org/wiki/Joomla, свободный. – Загл. с
экрана (дата обращения: 03.06.2019).
29. Joomla SEO Tips and Tricks [Электронный ресурс] // The San Diego SEO Company
: [сайт]. – Электрон. дан. – Режим доступа: http://seo-joomla.net/digests/59-generaciyastranic-upravlyaemaya-joomla.html, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
�Содержание
30. LTE [Электронный ресурс] // Википедия: свободная энциклопедия : [сайт]. –
Электрон. дан. – 2019. – Режим доступа: https://ru.wikipedia.org/wiki/LTE, свободный. –
Загл. с экрана (дата обращения: 03.06.2019).
31. LTE: взгляд изнутри [Электронный ресурс] // Хабр : [сайт]. – Электрон. дан. –
Режим доступа: http://habrahabr.ru/post/136317/, свободный. – Загл. с экрана (дата
обращения: 03.06.2019).
32. LTE – что это такое? Расшифровка, определение, перевод [Электронный
ресурс] // Что-Это-Такое.ru : сайт новых и хорошо забытых слов. – Электрон. дан. –
Режим доступа: http://chto-eto-takoe.ru/lte, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
33. MAC-адрес [Электронный ресурс] // Википедия: свободная энциклопедия :
[сайт]. – Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/MAC-адрес,
свободный. – Загл. с экрана (дата обращения: 03.06.2019).
34. PPP – пример настройки и описание [Электронный ресурс] // Ciscotips.ru :
[сайт]. – Электрон. дан. – Режим доступа: http://ciscotips.ru/ppp, свободный. – Загл. с
экрана (дата обращения: 03.06.2019).
35. PPP (сетевой протокол) [Электронный ресурс] // Википедия: свободная
энциклопедия : [сайт]. – Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/
PPP_(сетевой_протокол)#PPP_.D0.BA.D0.B0.D0.B4.D1.80, свободный. – Загл. с экрана
(дата обращения: 03.06.2019).
36. SMTP [Электронный ресурс] // Википедия: свободная энциклопедия : [сайт]. –
Электрон. дан. – Режим доступа: http://ru.wikipedia.org/wiki/SMTP, свободный. – Загл. с
экрана (дата обращения: 03.06.2019).
37. SSL [Электронный ресурс] // Википедия: свободная энциклопедия : [сайт]. –
Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/SSL, свободный. – Загл. с
экрана (дата обращения: 03.06.2019).
38. VirtualBox [Электронный ресурс] // Интек-НН: компьютерное оборудование и
технологии. – Электрон. дан. – Режим доступа: http://inteknn.ru/reviews/?prod_id=19008,
свободный. – Загл. с экрана (дата обращения: 03.06.2019).
39. VPN [Электронный ресурс] // Википедия: свободная энциклопедия : [сайт]. –
Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/VPN, свободный. – Загл. с
экрана (дата обращения: 03.06.2019).
40. Администрирование сетей Microsoft Windows XP Professional. Удаленный доступ
и VPN [Электронный ресурс] : лекция 14 // Интуит: национальный открытый
университет : [сайт]. – Электрон. дан. – Режим доступа: https://www.intuit.ru/studies/
courses/13/13/info, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
41. Аналитика ИКТ и Digital Media. Рейтинг LTE-покрытия операторов мобильной
связи России по итогам 2014 года [Электронный ресурс] // JSON TV : [сайт]. –
Электрон. дан. – Режим доступа: http://json.tv/ict_telecom_analytics_view/reyting-ltepokrytiya-operatorov-mobilnoy-svyazi-rossii-po-itogam-2014-goda-20150127055011,
свободный. – Загл. с экрана (дата обращения: 15.05.2015).
�Содержание
42. Блог веб-мастера [Электронный ресурс]. – Электрон. дан. – Режим доступа:
http://sirega.ru/sozdanie-kategoriy-v-joomla-25.html, свободный. – Загл. с экрана (дата
обращения: 25.10.2014).
43. В помощь веб-мастеру. HTML.RU [Электронный ресурс] : [сайт]. – Электрон.
дан. – Режим доступа: http://www-html.ru/div.html, свободный. – Загл. с экрана (дата
обращения: 03.02.2015).
44. Вардо, А. Значение Интернета в жизни людей [Электронный ресурс] / А. Вардо //
Проза.ru
:
[сайт]. –
Электрон.
дан.
–
Режим
доступа:
http://
www.proza.ru/2010/04/09/1451, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
45. Внешние таблицы стилей [Электронный ресурс] // Xiper.net : [сайт]. – Электрон.
дан. – Режим доступа: http://www.xiper.net/learn/css/css-including/external-stylesheet.html,
свободный. – Загл. с экрана (дата обращения: 13.03.2019).
46. Всемирная паутина [Электронный ресурс] // Википедия: свободная
энциклопедия : [сайт]. – Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/
Всемирная_паутина, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
47. Геостационарный спутник [Электронный ресурс] // Компьютерные сети.
Принципы, технологии, протоколы : [сайт]. – Электрон. дан. – Режим доступа: http://
iptcp.net/geostatsionarnyi-sputnik.html, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
48. Денвер – локальный сервер [Электронный ресурс] : [сайт]. – Электрон. дан. –
Режим доступа: http://www.denwer.ru/, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
49. Денвер (программа) [Электронный ресурс] // Википедия: свободная
энциклопедия : [сайт]. – Электрон. дан. – Режим доступа: http://ru.wikipedia.org/wiki/
Денвер_%28программа%29, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
50. Диспетчер задач Windows [Электронный ресурс] // Википедия: свободная
энциклопедия : [сайт]. – Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/
Диспетчер_задач_Windows, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
51. Диспетчер задач: основное назначение и функции [Электронный ресурс] //
Kaspersky. – Электрон. дан. – Режим доступа: http://support.kaspersky.ru/1344,
свободный. – Загл. с экрана (дата обращения: 05.07.2014).
52. Какими будут 5G сети? [Электронный ресурс] // 24Gadget.ru: новейшие
технологии : [сайт]. – Электрон. дан. – Режим доступа: http://24gadget.ru/1161060817kakimi-budut-5g-seti-3-foto.html, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
53. Как самому создать свой сайт [Электронный ресурс] // KtoNaNovenkogo.ru :
[сайт]. – Электрон. дан. – Режим доступа: http://ktonanovenkogo.ru/uroki-joomla,
свободный. – Загл. с экрана (дата обращения: 03.06.2019).
�Содержание
54. Коммуникационное оборудование вычислительных сетей [Электронный
ресурс] // Обучение в Интернет : [сайт]. – Электрон. дан. – Режим доступа: http://
www.lessons-tva.info/edu/telecom-loc/m1t6_2loc.html, свободный. – Загл. с экрана (дата
обращения: 03.06.2019).
55. Коммуникационное оборудование. Топология сети. Компьютерная сеть.
[Электронный ресурс] // IT технологии : [сайт]. – Электрон. дан. – Режим доступа:
http://more-it.ru/view_post.php?id=49, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
56. Компьютерные сети. Обучение сетевым технологиям [Электронный ресурс]. –
Электрон. дан. – Режим доступа: http://mm.lti-gti.ru/informatics/net1/1.htm, свободный. –
Загл. с экрана (дата обращения: 03.06.2019).
57. Кошелев, А. Защита сетей и firewall [Электронный ресурс] / А. Кошелев //
КомпьютерПресс : [сайт]. – Электрон. дан. – Режим доступа: http://www.compress.ru/
article.aspx?id=11177, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
58. Лучший учебник html. Основы html [Электронный ресурс] // Zvirec.com : [сайт]. –
Электрон. дан. – Режим доступа: http://zvirec.com/html_sod.php, свободный. – Загл. с
экрана (дата обращения: 03.06.2019)
59. Менеджер модулей в Joomla 2.5 [Электронный ресурс] // Spinch.net.ua: обзор
популярных расширений Joomla : [сайт]. – Электрон. дан. – Режим доступа: http://
spinch.net.ua/obzor/menedzher-moduley-v-joomla-2-5, свободный. – Загл. с экрана (дата
обращения: 04.06.2019).
60. Многоуровневая архитектура Интернета [Электронный ресурс] : локальные
сети // Компьютерные сети : [сайт]. – Электрон. дан. – Режим доступа: http://
www.conlex.kz/lokalnye-seti/#more-456, свободный. – Загл. с экрана (дата обращения:
22.09.2016).
61. Образовательная галактика Intel: эмулятор сети – Netemul [Электронный
ресурс]. –
Режим
доступа:
http://edugalaxy.intel.ru/index.php?
s=935def050cf3a07626fbf56ae541a486&automodule=blog&blogid=10907&showentry=1935,
свободный. – Загл. с экрана (дата обращения: 13.09.2014).
62. Общие настройки сайта на Joomla! [Электронный ресурс] // Айтишник Ру :
[сайт]. – Электрон. дан. – Режим доступа: http://www.aitishnik.ru/obschie-nastroyki-saytana-joomla/server.html, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
63. Общие принципы построения сетей [Электронный ресурс] // Компьютерные
сети. Принципы, технологии, протоколы : [сайт]. – Электрон. дан. – Режим доступа:
http://iptcp.net/obshchie-printsipy-postroeniya-setei.html, свободный. – Загл. с экрана (дата
обращения: 03.06.2019).
64. Операционная система [Электронный ресурс] // Википедия: свободная
энциклопедия : [сайт]. – Электрон. дан. – Режим доступа: https://ru.wikipedia.org/wiki/
Операционная_система, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
�Содержание
65. Оплачкин, Г. Менеджер шаблонов Joomla 2.5 [Электронный ресурс] /
Г. Оплачкин // Web-студия сайта ОГМ : [сайт]. – Электрон. дан. –Режим доступа: http://
www.sitedelkin.ru/index.php/menedzher-shablonov-joomla-2-5, свободный. – Загл. с экрана
(дата обращения: 03.06.2019).
66. Описание встроенных плагинов Joomla 2.5 [Электронный ресурс] // Мастер :
[сайт]. – Электрон. дан. – Режим доступа: http://bazila.net/saytostroenie/opisanievstroennykh-plaginov-joomla-2-5.html, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
67. Описание протокола SMTP [Электронный ресурс] // CodeNet : Все для
программиста! : [сайт]. – Электрон. дан. – Режим доступа: http://www.codenet.ru/
webmast/smtp.php, свободный. – Загл. с экрана (дата обращения: 14.08.2018).
68. Основные утилиты для работы с сетью [Электронный ресурс]. – Электрон.
дан. –
Режим
доступа:
http://windata.ru/windows-world/utility/utility-windows-dlyadiagnostiki-i-nastrojki-seti/, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
69. Основы компьютерных сетей [Электронный ресурс] : учебное пособие. –
Электрон.
дан.
–
Режим
доступа:
https://www.google.ru/url?
sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CB4QFjAA&url=http%3A%2F%
2Fdownload.microsoft.com%2Fdocuments%2Frus%2Feducation%2Fpdf%
2Fnetworks_book.pdf&ei=Nn8iVIr1OKWGywOq64HQDQ&usg=AFQjCNGmChkrW2lD45
y54rHbZIIvl9Te6Q&sig2=Ag--Mvchx4Wuaw2J2nDArQ&bvm=bv.76180860,d.bGQ&cad=rjt,
свободный. – Загл. с экрана (дата обращения: 03.06.2019).
70. Основы маршрутизации: глава 2 [Электронный ресурс] / CIT forum : [сайт]. –
Электрон. дан. – Режим доступа: http://citforum.ru/nets/ito/2.shtml#2.3, свободный. –
Загл. с экрана (дата обращения: 21.10.2013).
71. Основы сетей передачи данных [Электронный ресурс] // Интернет-университет
информационных технологий : [сайт]. – Электрон. дан. – Режим доступа: http://mm.ltigti.ru/informatics/net1/1.htm, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
72. Основы сетей передачи данных [Электронный ресурс] : эволюция
вычислительных сетей: лекция № 1 / Интернет-Университет Информационных
Технологий : [сайт]. – Электрон. дан. – Режим доступа: http://mm.lti-gti.ru/informatics/
net1/1.htm, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
73. Открытая платформа виртуализации VirtualBox [Электронный ресурс] //
iXBT.com : [сайт]. – Электрон. дан. – Режим доступа: http://www.ixbt.com/cm/
virtualization-virtualbox.shtml, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
74. Периферийные устройства. Стандартные порты ввода-вывода: технология
Bluetooth [Электронный ресурс] // Bourabai.ru : [сайт]. – Электрон. дан. – Режим
доступа: http://bourabai.ru/einf/bluetooth.htm, свободный. – Загл. с экрана (дата
обращения: 03.06.2019).
75. Поддержка Windows [Электронный ресурс] // Microsoft : [сайт]. – Электрон.
дан. – Режим доступа: http://support.microsoft.com/kb/308427/ru#top, свободный. – Загл.
с экрана (дата обращения: 03.06.2019).
�Содержание
76. Подробный справочник CSS и HTML [Электронный ресурс] // Slyweb : [сайт]. –
Электрон. дан. – Режим доступа: http://slyweb.ru/cssmanual/speak.php, свободный. –
Загл. с экрана (дата обращения: 04.06.2019).
77. Построение сети [Электронный ресурс] // Руководство NetEmul. – Электрон.
дан. – Режим доступа: http://netemul.sourceforge.net/help/ru/build.html, свободный. – Загл.
с экрана (дата обращения: 04.06.2019).
78. Протокол межсетевого взаимодействия IP [Электронный ресурс] // CIT forum :
[сайт]. – Электрон. дан. – Режим доступа: http://citforum.ru/nets/ip/glava_4.shtml,
свободный. – Загл. с экрана (дата обращения: 25.12.2013).
79. Работа с серверами http и ftp: лабораторная работа 7.2 [Электронный ресурс] //
Курс «Основы сетевых технологий» : [сайт]. – Электрон. дан. – Режим доступа: http://
znetwork.narod.ru/Modul_07/lab_7.2.htm, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
80. Работа с сетью в командной строке Windows [Электронный ресурс]. – Электрон.
дан. – Режим доступа: http://ab57.ru/netcmd.html, свободный. – Загл. с экрана (дата
обращения: 04.06.2019).
81. Различия между Интернет и Всемирной Паутиной [Электронный ресурс] //
Толковый словарь компьютерных и сетевых терминов : [сайт]. – Электрон. дан. –
Режим доступа: http://termin.narod.ru/w/Web_vs_Internet.htm, свободный. – Загл. с
экрана (дата обращения: 03.06.2019).
82. Разновидности CSS верстки (табличная, блочная), где и как применять
[Электронный ресурс] // Takprostotak.ru – создать сайт просто! : [сайт]. – Электрон.
дан. – Режим доступа: http://takprostotak.ru/vebrazrabotchiku/osnovy-css/raznovidnosti-cssverstki-tablichnaya-blochnaya-gde-i-kak-primenyat.html, свободный. – Загл. с экрана (дата
обращения: 09.09.2017).
83. Ресурс для начинающих веб-разработчиков [Электронный ресурс]. – Электрон.
дан. – Режим доступа: https://tproger.ru/tag/web/, свободный. – Загл. с экрана (дата
обращения: 25.05.2015).
84. Руководство пользователя Joomla 2.5 [Электронный ресурс] // Joomla.ru :
[сайт]. – Электрон. дан. – Режим доступа: https://cocoate.com/sites/cocoate.com/files/
private/j25ru.pdf, свободный. – Загл. с экрана (дата обращения: 18.04.2017).
85. Сведения об этапах развития компьютерных сетей и перспективах их
дальнейшего развития [Электронный ресурс]. – Электрон. дан. – Режим доступа:
http://kafvt.narod.ru/WAN/Svedeniy1.htm, свободный. – Загл. с экрана (дата обращения:
16.03.2014).
86. Связь одного источника и нескольких приемников [Электронный ресурс] //
Компьютерные сети. – Электрон. дан. – Режим доступа: http://iptcp.net/svyaz-odnogoistochnika-i-neskolkikh-priemnikov.html, свободный. – Загл. с экрана (дата обращения:
05.02.2015).
�Содержание
87. Сетевая информационная безопасность. Технологии и стандарты сетевой
защиты информации [Электронный ресурс] // ООО «С-Терра СиЭсПи» : [сайт] –
Электрон. дан. – Режим доступа: http://www.s-terra.com/solutions/standards/,
свободный. – Загл. с экрана (дата обращения: 15.06.2014).
88. Сети передачи данных. Пропускная способность сети связи. Методы решения
задачи статической маршрутизации: лекция 11 [Электронный ресурс] //
Студопедия.Орг : [сайт]. – Электрон. дан. – Режим доступа: http://studopedia.org/10105559.html, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
89. Скорость 5-G сети разогнали до 1 ТБ/сек [Электронный ресурс] // IT News. –
Электрон. дан. – Режим доступа: http://www.it-news.club/skorost-5g-seti-razognali-do-1-tbsek/, свободный. – Загл. с экрана (дата обращения: 01.04.2015).
90. Создание материалов Joomla и вывод на сайт [Электронный ресурс] //
FairHeart.ru : [сайт]. – Электрон. дан. – Режим доступа: http://fairheart.ru/joomla/osnovyjoomla/material-v-joomla-2-5-dobavlenie-i-publikaciya-na-sajte-kategorii-mediamenedzher.html, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
91. Составные части мета-тега [Электронный ресурс] // Веб-студия Ph4 – Каталог
интернета пользователю, веб-мастеру и дизайнеру v. 4.3 : [сайт]. – Электрон. дан. –
Режим доступа: http://www.ph4.ru/spravka_meta.ph4, свободный. – Загл. с экрана (дата
обращения: 01.05.2019).
92. Средства и технология защиты вычислительных сетей [Электронный ресурс] //
Новый систематизированный толковый словарь. – Электрон. дан. – Режим доступа:
http://www.gpntb.ru/win/book/5/Doc12.HTML, свободный. – Загл. с экрана (дата
обращения: 03.06.2019).
93. Структуризация как средство построения больших сетей [Электронный
ресурс] // Учебно-методический центр кафедры информационных технологий /
Ивановский государственный химико-технологический университет, Кафедра
информационных технологий : [сайт]. – Электрон. дан. – Режим доступа: http://
dit.isuct.ru/ivt/sitanov/Literatura/KompSeti/Pages/Glava6_4.htm, свободный. – Загл. с
экрана (дата обращения: 03.06.2019).
94. Технология защиты сетевых компьютеров. Брандмауэр [Электронный ресурс] :
лабораторная работа // Компьютерные сети : учебно-методический комплекс : [сайт]. –
Электрон. дан. – Режим доступа: http://olegkrutan.narod.ru/files/umk/lab42.htm,
свободный. – Загл. с экрана (дата обращения: 03.06.2019).
95. Уроки CSS [Электронный ресурс] // Site-do.ru : [сайт]. – Электрон. дан. – Режим
доступа: http://www.site-do.ru/css/css14.php, свободный. – Загл. с экрана (дата
обращения: 03.06.2019).
96. Уроки Joomla [Электронный ресурс] // Transweber.ru : [сайт]. – Электрон. дан. –
Режим доступа: http://www.transweber.ru/uroki/48--joomla, свободный. – Загл. с экрана
(дата обращения: 14.02.2013).
97. Уроки по Joomla для новичков, или Продолжаем бесплатный курс по изучению
CMS Joomla [Электронный ресурс] // Ab-w.net : [сайт]. – Электрон. дан. – Режим
доступа: http://ab-w.net/Joomla/uroki-joomla-lessons-besplatno.php, свободный. – Загл. с
экрана (дата обращения: 14.04.2016).
�Содержание
98. Установка Joomla 2.5 на Денвер [Электронный ресурс] // Service Joomla : [сайт]. –
Электрон. дан. – Режим доступа: http://service-joomla.ru/kak-sozdat-svoy-sayt/item/52ustanovka-joomla-na-denwer.html, свободный. – Загл. с экрана (дата обращения:
03.06.2019).
99. Установка и настройка ОС семейства Windows в среде ВМ: лабораторная работа
1.1 [Электронный ресурс] // Курс «Основы сетевых технологий» : [сайт]. – Электрон.
дан. – Режим доступа: http://znetwork.narod.ru/Modul_01/lab_1.1.htm, свободный. – Загл.
с экрана (дата обращения: 03.06.2019).
100. Учебник HTML для начинающих [Электронный ресурс] // Самоучитель Web
Design : [сайт]. – Электрон. дан. – Режим доступа: http://htmlbook.ucoz.ru/index/
lesson_1/0-11, свободный. – Загл. с экрана (дата обращения: 03.06.2019).
101. Фон в css (Background) [Электронный ресурс] // WebMasterMix.RU : проект для
веб-мастеров и тех, кто хочет ими стать! : [сайт]. – Электрон. дан. – Режим доступа:
http://webmastermix.ru/lessons-css/18-background-in-css.html, свободный. – Загл. с экрана
(дата обращения: 04.06.2019).
102. Форум начинающих веб-мастеров [Электронный ресурс]. Электрон. дан. –
Режим доступа: http://interbizmag.ru/forum/index.php?showtopic=43, свободный. – Загл. с
экрана (дата обращения: 14.02.2013).
103. Четвертое поколение сотовой связи – новое качество мобильного Интернета
[Электронный ресурс] // NetHistory.RU : [сайт]. – Электрон. дан. – Режим доступа:
http://nethistory.ru/?p=2404, свободный. – Загл. с экрана (дата обращения: 18.02.2015).
104. Что такое 1G 2G 3G 4G? [Электронный ресурс] // Р2С : [сайт]. – Электрон. дан. –
Режим доступа: http://www.r2c-pro.ru/info/chto_takoe_1g_2g_3g_4g/, свободный. – Загл.
с экрана (дата обращения: 03.06.2019).
105. Что такое FTP сервер? [Электронный ресурс] // Speed-Tester.Info [сайт]. –
Электрон.
дан. –
Режим
доступа:
http://speed-tester.info/
info_14_chto_takoe_ftp_server_server_ftp_ftp_server.html, свободный. – Загл. с экрана
(дата обращения: 03.06.2019).
106. Что такое контент [Электронный ресурс] // Любознайка : [сайт]. – Электрон. дан.
– Режим доступа: http://luboznaiki.ru/opredelenie/kontent.html, свободный. – Загл. с
экрана (дата обращения: 03.06.2019).
107. Что такое «поколение» сетей сотовой связи [Электронный ресурс] // 1234G.ru! :
портал о современных технологиях мобильной и беспроводной связи. – Электрон.
дан. – Режим доступа: http://1234g.ru/1g/chto-takoe-pokolenie-setej-sotovoj-svyazi,
свободный. – Загл. с экрана (дата обращения: 04.06.2019).
108. Шоберг, А. CSMA/CD: метод доступа [Электронный ресурс] / А. Шоберг //
Anatoly G. Shoberg’s Pages for students : [сайт]. – Электрон. дан. – Режим доступа:
http://network-evm.narod.ru/lections/datalink_layer/CSMA-CD/CSMS-CD.htm,
свободный. – Загл. с экрана (дата обращения: 03.06.2019).
109. Электронная почта (e-mail) [Электронный ресурс] // Студопедия.Нет : [сайт]. –
Студопедия.Орг : [сайт]. – Электрон. дан. – Режим доступа: http://
studopedia.net/10_81757_elektronnaya-pochta-e-mail.html, свободный. – Загл. с экрана
(дата обращения: 26.07.2014).
�Содержание
Об авторах
Москаленко Елена Валерьевна
Ракитин Роман Юрьевич
�Содержание
Москаленко Елена Валерьевна
Старший преподаватель, ведущий программист кафедры теоретических основ информатики АлтГПУ.
Выпускница АлтГПА 2013 г. по специальности "Информатика с дополнительной специальностью
"Математика".
В 2015 году окончила с отличием магистратуру АлтГПУ по направлению подготовки: "Педагогическое
образование: Информационные технологии в физико-математическом образовании".
В настоящее время обучается на 4 курсе в аспирантуре АлтГПУ по направлению подготовки: "44.06.01.
Образование и педагогические науки", профиль подготовки: "13.00.08. Теория и методика
профессионального образования".
В вузе работает с 2012 года."
�Содержание
Ракитин Роман Юрьевич
Доцент кафедры теоретических основ информатики.
В 2003 закончил магистратуру АлтГПУ.
В 2006 защитил диссертацию в АлтГТУ.
Областью профессиональных интересов является – система профессионального образования,
информационные коммуникационные технологии в образовании, дистанционные образовательные
технологии.
Является автором 5 учебно-методических работ и более 100 высокорейтинговых публикаций.
�
Dublin Core
The Dublin Core metadata element set is common to all Omeka records, including items, files, and collections. For more information see, http://dublincore.org/documents/dces/.
Title
A name given to the resource
Ракитин, Роман Юрьевич
Dublin Core
The Dublin Core metadata element set is common to all Omeka records, including items, files, and collections. For more information see, http://dublincore.org/documents/dces/.
Title
A name given to the resource
Компьютерные сети
Subject
The topic of the resource
1. Вычислительная техника. 2. Программирование ЭВМ. Компьютерные программы. Программотехника. 3. компьютерные сети. 4. разработка веб-сайтов. 5. веб-сайты.
Description
An account of the resource
Компьютерные сети [Электронный ресурс] : учебное пособие / Р. Ю. Ракитин, Е. В. Москаленко ; Алтайский государственный педагогический университет. — Барнаул : АлтГПУ, 2019. — 340 с.
Учебное пособие содержит теоретический материал по основам организации, принципам построения и функционирования современных компьютерных сетей, а также практические руководства по разработке web-сайтов и моделированию компьютерных сетей. Учебное пособие предназначено для студентов и преподавателей высших и среднеспециальных учебных заведений при изучении темы «Компьютерные сети». Рекомендовано к изданию редакционно-издательским советом АлтГПУ 30.05.2019 г.
Creator
An entity primarily responsible for making the resource
<strong><a href="http://library.uni-altai.ru/ecat/zgate?ACTION=follow&SESSION_ID=39097&TERM=%D0%A0%D0%B0%D0%BA%D0%B8%D1%82%D0%B8%D0%BD,%20%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD%20%D0%AE%D1%80%D1%8C%D0%B5%D0%B2%D0%B8%D1%87%5B1,1004,4,6%5D&LANG=rus">Ракитин, Роман Юрьевич</a></strong>
Source
A related resource from which the described resource is derived
Алтайский государственный педагогический университет, 2019
Publisher
An entity responsible for making the resource available
Алтайский государственный педагогический университет
Date
A point or period of time associated with an event in the lifecycle of the resource
09.09.2019
Contributor
An entity responsible for making contributions to the resource
Москаленко Елена Валерьевна
Rights
Information about rights held in and over the resource
©Алтайский государственный педагогический университет, 2019
Format
The file format, physical medium, or dimensions of the resource
pdf, exe
Language
A language of the resource
русский
Type
The nature or genre of the resource
Учебное пособие
Identifier
An unambiguous reference to the resource within a given context
<URL:<a href="http://library.altspu.ru/dc/pdf/moskalenko.pdf" target="_blank">http://library.altspu.ru/dc/pdf/moskalenko.pdf</a>><br /><URL:<a href="http://library.altspu.ru/dc/exe/moskalenko.exe" target="_blank">http://library.altspu.ru/dc/exe/moskalenko.exe</a>>
веб-сайты
Вычислительная техника
компьютерные сети
Программирование ЭВМ. Компьютерные программы. Программотехника
разработка веб-сайтов
-
http://books.altspu.ru/files/original/63/106/_[650].png
63e48e8879f5e2ad23239915f3b3deef
http://books.altspu.ru/files/original/63/106/POEVM[_].pdf
202519b391e8c7ed1dd643b0975e948c
PDF Text
Text
Содержание
�Содержание
Об издании
Основной титульный экран
Дополнительный титульный экран непериодического издания – 1
Дополнительный титульный экран непериодического издания – 2
�Содержание
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Алтайский государственный педагогический университет»
(ФГБОУ ВО "АлтГПУ")
Е.Н. Дронова
Программное обеспечение ЭВМ
и технологии обработки информации
Учебное пособие
Барнаул
ФГБОУ ВО «АлтГПУ»
2018
Об издании - 1, 2, 3.
ISBN 978-5-88210-911-9
�Содержание
УДК 004.4(075)
ББК 32.972.13я73
Д758
Дронова, Е.Н.
Программное обеспечение ЭВМ и технологии обработки информации [Электронный ресурс] : учебное
пособие / Е.Н. Дронова. – Барнаул : АлтГПУ, 2018. – Систем. требования: PC не ниже класса Intel
Celeron 2 ГГц ; 512 Мb RAM ; Windows XP/Vista/7/8/10 ; Adobe Acrobat Reader ; SVGA монитор с
разрешением 1024х768 ; мышь.
ISBN 978-5-88210-911-9
Рецензенты:
Алтухов Ю. А., доктор физико-математических наук, профессор (Алтайский государственный
технический университет им. И.И. Ползунова);
Веряев А. А., доктор педагогических наук, профессор (Алтайский государственный педагогический
университет);
Пышнограй Г. В., доктор физико-математических наук, профессор (Алтайский государственный
университет)
Учебное пособие подготовлено в соответствии с требованиями Федерального государственного
образовательного стандарта высшего образования, учебным планом и рабочей программой
дисциплины. В нем рассматриваются общие вопросы программного обеспечения ЭВМ и технологий
обработки информации: различные классификации программного обеспечения ЭВМ, технологии
обработки текстовой информации, технологии представления информации, технологии обработки
числовой информации.
Пособие предназначено для студентов первого курса заочной формы обучения направления
подготовки «Педагогическое образование», профиль подготовки «Информатика».
Рекомендовано к изданию редакционно-издательским советом АлтГПУ 25.01.2018 г.
Текстовое (символьное) электронное издание.
Системные требования:
PC не ниже класса Intel Celeron 2 ГГц ; 512 Мb RAM ; Windows XP/Vista/7/8/10 ; Adobe Acrobat Reader ;
SVGA монитор с разрешением 1024х768 ; мышь.
Об издании - 1, 2, 3.
�Содержание
Электронное издание создано при использовании программного обеспечения Sunrav BookOffice.
Объём издания – 7 500 КБ.
Дата подписания к использованию: 26.02.2018
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Алтайский государственный педагогический университет» (ФГБОУ ВО «АлтГПУ»)
ул. Молодежная, 55, г. Барнаул, 656031
Тел. (385-2) 36-82-71, факс (385-2) 24-18-72
е-mail: rector@altspu.ru, http://www.altspu.ru
Об издании - 1, 2, 3.
�Содержание
Содержание
Введение
Глава 1. Программное обеспечение ЭВМ: основные понятия и классификации
1.1. Понятие программы и программного обеспечения ЭВМ
1.2. Классификация программного обеспечения по сфере использования
1.3. Классификация программного обеспечения по способу распространения и использования
1.4. Другие классификации программного обеспечения
Лабораторная работа № 1
Тестовые задания к главе 1
Глава 2. Технологии обработки текстовой информации: текстовый процессор LibreOffice Writer
2.1. Классификация программного обеспечения для обработки текстовой информации
2.2. Принцип WYSIWYG и основные группы операций при обработке текстовой информации
2.3. Основные функции текстовых процессоров
2.4. Шрифты: основные понятия и определения
2.5. Стили и шаблоны
2.6. Основные правила оформления текстовых документов
Лабораторная работа № 2
Тестовые задания к главе 2
Глава 3. Технологии представления информации: редактор презентаций LibreOffice Impress
3.1. Назначение электронной презентации
3.2. Этапы создания презентации
3.3. Требования к структуре презентации
3.4. Требования к оформлению слайдов презентации
Лабораторная работа № 3
Тестовые задания к главе 3
Глава 4. Технологии обработки числовой информации: табличный процессор LibreOffice Calc
4.1. Назначение и основные функции табличных процессоров
4.2. Основные понятия табличного процессора
4.3. Использование формул в табличном процессоре
4.4. Применение табличного процессора для расчетов
4.5. Построение диаграмм и графиков в табличном процессоре
�Содержание
4.6. Табличный процессор как простая база данных
Лабораторная работа № 4
Лабораторная работа № 5
Лабораторная работа № 6
Лабораторная работа № 7
Тестовые задания к главе 4
Ответы к тестовым заданиям
Заключение
Список рекомендованной литературы
�Содержание
Введение
Дисциплина «Программное обеспечение ЭВМ и технологии обработки информации» имеет целью
формирование системных теоретических знаний о программном обеспечении ЭВМ и технологиях
обработки информации, развитие практических умений и навыков работы с программными
продуктами на уровне квалифицированного пользователя.
Изучение ее базируется на знаниях, полученных при изучении школьного курса информатики и ИКТ и
дисциплины «Основы информационной культуры».
Изучение данной дисциплины необходимо как предшествующее для дальнейшего изучения следующих
дисциплин: «ИКТ в образовательной деятельности», «Интерактивные технологии обучения»,
«Информационные технологии коллективной работы», «Компьютерная графика», «Проектирование
цифровых образовательных ресурсов», «Средства и технологии обработки числовой информации».
Компетенции, формируемые у обучающихся в результате освоения дисциплины:
ПК-1: готов реализовывать образовательные программы по предмету в соответствии с
требованиями образовательных стандартов;
ПК-4: способен использовать возможности образовательной среды для достижения личностных,
метапредметных и предметных результатов обучения и обеспечения качества учебно-воспитательного
процесса средствами преподаваемого предмета.
Учебное пособие подготовлено в соответствии с рабочей программой дисциплины и раскрывает
содержание всех ее разделов: «Программное обеспечение ЭВМ: основные понятия и классификации»,
«Технологии обработки текстовой информации: текстовый процессор LibreOffice Writer», «Технологии
представления информации: редактор презентаций LibreOffice Impress», «Технологии обработки
числовой информации: табличный процессор LibreOffice Calc». Оно содержит как теоретический
материал для организации лекций, так и практические задания для организации лабораторных занятий
по дисциплине. Кроме этого, к каждому разделу приводятся тестовые задания для организации
контроля знаний обучающихся.
Данное пособие окажет помощь обучающимся при подготовке к занятиям по дисциплине
«Программное обеспечение ЭВМ и технологии обработки информации», и также поможет при
самостоятельном изучении программного материала и самоконтроле.
�Содержание
Заключение
Программное обеспечение ЭВМ представляет собой совокупность программ, позволяющих
осуществлять на компьютере автоматизированную обработку информации.
В настоящее время существуют различные классификации программного обеспечения ЭВМ. Наиболее
популярной является классификация программного обеспечения по сфере использования. В
соответствии с ней выделяют три класса программного обеспечения: системное ПО, прикладное ПО,
инструментальное ПО.
Системное программное обеспечение является основным программным обеспечением, оно
представляет собой совокупность программ и программных комплексов, предназначенных для
обеспечения работы компьютера и сетей ЭВМ.
Прикладное программное обеспечение представляет собой комплекс взаимосвязанных программ,
предназначенный для решения задач определенного класса конкретной предметной области.
Инструментальное программное обеспечение представляет собой совокупность программ, которые
используют при разработке программ прикладного и системного программного обеспечения.
Наибольшее распространение среди пользователей компьютера имеет прикладное программное
обеспечение. Оно позволяет решать как общие универсальные задачи, так и узкие профессиональные
задачи различных предметных областей.
Особенно популярно прикладное программное обеспечение, нацеленное на:
•
обработку текстовой информации (текстовые процессоры);
•
представление информации (редакторы презентаций);
•
обработку числовой информации (табличные процессоры).
Текстовый процессор – это прикладное ПО, предназначенное для создания, редактирования и
форматирования текстовой информации, позволяющее оперировать сложными структурными
средствами: абзацем, главой, страницей и т. д.
Редактор презентаций – это прикладное ПО, предназначенное для подготовки и просмотра
презентаций, представляющих собой набор слайдов для публичной демонстрации проделанной
работы.
Табличный процессор – это прикладное ПО, предназначенное для обработки информации
(преимущественно числовой), представленной в табличном виде.
�Содержание
Список рекомендованной литературы
1. Акимова, Е. В. Электронный учебник по дисциплине «Информатика» [Электронный ресурс] /
Е. В Акимова. – Режим доступа: http://sgpek.ru/files/electronbook/Informatika/index.html, свободный.
2. Дронова, Е. Н. Использование табличного процессора для составления математических таблиц
[Электронный ресурс] / Е. Н. Дронова // Novainfo. – Электрон. журн. – 2015. – № 31-2. – Режим
доступа: https://www.novainfo.ru/article/?nid=3219, свободный.
3. Дронова, Е. Н. Решение задач оптимизации методом подбора параметра в электронных таблицах
как средство развития мыслительных операций у учащихся [Электронный ресурс] / Е. Н. Дронова //
Современная педагогика. – Электрон. журн. – 2015. – № 1 (26). – Режим доступа: http://
pedagogika.snauka.ru/2015/01/3223, свободный.
4. Дронова, Е. Н. Табличный процессор OpenOffice.org Calc : учеб.-метод. пособие / Е. Н. Дронова. –
Барнаул : АлтГПА, 2010. – 66 с.
5. Журавлёва, И. А. Системное и прикладное программное обеспечение
И. А. Журавлёва, П. К. Корнеев. – Ставрополь : СКФУ, 2017. – 132 c.
: практикум /
6. Иванова, Н. Ю. Системное и прикладное программное обеспечение : учеб. пособие /
Н. Ю. Иванова, В. Г. Маняхина. – Москва : Прометей, 2011. – 201 с.
7. Классификация программного обеспечения по виду лицензирования. [Электронный ресурс] –
Режим доступа: http://helpiks.org/7-85293.html, свободный.
8. Краткое руководство по LibreOffice [Электронный
libreoffice.readthedocs.io/ru/latest/, свободный.
ресурс].
–
Режим
доступа:
https://
9. Программное прикладное обеспечение : учеб.-метод. пособие / авт.-сост. С. А. Омарова,
Б. К. Тульбасова, Г. А. Тюлепбердинова. – Алматы : Нур-Принт, 2012. – 73 c.
10. Рекомендации по оформлению электронной презентации в СПбГУ ИТМО [Электронный ресурс]. –
Режим доступа: http://window.edu.ru/resource/630/79630/files/presentation.pdf, свободный.
11. Скурыдин, Ю. Г. Программное обеспечение ЭВМ : учеб. пособие / Ю. Г. Скурыдин,
Г. П. Абрамкин, Е. М. Скурыдина. – Барнаул : АлтГПА, 2010. – 326 с.
12. Смирнов, А. А. Прикладное программное обеспечение : учеб.-практ. пособие / А. А. Смирнов. –
Москва : Евразийский открытый институт, 2011. – 383 с.
13. Технология работы в LibreOffice: текстовый процессор Writer, табличный процессор Calc : практикум
/ авт.-сост. В. А. Павлушина. – Рязань, 2012. – 80 с.
14. Успешно сдать ЕГЭ по информатике [Электронный ресурс]. – Режим доступа: http://infoegehelp.ru/,
свободный.
�
Dublin Core
The Dublin Core metadata element set is common to all Omeka records, including items, files, and collections. For more information see, http://dublincore.org/documents/dces/.
Title
A name given to the resource
Дронова Екатерина Николаевна
Dublin Core
The Dublin Core metadata element set is common to all Omeka records, including items, files, and collections. For more information see, http://dublincore.org/documents/dces/.
Title
A name given to the resource
Программное обеспечение ЭВМ и технологии обработки информации
Subject
The topic of the resource
1. Вычислительная техника. 2. Программирование ЭВМ. Компьютерные программы. Программотехника. 3. программное обеспечение (ПО). 4. обработка информации. 5. технологии обработки. 6. текстовая информация. 7. текстовые процессоры. 8. числовая информация. 9. лабораторные работы. 10. электронные презентации.
Description
An account of the resource
Программное обеспечение ЭВМ и технологии обработки информации [Электронный ресурс] : учебное пособие / Е. Н. Дронова ; Алтайский государственный педагогический университет. — Барнаул : АлтГПУ, 2018. — 140 с. : ил. — Дата подписания к использованию: 26.02.2018. — Библиогр.: с. 140 (14 назв.).
Учебное пособие подготовлено в соответствии с требованиями Федерального государственного образовательного стандарта высшего образования, учебным планом и рабочей программой дисциплины. В нем рассматриваются общие вопросы программного обеспечения ЭВМ и технологий обработки информации: различные классификации программного обеспечения ЭВМ, технологии обработки текстовой информации, технологии представления информации, технологии обработки числовой информации. Пособие предназначено для студентов первого курса заочной формы обучения направления подготовки «Педагогическое образование», профиль подготовки «Информатика».
Creator
An entity primarily responsible for making the resource
Дронова, Екатерина Николаевна
Source
A related resource from which the described resource is derived
Алтайский государственный педагогический университет, 2018
Publisher
An entity responsible for making the resource available
Алтайский государственный педагогический университет
Date
A point or period of time associated with an event in the lifecycle of the resource
26.02.2018
Rights
Information about rights held in and over the resource
©Алтайский государственный педагогический университет, 2018
Format
The file format, physical medium, or dimensions of the resource
pdf, exe
Language
A language of the resource
русский
Type
The nature or genre of the resource
Учебное пособие
Identifier
An unambiguous reference to the resource within a given context
<URL:<a href="http://library.altspu.ru/dc/pdf/dronova1.pdf" target="_blank">http://library.altspu.ru/dc/pdf/dronova1.pdf</a>>.
<URL:<a href="http://library.altspu.ru/dc/exe/dronova1.exe" target="_blank">http://library.altspu.ru/dc/exe/dronova1.exe</a>>.
Вычислительная техника
лабораторные работы
обработка информации
программное обеспечение (ПО)
текстовая информация
текстовые процессоры
технологии обработки
числовая информация
электронные презентации
-
http://books.altspu.ru/files/original/1/1/_[650].png
167b34274d867f7086a61c48282586f9
http://books.altspu.ru/files/original/1/1/Abramkin_Programmirovanie_v_srede_Turbo_Pascal[protection].pdf
02255134417ec998ee9c04da2f9fd33d
PDF Text
Text
Оглавлен ие
�Оглавлен ие
Об издании
Основной титульный экран
Дополнительный титульный экран непериодического издания – 1
Дополнительный титульный экран непериодического издания – 2
�Оглавлен ие
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
«АЛТАЙСКИЙ ГОСУДАРСТВЕННЫЙ ПЕДАГОГИЧЕСКИЙ УНИВЕРСИТЕТ»
Г.П. АБРАМКИН, Ю.С. ЕФРЕМОВ, О.В. ТОКАРЕВА
ПРОГРАММИРОВАНИЕ
в среде Турбо Паскаль
Учебное пособие
Барнаул
ФГБОУ ВО "АлтГПУ"
2015
Об издании - 1, 2, 3.
ISBN 978–5–88210–774–0
�Оглавлен ие
ББК 74
УДК 37
А16
Абрамкин, Г.П.
Программирование в среде Турбо Паскаль [Электронный ресурс] : учебное пособие
Абрамкин, Ю.С. Ефремов, О.В. Токарева. – Барнаул : АлтГПУ, 2015.
ISBN 978–5–88210–774–0
/ Г.П.
Рецензенты:
Овчаров А.В. – доктор пед. наук, зав. кафедрой теоретической физики и математики АлтГПУ;
Шулиманова З.Л. – доктор физ.-мат. наук, зав. кафедрой физики и химии Российской открытой
академии транспорта Московского государственного университета путей сообщения.
Текстовое (символьное) электронное издание.
Деривативное электронное издание.
Системные требования:
Intel Celeron 2 ГГц ; ОЗУ 512 Мб ; Windows XP/Vista/7/8 ; SVGA монитор с разрешением 1024х768.
Об издании - 1, 2, 3.
�Оглавлен ие
Электронное издание создано при использовании программного обеспечения Sunrav BookOffice.
Объём издания - 7 514 КБ.
Размещено на сайте: 01.06.2015
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Алтайский государственный педагогический университет» (ФГБОУ ВО «АлтГПУ»)
ул. Молодежная, 55, г. Барнаул, 656031
Тел. (385-2) 36-82-71, факс (385-2) 24-18-72
е-mail: rector@altspu.ru, http://www.altspu.ru
Об издании - 1, 2, 3.
�Оглавлен ие
Оглавление
Лабораторная работа № 1. Знакомство со средой Турбо Паскаль.
Как начать работу с Турбо Паскалем
Функциональные клавиши
Текстовый редактор
Основные приемы работы в среде Турбо Паскаля
Работа с файлами
Прогон и отладка программы
Справочная служба Турбо Паскаля
Практическая работа в среде Турбо Паскаль 7.0
1. Запуск среды
2. Первое знакомство. Основное меню
3. Работа в редакционном окне. Создание программы
4. Сохранение программы.
5. Компиляция программы.
6. Выполнение программы.
7. Отладка программы.
Лабораторная работа № 2. Составление линейных программ.
Контрольные задания
Лабораторная работа № 3. Типы данных. Функции преобразования типа.
Контрольные задания
Лабораторная работа № 4. Операции отношений. Логические операции.
Контрольные задания
Лабораторная работа № 5. Условный и составной операторы.
Контрольные задания
Лабораторная работа № 6. Оператор выбора.
Контрольные задания
Лабораторная работа № 7. Циклы.
Контрольные задания
Лабораторная работа № 8. Массивы.
Контрольные задания
Приложение
Лабораторная работа № 9. Строковый тип данных.
Контрольные задания
Лабораторная работа № 10. Процедуры и функции.
Контрольные задания
Лабораторная работа № 11. Множества.
Вопросы и упражнения
Контрольные задания
�Оглавлен ие
Лабораторная работа № 12. Записи.
Вопросы и упражнения
Контрольные задания
Лабораторная работа № 13. Файлы.
Стандартные файлы
Файлы последовательного доступа
Файлы произвольного доступа
Текстовые файлы
Процедуры и функции обработки текстового файла
Файлы без типа
Контрольные задания
Лабораторная работа № 14. Модули.
Контрольные задания
Лабораторная работа № 15. Динамические структуры данных.
Контрольные задания
Лабораторная работа № 16. Процедуры подготовки к работе в графическом режиме.
Контрольные задания
Лабораторная работа № 17. Рисование графических примитивов и фигур.
Система координат. Текущий указатель.
Линии и их стили.
Коэффициент сжатия изображения.
Окружности, эллипсы, дуги.
Контрольные задания
Лабораторная работа № 18. Управление цветами и шаблонами заливки (заполнения).
Контрольные задания
Лабораторная работа № 19. Битовые графические операции.
Контрольные задания
Лабораторная работа № 20. Управление видеостраницами. Графические окна. Вывод текста.
Контрольные задания
Лабораторная работа № 21. Управление клавиатурой.
Контрольные задания
Лабораторная работа № 22. Основные понятия объектно-ориентированного программирования.
Задания для самостоятельной работы
Лабораторная работа № 23. Элементы Turbo Vision.
Задания для самостоятельной работы
Лабораторная работа № 24. Окна.
Задания для самостоятельной работы
Лабораторная работа № 25. Интерьер.
�Задания для самостоятельной работы
Лабораторная работа № 26. Скроллинг.
Задание для самостоятельной работы
Лабораторная работа № 27. Диалоговые окна.
Управление диалоговыми окнами
Статический текст
Кнопки
Создание кластеров
Строка ввода
Установка и получение данных
Другие элементы управления
Задание для самостоятельной работы
Приложение
Встроенный ассемблер
Сообщения и коды ошибок
Библиографический список
Оглавлен ие
�Оглавлен ие
Лабораторная работа № 1
ЗНАКОМСТВО СО СРЕДОЙ ТУРБО ПАСКАЛЬ
Система программирования Турбо Паскаль представляет собой единство двух в известной степени
самостоятельных начал: компилятора с языка программирования Паскаль (язык назван в честь
выдающегося французского математика и философа Блеза Паскаля (1623–1662)) и некоторой
инструментальной программной оболочки, способствующей повышению эффективности создания
программ. Для краткости условимся в дальнейшем называть реализуемый компилятором язык
программирования Паскаль языком Турбо Паскаль, а разнообразные сервисные услуги,
предоставляемые программной оболочкой – средой Турбо Паскаля.
Среда Турбо Паскаля – это первое, с чем сталкивается любой программист, приступающий к
практической работе с системой. Если по каким-либо причинам Вы не собираетесь писать
собственные программы, можно пропустить эту главу, в которой приводятся минимальные сведения
об основных приемах работы в среде Турбо Паскаля.
�Оглавлен ие
Как начать работу с Турбо Паскалем
Система Турбо Паскаль довольно значительна по объему. Она поставляется на нескольких
дистрибутивных дискетах и устанавливается на жесткий диск. При развертывании системы на
жестком диске обычно создается отдельный каталог с именем BP (или TP, TURBO, PASCAL и т.п.), в
который помещаются все файлы с дистрибутивных дискет. Для вызова Турбо Паскаля необходимо
отыскать в древовидной структуре каталогов ПК этот каталог и в нем файл с именем TURBO. EXE.
Этот файл содержит готовую к работе диалоговую систему программирования Турбо Паскаль. В
него входят минимально необходимые части Турбо Паскаля (текстовый редактор, компилятор,
компоновщик, загрузчик). Для нормальной работы в диалоговой среде понадобятся также основная
библиотека, располагающаяся в файле TURBO.TPL, и справочная служба (файл TURBO.HLP). В
принципе, этих файлов достаточно для написания, компиляции и исполнения большинства примеров,
содержащихся в этой книге.
Пусть перечисленные файлы располагаются в каталоге BP на диске C. Тогда для вызова Турбо
Паскаля следует дать команду
C:\BP\BIN\TURBO.
По этой команде операционная система MS–DOS поставит на исполнение программу из файла
TURBO.EXE: загрузит программу в оперативную память и передаст ей управление.
Не рекомендуется работать с системой, назначив в качестве каталога по умолчанию (текущего каталога)
тот, в котором хранятся перечисленные выше файлы (этот каталог будем называть системным).
Во-первых, в таком случае можно ошибочно стереть какой-либо из файлов системы
программирования и тем самым нарушить ее работоспособность, а во-вторых, этот каталог очень
скоро за-полнится другими файлами, прямо не относящимися к Турбо Паскалю. Существует и еще
одна причина, по которой нежелательно работать в системном каталоге. Дело в том, что Турбо
Паскаль имеет свойство «запоминать» свою настройку в двух файлах с именами TURBO.TP и
TURBO.PCK. При вызове система начинает поиск этих файлов в текущем каталоге. Если этот каталог
– Ваш индивидуальный, система всякий раз будет настраиваться так, как Вы этого хотите. Если эти
файлы не обнаружены в Вашем каталоге (а при первом обращении к Турбо Паскалю так оно и будет),
система продолжит поиск в системном каталоге, а не найдя их там, настроится стандартным образом.
Впоследствии можно сохранить настроечные файлы в своем каталоге и тем самым избавить себя от
необходимости перенастройки системы всякий раз при обращении к ней.
После успешного вызова системы экран ПК приобретает вид, показанный на рис. 1.
�Оглавлен ие
Рис.1. Вид экрана после вызова Турбо Паскаля
Сразу же скажем, что для выхода из Турбо Паскаля следует нажать клавишу Alt и, не отпуская ее, –
клавишу с латинской буквой X, после чего можно отпустить обе клавиши.
Верхняя строка содержит «меню» возможных режимов работы Турбо Паскаля, нижняя – краткую
справку о назначении основных функциональных клавиш. Вся остальная часть экрана принадлежит
окну редактора, очерченному двойной рамкой и предназначенному для ввода и коррекции текста
программ. В его верхней строке приводятся имя того дискового файла, откуда был прочитан текст
программы (новому файлу присваивается имя NONAME00.PAS), два специальных поля,
используемых при работе с устройством ввода «мышь» (эти поля выделены квадратными скобками), и
цифра 1 – номер окна. В Турбо Паскале можно работать одновременно с несколькими программами
(или частями одной крупной программы), каждая из которых может располагаться в отдельном окне
редактора, Среда позволяет использовать до девяти окон редактора одновременно.
Кроме окна (окон) редактора, в Турбо Паскале используются также окна: отладочного режима,
вывода результатов работы программы, справочной службы, стека, регистров. По желанию они могут
вызываться на экран поочередно или присутствовать на нем одновременно.
�Оглавлен ие
Функциональные клавиши
Функциональные клавиши используются для управления средой Турбо Паскаля. Они обозначаются F1,
F2, ..., F12 и располагаются в самом верхнем ряду клавиатуры. С каждой из этих клавиш связывается
некоторая команда меню. Действие почти всех функциональных клавиш можно модифицировать
тремя особыми клавишами: Alt (от ALTernative – дополнительный), Ctrl (ConTRoL – управление) и
Shift (SHIFT – сдвиг). Эти клавиши используются подобно клавише временной смены регистра на
пишущей машинке: нужно нажать на одну из них и затем, не отпуская ее, нажать функциональную
клавишу. В дальнейшем такое совместное нажатие двух клавиш будем обозначать знаком +. Например,
Alt+F3 означает, что вместе с клавишей Alt необходимо нажать клавишу F3, Ctrl+F9 – вместе с Ctrl
нажимается клавиша F9 и т.д.
Ниже приводятся команды, которые передаются среде Турбо Паскаля функциональными клавишами
и некоторыми их комбинациями с клавишами Ctrl и Alt:
F1 – обратиться за справкой к встроенной справочной службе (Help – помощь);
F2 – записать редактируемый текст в дисковый файл;
F3 – прочитать текст из дискового файла в окно редактора;
F4 – используется в отладочном режиме: начать или продолжить исполнение программы и
остановиться перед исполнением той ее строки, на которой стоит курсор;
F5 – распахнуть активное окно на весь экран;
F6 – сделать активным следующее окно;
F7 – используется в отладочном режиме: выполнить следующую строку программы; если в строке есть
обращение к процедуре (функции), войти в эту процедуру и остановиться перед исполнением первого
ее оператора;
F8 – используется в отладочном режиме: выполнить следующую строку программы; если в строке есть
обращение к процедуре (функции), исполнить ее и не прослеживать ее работу;
F9 – компилировать программу, но не выполнять ее;
F10 – перейти к диалоговому выбору режима работы с помощью главного меню;
Ctrl+F9 – выполнить прогон программы: компилировать программу, находящуюся в редакторе,
загрузить ее в оперативную память и выполнить, после чего вернуться в среду Турбо Паскаля;
Alt+F5 – сменить окно редактора на окно вывода результатов работы (прогона) программы.
Описание некоторых функциональных клавиш.
Во-первых, Вам понадобятся команды Ctrl+F9 для проверки работы Вашей программы и Alt+X для
выхода из Турбо Паскаля. Клавиши F2 и F3 помогут Вам в работе с Вашими каталогами и файлами.
Командой ALT+F5 Вы в любой момент сможете просмотреть данные, выданные на экран в результате
прогона программы.
�Оглавлен ие
Текстовый редактор
Текстовый редактор среды Турбо Паскаля предоставляет пользователю удобные средства создания и
редактирования текстов программ. Признаком того, что среда находится в состоянии редактирования,
является наличие в окне редактора курсора – небольшого мигающего прямоугольника. Режим
редактирования автоматически устанавливается сразу после загрузки Турбо Паскаля. Из режима
редактирования можно перейти к любому другому режиму работы Турбо Паскаля с помощью
функциональных клавиш или выбора нужного режима из главного меню. Если среда находится в
состоянии выбора из меню, курсор исчезает, а в строке меню появляется цветной указатель прямоугольник, выделяющий одно из кодовых слов. Для перехода от состояния выбора режима из
главного меню в состояние редактирования нужно нажать клавишу Esc (ESCape – ускользать,
убегать), а для перехода к выбору из главного меню – F10.
Рассмотрим основные приемы работы с текстовым редактором.
Для создания текста программы нужно ввести этот текст с помощью клавиатуры ПК подобно тому, как
это делается при печатании текста на пишущей машинке. После заполнения очередной строки следует
нажать на клавишу Enter, чтобы перевести курсор на следующую строку (курсор всегда показывает то
место на экране, куда помещается очередной вводимый символ программы).
Окно редактора имитирует длинный и достаточно широкий лист бумаги, фрагмент которого виден в
окне. Если курсор достиг нижнего края, осуществляется прокрутка окна редактора: его содержимое
смещается вверх на одну строку и снизу появляется новая строка листа. Если курсор достиг правой
границы экрана, окно начинает по мере ввода символов смещаться вправо, показывая правый край
листа. Размеры листа по горизонтали и вертикали ограничиваются только общим числом символов в
файле, которых не должно быть больше 64535, однако компилятор Турбо Паскаля воспринимает
строки программы длиной не более 126 символов.
Окно можно смещать относительно листа с помощью следующих клавиш:
PgUp – на страницу вверх (PaGe UP – страницу вверх);
PgDn – на страницу вниз (PaGe DowN – страницу вниз);
Ноmе – в начало текущей строки (HOME – домой);
End – в конец текущей строки (END – конец);
Ctrl+PgUp – в начало текста;
Ctrl+PgDn – в конец текста.
Клавишами перевода курсора (эти клавиши помечены соответствующими стрелками и располагаются
в правой части клавиатуры) его можно смещать по экрану. При достижении курсором границ окна оно
смещается на строку или на символ.
Если Вы ошиблись при вводе очередного символа, его можно стереть с помощью клавиши,
обозначенной стрелкой влево (клавиша Backspace располагается над клавишей Enter). Клавиша Del
(от DELete – стирать) стирает символ, на который в данный момент указывает курсор, а команда
Ctrl+Y – всю строку, на которой располагается курсор.
Следует помнить, что редактор Турбо Паскаля вставляет в конце каждой строки невидимый на
экране символ - разделитель. Этот символ вставляется клавишей Enter, а стирается клавишами
Backspace или Del. С помощью вставки/стирания разделителя можно «разрезать»/«склеить» строки.
�Оглавлен ие
Чтобы «разрезать» строку, следует подвести курсор к нужному месту и нажать клавишу Enter, чтобы
«склеить» соседние строки, нужно установить курсор в конец первой строки (для этого удобно
использовать клавишу End) и нажать клавишу Del или установить курсор в начало следующей строки
(клавишей Home) и нажать клавишу Backspace.
Нормальный режим работы редактора – режим вставки, в котором каждый вновь вводимый символ
как бы «раздвигает» текст на экране, смещая вправо остаток строки. Следует учитывать, что
«разрезание» и последующая вставка пропущенных строк возможны только в этом режиме. Редактор
может также работать в режиме наложения новых символов на существующий старый текст: в этом
режиме новый символ заменяет собой тот символ, на который указывает курсор, а остаток строки
справа от курсора не смещается вправо. Для перехода к режиму наложения нужно нажать клавишу Ins
(INSert – вставка), если нажать эту клавишу еще раз, вновь восстановится режим вставки. Признаком
того, в каком режиме работает редактор, является форма курсора: в режиме вставки курсор похож на
мигающий символ подчеркивания, а в режиме наложения он представляет собой крупный мигающий
прямоугольник, заслоняющий символ целиком.
И еще об одной возможности редактора. Обычно редактор работает в режиме автоотступа. В этом
режиме каждая новая строка начинается в той же позиции на экране, что и предыдущая. Режим
автоотступа поддерживает хороший стиль оформления текстов программ: отступы от левого края
выделяют тело условного или составного оператора и делают программу более наглядной. Отказаться
от автоотступа можно командой Ctrl+O I (при нажатой клавише Ctrl нажимается сначала клавиша O,
затем О отпускается и нажимается клавиша I), повторная команда Ctrl+O I восстановит режим
автоотступа.
Ниже перечислены наиболее часто используемые команды текстового редактора Турбо Паскаля.
Смещение курсора
PgUp – на страницу вверх;
PgDn – на страницу вниз;
Ноmе – в начало строки;
Ctrl+PgUp – в начало текста;
Ctrl+PgDn – в конец текста.
Команды редактирования
Backspace – стереть символ слева от курсора;
Del – стереть символ, на который указывает курсор;
Ctrl+Y – стереть строку, на которой располагается курсор;
Enter – вставить новую строку, разрезать старую;
Ctrl+O L – восстановить текущую строку (действует, если курсор не покидал измененную строку).
�Оглавлен ие
Работа с блоком
Ctrl+К В – пометить начало блока;
Ctrl+К К – пометить конец блока;
Ctrl+К H – отменить выделение;
Ctrl+K Y – стереть блок;
Ctrl+К С – копировать блок;
Ctrl+К V – переместить блок;
Ctrl+K W – записать блок в дисковый файл;
Ctrl+K R – прочитать блок из дискового файла;
Ctrl+K P – напечатать блок.
�Оглавлен ие
Основные приёмы работы в среде Турбо Паскаля
Работа с файлами
Прогон и отладка программы
Справочная служба Турбо Паскаля
Практическая работа в среде Турбо Паскаль 7.0
1. Запуск среды
2. Первое знакомство. Основное меню
3. Работа в редакционном окне. Создание программы
4. Сохранение программы.
5. Компиляция программы.
6. Выполнение программы.
7. Отладка программы.
�Оглавлен ие
Работа с файлами
Как уже говорилось, сразу после запуска Турбо Паскаля среда автоматически переходит в режим
редактирования текста, в котором можно подготовить новую программу или исправить
существующую.
Основной формой хранения текстов программ вне среды являются файлы. После завершения работы с
Турбо Паскалем можно сохранить текст новой программы в дисковом файле с тем, чтобы
использовать его в следующий раз. Для обмена данными между дисковыми файлами и редактором
среды предназначены клавиши F2 (запись в файл) и F3 (чтение из файла). Если Вы создаете новую
программу, то среда еще не знает имя того файла, в который Вы захотите поместить текст этой
программы, и поэтому она присваивает тексту стандартное имя NONAME00.PAS (NO NAME – нет
имени). Для сохранения текста программы в файле нужно нажать на клавишу F2. В этот момент среда
проверит имя и, если это – стандартное имя NONAME, спросит, нужно ли его изменять: на экране
появится небольшое окно запроса с надписью в верхней части:
Save file as
(Сохранить в файле с именем)
Ниже надписи располагается поле для ввода имени файла, в котором можно написать любое имя и
нажать клавишу Enter, текст будет сохранен в файле. Если в имени файла опущено расширение, среда
присвоит файлу стандартное расширение *.PAS.
Если завершена работа с Турбо Паскалем (командой Alt+X), но не сохранен текст программы на
диске, на экране появится окно с запросом:
NONAME00.PAS has been modified. Save?
(Файл NONAME00.PAS был изменен. Сохранить?)
В ответ следует нажать Y (Yes – да), если необходимо сохранить текст в файле, или N (No – нет), если
сохранять текст не нужно.
�Оглавлен ие
Прогон и отладка программы
После подготовки текста программы можно попытаться исполнить ее, т.е. откомпилировать
программу, связать ее (если необходимо) с библиотекой стандартных процедур и функций, загрузить в
оперативную память и передать ей управление. Вся эта последовательность действий называется
прогоном программы и реализуется командой Ctrl+F9.
Если в программе нет синтаксических ошибок, то все действия выполняются последовательно одно за
другим, при этом на экране сообщается о количестве строк откомпилированной программы и объеме
доступной оперативной памяти. Перед передачей управления загруженной программе среда очищает
экран (точнее, выводит на экран окно прогона программы), а после завершения работы программы
вновь берет управление компьютером на себя и восстанавливает на экране окно редактора.
Если на каком-либо этапе среда обнаружила ошибку, она прекращает дальнейшие действия,
восстанавливает окно редактора и помещает курсор на ту строку программы, при компиляции или
исполнении которой обнаружена ошибка. При этом в верхней строке редактора появляется
диагностическое сообщение о причине ошибки. Все это позволяет очень быстро отладить программу,
т.е. устранить в ней синтаксические ошибки и добиться правильной ее работы.
Если ошибка возникла на этапе работы программы, простое указание того места, где она обнаружена,
может не дать нужной информации, так как ошибка может явиться следствием неправильной
подготовки данных. Например, если ошибка возникла при извлечении корня из отрицательного числа,
будет указан оператор, в котором осуществлялась сама операция извлечения корня, хотя ясно, что
первопричину ошибки следует искать где-то раньше, там, где соответствующей переменной
присваивается отрицательное значение. В таких ситуациях обычно прибегают к пошаговому
исполнению программы с помощью команд, связанных с клавишами F4, F7 и F8. Пока еще не
накоплен достаточный опыт отладки, можно пользоваться одной клавишей F7, после нажатия на
которую среда осуществит компиляцию, компоновку (связь с библиотекой стандартных процедур и
функций) и загрузку программы, а затем остановит прогон перед исполнением первого оператора.
Строка программы, содержащая этот оператор, будет выделена на экране указателем (цветом). Теперь
каждое новое нажатие на F7 будет вызывать исполнение всех операций, запрограммированных в
текущей строке, и смещение указателя к следующей строке программы. В подозрительном месте
программы можно просмотреть значения нужных Вам переменных или выражений. Для этого можно
действовать следующим образом. Установите курсор в то место текущей строки, где написано имя
интересующей Вас переменной, нажмите Ctrl+F4. На экране откроется диалоговое окно, состоящее из
трех полей. В верхнем поле будет стоять имя переменной. После этого нажмите на клавишу Enter,
чтобы получить в среднем поле текущее значение этой переменной. Если перед командой Ctrl+F4
курсор стоял на пустом участь строки или указывал на другую переменную, верхнее поле также
окажете пустым или будет содержать имя этой другой переменной. В этом случае следует ввести с
помощью клавиатуры интересующее Вас имя в верхнем поле и нажать клавишу Enter. Кстати, таким
образом можно вводить н только имена прослеживаемых переменных, но и выражения с их участием
– среда вычислит и покажет значение этого выражения.
�Оглавлен ие
Справочная служба Турбо Паскаля
Неотъемлемой составной частью среды Турбо Паскаля являете встроенная справочная служба. Если
Вы достаточно хорошо владеет английским языком, у Вас не будет проблем при работе с Турбо
Паскалем в затруднительной ситуации достаточно нажать на клавишу F1 и на экране высветится
необходимая справка. Эта справка зависит от текущего состояния среды (такую справочную службу
называют контекстно-зависимой). Например, если нажать на F1 в момент, когда среда обнаружила
ошибку в программе, в справке будут сообщены дополнительные сведения о причинах появления этой
ошибки и рекомендации по ее устранению.
Существуют четыре способа обращения к справочной службе непосредственно из окна редактора:
F1 – получение контекстно-зависимой справки;
Shift+F1 – выбор справки из списка доступных справочных сообщений
Ctrl+F1 – получение справки о нужной стандартной процедуре функции, о стандартной константе или
переменной;
Alt+F1 – получение предыдущей справки.
При использовании команды Shift+F1 на экране появляется справочное окно, содержащее
упорядоченный по алфавиту список стандартных процедур, функций, констант и переменных, для
которых можно получить справочную информацию. В этот момент клавишами смещения курсоре
следует передвинуть указатель в окне к нужному слову и нажать клавиша Enter, чтобы получить
справку.
Эту же справку можно получить и другим способом: напечатать не экране имя стандартной процедуры
(функции, константы, переменной) или подвести курсор к имеющемуся уже в тексте программы
стандартному имени и нажать Ctrl+F1. Среда проанализирует ближайшее окружение курсора,
выделит стандартное имя и даст нужную справку.
Доступ к справочной службе возможен и через главное меню Турбо Паскаля.
Во многих случаях справка содержит пример небольшой программы, иллюстрирующей
соответствующие возможности Турбо Паскаля, Не торопитесь запоминать или записывать на бумаге
этот текст, его можно «вырезать» из справки и перенести в окно редактора. Для этого после вызова
нужной справки нажмите клавишу Alt и, не отпуская ее, – клавишу с латинской буквой E – на экране
раскроется дополнительное меню . Затем клавишами смещения курсора подведите указатель (светлый
прямоугольник) в меню к строчке Copy examples (копировать примеры) и нажмите клавишу Enter –
текст примера скопируется во внутренний буфер редактора. Для извлечения примера из буфера следует
нажать клавишу Esc, чтобы выйти из справочной службы, подвести курсор к свободной строке в окне
редактора и дать команды Shift+Ins (копирование содержимого буфера в виде блока в текст
программы) и Ctrl+K H (убрать выделение блока цветом).
�Оглавлен ие
Практическая работа в среде Турбо Паскаль 7.0
1. Запуск среды
2. Первое знакомство. Основное меню
3. Работа в редакционном окне. Создание программы
4. Сохранение программы.
5. Компиляция программы.
6. Выполнение программы.
7. Отладка программы.
�Оглавлен ие
1. Запуск среды
Для запуска среды достаточно, находясь в каталоге, содержащем систему Турбо Паскаля (файл
TURBO.EXE), в ответ на подсказку DOS набрать TURBO и нажать клавишу Enter. При этом
запустится программа TURBO.EXE, которая и вызовет среду. Для выхода из среды наберите Alt + X.
�Оглавлен ие
2. Первое знакомство. Основное меню
При входе в интегрированную среду Турбо Паскаля 7.0 на экране появляется окно, в верхней
части которого высвечивается полоса с надписями - заголовками секций меню, перечисляющими
услуги, предоставляемые средой:
File
Edit
Se arch
Run
Compile
De bug
Tools
Options
Window
He lp
Вход в меню осуществляется одновременным нажатием клавиш Alt и клавиши с буквой, выделенной в
заголовке нужной секции меню. Например, для входа в секцию File необходимо нажать Alt–F. Другим
способом входа в меню является нажатие функциональной клавиши F10 с последующим
перемещением в нужную позицию меню с помощью курсора (вправо или влево). Выбранная позиция
меню подсвечивается. При нажатии клавиши Enter подсвеченная секция меню раскрывается в виде
окна, содержащего дальнейшую детализацию меню.
Например, если в меню оказывается подсвеченной секция Edit, то при нажатии клавиши Enter
раскрывается следующее окно:
Undo
Alt+BkSp
Redo
Cut
Shift+Del
Copy
Ctrl+Ins
Paste
Shift+ Ins
Clear
Ctrl+Del
Show clipboard
Комбинации клавиш, указанные справа от названия действия, определяют способ прямого входа в
меню для выполнения указанного действия.
Например, для выполнения действия «Copy» можно, находясь в меню, с помощью курсора «наехать»
на нужную позицию, подсветив ее, и нажать клавишу Enter. Другим способом является использование
клавиш. Не входя в меню, можно выполнить операцию «Copy», нажав клавиши Ctrl+Ins.
Для выхода из меню достаточно нажать клавишу Esc.
�Оглавлен ие
3. Работа в редакционном окне. Создание программы
Нажмите F10, чтобы войти в полосу меню, а затем «наедьте» курсором на позицию File, нажмите
Enter (либо наберите Alt+F). Раскрывается секция меню File:
New
Open
F3
Save
F2
Save as
Save all
Change dir
Print
Printer Setup
Dos shell
Exit
Alt+X
Выберите строку New, нажмите клавишу Enter. На экране раскрывается пустое окно, озаглавленное
NONAME00.PAS. Это имя, данное средой по умолчанию Вашей будущей программе. Если Вы
повторите операцию, раскроется еще одно окно, но уже с именем NONAME01.PAS. Таким образом
можно раскрыть достаточное число редакционных окон. Для переключения окон достаточно,
удерживая нажатой клавишу Alt, нажать клавишу с цифрой – окна пронумерованы. Например, для
возврата в первое окно нужно набрать Alt+1.
Итак, перед Вами пустое окно, в левом верхнем углу которого мигает курсор. При наборе текста с
помощью клавиатуры курсор будет перемещаться. Приступите к вводу текста программы, нажимая
Enter в конце каждой строки:
Program Summa;
Var
A,B,Sum: integer;
Begin
Wtite ('Введите два числа: ');
Readln(A,B);
Sum:= A+B;
Writeln ('Cyммa paвна ', Sum);
Writeln ('Нажмите Enter ');
Readin;
End.
�Оглавлен ие
Примечание. Не забывайте про точку с запятой, а за последним End поставьте точку. Для удаления
ошибочно набранного текста используйте Backspace, а для передвижения внутри окна редактора
используйте клавиши со стрелками.
�Оглавлен ие
4. Сохранение программы.
Для сохранения программы на диске выберите команду Save as из меню File. Турбо Паскаль открывает
диалоговый окно Save File As для переименования файла и сохранения его в другом каталоге
(директории) или на другом диске.
Диалоговое окно содержит входной бокс, список файлов, информационную панель, стандартные
переключатели Ok, Cancel, Help и список предыстории. Переключение между элементами окна
осуществляется клавишей Tab.
Во входном боксе Save file as записывается имя, под которым Вы собираетесь запомнить файл (либо
файловая маска для бокса Files).
В нашем случае надо набрать SUMMA.PAS и нажать Enter. Рассмотрим детальнее остальные
элементы диалогового бокса.
Бокс Files содержит имена файлов в текущем каталоге (директории), в соответствии с маской,
установленной в боксе Save file as.
Например, если в боксе Save file as записано *.PAS, то в боксе Files появятся имена всех файлов
каталога, содержащие расширение .PAS.
Список предыстории добавляет ко входному боксу все имена, которые появлялись в нем во время
последних вызовов диалогового окна. В список предыстории можно войти в том случае, если справа
от входного бокса Save file as видите стрелку «вниз». Для входа в список следует нажать курсор «вниз».
Этот список используется для повторного вхождения в текст, в который Вы уже входили.
Выбор нужного элемента осуществляется курсором, при этом подсвечивается выбранная позиция.
Затем следует нажать клавишу Enter. Выбранное имя файла попадает во входной бокс Save file as.
Если выбор не сделан, для выхода из списка предыстории нажмите клавишу Esc. Информационная
панель отображает путевое имя выбранного файла, его имя, дату, время создания и размер.
Переключатель Оk служит для подтверждения выполненных действий.
Кнопка Cancel отменяет все действия и выводит из диалогового окна.
Кнопка Help выводит окно с подсказкой.
�Оглавлен ие
5. Компиляция программы.
Для компиляции программы выберите опцию Compile в основном меню, для чего нажмите F10, С.
Секция содержит подменю:
Compile
Alt+F9
Make
F9
Build
Destination Memory (Disk)
Primary file …
Clear primary file
Infortation …
Команды меню Compile используются при компиляции и реализации операций Make и Build.
Команда Compile компилирует файл в активном редакционном окне. При компиляции или
выполнении команды Make на экране высвечивается бокс состояния с результатами. После
завершения компиляции или команды Make для ликвидации окна статуса компиляции достаточно
нажать любую клавишу.
При обнаружении ошибки в верхней части редакционного окна появляется сообщение.
Команда Make включает встроенный Project Manager для создания файла .ЕХЕ.
Файлы рекомпилируются в соответствии со следующими правилами:
Если Compile/Primary File содержит в списке первичный файл, он компилируется, в противном
случае компилируется последний файл, загруженный в редактор. Турбо Паскаль проверяет все файлы,
от которых зависит компилируемый файл.
Если исходный файл для данного модуля (Unit) модифицировался после того, как объектный код
(.TPU) файла был создан, модуль перекомпилируется.
Если интерфейс для данного модуля изменен, все другие модули, от него зависящие,
перекомпилируются.
Если модуль использует .OBJ file и он новее, чем .TPU file данного модуля, модуль
перекомпилируется.
Если модуль включает Include file и он новее, чем .TPU file данного модуля, модуль
перекомпилируется.
Команда Build перестраивает все файлы независимо от их новизны. Команда идентична команде
Make, но не является условной (Make перестраивает только файлы, не являющиеся текущими).
Команда Destination Memory (Disk) определяет место запоминания выполняемого кода в памяти или
на диске (как файл .ЕХЕ).
Устанавливая Destination Disk, Вы увеличиваете память, доступную среде для компиляции и отладки
�Оглавлен ие
программы.
При установке Destination Memory при выходе из среды код исчезает.
Замечание. Даже если Destination установлена в память, любые модули, рекомпилированные с
помощью Make или Build, хранят свои обновленные файлы .TPU на диске.
При установке Destination на диск Турбо Паскаль создает файл .ЕХЕ, имя которого выводится из
двух имен следующим образом:
имя первичного файла
или
если не определено первичное имя, то назначается имя файла в активном редакционном окне.
Турбо Паскаль запоминает результирующий .ЕХЕ в том же каталоге, что и исходный файл или в
каталоге, заданном в установке ЕХЕ & TPU Directory меню Options/Directories.
Переустановка команды Destination происходит нажатием клавиши Enter (установка Destination
Memory сменится на Destination Disk и наоборот).
Итак, выполните команду Compile. После начала компиляции в центре экрана появляется окно с
информацией о процессе компиляции. Если во время компиляции не обнаружено ошибок, в этом окне
появится сообщение "Compile successful: Press any key" (компиляция успешна: нажмите любую
клавишу). Окно остается на экране до тех пор, пока Вы не нажмете клавишу.
Как уже было сказано, при обнаружении ошибки, Турбо Паскаль останавливает процесс
компиляции, устанавливает курсор на ошибку в редакционном окне и выдает сообщение об ошибке.
Нажатие любой клавиши убирает сообщение, а нажатие Ctrl+Q W обеспечивает его показ до тех пор,
пока Вы не измените файл или не перекомпилируете его.
Сделав исправления, сохраните обновленный файл и заново скомпилируйте его.
Однако, для запоминания файла на этот раз нет необходимости вызывать диалоговое окно Save as,
достаточно нажать клавишу F2.
�Оглавлен ие
6. Выполнение программы.
Для запуска программы выберите секцию Run в основном меню. Секция содержит подменю:
Run
Ctrl+F9
Step over
F8
Trace into
F7
Go to cursor
F4
Program reset
Ctrl+F2
Parameters …
Команды меню Run позволяют запускать программу на выполнение, начинать и заканчивать сеанс
отладки. Команда Run запускает Вашу программу на выполнение. При этом используются любые
параметры, передаваемые ей командой Run/Parameters.
Если исходный код модифицировался после последней компиляции, компилятор автоматически
сделает Make и свяжет программу.
Если отладка программы Вами не планируется, установите [х] Standalone в диалоговом окне Debugger
меню Options/Debugger до начала компиляции и сборки.
Если программа компилируется с установкой [х] Integrated в диалоговом боксе Debugger,
результирующий исполняемый код будет содержать отладочную информацию, действующую на
команду Run следующим образом:
1. Если Вы не модифицировали исходный код после последней компиляции, команда Run заставляет
Вашу программу выполняться до точки прерывания или до конца, если точки прерывания не
установлены.
2. Если Вы модифицировали исходный код после последней компиляции и:
- если Вы не делаете пошагового прогона программы, компилятор перекомпоновывает Вашу
программу и устанавливает ее для работы с самого начала;
- если Вы уже делаете пошаговый прогон, используя ко-манды меню Run/Step Over или
Run/Trace Into, Турбо Паскаль спрашивает у Вас, хотите ли Вы перестроить программу,
- если Вы отвечаете Yes, компилятор делает Make и Link и устанавливает программу на
работу с самого начала,
- если Вы отвечаете No, Ваша программа выполняется до следующей точки прерывания (или
до конца, если такой точки нет).
Команда Program reset останавливает текущую отладку, освобождает память, занятую программой и
закрывает все файлы, используемые программой.
Команда Go to cursor пускает программу от места останова (подсвеченная строка исходного текста в
редакционном окне) до строки, возле которой установлен курсор. Если курсор находится на строке, не
содержащей выполняемых операторов, Турбо Паскаль высвечивает предупреждение. Эта команда
�Оглавлен ие
может инициировать отладку. Команда не устанавливает постоянной точки прерывания, но позволяет
программе останавливаться на уже установленных постоянных точках, встречающихся до строки,
помеченной курсором. Если это произойдет, необходимо снова воспользоваться командой Go to
cursor. Удобно использовать эту команду для предварительной установки run bar (подсвеченной
строки, на которой остановлена отладка).
Команда Trace into пускает Вашу программу построчно (оператор за оператором). При достижении
процедуры команда начинает пооператорное выполнение процедуры (в отличие от команды Step
Over, выполняющей процедуру за один шаг).
Команда Step Over выполняет следующий оператор в текущей процедуре, не трассируя вызовы
процедур низшего уровня, даже если они доступны отладчику, т.е. ее следует использовать для
пооператорного выполнения текущей процедуры без ухода в другие процедуры.
Команда Parameters выводит диалоговое окно, в котором вводятся аргументы текущей программы
(точно так, как это делается в DOS).
Program Parameters
Parameter
Ok
Cancel
Help
Итак, Вы в меню Run. Выберите команду Run. Вы попадете в окно пользователя, появится сообщение:
Введите два числа:
Наберите два любых целых числа с пробелом между ними и нажмите Enter. Появится следующее
сообщение:
Сумма равна
а за ним – сумма двух чисел. В следующей строке появится сообщение:
Нажмите клавишу Enter
Программа будет ожидать нажатия клавиши Enter. Для наблюдения за выводом из своей программы,
выберите команду User Screen в меню Debug (или нажмите Alt+F5).
�Оглавлен ие
7. Отладка программы.
Продемонстрируем использование интегрированного отладчика, встроенного в среду Турбо
Паскаля 7.0.
Интегрированный отладчик позволяет перемещаться по строкам программы, одновременно наблюдая
за изменением значений переменных.
Для начала сеанса отладки, выберите команду Trace Into меню Run (или нажмите F7). Run bar
(подсвеченная полоса) устанавливается на первой строке (в данном случае Begin).
Первое нажатие клавиши F7 инициализирует сеанс отладки. Теперь нажмите F7, чтобы начать
выполнение программы. Следующая выполнимая строка – оператор Write. Нажмите F7 снова.
Появится экран пользователя. Это произойдет потому, что утверждение Readln ожидает ввода двух
чисел. Наберите два целых числа, разделенные пробелом. Нажмите Enter. Вы вернетесь назад в
редакционное окно, с run bar на операторе присваивания. Нажмите F7 и выполните оператор
присваивания. Теперь полоса запуска находится на операторе Writeln. Нажмите F7 дважды. Теперь Вы
должны выполнить Readln. Нажмите F7, посмотрите вывод своей программы и затем нажмите Enter.
Нажмите F7 и Вы выйдете из программы.
Для того чтобы наблюдать за значениями объявленных переменных, войдите в секцию меню Debug.
Breakpoints
Clear stack
Ctrl+F3
Register
Watch
Output
User screen
Alt+F5
Evaluate/modify …
Ctrl+F4
Add watch
Add breakpoints
Выберите команду Add Watch из нижней части меню.
Команда Add watch помещает наблюдаемое выражение в окно Watches. При выборе Add Watch
отладчик открывает диалоговое окно Add Watch.
Во входном боксе Watch expression высвечивается выражение по умолчанию (то, на которое
указывает курсор в редакционном окне). Для поиска и выбора другого выражения (из числа уже
использовавшихся) можно открыть список предыстории. Если Вы вводите допустимое выражение,
нажав клавишу Enter или задействовав Ok, отладчик добавляет выражение и его текущее значение в
окно Watches.
�Оглавлен ие
Add Watch
Watch Expression
Ok
Cancel
Help
Если окно Watches является активным, для введения нового выражения для наблюдения нужно
нажать клавишу Ins.
Наберите А в окне ввода Watch Expression и нажмите Enter. A появится в окне Watches вместе со
своим текущим значением. Теперь используйте команду Add Watch для добавления В и Sum в окно
Watches.
Выберите Trace Into в секции Run (или нажмите F7) для того, чтобы сделать шаг в своей программе. В
окне Watches появятся А = 0, В = 0, Sum = 0. Когда после ввода чисел Вы нажмете Enter и вернетесь в
редакционное окно, значения А и В изменятся на введенные Вами. После выполнения оператора
вычисления суммы изменится и значение Sum.
Итак, Вы умеете пользоваться средой для основных действий. Легко, но не обольщайтесь.
Профессиональное овладение средой потребует от Вас некоторых дополнительных усилий.
Действительно, меню содержит более 80 команд (мы с Вами рассмотрели только некоторые из них),
большая часть открывает диалоговые окна.
Так, секция Options позволяет провести оптимальную настройку самой среды, секция Edit содержит
команды передачи фрагментов из одного окна в другое либо внутри одного окна. Секция Search
обеспечивает поиск и замену фрагментов. Секция Window позволяет изменять размер окон, а также
способ их выдачи на экран. Наконец, секция Help поможет разобраться во всех тонкостях
использования среды.
�Оглавлен ие
Лабораторная работа № 2
СОСТАВЛЕНИЕ ЛИНЕЙНЫХ ПРОГРАММ
Линейная программа, как правило, составляется для вычисления значения некоторого выражения.
Операция вычисления заданного выражения и запись в память полученного значения выполняются с
помощью оператора присваивания. Оператор присваивания имеет вид
<идентификатор>:= <выражение>;
где идентификатор – имя переменной или функции; знак «:=» – знак операции присваивания (читается
«присвоить»), его не следует путать с операцией отношения «=» (читается «равно»). Оператор
присваивания позволяет заменить текущее значение переменной, стоящей слева, новым значением,
задаваемым выражением, стоящим справа. Например, после выполнения оператора
х:= х + n;
текущее значение переменной х изменится на величину n.
Переменная (или функция) и выражение в операторе присваивания могут быть любого типа, но
обязательно идентичного. Допускается использование переменной типа Real c выражением типа
Integer.
Приведем примеры операторов присваивания:
Start:= 1;
x0:= 0;
sum:= Numb1+ Numb2;
i:= i+ 2;
x1:= (–b+sqrt(b*b–4*а*с))/(2*а);
fun:= false;
arr[2,3]:= m;
Str:= 'Turbo Pascal';
Рассмотрим более подробно понятие выражения. Выражения строятся из операндов (констант,
переменных, функций), знаков операций и круглых скобок. Константы, переменные и функции
должны быть либо описаны в программе, либо иметь стандартные имена (см. табл. 1). Для
вычисления числового значения используются арифметические выражения. При этом возможны
следующие знаки арифметических действий: + (сложение), - (вычитание), * (умножение), / (деление),
DIV (деление целых чисел), MOD (остаток от деления целых чисел).
Порядок выполнения операций в арифметическом выражении определяется их приоритетом:
операции умножения, деления, DIV, MOD выполняются перед операциями сложения и вычитания.
Например, при вычислении выражения 2+3*4 получим результат, равный 14. Операции одинакового
приоритета (*, /, DIV, MOD) и (+, -) выполняются в порядке их написания слева направо. Например,
a/b*с соответствует записи
.
�Оглавлен ие
Выражение, заключенное в скобки, вычисляется в первую очередь. Например, значение выражения
(2+3)*4 равно 20.
Промежуточные результаты вычислений арифметических выражений не должны выходить из
допустимой области значений целых и вещественных чисел. В арифметическом выражении допустимо
присутствие данных вещественного и целого типа. Но не рекомендуется в одном выражении
использовать данные различных типов, это приводит к дополнительным затратам машинного времени
на преобразование типов и возможны потери в точности. Если один из операндов операций
сложения, вычитания или умножения вещественный, а второй – целый, то последний перед
выполнением операции автоматически преобразуется к вещественному типу и результат будет
вещественным числом. При выполнении операции деления оба операнда, если они целые,
преобразуются к вещественному типу, результат операции всегда – вещественное число. Например,
при вычислении выражения 2/5 результат равен 0.4 (вещественный). Следовательно, результат
выражения будет целым числом, если все операнды в нем целого типа и операция деления
отсутствует. Для иллюстрации сказанного рассмотрим выражение
(6 + 4) * (1 + 0.1).
Сначала вычисляется выражение в первой скобке, т.е. 6 + 4 = 10 (целое). Во вторых скобках
величина 0.1 является вещественной, поэтому перед сложением другой операнд преобразуется к
вещественному типу 1.0. В результате получим 1.0 + 0.1 = 1.1 (вещественное). В операции
умножения теперь участвует целый операнд 10 и вещественный 1.1, целый операнд преобразуется в
вещественный, в результате имеем
10.0 * 1.1 = 11.0 (вещественное). Результат имеет вещественный тип, хотя в данном выражении
дробная часть равна нулю. В примере используются числа, однако все сказанное справедливо и в
случае использования переменных, имеющих те же значения.
Приведем пример записи на языке Turbo Pascal выражения вида
.
Программная запись будет иметь вид:
(а + 12.55 * b)/(c2 – 1.87Е3) + GAMMA.
В качестве операнда в выражении, кроме констант и переменных, можно использовать стандартные
функции. Аргументы функций обязательно заключаются в круглые скобки. В качестве аргументов
можно употреблять константы, переменные и выражения. Приоритет вычисления стандартных
функций выше, чем приоритет выполнения арифметических операций. В таблице 1 приведены
арифметические стандартные функции. Например, выражение
имеет следующую программную запись:
exp(abs((2*sin(4*x)+x)/(3*sqr(x)))).
Для возведения переменной х в некоторую степень а, т.е. нахождения , используется известное
равенство
.
�Оглавлен ие
Тогда выражение на языке Pascal должно быть записано в виде:
ехр(а*ln(х)).
Для вычисления loga b и lg b используют известные соотношения
log a b
ln b
ln b
; lg b
0, 4343 ln b
ln a
ln10
Таблица 1
Функция
Назначение
Тип аргум.
Тип результ.
abs(х)
абсолютное значение аргумента
I, R*
I, R
arctan(x)
арктангенс аргумента
R
R
cos(x)
косинус аргумента
R
R
exp(х)
ех
R
R
In(х)
натуральный логарифм
R
R
sin(x)
Синус аргумента
R
R
sqr(х)
квадрат аргумента
I, R
I, R
R
R
-
-
sqrt(х)
Pi
= 3.1415926535897932385
frac(x)
дробная часть числа
R
R
int(x)
целая часть числа
R
R
Random
равномерное псевдослучайное число 0 ? i ? 1
R
R
Random(х)
равномерное псевдослучайное число 0 ? i ? x
R
R
Randomize
инициализация датчика псевдослучайных чисел
Составим простейшую линейную программу вычисления площади поверхности и объема круглого
конуса, имеющего радиус основания R=12,54 см и длину образующей L=28,48 см. При вычислении
используем равенства:
,
где Н – высота конуса, определяемая по формуле
.
�Оглавлен ие
Пример 1
Program Conus;
Var
r, l, h, s, v: real;
Begin
write('Введите l='); readln(l);
write('Введите r='); readln(r);
s:= Pi*sqr(r) + Pi*r*l;
h:= sqrt(l*l – r*r);
v:= Pi*sqr(r)*h/3;
writeln('Параметры конуса');
writeln('r=', r, 'l=', l, 'h=', h);
writeln('Поверхность конуса s= ', s);
writeln('Объем конуса v= ', v);
readln;
End.
B программе используется предопределенная константа Pi (
). Начинается программа
с описания переменных. В операторной части программы (после Begin) следуют процедуры ввода
(read, readln) и вывода (write, writeln). Процедура read позволяет присвоить переменным r и l
введенные с клавиатуры числовые значения. В первом операторе присваивания вычисляется значение
переменной S – полной поверхности конуса, во втором – высота конуса (используется стандартная
функция извлечения квадратного корня sqrt); в третьем – объем конуса. Далее следуют процедуры
вывода на печать текстов, заключенных в апострофы, и значений переменных R, L, Н. Для печати
значений переменных в процедуре writeln указываются их имена, заключенные в апострофы. Конец
программы обозначается служебным словом End, после которого ставится точка (End.).
В языке Turbo Pascal отсутствуют операторы ввода–вывода. Их роль играют процедуры Read,
Readln, Write, Writeln, работа которых базируется на устройствах MS–DOS.
Процедура чтения Read обеспечивает ввод числовых данных, символов, строк для последующей их
обработки операторами программы. Ее формат:
Read (FV, х1, x2, ..., хn);
где FV – имя устройства, откуда вводятся данные; х1, ..., хn – список идентификаторов вводимых
переменных. По умолчанию FV равно CON (консоль), поэтому при вводе данных с клавиатуры FV
можно не указывать.
Например:
Read(х,у);
{Вводятся значения переменных х и у}
Read(А);
{Вводится значение переменной А}
�Оглавлен ие
Вводимые значения набираются на клавиатуре минимум через один пробел и высвечиваются на
экране. После набора данных для одной процедуры Read нажимается клавиша ввода (Enter).
Единственным отличием процедуры Readln от процедуры Read является то, что после считывания
значений всех переменных для одной процедуры Readln данные для следующей процедуры Readln
будут считываться с начала новой строки.
В процедурах Read и Readln параметры можно не указывать:
Read;
Readln;
В обоих случаях вводится и отражается на экране произвольная строка символов. Ввод прекращается
нажатием <Enter>.
Процедура вывода Write производит вывод числовых данных, символов, строк и булевских
значений. Формат:
Write(FV, y1, y2, ..., yn);
где FV – имя устройства, на которое осуществляется вывод.
По умолчанию FV равно CON (при выводе CON – экран); у1 , у2 , ..., уn – выражения,
результаты выполнения которых выводятся на экран, константы, имена переменных.
Процедура Writeln аналогична процедуре Write, но после выполнения происходит переход в
начало следующей строки.
Например:
Write(55+66);
Write('Сумма 5 + 6 = ',5 + 6);
Writeln(x, y, Sum);
Форматированный вывод. В процедурах вывода на экран имеется возможность указать константу (или
выражение), определяющую ширину поля вывода. Это значение указывается через двоеточие сразу
после имени выводимой единицы:
Write(55+55:10,22:6);
{результат:.......110....22}
(под число 110 отводится поле в десять позиций, под число 22 – в шесть).
Вещественные значения могут выводиться в форматах как с плавающей точкой, так и фиксированной
точкой. В первом случае указывается только ширина поля, во втором дополнительно фиксируется
количество символов в дробной части.
Например:
Write(655.04:15)
{результат: 6.550400000Е+02}
Write(655.04:8:4)
{результат: 655.0400}
Форматированный вывод позволяет оформлять выводимые данные в таблицы.
I – integer (целый); R – real (вещественный).
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Составьте программы на языке Turbo Pascal для вычислений по формулам:
1)
;
2)
;
;
3)
4)
;
5)
6)
;
;
;
7)
;
8)
9)
;
10)
;
11)
;
12)
13)
14)
15)
16)
17)
18)
�Оглавлен ие
19)
20)
21)
22)
23)
24)
25)
26)
27)
28)
29)
30)
2. Вычислить значения выражений:
1)
3)
5)
7)
9)
11)
13)
15)
17)
19)
21)
23)
25)
27)
29)
20 div 6;
29 div 3;
44 div 9;
33 div 5;
3 div 7;
1 div 4;
12 div 5;
22 div 6;
19 div 4;
21 div 5
23 div 7;
25 div 9;
27 div 11;
29 div 13;
31 div 17;
20
29
44
33
3
1
12
22
19
20
19
21
23
25
27
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
6;
3;
9;
5;
7;
4;
5;
6;
4;
7
6;
8;
9;
11;
13;
2)
4)
6)
8)
10)
12)
14)
16)
18)
20)
22)
24)
26)
28)
30)
25 div 7;
17 div 4;
99 div 5;
15 div 9;
5 div 8;
1 div 2;
2 div 5;
6 div 9;
3 div 7;
7 div 9
9 div 11;
11 div 13;
13 div 15;
15 div 17;
17 div 19;
25
17
99
15
5
1
2
6
3
5
7
9
11
13
15
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
mod
7;
4;
5;
9;
8;
2;
5;
9;
7;
9;
11;
13;
15;
19;
21.
�3. Вычислить значения выражений:
1) – a mod b + a div be;
2)
3) – ab div b mod c;
4)
5) c – b div (a + b) mod c;
6)
7) a mod be + a div c;
8)
9) kn div a mod c;
10)
11) – ab mod cbc div a;
12)
13) k mod abc – c div ab;
14)
15) (k + b) mod kb div a + c;
16)
17) ab div cb mod abc;
18)
19) k div abc + ab mod kc;
20)
21) a mod b div c mod a;
22)
23) k mod (ab)c – c div a mod b;
24) b div ab mod c + b + c mod a;
25) k mod n + c + (a – b) div k;
26) (ab) mod (a + b) + ab mod cb;
27) (a + b) mod ab – a mod b div c;
28) k mod na – (k + a) div (b + k);
29) a mod b + c + (a + b) div ka;
30) a + b mod c + (a + b) div c.
Оглавлен ие
a mod b + ac div c
k mod n – k div c – 1;
a div be mod (ab);
ab mod ca div ba;
a + b div (ab) + a mod b;
a mod b – (b – a) div cb;
kab div kab + a mod kb;
a mod (a + b) c div ab;
a + b mod kc + k div ab;
nk div n – kn mod k + a;
a – b mod ca + ca div b;
�Оглавлен ие
Лабораторная работа № 3
ТИПЫ ДАННЫХ. ФУНКЦИИ ПРЕОБРАЗОВАНИЯ ТИПА
Любая константа, переменная, значение функции или выражения в Turbo Pascal характеризуется
своим типом. Тип любого из этих объектов определяет множество допустимых значений, которые
может иметь объект, а также множество допустимых операций, которые применимы к объекту. Turbo
Pascal характеризуется разветвленной структурой типов данных (рис.1).
Рис.1. Структура типов данных
Среди типов, используемых в языке, есть стандартные (предопределенные) типы и типы,
определяемые программистом.
Стандартные типы не требуют предварительного определения. Все другие типы должны быть
определены либо в разделе объявления типов, либо в разделе объявления переменных. В данной
работе будут описаны только простые типы данных.
Все простые типы, за исключением вещественных, называются порядковыми типами.
Для величин порядковых типов определены три стандартные функции: Odd, Pred, Succ.
Функция Odd(х) проверяет величину х на нечетность. Аргументом функции является величина типа
Longint*, результат равен True, если аргумент нечетный, и False – если четный.
Функция Pred(х) определяет предыдущее значение рассматриваемой величины (например, Pred(2)
равно 1).
Функция Succ(х) определяет последующее значение рассматриваемой величины (например,
Succ(2) равно 3).
�Оглавлен ие
Функцию Pred(х) нельзя применять к первому элементу последовательности, а функцию Succ(х) –
к последнему.
Целые типы. В Turbo Pascal имеется пять стандартных целых типов: Shortint, Integer,
Longint, Byte, Word. Характеристика типов приведена в таблице 1.
Таблица 1
Тип
Диапазон
Формат
Shortint
–128..128
8–битовый знаковый
Integer
–32768..32767
16–битовый знаковый
Longint
–2147483648..2147483647
32–битовый знаковый
Byte
0..255
8–битовый беззнаковый
Word
0..65535
16–битовый беззнаковый
Над целыми числами определены операции: *, +, –, div, mod. При использовании процедур и
функций с целочисленными параметрами следует руководствоваться «вложенностью» типов, т.е.
везде, где может использоваться Word, допускается использование Byte (но не наоборот). В Longint
«входит» Integer, который, в свою очередь, включает в себя Shortint.
В таблице 2 содержится перечень встроенных процедур и функций, применимых к целочисленным
типам:
Таблица 2
Обращение
Тип результата
Действие
abs(х)
х
возвращает модуль х
chr(b)
char
возвращает символ, код которого равен b
dec(vx[,i])
как у vx
уменьшает значение vx на i,при отсутствии i – на 1
inc(vx[,i])
как у vx
увеличивает значение vx на i, при отсутствии i – на 1
odd(i)
boolean
возвращает True, если аргумент нечетное число; False, если четное
random
real
возвращает псевдослучайное число, равномерно распределенное на
интервале 0 ≤ x <1
random(n)
integer
возвращает псевдослучайное число, равномерно распределенное на
интервале 0 ≤ x < n
sqr (х)
как у параметра
возвращает квадрат аргумента
где b, w, i, l – обозначения соответственно типа Byte, Word, Integer, Longint; х – выражения
любого из этих типов; vx – переменная; в квадратных скобках указан необязательный параметр.
При использовании разных целых типов в одном выражении они приводятся к базовому типу.
Например, при использовании Integer и Shortint базовым будет тип Integer.
�Оглавлен ие
Логический тип. Стандартный логический тип Boolean представляет такой тип данных, когда
параметр может принимать два значения True и False. При этом справедливы следующие условия:
false < true;
ord(false) = 0;
ord(true) = 1;
succ(false) = true;
pred(true) = false.
Литерный (символьный) тип. Значением символьного типа Char является множество всех символов
ПЭВМ. Каждому символу ПЭВМ предписывается целое число в диапазоне 0..255. Это число есть код
внутреннего представления символа, его возвращает функция Ord. Для кодировки используется код
ASCII (American Standard Code for Information Interchange). Первая половина символов с кодами 0..127
соответствует стандарту ASCII. Вторая половина символов с кодами 128..255 не ограничена жесткими
рамками стандарта и может меняться на ПЭВМ разного типа. Во второй половине хранятся символы
национальных алфавитов, в том числе и русского языка. Символы с кодами 0..31 относятся к
служебным кодам.
К типу Char применима встроенная функция Chr(b), которая преобразует выражение типа Byte в
символ и возвращает последний в качестве своего значения.
Перечисляемый тип. Перечисляемый тип определяется набором идентификаторов, с которыми могут
совпадать значения параметров. Список идентификаторов указывается в круглых скобках,
идентификаторы разделяются запятыми. Объявление типа должно быть сделано в разделе объявлений,
и ему должно предшествовать кодовое слово Type. Между значениями перечисляемого типа и
порядковыми номерами этих значений устанавливается следующее соотношение: первое значение в
списке получает порядковый номер 0, второе – 1 и т.д. Максимальная мощность перечисляемого типа
– 256 значений.
Пример 1
Type
Operaс=(plus,minus,mult,divide);
Color=(black,white,blue,green,yellow,red,grey);
Month=(jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec);
Логический и литерный типы являются частными случаями перечисляемого типа, например:
Type
Boolean = (false, true);
Тип–диапазон. В любом порядковом типе можно выделить подмножество значений, определяемое
минимальным и максимальным значениями. Такое подмножество определяет тип–диапазон.
Объявление типа должно быть сделано в разделе объявлений типов.
�Оглавлен ие
Пример 2
Type
Digit = –100..100;
Day = 1..31;
Ch = 'a'..'z';
Как видно из примеров, границы типа–диапазона разделяются специальным символом – двумя
последовательными точками (в отличие от принятого троеточия).
Вещественные типы. В Turbo Pascal имеется пять стандартных вещественных типов: Real,
Single, Double, Extended, Соmр. Характеристики этих типов приведены в таблице 3.
Таблица 3
Тип
Диапазон
Число значащих цифр
Размер в байтах
Real
2.9*10 – 39..1.7*1038
11 – 12
6
Single
1.5*10 – 45..3.4*1038
7–8
4
Double
5.0*10 –324..1.7*10308
15 – 16
8
Extended
3.4*10 – 4951..1.1*104932
19–20
10
Comp
–263 + 1..263– 1
19–20
8
Тип Comp фактически является типом целых чисел увеличенного диапазона, однако порядковым
типом не является.
Доступ к типам Single, Double и Extended возможен только при особых режимах компиляции.
Эти типы рассчитаны на аппаратную поддержку арифметики с плавающей точкой и для их
эффективного использования в состав ПЭВМ должен входить арифметический сопроцессор, что требует
настройки компилятора.
Тип Real, который используют, не задумываясь, многие программисты при разработке
вычислительных программ на Turbo Pascal, самый медленный из всех вещественных типов.
Для работы с вещественными данными могут использоваться встроенные математические функции
abs(х), arctan(x), cos(х), sin(х), exp(х), In(х), random, sqr(х), sqrt(х), а также
функции fгас(х) и int(x).
Функция fгас(х) выделяет дробную часть х, а функция int(x) – целую часть х, где х – выражение
любого вещественного типа. Результат имеет тип и знак аргумента. Например,
frac(3.14159) возвращает 0.14159,
int(3.14159) возвращает 3.0
Функции преобразования типа. Эти функции предназначены для преобразования типов величин,
например, символа в целое число, вещественного числа – в целое и т.д. К ним относятся следующие
функции.
Chr(х) – преобразование ASCII–кода в символ. Аргумент функции должен быть целого типа в
�Оглавлен ие
диапазоне (0..255). Результатом является символ, соответствующий данному коду.
Ord(х) – преобразование любого порядкового типа в целый тип. Аргументом функции может быть
величина любого порядкового типа (логический, литерный, перечисляемый). Результатом является
величина типа Longint.
Round(х) – округление вещественного числа до ближайшего целого. Аргумент функции – величина
вещественного типа, а результат – округленная до ближайшего целого величина типа Longint.
Trunc(х) – получение целой части вещественного числа. Аргумент функции – величина
вещественного типа, а результат – целая часть этого числа. Тип результата Longint.
Пример 3
х:= 21.53;
trunc(x) = 21,
round(x) = 22;
х:= –2.7;
trunc(x) = –2,
round(x) = –3.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Определить тип (целый или вещественный) выражения:
1) 1 + 0.0;
4) sqr(5.0);
7) succ(–2);
2) 20/4;
5) sqrt(16);
8) trunc(–3.14);
3) sqr(4);
6) sin(0);
9) round(6.88).
2. Чему равно?
1) trunc(5.61);
6) round (–17.96);
2) trunc (–5.61);
7) frac(Pi);
3) round(17.16);
8) frac(–Pi);
4) round(17.96);
9) int(Pi);
5) round(–17.16);
10) int(–Pi).
Проверить правильность ответов, составив соответствующую программу.
3. Чему равно?
1) chr(65);
6) ord('''');
2) chr(97);
7) ord(chr(49));
3) ord('A');
8) chr(ord('*'));
4) ord('a');
9) pred('B');
5) chr(7);
10) succ('B').
4. Вычислить значения выражений:
1) succ(round(a/b)) – pred(n);
2) ord('z') – ord('a') + 1.
5. Дано действительное число х. Получить целую часть числа х, затем число х, округленное до
ближайшего целого, затем х без дробных цифр.
6. Используя типы Color и Month (пример 1), определить порядковые номера значений green,
black, mar, dec, а также succ(nov) и pred(feb).
7. Используя типы Day и Ch (пример 2), определить порядковые номера значений 'a', 'z', 1, 31.
8. Составить программу "датчик случайных чисел", генерирующую случайное число в диапазоне 0 ≤
i < 1 и 0 ≤ i < n, а также в диапазоне a ≤ i ≤ b.
9. Составить программу, проверяющую на четность вводимое число.
�Оглавлен ие
Лабораторная работа № 4
ОПЕРАЦИИ ОТНОШЕНИЙ. ЛОГИЧЕСКИЕ ОПЕРАЦИИ
Операции отношений предназначены для сравнения двух разных величин (величины должны быть сравнимых
типов). Результат сравнения имеет логический (Boolean) тип (Табл. 1). Все операции обладают одним и тем
же приоритетом. Каждая из операций должна соединять два операнда.
Операнды этих операций (константы, переменные, функции, выражения, не содержащие отношений) могут быть
вещественного, целого или логического (булевского) типа. Результат операции отношения равен True, если
отношение удовлетворяется для значений входящих в него операндов, и False – в противном случае.
Указанные два слова являются единственно возможной парой значений стандартного типа Boolean.
Таблица 1
Операции отношений
Операция
Действие
Выражение
Результат
=
Равно
А=В
True, если А равно В
<>
не равно
А <> В
True, если А не равно В
>
Больше
А>В
True, если А больше В
<
Меньше
А<В
True, если А меньше В
>=
больше или равно
А >= В
True, если А больше или
равно В
<=
меньше или равно
А <= В
True, если А меньше или
равно В
Например, значение 5 < 2 есть False (ложно), а 0 <= 15 – True (истинно). В сравнении с
арифметическими операциями (*, /, div, mod, +, –) операции отношений имеют меньший приоритет
(см. табл. 2), т.е., например, значение отношения 2*5 <= 17 div 3 есть False, а отношения 7+3>16 –
4*3 – True.
Следует помнить, что к операндам вещественного типа не следует применять операцию отношения «=» (равно),
условие может не выполняться за счет неточного представления действительных чисел в памяти ЭВМ и
неизбежных ошибок округления при вычислении выражений вещественного типа. Поэтому отношение а1 = а2
следует заменить отношением abs (a1 – а2) < е, где е – некоторая малая величина, характеризующая
допустимую погрешность округления.
Таблица 2
Приоритет операций
Приоритет
Тип операций
Операции
1
Унарные операции
Not
2
Операции типа умножения
*, /, Div, Mod, And
3
Операции типа сложения
+, *, Or, Xor
4
Операции отношений
=, 0, <, >, <=, >=
Turbo
Pascal
Логические операции. Помимо операций отношения в языке
существуют 4 логических
операции, применимые только к операндам целого и логического типа. Если операнды – целые числа, то
результат логической операции тоже целое число. Логические операции над логическими данными дают
результат логического (Boolean) типа.
Имеется одна унарная операция Not (исключение) и три бинарных операции And (и), Or (или), Xor
(исключающее или) (Табл. 3).
�Оглавлен ие
В Turbo Pascal булевское выражение – это выражение типа Boolean, т.е. такое, вычисление которого
дает один из двух результатов: True (истина) и False (ложь). Элементами булевских выражений могут быть
булевские константы (True или False), переменные и опять-таки выражения.
Рассмотрим пример:
Var
х, у, z: real;
b: Boolean;
x:= 4; у:= 0; z:= 1;
b:= (x<у–1) or (у+z>=x) and (z<>0);
В этом примере присутствуют две булевские операции – And и Or. Операция And, как более приоритетная,
выполняется первой. Операндами And служат два булевских выражения (у+z>=x) и (z<>0). Первое дает
False, второе – True. Следовательно, результатом операции And будет False. Затем выполняется Or с
операндами (x<у*1) и False. И то и другое равно False, поэтому операция Or дает False.
Таблица 3
Логические операции
Операция
Действие
Выражение
Not
Логическое
отрицание
Not A
And
Or
Xor
Логическое и
Логическое или
Исключающее
или
A and В
A or В
А xor В
А
В
Результат
True
False
False
True
True
True
True
True
False
False
False
True
False
False
False
False
True
True
True
True
False
True
False
True
True
False
False
False
True
True
False
True
False
True
False
True
True
False
False
False
Поскольку логические операции имеют более высокий приоритет, чем операции отношения, в сложных
логических выражениях необходимо расставлять скобки. Если, например, A, В, C и D имеют тип Integer,
�Оглавлен ие
то выражение
А = В and С < D
вызовет сообщение об ошибке. Правильным будет выражение
(А = В) and (C < D).
С помощью скобок можно изменить порядок вычислений. Например, выражение
1
6
4
2
5
3
(–3>=5) or not (7<9) and (0<=3)
имеет значение False. Цифрами вверху показан порядок выполнения операций: результат выполнения
операции 1 – False, операции 2 – True, операции 3 – True, операции 4 – False, операции 5 – False,
операции 6 – False.
Следует иметь в виду, эти две логические операции могут быть записаны подряд, если второй из них является
операция Not, например:
x1 and not x2.
В языке программирования Turbo Pascal нельзя записать двустороннее неравенство 1 < x < 2. Вместо
этого необходимо воспользоваться логическим выражением (x > 1) and (x < 2).
Нельзя также записать x = у = z. Такой же смысл имеет логическое выражение (x = у) and (x =
z). Если необходимо написать условие, заключающееся в том, что x лежит в диапазоне от –2 до + 2, его
можно записать в виде
not((х<–2) and (х>2)) или (х >=–2) and (x<=2).
Более сложным является условие, которое истинно, если точка лежит внутри единичного круга с центром в
начале координат
sqr(x)+ sqr(y) < 1.
Приме р 1. Определить принадлежность некоторого действительного числа х одному из двух отрезков [а,
b] или [c, d]. Если х принадлежит одному из этих отрезков, то переменной q присвоить значение True. в
противном случае – False.
Program Primer1;
Var
a, b, c, d, x: real;
q: Boolean;
Begin
write ('Введите x, a, b, c, d ==>');
readln (x, a, b, c, d);
q:=(a<=x) and (x<=b) or (c<=x) and (x<=d);
writeln ('Число принадлежит* ', q);
End.
Приме р 2. Составить программу, позволяющую определить, находится ли точка с произвольно заданными
�Оглавлен ие
координатами в заштрихованной области. Если точка принадлежит заштрихованной области, то переменной q
присвоить значение True, в противном случае – False.
Program Primer2;
Var
x,y: real;
q,b: Boolean;
Begin
write('Введите x,y ==>'); readln(x,y);
b:=(sqr(x)+sqr(y)<=1) and (abs(x)+abs(y)>=1);
q:=((x<0) and b) or ((x>=0) and not b));
writeln ('Точка принадлежит* ', q);
End.
Приме чание
В Turbo Pascal имеются два вида вычисления логических выражений: полное вычисление и
укороченное вычисление. Полное вычисление означает, что вычисляется каждый операнд, даже если
известен результат всего выражения. Предположим, что дано выражение A and В, где А и В – некоторые
логические выражения (операнды). При полном вычислении в любом случае вычисляются и значения А, и
значения В, а уж затем формируется значение всего выражения. При укороченном вычислении, если
величина А = False, выражение В не вычисляется, т.к. его значение не влияет на результат, который в
любом случае будет False.
Выбор вида вычисления осуществляется с помощью директивы компилятора $В. В случае директивы
{$В–} (этот вариант выбирается по умолчанию) производится укороченное вычисление. В случае
директивы {$В+} производится полное вычисление.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Вычислить значения выражений:
1) k mod 7 = k div 5 – 1
при k = 15;
2) odd(trunc(10•p))
при p = 0.182;
3) not odd(n)
при n = 0;
4) (x•y <> 0) and (y > x)
при x = 2; y = 1;
5) (x•y <> 0) or (y > x)
при x = 2; y = 1;
6) (a < b) and (x + a < b) or (с < m) or e
x = 8.7; e = true;
при a = 2.5; b = 7.8; с = 17.3; m = 5;
7) (a < 3) and (b = a+ 6) or not (c = 4)
при a=2; b=8; c=5;
8) t and (р mod 3=0)
при t = true; p = 101010;
9) a or (not b)
при а = false; b = true;
10) (2–a > b) or not (c = b) and (d – 1 <= e)
при a = 2; b = 4; c = 7; d = 4; e = 3;
11) not ((a = b) and (c2 <= 100) or (d <> e div 8))
при a = 6; b = 7; с = 3; d = 2; e = 16;
12) not (a = b) and (c2 <= 100) or (d <> e div 8)
при a=1; b=18; c=6; d=42; e=8
13) p and q or r
при p = true; q = true; r = false;
14) p and q or r
при p = true; q = false; r = true;
15) p and q or r
при p = false; q = false; r = false;
2. Вычислить следующие выражения при а = true, b = false, с = true, p = true, q = false:
1) a or b and not a;
2) (a or b) and not a;
3) not a and b;
4) not (a and b);
5) not (pred(c) = false) or (ord (c) = 1);
6) not a and not b or not c;
7) a and b < a or not b;
8) (ord (succ (false)) > 0) or (ord (false) <0)
9) a and b or not a;
10) (a = c) or (b = c) and (p > q);
11) (pred(q) = b) or (p > q);
12) (a = p) or (p = q) and not p;
13) (a > b) or not p and (b > c);
14) (a = q) and not ((a > b) and (p > q));
15) succ(pred(c = q)) and (ord(p = q)=1));
�Оглавлен ие
16) (a > b) and (p > q) or (a = p);
3. Даны значения переменных: a=10; b=20; t = true; f = false. Какими будут значения
выражений:
1) (t and f) or not (t or f);
2) t or f or (a > b);
3) not (not (not (a < b)));
4) not (a < 15) or not (b < 30);
5) (a < 5) and (b > 5) and (a < 20) and (b < 30);
6) (a < 5) and (b > 5) and (a < 10) and (b < 30);
7) (a < 5) and (b > 5) and (a < 20) or (b < 30);
8) (a < 5) and (b > 5) and (a < 10) or (b < 30);
9) not (pred(t) = false) or (ord(f) <> 1);
10) not (not (a = b));
11) not (not (not (a = b)));
12) (ord(succ (f)) > 0) or (ord(t) =1);
13) (a < 5) and (b > 5) or (a < 20) and (b < 30);
14) (a < 5) and (b > 5) or (a < 10) and (b < 30);
15) (a < 5) and (b > 5) xor (а < 20) and (b < 30);
16) (a < 5) and (b > 5) xor (a < 10) and (b < 30)?
4. Составить программу, позволяющую определить, находится ли точка с произвольно заданными
координатами в заштрихованной области. Если точка принадлежит заштрихованной области, то
переменной q присвоить значение True, в противном случае – False.
1
2
3
4
5
6
7
8
�Оглавлен ие
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
�Оглавлен ие
29
30
31
32
33
34
35
36
37
38
39
40
�Оглавлен ие
Лабораторная работа № 5
УСЛОВНЫЙ И СОСТАВНОЙ ОПЕРАТОРЫ
Условный оператор позволяет выбирать одно из двух действий, причем выбор делается во время выполнения
программы. Существует два вида условного оператора:
1) if B then S1
{если В то S1}
2) if B then S1 else S2
{если В то S1 иначе S2}
где В – выражение булевского типа; S1 и S2 – отдельные операторы или операторы, сгруппированные вместе
при помощи операторных скобок begin .. end. Такой оператор называется составным.
Составной оператор представляет собой группу из произвольного числа операторов, отделенных друг от
друга точкой с запятой и ограниченную операторными скобками begin .. end.
В качестве выражений булевского типа используются отношения. В общем случае отношения – это два
выражения, разделенные одним из знаков =, <>, >=, <=, <, >.
Для условного оператора первого вида, если выражение В принимает значение True, выполняется оператор S1,
стоящий после then. Если же выражение B принимает значение False, то этот оператор не выполняется.
Например:
if x > у then x:= 2.5.
Если значение x > у, то выполнится оператор x:= 2.5 и переменная х примет значение 2.5; если же
значение х <= у, т.е. выражение х > у ложно, то оператор х:= 2.5 не выполнится и значение х не
изменится.
Для условного оператора второго вида, если выражение В принимает значение True, выполняется оператор S1,
стоящий после then, a S2 не выполняется. Если выражение В принимает значение False, то выполняется
оператор S2, стоящий после else, a S1 не выполняется. Например:
if х > у then х:= 2.5 else y:= 0.0.
При этом, если х больше у, т.е. выражение х > у истинно, х присваивается значение 2.5, а у останется без
изменения. Если же значение х <= у, т.е. выражение х > у ложно, то у присваивается значение 0.0, а
значение х не изменится.
Следует помнить, что условный оператор управляет только одним оператором, поэтому, если требуется
произвести более одного действия, необходимо использовать составной оператор. Например, необходимо
присвоить целым переменным значения 1 и 5, если параметр а < 0, и нули в противном случае.
Оператор If запишется следующим образом:
if а < 0 then
begin
х:= 1;
y:= 5
end
else
begin
х:= 0;
�Оглавлен ие
y:= 0
end;
На операторы, стоящие после then и else, не наложены ограничения. Особый интерес представляет случай,
когда эти операторы являются условными. Рассмотрим возможные варианты:
1. В условном операторе первого вида if B1 then S1 оператор S1 может быть условным оператором
первого вида, тогда будем иметь следующую конструкцию:
if B1 then if B2 then S1.
В этом случае оператор определяется однозначно.
В условном операторе первого вида оператор S1 может быть условным оператором второго вида, тогда будем
иметь следующую конструкцию:
if B1 then if B2 then S1 else S2.
B этом случае возникает вопрос: какому then соответствует else? Для обеспечения однозначности в Turbo
Pascal принято соглашение о том. что каждому else соответствует предыдущий свободный then.
2. В условном операторе второго вида If B1 then S1 else S2 в качестве операторов S1 и S2 также
могут использоваться условные операторы как первого, так и второго вида. Рассмотрим следующий случай: S1
– условный оператор первого вида, S2 – не является условным оператором. Будем иметь конструкцию:
if B1 then begin if B2 then S1 end else S2;
Легко видеть, что в этом случае оператор S1 необходимо заключить в операторные скобки. Их отсутствие
привело бы к конструкции, рассмотренной выше. Рассмотрим примеры использования условного оператора.
Приме р 1 . Составить программу вычисления
Program Primer;
Var
х, у: real;
Begin
write('х:= '); readln(х);
if
х <= 0
then y:= 0
else y:= x* x* x;
writeln(y: 6: 2);
readln;
End.
Приме р 2. Даны действительные числа а, b, с (а <> 0). Составить программу, выясняющую,
имеет ли уравнение ах2 + bх + с = 0 действительные корни. Если действительные корни имеются, то найти
их. В противном случае ответом должно служить сообщение, что действительных корней нет.
Program Korni;
Var
�Оглавлен ие
a,b,c,x1,x2,d: real;
Begin
write('a,b,c:= '); readln(a,b,c);
d:= sqr(b)–4*a*c;
if d<0 then writeln('действительных корней нет')
else
begin
d:= sqrt(d);
a:= 2*a;
x1:= (–b+d)/a;
x2:= (–b–d)/a;
writeln('x1 = ',x1: 6: 2,'x2 = ',x2: 6: 2)
end
End.
Приме р 3. Даны действительные числа х, у, z. Составить программу, вычисляющую max(x, y,
z).
Вариант 1.
Program Max;
Var
х, у, z, m: real;
Begin
readln (x, y, z);
if х > у then if х > z then m:= х
else m:= z
else if y > z then m:= y
else m:= z;
writeln ('max = ', m: 6: 3);
readln;
End.
Вариант 2.
Program Max;
Var
х, y, z, m: real;
Begin
�Оглавлен ие
readln (x, y, z);
if (х > y) and (х > z) then m:= х
else if y > z then m:= y
else m:= z;
writeln ('max = ', m: 6: 3);
readln;
End.
Вариант 3.
Program Max;
Var
х, y, z. m: real;
t: boolean;
Begin
readln (x, y, z);
t:= (х > y) and (х > z);
if t then m:= х
else if y > z then m:= y
else m:= z;
writeln ('max = ', m: 6: 3) ;
readln;
End.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Написать программы для вычисления значений функций:
1.
1
3
x 0;
3x 2 , если
f (x )
x
2sin(cos 4 x ), если x 0.
2.
2
x ln(x ), если x 0;
f (x)
3
если x 0.
1 x ,
3.
ln( x 1),
f (x) x
2x
e x e ,
4.
x
x
e e ,
f ( x) 2
sin x,
если
если
x 0;
x 0.
если
x 0;
если
x 0.
5.
если
1.9 x 3,
f ( x)
tg 2 x
cos
x
e
,
если
x 0;
x 0.
6.
4x ,
f ( x ) arctg x,
x
,
4
если
x 1;
если 1 x 1;
если
x 1.
7.
если
x 1;
0,
f ( x ) arcctg x, если 1 x 2;
25 x 2 , если
x 2.
8.
x 2 3x 2, если - 5 x 3;
1
f ( x)
x 3,
если
x 5;
x
3x
x 3.
e x , если
9.
ln( x 2), если 0 x 3;
f ( x ) x 3 x 2 , если
x 3;
x2 ,
3.
если
x
10.
x 3 1,
2
f ( x ) x 7,
lg( x 2 2),
11.
e 2 x x 2 1,
f ( x)
4
x ,
если
x 2;
если
если
2 x 1;
x 1.
если
x 0;
если
x 0.
�Оглавлен ие
12.
x e x ,
f ( x) 2
x sin( x ),
если
x 0;
x 0.
13.
e x 1,
f (x)
x 1,
14.
e x 1 ,
f ( x)
7
2
cos 3 x x ,
если
x 0;
если
x 0.
15.
sin x cos 2 x,
f ( x)
2x
x e ,
если
x 0;
если
x 0.
16.
lg(1 x 2 ),
f ( x ) 1 x 3 x 5,
4,
17.
sin x
,
если
x 1;
x
3
f ( x) x e x,
если - 1 x 1;
lg(x 3 7 x ), если
x 1.
18.
ln( e x 1), если 0 x 3;
f ( x ) 3x 2 2 x 3 , если
x 3;
2x
4
x 0.
e x , если
19.
cos x 1
,
ex
1
f ( x ) ln x 2 ,
x
3x 2 x ,
если
если
x 0;
если
x 0.
если 0 x 5;
если x 5;
если
x 0.
если
x 1;
если 0 x 1;
если
x 0.
20.
x2
, если x 1;
f ( x ) ln x
6
x 1 если x 1;
21.
x x 2 ,
f ( x) 2
x 1,
22.
23.
x 3 sin x,
f ( x)
x 1,
ln( x 2),
f (x)
x
2 cos x 3 ,
если
если
x 0;
x 0.
если
если
если
если
x 0;
x 0.
x 0;
x 0.
�Оглавлен ие
24.
ln( x 2 4),
f ( x) x2
x,
10
25.
cos x
,
x
f ( x) x
e 2 x ,
26.
x,
если
x 0.5;
f ( x ) cos x, если 0 x 0.5;
sin 2 x 2 , если
x 0.
27.
x 2 1, если
x 2;
f ( x ) lg( x 1), если 0 x 2;
x 0.
sin x, если
28.
ln( x 2 ), если
x ;
2
f ( x ) sin x x , если 0 x ;
2
x 0.
x 0.1, если
29.
x 3 1 x 2 , если
x 1;
4 2
f ( x ) x 9, если 0 x 1;
2
x 0.
x 0.1, если
если
x 0;
если
x 0.
если
x 0;
если
x 0.
2. Решить следующие задачи:
1) Даны действительные числа х, у, z. Составить программу, вычисляющую max(2x, y, 4z).
2) Даны действительные числа х, у, z. Составить программу, вычисляющую min(5x, 2y, 3z).
3) Даны действительные числа х, у, z. Составить программу, вычисляющую max(х + у + z,
xyz).
4) Даны действительные числа х, у, z. Составить программу, вычисляющую min2(x + у + z/2,
xyz) + 1.
5) Даны действительные числа х, у, z. Составить программу, вычисляющую min(x2 + у2, у2 +
z2).
6) Даны действительные числа х, у. Составить программу, вычисляющую z = max(х, у) при х
0 и z = min(x, у) при х > 0.
7) Даны действительные числа х, у (х <> у). Меньшее из этих двух чисел заменить их
полусуммой, а большее – их удвоенным произведением.
8) Даны действительные числа х, у, z. Составить программу, меняющую значения переменных так,
чтобы оказалось х у z.
9) Даны действительные числа х, у, z. Составить программу, вычисляющую u = max(x, z)/
min(y, z).
10) Даны действительные числа х, у. Составить программу, вычисляющую z = max(x, y)/
�Оглавлен ие
min(x, y).
11) Даны три действительных числа. Составить программу, выбирающую из них те, которые
принадлежат интервалу [1, 3] или [5, 7].
12) Даны три действительных числа. Составить программу, выводящую их среднее геометрическое,
если все они неотрицательны.
13) Даны три действительных числа. Составить программу, возводящую в квадрат те из них, значения
которых неотрицательны.
14) Даны три действительных положительных числа а, b, с. Составить программу, выясняющую,
существует ли треугольник со сторонами а, b, с.
15) Даны три действительных числа а, b, с. Составить программу, удваивающую эти числа, если
а b с, и заменяющую их абсолютными значениями, если это не так.
16) Из четырех чисел а, b, c и d одно отлично от трех других, равных между собой. Присвоить
номер этого числа переменной n.
17) Даны целые числа а, b, с и d. Составить программу, печатающую те из них, которые делятся на
3.
18) Даны целые числа а, b, с и d. Составить программу, печатающую те из них, которые делятся на
5.
19) Дана упорядоченная тройка чисел х,
наименьшего числа.
у,
z. Составить программу, печатающую номер
20) Дана упорядоченная тройка чисел
наибольшего числа.
у,
z. Составить программу, печатающую номер
х,
21) Дана упорядоченная четверка чисел а, b, c и d. Составить программу, печатающую номера
положительных чисел.
22) Дана упорядоченная четверка чисел а, b, с и d. Составить программу, печатающую номера
отрицательных чисел.
23) Дана четверка чисел а, b, с и d. Составить программу, заменяющую четные числа нулями.
24) Дана четверка чисел а, b, c и d. Составить программу, заменяющую нечетные числа
единицами.
25) Составить программу, находящую из четверки чисел а, b, с и d два таких, произведение
которых максимально.
26) Составить программу, находящую из четверки чисел а, b, с и d два таких, сумма которых
минимальна.
27) Даны три числа а, b и с. Составить программу, заменяющую нулями те из них, произведение
которых больше десяти.
28) Даны три числа а, b, и с. Составить программу, которая находит их произведение, если a>b>c,
их сумму, если a<b и разность (a – b) в остальных случаях.
29) Дана упорядоченная четверка чисел a, b, c и d. Составить программу, печатающую номера тех
чисел, которые больше десяти.
�Оглавлен ие
30) Дана упорядоченная четверка чисел а, b, c и d. Составить программу, печатающую номера тех
чисел, которые делятся на 3.
�Оглавлен ие
Лабораторная работа № 6
ОПЕРАТОР ВЫБОРА
В Turbo Pascal предусмотрен еще один управляющий механизм для выбора одной из нескольких
альтернатив, который иногда оказывается более предпочтительным по сравнению с вложенной конструкцией
If. Оператор выбора (варианта) состоит из ключевого слова Case, после которого идет ключ (параметр)
выбора (селектор), ключевое слово of, список операторов выбора, каждому из которых предшествует метка
(константа) выбора, а после него ключевое слово end. Как и в операторе If, здесь может присутствовать
слово else, имеющее тот же смысл.
Структура этого оператора в Turbo Pascal такова:
Case S of
c1: operator1;
c2: operator2;
...................
cN: operatorN
else
operator
end;
B этой структуре S – выражение типа любого порядкового типа (обычно Integer), значение которого
вычисляется; с1, c2, ..., cN – константы, с которыми сравнивается значение выражения S;
operator1, ..., operatorN – операторы, из которых выполняется тот, с константой которого совпадает
значение выражения S; operator – оператор, который выполняется, если значение выражения S не совпадет
ни с одной из констант c1, ..., cN.
Ветвь оператора else operator является необязательной. Если она отсутствует и значение выражения S не
совпадает ни с одной из перечисленных констант, активизируется оператор, находящийся за словом end, т.е.
первый оператор за границей Case (пример 1). Селектор может иметь любой скалярный тип, кроме
вещественного (пример 3). Селектор может иметь и литерный тип. Его использование рассмотрено в примере 5.
При вводе одного из символов у или Y на экран будет выведено слово «Да», а при вводе n или N – слово
«Нет». Использование строкового типа в качестве селектора запрещено.
Если для нескольких констант нужно выполнить один и тот же оператор, их можно перечислить через запятую
(или даже указать диапазон, если возможно), сопроводив их одним оператором (пример 2, 4). Ниже приведены
типичные форматы записи оператора Case.
Приме р 1. Селектор целочисленного типа:
Case i of
1: y:= i+ 10;
2: y:= i+ 100;
3: y:= i+ 1000
end;
Приме р 2. Селектор интервального типа:
Case i of
�Оглавлен ие
1..10: writeln('число',i:4,'в диапазоне 1-10');
11..20: writeln('число',i:4,'в диапазоне 11-20');
21..30: writeln('число',i:4,'в диапазоне 21-30')
else
writeln ('число',i:4,'вне пределов контроля')
end;
Приме р 3. Селектор перечисляемого типа:
Type
color = (red, blue, black);
Var
х: integer;
clr: color;
Begin
write('Введите х: ', #61#62); readln (х);
Case х of
{ввод значений}
1: clr:= red;
2: clr:= blue;
3: clr:= black
end;
write('color-');
Case clr of
{вывод значений}
red: writeln('red');
blue: writeln('blue');
black: writeln('black')
end
End.
Приме р 4. Селектор для нескольких констант:
Case i of
2, 4, 6, 8: writeln('четная цифра');
1, 3, 5, 7, 9: writeln('нечетная цифра');
10..100: writeln('число от 10 до 100');
else
writeln('отрицательное число или больше 100')
end;
�Оглавлен ие
Приме р 5. Селектор литерного типа (char):
Var
ch: char;
Begin
readln(ch);
Case ch of
'n', 'N': writeln('Нет');
'y', 'Y': writeln('Да')
end
End.
Используя оператор Case, можно организовать ввод и вывод данных перечисляемого типа, минуя ограничения
языка Turbo Pascal (пример 3).
Рассмотрим программу, имитирующую работу микрокалькулятора. Программа вводит две строки: первая
содержит два произвольных числа, разделенных пробелом, вторая – символ арифметического действия,
например:
2
2
18.35 0.12
или
*
/
Программа осуществляет над введенными числами соответствующее действие и выводит на экран
результаты. Признаком конца работы программы служит любой символ, отличный от +, -, *, /.
Приме р 6
Program Calc;
Var
operation: char;
{знак операции}
х, у, z: real;
{операнды и результаты}
stop: boolean;
{признак ошибочной операции останова}
Begin
stop:= false;
repeat
writeln;
{пустая строка – разделитель}
write('х, y:= '); readln(x, y);
writeln('операция: ');
readln(operation);
Case operation of
'+': z:= х + y;
�Оглавлен ие
'–': z:= х – y;
'?': z:= х ? y;
'/': z:= х / y
else
stop:= true
end;
if not stop then writeln('результат z:=', z)
until stop
End.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Составить программу вычисления площадей (площадей полных поверхностей, объемов) различных
геометрических фигур:
ab,
h
a ,
2
h
( a b) ,
s
2
1)
r 2 ,
ab sin ,
,
r 2
360
если n 1,3;
если n 2, 4;
если n 5,7;
если n 6,8;
если n 9,11;
если n 10,12.
2(ab bc ac ),
2rh 2r 2 ,
4r 2 ,
2) s 2
2
R r ( R r)l,
2
rl r ,
r (2h d ),
abc,
1
r 3 h ,
3
4 3
3) s r ,
3 2
r h ,
h ( R 2 Rr r 2 ),
2r 2 h,
если
если
если
если
если
если
k
k
k
k
k
k
1..3;
4..6;
7..9;
10..11;
12..14;
15..17.
если k 1;
если k 2;
если k 3;
если k 4;
если k 5;
если k 6.
2. Используя оператор Case, составить программу вычисления значений функции:
2 3 b ,
2
(b ),
tg(b ) 1 ,
y
1)
b
e b ,
arctg ,
b
1 sin x,
1
(1 cos x),
2
2) y tg x ,
3
2
c tg x,
sin x 2 ,
если b 1;
если b 3;
если b 5;
если b 7;
если b 9.
если 5 x 10;
если 10 x 15;
если 15 x 20;
если 20 x 25;
если 25 x 30.
�Оглавлен ие
ea b ,
lg a ,
b
3) y ( a b)2 c ,
sin 2 ,
2
2
a b ,
a bx cx 2 ,
c
a sin bx ,
a bx 3 c,
4) y
x
a ln b
,
b
2
e a sin x c,
a 4 x ,
sin x cos 2 x,
2
2 x 1,
x e x ,
5) y
cos x,
x 3 c tg 2 x,
2
x 5,
lg( x x 2 ),
2
c bx ax ,
3x ,
6) y
arccos x ,
x 2 b ln x 2 ,
x
2
e bx ,
если k 2;
если k 4;
если k 6;
если k 8;
если k 10;
если 1 x 2;
если 2 x 3;
если 3 x 4;
если 4 x 5;
если 5 x 6;
если 6 x 7.
если 1 x 2;
если 2 x 3;
если 3 x 4;
если 4 x 5;
если 5 x 6;
если 6 x 7.
если 1 x 2;
если 2 x 3;
если 3 x 4;
если 4 x 5;
если 5 x 6;
если 6 x 7.
3.
1) Type Country = (Austria, Bulgaria, Greece, Italy, Norway, France,
Germany);
Capital = (Vena, Sofia, Afiny, Rom, Oslo, Paris, Bonn);
Var St: Country; Stol: Capital;
– по значению переменной St (названию страны) присвоить переменной Stol название столицы этой страны;
– по значению переменной Stol (названию столицы) присвоить переменной St название этой страны;
2) Var Eng: (Ada, Basic, Modula2, Lisp, Pascal, Pl1, Fortran, C);
По Eng – английскому названию языка программирования вывести на экран русское название этого языка
(Ада, Бейсик, Модула2, Лисп, Паскаль, Пл1, Фортран, Си);
3) Type Name = (zero, one, two, three, four, five, six, seven);
�Оглавлен ие
Var d: '0'..'7'; n: Name;
По литере-цифре d присвоить переменной n название этой цифры.
4) Type Country = (Germany, Cuba, Laos, Mexico, Monaco, China, Poland);
Continent = (Asia, America, Europe);
Var St: Country; Con: Continent;
По St – названию страны определить Con – название ее континента.
5) Type Season = (Winter, Spring, Summer, Autumn);
осень}
nov, dec);
{зима, весна, лето,
Month = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct,
Var Mon: Month; Sn: Season;
Определить Sn – сезон, на который приходится месяц Mon.
6) Type Units = (decimeter, kilometer, meter, millimeter, centimeter);
Var х: integer; p: Units;
Значение переменной х, означающее некоторую длину в единицах p, заменить на величину этой же длины в
метрах.
7) Var k: 1..9;
Напечатать значение переменной k римскими цифрами.
dec);
8) Type Month = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov,
Var Day: 28..31; Mon: Month;
Переменной Day присвоить количество дней в месяце Mon (год считать не високосным).
9) Для целого числа k от 1 до 99 напечатать фразу «мне k лет», учитывая при этом, что при некоторых
значениях k слово «лет» надо заменить словом «год» или «года».
�Оглавлен ие
Лабораторная работа № 7
ЦИКЛЫ
Циклы (многократно повторяемые действия) могут быть заданы в Turbo Pascal следующим образом:
a) Цикл со счетчиком:
for i:= A to[downto] B do P
где i – переменная типа Integer; А и B – константы или выражения типа Integer; при to значение
i при каждом повторе увеличивается на 1 (при А > В оператор Р не выполняется ни разу); при
downto – уменьшается на 1 (при А < В оператор Р не выполняется ни разу); Р – оператор (тело
цикла), который может быть и составным:
for i:= A to[downto] B do
begin
<операторы>
end;
b) Цикл с завершением по нарушению условия:
while B do P;
где В – условие (при невыполнении условия оператор Р не выполняется ни разу); Р – оператор (тело
цикла), который может быть и составным:
while B do
begin
<операторы>
end;
Выполнение: проверяется условие В, и, если оно удовлетворено, то выполняется Р, а затем вновь
проверяется В и т.д. Как только на очередном шаге окажется, что условие В не удовлетворяется, то
выполнение цикла прекратится.
c) Цикл до выполнения условия (с завершением по достижению условия)
repeat
<операторы>
until <условие>;
Выполнение: выполняются операторы и проверяет условие. Если оно не выполнено, то вновь
выполняются операторы и т.д. При удовлетворении условия выполнение цикла прекратится. В любом
случае операторы выполняются хотя бы раз.
Пример 1. Составить программу вычисления n!.
а)
Program fact1;
�Оглавлен ие
var n, i, p: integer;
Begin
write('n='); readln(n);
p:= 1;
for i:= 1 to n do p:= p?i;
write('n!=', p)
End.
b)
Program fact2;
var n, i, p: integer;
Begin
write('n='); readln(n);
p:= 1;
i:= 0;
while i < n do
begin
p:= p?i; i:= i + 1
end;
write('n!=', p)
End.
c)
Program fact3;
var n, i, p: integer;
Begin
write('n='); readln(n);
p:= 1 ;
i:= 0;
repeat
p:= p?i; i:= i + 1
until i >= n;
write('n!=', p)
End.
Пример 2. Составить программу, печатающую таблицу значений функции у=sqrt(x) на отрезке
[0,3] с шагом 0,3.
�Оглавлен ие
Program t;
var i: integer;
Begin
write('x', ' ': 6);
for i:= 0 to 10 do write(i*0.3: 6: 1);
writeln;
for i:= 1 to 75 do write('-');
writeln;
write('sqrt(x)', ' ');
for i:= 0 to 10 do
write(sqrt(i*0.3): 6: 2)
End.
Таблица будет изображена на экране в виде:
x
0.0
0.3
0.6
0.9
1.2
1.5
1.8
2.1
2.4
2.7
3.0
----------------------------------------------------------------------------------------------sqrt(x) 0.00
0.55
0.77
0.95
1.10
1.22
1.34
1.45
1.55
1.64
1.73
Пример 3. Не используя стандартные функции (за исключением abs), вычислить с точностью до
0.0001 функцию y=f(x). Считать, что требуемая точность достигнута, если очередное слагаемое по
модулю меньше 0.0001, все последующие слагаемые можно уже не учитывать. Привести и
значение функции у, найденное с помощью стандартных функций.
y cos x 1
x2 x4 x6
2! 4! 6!
Program f1;
var x, y, n, u: real;
Begin
write('x='); readln(x);
y:= 1;
{задается начальное значение для суммы}
n:= 1;
{номер слагаемого : y = 1–u1+u2–...}
u:= 1;
repeat
u:= –u*x*x/((2*n – 1)*2*n);
{un = un-1(–x2)/((2n – 1)2n)}
y:= y + u; n:= n + 1
until abs(u) < 0.0001;
write('полученное y=',y:6:2,'стандартное x=', cos(x):6:2)
�Оглавлен ие
End.
Program f2;
var x, y, n, u: real;
Begin
write('x='); readln(x);
y:= 1;
{задается начальное значение для суммы}
n:= 1;
{номер слагаемого : y=1–u1+u2–...}
u:= 1;
while abs(u)>=0.0001 do
begin
y:= y + u;
u:= –u*x*x/((2*n–1)*2*n);
{un =un-1(–x2)/((2n – 1)2n)}
n:= n+1;
end;
write('полученное x=',x:8:4,'стандартное x=',cos(x):8:4)
End.
Пример 4. Дана непустая последовательность положительных вещественных чисел, за которой
следует отрицательное число. Составить программу вычисления среднего арифметического этих
чисел.
Program s1;
var x, s: real; i: integer;
Begin
write('x='); readln(x);
i:= 0; s:= 0;
repeat
s:= s + x;
i:= i + 1;
write('x', i + 1, '='); readln(x);
until x < 0;
write('cp. арифм. =', s/i)
End.
Program s2;
var x, s: real; i: integer;
Begin
�Оглавлен ие
write('x='); readln(x);
i:= 0; s:= 0;
while x >= 0 do
begin
s:= s + x;
i:= i + 1;
write('x', i + 1, '='); readln(x)
end;
write('cp. арифм. =', s/i)
End.
Пример 5. Дано целое n > 0. Составить программу, печатающую все простые числа из диапазона
[2, n].
Program p1;
var n, m, k, p: integer;
Begin
write('n='); readln(n);
for m:= 2 to n do
begin
p:= 0;
for k:= 2 to trunc(sqrt(m)) do
if m mod k = 0 then p:= 1;
if p = 0 then write(m,' ')
end
End.
Program p2;
var n, m, k: integer; t: boolean;
Begin
write ('n='); readln(n);
for m:= 2 to n do
begin
k:= 2;
repeat
t:= m mod k = 0;
k:= k + 1
�Оглавлен ие
until t or (k>= trunc(sqrt(m)));
if not t then write (m, ' ')
end
End.
Недостатком программы р1 является неэкономное использование машинного времени: проверка на
делимость делителем k каждый раз осуществляется во всем диапазоне [2,
m ].
В программе р2 выход из цикла организован с помощью булевой переменной t.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Сформировать таблицу значений функции у = f(x) на отрезке [a, b] с шагом h в виде:
x
0
0.1
1
sin(x)
0.000
0.010
0.841
(y = sin x, a = 0, b = 1, h = 0.1)
1) y = ex
2) y=10x
a=0
a=0
a = 0.2
a=1
b=2
b=2
b = 1.2
b=0
h = 0.2
h = 0.2
h = 0.1
h = 0.1
6) y = ctg x
3) y = sin x
7) y = ln x
8) y = arctg x
4) y = cos x
9) y = arcctg x
a = 0.9
a=1
a=0
a=3
b = 0.1
b=4
b=2
b=1
h = 0.1
h = 0.4
h = 0.2
h = 0.3
2. Вычислить:
100
1
52
1) i 2 ;
i 1
n
i2
2) i 2 2i 3 ;
i 1
2
2n 2);
2
2);
n 1
1 sin kx
;
k
k 1
20
n
6)
n 3
i 1
5) ln(n
k 1
30
1 i2 ;
k
k
4) k 1 cos kx;
8)
n
3) ln
7) ln(i
n2
ln n
;
n
n
k
9) 1 k 3 ;
k 1
3. Не используя стандартные функции (за исключением abs), вычислить с точностью до 0.0001
функцию y=f(x). Считать, что требуемая точность достигнута, если очередное слагаемое по модулю
меньше 0.0001, все последующие слагаемые можно уже не учитывать. Для задач 1) – 6) привести и
значение функции у, найденное с помощью стандартных функций.
x x2
;
1! 2!
1)
y e x 1
2)
y arctg x x
3)
y sin x x
4)
y ln( x 1) x
x3 x5
( x 1);
3 5
x3 x5
;
3! 5!
x2 x3
( x 1);
2
3
�Оглавлен ие
5)
y sh x
e x e x
x3 x5
x ;
2
3! 5!
6)
y ch x
e x e x
x2 x4
1 ;
2
2! 4!
7)
y
8)
y
9)
y e x dx x
sin x
1x3 1x5
dx x
x
3 3! 5 5!
0
( найти
y (1));
sin x
x 1 x3 1 x5
dx
3 7 3! 11 5!
0 2 x
( найти
y (1));
x
x
x
2
0
x3 1 x5 1 x7
3 2! 5 3! 7
( найти
y (1));
4. Приближенно вычислить интегралы, используя метод средних прямоугольников при n =100
b
f ( x )dx h f ( x ) f ( x )
1
2
f ( x ) n,
a
где
h
2
1)
1
2
4)
1
7)
ba
h
, x k a kh .
n
2
dx
2
1 sin x
dx
1 x4
1
;
sin x
0 x dx;
;
2)
5)
8)
2
xdx
1 1 ex ;
1
dx
0 1 x 4 ;
1
2
x
e dx;
0
1
xdx
3)
1 ex
0
1
6)
;
1 x 6 dx;
0
1
sin x
9) 2
0
x
dx ;
7) – 9) – сравнить с результатом предыдущего задания.
5. Вычислить:
1) Сколько членов суммы 1 + 1/2 + 1/3 + ... нужно взять, чтобы результат превысил 4?
2) Сколько членов суммы 1 + 1/4 + 1/9 + ... нужно взять, чтобы результат превысил 1.6?
3) Сколько членов суммы 1+1/2+1/4+1/8+1/16 + ... нужно взять, чтобы результат оказался не менее
1.999?
Числами Фибоначчи называют числа следующей последовательности: 1, 1, 2, 3, 5, 8, ... . Здесь
каждое следующее число равно сумме двух предыдущих.
4) Вычислить двадцатое число Фибоначчи;
5) Вычислить сумму 10 первых чисел Фибоначчи;
6) Найти первое число Фибоначчи, большее m (m > 1);
7) Вычислить сумму всех чисел Фибоначчи, которые не превосходят 1000;
8) Вычислить сумму квадратов всех целых чисел, попадающих в интервал (ln x, ex), x > 1;
�Оглавлен ие
9) Вычислить количество точек с целочисленными координатами, попа-дающих в круг радиуса r (r
> 0) с центром в начале координат.
6. Решить следующие задачи:
1) Дано 15 вещественных чисел. Вычислить разность между максимальным и минимальным из
них.
2) Дана непустая последовательность различных натуральных чисел, за которой следует 0.
Определить порядковый номер наименьшего из них.
3) Даны целое n > 0 и последовательность вещественных чисел, среди которых есть хотя бы одно
отрицательное число. Найти величину наибольшего среди отрицательных чисел этой
последовательности.
4) Дано 12 вещественных чисел. Определить, образуют ли они возрастающую последовательность.
5) Дана последовательность из 14 целых чисел. Определить, со скольких отрицательных чисел она
начинается.
6) Дано 15 вещественных чисел. Найти порядковый номер того из них, которое наиболее близко к
какому-нибудь целому числу.
7) Даны натуральное n и вещественные числа x1, у1, x2, у2, ..., xn, уn. Рассматривая пары xk, уk как
координаты точек на плоскости, определить радиус наименьшего круга (с центром в начале
координат), внутрь которого попадают все эти точки.
8) Дана последовательность различных натуральных чисел, за которой следует 0. Определить два
наибольших числа среди них.
9) Дана последовательность различных натуральных чисел, за которой следует 0. Определить,
сколько из этих чисел больше предыдущего числа.
7) Вычислить:
1)
4)
10
i , j 1
10
k 1
i2
;
j3
2)
20
1
i j
i , j 1
;
2
3)
12
i
i 1 k 1
n!
k
20
n 1
5)
k
sin kn
k!
;
1
k 1;
n 1
n
k 1
;
2
�Оглавлен ие
Лабораторная работа № 8
МАССИВЫ
Массив – это структурированный тип данных, состоящий из фиксированного числа элементов,
имеющих один и тот же тип. Элементами массива могут быть данные любого, но только одного типа,
включая структурированные. Число элементов массива фиксируется при описании и в процессе
выполнения программы не меняется. Доступ к каждому отдельному элементу осуществляется путем
индексирования элементов массива. Индексы представляют собой выражения любого скалярного
типа, кроме вещественного. Тип индекса определяет границы изменения значений индекса.
Для описания массивов используется зарезервированное слово Array of.
Пример описания массивов различной размерности:
Cons t
Min = 10;
Мах = 25;
Type
MassivA = Array [1..100] of Real;
MassivB = Array [1..20, 1..50] of Integer;
MassivС = Array [1..10, 1..20, 1..30] of Char;
Var
a: MassivA;
b: MassivB;
с: MassivC;
Mas: Array [1..Min, 1..Max] of Char;
Как видно из примера, массив может быть описан без представления типа в разделе описания типов
данных. Однако, если использовать описание
Var
a: Array [1..5] of Real;
b: Array [1..5] of Real;
то переменные а и b считаются в Turbo Pascal переменными разных типов. Для обеспечения их
совместимости необходимо объявить их так:
Type
Massiv = Array [1..5] of Real;
Var
a,b: Massiv;
При индексации компонентов (элементов) массива надо соблюдать лишь два требования: во-первых,
диапазон не должен принадлежать типу LongInt, т.е. он обязан «уместиться» максимум в типе Word,
�Оглавлен ие
а, во-вторых, произведение количества компонентов массива, задаваемое диапазоном индексов, на
размер компонента в байтах не может превышать 65520 байт.
В общем случае ничто не обязывает объявлять диапазон индекса числами. В качестве индексов можно
использовать любые перечисляемые типы, как встроенные, так и вводимые. Индексы могут задаваться
по-прежнему диапазоном, а если диапазон соответствует всему типу, то можно вместо него просто
записать имя этого перечисляемого типа:
Type
MonthType = (January, February, March, April, May);
ComplectType = Array [MonthType] of Word;
SpringType = Array [March..May] of Word;
Var
Complect: СompleсtType;
{5 элементов типа Word}
Spring: StringType;
{3 элемента типа Word}
Alpha: Array['A'..'z'] of Char;
{52 символа}
Switch: Array [Boolean] of Byte;
{2 элемента}
Элементы массивов будут индексироваться значениями заданных перечисляемых типов или их
диапазонов: Complect[January] – первый, a Spring[May] – последний элементы в своих
массивах.
При описании многомерных массивов количество измерений формально не ограничено. Каждое
измерение не зависит от остальных, и можно объявлять массивы с разными индексами:
Var
m: Аrrау[–10..0, 'А'..'С', Boolean] of Byte;
Turbo Pascal позволяет записывать индексы не через запятую, а как бы изолированно
m[–3, 'B', True]
эквивалентно m[–3]['В'][True].
Следует помнить, что, если индекс элемента массива задается константой, то скорость обращения к
нему будет максимальной, потому что компилятор в этом случае вычислит расположение элемента
еще на этапе компиляции программы.
Действия над массивами. Для работы с массивом как единым целым используется идентификатор
массива без указания индекса в квадратных скобках. Массив может участвовать только в операциях
отношения «равно», «не равно» и в операторе присваивания. Массивы, участвующие в этих действиях,
должны быть идентичны по структуре, т.е. иметь одинаковые типы индексов и одинаковые типы
компонентов. Например, если массивы а и b описаны как
Var
a, b: Array[1..20] of Real;
то применение к ним допустимых операций даст следующий результат:
�Оглавлен ие
Выражение
Результат
А=В
Равен True, если значение каждого элемента массива А равно соответствующему значению
элемента массива В.
А <> B
Равен True, если хотя бы одно значение элемента массива А не равно значению
соответствующего элемента массива В.
А:= В
Все значения элементов массива В присваиваются соответствующим элементам массива А.
Массив В не меняется.
Действия над элементами массивов. Индексированные элементы массива называются
индексированными переменными и могут быть использованы, как и простые переменные, т.е. они
могут находиться в выражениях в качестве операндов, использоваться в операторах for, while, repeat,
входить в качестве параметров в процедуры read[ln], write[ln].
Инициализация массива заключается в присваивании каждому элементу массива одного и того же
значения соответствующего базового типа. Это можно сделать, записав группу операторов
присваивания. Например,
а[1]:= 0; а[2]:= 0; а[3]:= 0; а[4]:= 0; а[5]:= 0;
Однако гораздо удобнее получить этот же результат, использовав оператор for:
for i:=1 to 5 do a[i]:=0;
Для инициализации двумерного массива используют вложенный оператор for:
for i:= 1 to n do
for j:= 1 to m do
b[i, j]:= 0;
Значения элементам массива можно присваивать с помощью оператора присваивания, как в примере
инициализации, однако чаще всего они вводятся с экрана с помощью процедуры read[ln] c
использованием оператора for:
for i:= 1 to n do
readln(a[i]);
Значения двумерного массива вводятся с помощью вложенного оператора for:
for i:= 1 to n do
for j:= 1 to n do
begin
write('b[', i, ',' , j, ']=');
readln(b[i, j]);
end;
Если значения элементов могут принимать произвольные значения, используют датчик случайных
чисел:
�Оглавлен ие
Randomize;
for i:= 1 to n do
a[i]:= random(100);
{целые числа 1..100}
или для двумерного массива
Randomize;
for i:= 1 to n do
for j:= 1 to m do
b[i, j]:= random(10);
{вещественные числа из диапазона 1..10}
Вывод значений элементов массива выполняется аналогичным образом, но используется процедура
write[ln]:
for i:= 1 to n do
for j:= 1 to m do
writeln('b['i,',', j,']=', b[i, j]:8:4);
Копированием массивов называется присваивание значений всех элементов одного массива всем
соответствующим элементам другого массива. Копирование можно выполнить одним оператором
присваивания:
d:= а;
или с помощью оператора for:
for i:= 1 to n do
d[i]:= a[i];
Поиск в массиве каких-либо элементов, удовлетворяющих некоторым известным условиям,
осуществляют, вводя дополнительную переменную k и используя операторы for и If:
k:= 0;
for i:= 1 to n do
if a[i]:= 0 then k:= k + 1;
Программа определяет число элементов массива а, имеющих нулевое значение. Перестановка
значений элементов массива осуществляется с помощью дополнительной переменной того же типа,
что и базовый тип массива. Например, требуется поменять значения первого и пятого элементов
массива а:
vs:= а[5];
а[5]:= а[1];
а[1]:= vs;
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Составить программу, которая, сформировав с помощью датчика случайных чисел одномерный
массив данных, подсчитывает следующие выражения:
1)
y
x
x1 x2
n ;
n
1 2
2)
y x1x1 x 2 x 2 x nx n ;
3)
y
4)
y x 1 x 2 x 3 x
5)
y x 1x n x 2x n 1 x nx 1 ;
6)
y x1 x 2 n x 2 x 2 n 1 x n x n 1 ;
7)
y x n x n x n 1 x n x n 1 x n 2 x n x 1 ;
8)
y
x 1 x 2 x
n
;
n 1
x n;
x1 x2 x n x2 x n
x n ;
n
n 1
2. В случайной последовательности x1 , x2 , , x3 n каждая тройка чисел описывает координаты центра и
радиус круга. Существует ли изолированный круг, который не пересекается другими?
3. В случайной последовательности x1 , x2 , , x2 n – пары соседних членов х 2k-1 и х 2k, описывают концы
отрезков. Накрывают ли полностью эти отрезки отрезок [х min , х max] ?
4. Даны действительные числа x, y1, y2, ..., y100 (y1 < y2 < ...< y100, y1 < x < y100). Найти натуральное k, при
котором y k 1 x y k .
5. Даны n и
призеров.
a1 , a2 , , a n n 3 ; ai
– результат i–го спортсмена в беге на 100 м. Сформировать тройку
6. Даны n натуральных чисел . Определить и вывести количество членов последовательности:
1) являющихся нечетными числами;
2) кратных 3 и не кратных 5;
3) являющихся квадратами четных чисел;
4) удовлетворяющих условию ak
ak 1 ak 1
;
2
5) удовлетворяющих условию 2k < аk < k!;
6) имеющих четные порядковые номера и являющихся нечетными числами;
7) являющихся удвоенными нечетными числами;
8) при делении на 7 дающих остаток 1, 2 или 5;
9) обладающих тем свойством, что корни уравнения
x 2 3a i 5
действительны и положительны.
�Оглавлен ие
10) Найти количество и сумму тех членов данной последовательности, которые делятся на 5 и не
делятся на 7.
11) Получить произведение членов последовательности, кратных р (р – натуральное).
12) Получить удвоенную сумму всех положительных членов последовательности.
13) Заменить все большие 7 члены последовательности числом 7, подсчитать количество таких
членов.
14) Получить сумму тех чисел данной последовательности, которые кратны 5.
15) Получить сумму тех чисел данной последовательности, которые нечетны и отрицательны.
16) Получить сумму чисел данной последовательности, которые удовлетворяют условию |at| < t2.
7. Даны натуральное n , символы
s1 , s2 , , s n
.
1) подсчитать, сколько раз среди данных символов встречается символ «+» и сколько раз символ
«*»;
2) подсчитать общее число вхождений символов «+», « – », «*» в последовательность.
Преобразовать последовательность, заменив в ней:
3) все восклицательные знаки точками;
4) каждую точку многоточием (т.е. тремя точками);
5) каждую из групп стоящих рядом точек одной точкой;
6) каждую из групп стоящих рядом точек многоточием (т.е. тремя точками).
Среди символов есть двоеточие. Получить все символы, расположенные:
7) до первого двоеточия включительно;
8) после первого двоеточия;
9) между первым и вторым двоеточием.
8. Даны действительные числа
1)
a1 , a n 1 , a 2 , a n 2 , , a n , a 2 n ;
2)
a1 , a2 n , a2 , a2 n 1 , , a n , a n 1 ;
3)
a1 a 2 n ,a 2 a 2 n 1 , ,a n a n 1 ;
4)
a 2 n , a1 , a 2 , , a 2 n 1 ;
5)
an 1 , an 2 , , a 2n , a1 , a 2 , , an ;
6)
a n 1 , a n 2 , , a 2n , a n , a n 1 , , a1 ;
7)
a 2 n , a n 1 , a 2 n 1 , a n , , a n , a1 ;
8)
a1 , a3 , , a2 n 1 , a2 , a4 , , a2 n;
a1 , a2 , , a2 n
. Получить:
�Оглавлен ие
9. C помощью датчика случайных чисел сформировать: в заданиях 1)–3) одномерный массив из N
элементов, в заданиях 4)–10) – двумерный массив N*N и выполнить следующие действия:
1) упорядочить элементы массива по возрастанию (сортировку производить перестановкой
соседних элементов);
2) упорядочить элементы массива по возрастанию (алгоритм сортировки следующий: поиск
наименьшего элемента, помещение его на первое место; поиск наименьшего элемента из
оставшихся и помещение его на второе место и т.д.);
3) упорядочить элементы массива по убыванию (просматривать последовательно элементы и
вставлять их на подходящее место в упорядоченную создаваемую последовательность; это место
определяется последовательным сравнением элемента с уже упорядоченными элементами).
4) упорядочить (переставить) строки матрицы по неубыванию значений первых элементов строк;
5) упорядочить (переставить) строки матрицы по невозрастанию сумм элементов строк;
6) упорядочить (переставить) строки матрицы по неубыванию значений наименьших элементов
строк;
7) упорядочить (переставить) строки матрицы по невозрастанию значений наибольших элементов
строк;
8) упорядочить (переставить) строки матрицы по неубыванию сумм элементов строк;
9) упорядочить (переставить) строки матрицы по неубыванию наименьших элементов строк;
10) упорядочить (переставить) строки матрицы по невозрастанию наибольших элементов строк.
10. Дан упорядоченный одномерный массив целочисленных значений и целое число р. Удалить k–ый
элемент массива и вставить в массив число р так, чтобы не нарушилась упорядоченность.
11. Дана действительная квадратная матрица порядка 2N. Получить новую матрицу, переставляя ее
блоки размера N*N, как показано на рисунке:
12. Дана действительная квадратная матрица порядка 3N. Найти наибольшее из значений элементов,
расположенных в заштрихованной части матрицы:
�Оглавлен ие
�Оглавлен ие
ПРИЛОЖЕНИЕ
{ввод одномерного массива}
write('укажите размер массива n='); readln(n);
for i:= 1 to n do
begin
write('a[', i, ']=');
readln(a[i]);
end;
{формирование одномерного массива с помощью датчика случайных чисел}
writе('укажите размер массива n='); readln(n);
Randomize;
for i:= 1 to n do
begin
a[i]:= random(200);
{диапазон изменения чисел 0..199}
b[i]:= 10?random;
{вещественные числа в диапазоне 0.0..9.9}
end;
{ввод двумерного массива по строкам}
write('укажите число строк n='); readln(n);
writе('укажите число столбцов m='); readln(m);
for i:= 1 to n do
begin
write('введите ', i, '–ю строку');
for j:= 1 to m do
begin
write('b[', i. ', ', j, ']=');
readln(b[i, j]);
end;
end;
{ввод двумерного массива по столбцам}
write ('укажитете число столбцов m='); readln (m);
write('укажите число строк n='); readln(n);
for j:=1 to m do
�Оглавлен ие
begin
write('введите ', j, '–и столбец');
for i:= 1 to n do
begin
write('b[', i, ', ', j, ']= ');
readln(b[i, j]);
end;
end;
{вывод одномерного массива}
writeln('вывод массива');
for i:= 1 to n do
write('a[', i:2, ']=', a[i]:4);
{вывод двумерного массива}
for i:= 1 to n do
begin
for j:=1 to m do
write('b['. i, ', ', j, ']=', b[i, j]);
writeln;
end;
{суммирование элементов одномерного массива}
s:= 0;
for i:= 1 to n do
s:= s + a[i];
{суммирование элементов двумерного массива}
s:= 0;
for i:= 1 to n do
for j:= 1 to m do
s:=s+b[i,j];
{суммирование диагональных элементов двумерного массива}
s:= 0;
for i:= 1 to n do
s:= s + b[i, i];
�Оглавлен ие
{суммирование двух массивов}
for i:= 1 to n do
c[i]:= a[i] + b[i];
{суммирование двумерных массивов}
for i:= 1 to n do
for j:= 1 to m do
c[i, j]:= a[i, j] + b[i,j];
{суммирование элементов i–ой строки матрицы}
s:= 0;
for j:= 1 to m do
s:= s + b[i, j];
{суммирование матрицы по строкам}
for i:= 1 to n do
begin
s:= 0;
for j:= 1 to m do
s:= s + b[i, j];
d[i]:= s;
end;
{транспонирование матрицы}
{заменить строки столбцами, а столбцы строками}
for i:= 1 to n do
for j:= 1 to m do
b[i, j]:= a[j, i];
{транспонирование квадратной матрицы}
for i:= 1 to n–1 do
for j:= i + 1 to n do
begin
p:= a[i, j];
a[i, j]:= a[j, i];
a[j, i]:= p;
�Оглавлен ие
end;
{умножение матрицы на вектор}
for i:= 1 to n do
begin
s:= 0;
for j:= 1 to m do
s:= s + a[i, j] ?b[j];
c[i]:= s;
end;
{умножение матрицы на матрицу}
for i:=1 to n do
for j:=1 to m do
begin
s:= 0;
for l:=1 to k do
s:= s + a[i,l]*b[l,j];
c[i,j]:= s;
end;
{удаление элемента из массива}
n:= n–1 ;
for i:= k to n do
a[i]:= a[i+1];
{включение элемента в заданную позицию массива}
for i:= n downto k do
a[i + 1]:= a[i];
a[k]:= b;
n:= n+1 ;
{включение элемента
упорядоченности}
в
массив,
упорядоченный
по
i:= 1;
m1: if i > n then begin a[i+1]:= b; goto m2 end;
if b > a[i] then begin i:= i+1; goto m1 end;
возрастанию
с
сохранением
�Оглавлен ие
for j:= n downto i do
a[j+1]:= a[j];
a[i]:= b;
m2: n:= n+1 ;
{удаление строки с заданным номером из матрицы}
n:= n – 1 ;
for i:= k to n do
for j:= 1 to m do
b[i, j]:= b[i+1, j];
{включение строки в матрицу}
for i:= n downto k do
for j:= 1 to m do
b[i+1, j]:= b[i, j];
for j:= 1 to m do
a[k,j]:= c[j];
n:= n+1 ;
{перестановка строк матрицы}
for k:= 1 to m do
c[k]:= a[i,k];
for k:= 1 to m do
a[i,k]:= a[j,k];
for k:= 1 to m do
a[j,k]:= c[k];
{перестановка строк матрицы}
for k:= 1 to m do
begin
p:= a[i,k];
a[i,k]:= a[j,k];
a[j,k]:= p;
end;
{умножение строки матрицы на число b}
�Оглавлен ие
for j:= 1 to n do
a[i, j]:= a[i, j]*b;
{поиск минимального (максимального) элемента в массиве}
max:= а[1]; index:= 1;
for i:= 2 to n do
if a[i] > max then
begin
max:= a[ i ];
index:= i;
end;
{поиск минимального (максимального) элемента в матрице}
max:= а[1, 1]; indexi:= 1; indexj:= 1;
for i:= 2 to n do
for j:= 1 to m do
if a[i, j] > max then
begin
max:= a[i, j];
indexi:= i;
indexj:= j;
end;
{упорядочить массив по возрастанию (убыванию)}
for j:= 1 to n–1 do
for i:= 1 to n–j do
if a[i] > a[i+1 ] then
begin
s:= a[i];
a[i]:= a[i+1];
a[i+1]:= s;
end;
{преобразование матрицы в одномерный массив}
for i:= 1 to n do
for j:= 1 to m do
�Оглавлен ие
b[(i–1)*m+j]:= a[i, j];
{определение числа элементов массива, удовлетворяющих заданному условию}
k:= 0;
for i:= 1 to n do
if а[j] >= t then k:= k+1;
{суммирование элементов массива, удовлетворяющих заданному условию}
s:= 0;
for i:= 1 to n do
if a[i] >= t then s:= s + a[i];
{объединение двух массивов одинакового размера}
for i:= 1 to n do
begin
с[2*i – 1]:= a[i];
c[2*i]:= b[i];
end;
{инвертирование массива}
m:= n div 2;
for i:= 1 to m do
begin
p:= a[i];
a[i]:= a[n–i+1];
a[n–i+1 ]:= p;
end;
{поиск в массиве заданного элемента и его номера}
l:= 100;
st:= 'элемента, равного L, нет';
k:= 0;
for i:= 1 to n do
if a[i] = l then k:= i;
if k = 0 then writeln(st)
else writeln('номер элемента i = ', k);
�Оглавлен ие
{циклический сдвиг элементов массива}
{исходные данные: n – размер массива, а – массив размером n, m – число позиций сдвига, р –
массив размером не менее m }
for i:= 1 to m do
p[i]:= a[n – m + 1];
for i:= n – m downto 1 do
a[i + m]:= a[i];
for i:= 1 to n do
a[i]:= p[i];
{циклический сдвиг элементов массива}
{исходные данные: n – размер массива, а – массив размером n, m –число позиций сдвига, р –
переменная, j – управляющая переменная внутреннего цикла}
for i:= 1 to n – 1 do
begin
р:= a[i];
for j:= i + 1 to n do
if a[j] <> р then
begin
p:= a[i];
k:= j;
end;
a[k]:= a[i];
a[i]:= p;
end;
�Оглавлен ие
Лабораторная работа № 9
СТРОКОВЫЙ ТИП ДАННЫХ
Строки – это последовательности символов, при использовании в выражениях строка обязательно
заключается в апострофы, идентификатор строки – string, за которым обязательно следует
заключенное в квадратные скобки значение максимально допустимой длины строки. Формат описания
строки:
Type
<имя типа> = string[i];
{ i – переменная типа byte, i <= 255}
Var
<идентификатор, ...>: <имя типа>;
Переменную типа string можно задать и без описания типа:
Var
<идентификатор, ...>: string[i];
Строковые выражения – это выражения, в которых присутствуют строковые данные. Над строковыми
данными допустимы операции сцепления и операции отношения.
Операция сцепления (+) применяется для сцепления нескольких строк в одну, длина результирующей
строки не должна превы-шать 255.
Пример: выражение – 'А' + 'Б' + 'В', результат – 'АБВ'.
Операции отношения (=, <>, >, <, >=, <=) проводят сравнение двух строк и имеют приоритет
ниже операции сцепления, строки сравниваются слева направо до первого несовпадающего символа,
результат операции отношения – True или False.
Примеры: выражение – 'Принтер' = 'Принтер', результат –True; выражение –
'ХХХХХ' < 'ХХХХ', результат – False.
Для присваивания строковой переменной результата строкового выражения используется оператор
присваивания (:=).
Пример: Str1:= 'Группа студентов'; Str2:= Str1 + ' второго курса';
Допускается смешение в одном выражении операндов строкового и литерного типа. К отдельным
символам строки можно обратиться по номеру (индексу данного символа в строке). Индекс –
целочисленная величина, записывается в квадратных скобках. Например, выражение Str2[8]
обеспечит доступ к восьмому символу 'у' переменной Str2.
Для обработки строковых данных используются следующие стандартные процедуры и функции:
Процедуры:
Delete (St, Poz, N) – удаление N символов строки St, начиная с позиции Poz.
Пример: St:= 'река Обь'; Delete(St, 1, 5) оставит 'Обь'.
Insert (Str1, Str2, Poz) – вставка строки Str1 в строку Str2, начиная с позиции Poz.
�Оглавлен ие
Пример: Str1:= 'ГП'; Str2:= 'БУ'; выражение Insert (Str1, Str2, 2) даст
результат 'БГПУ'.
Str (IBR, St) – преобразование числового значения величины IBR и помещение результата в строку
St.
Примеры: IBR:= 1500, Str(IBR:6, S) даст результат ' 1500'; IBR:= 4.8Е + 3,
Str(IBR:10, St) даст в переменной St выражение ' 4800'.
Val (St, IBR, Cod) – преобразует значение St в величину целочисленного или вещественного типа
и помещает результат в IBR. Cod – целочисленная переменная. Если во время операции
преобразования ошибки не обнаружено, значение Cod = 0, если ошибка обнаружена (например,
литерное значение переводится в числовое) Cod будет содержать номер позиции первого ошибочного
символа, а значение IBR не определено.
Функции:
Copy (St, Poz, N) – выделяет из St подстроку длиной N символов, начиная с позиции Poz. Если
Poz больше длины St, то результатом будет пробел, если Poz > 255, то возникнет ошибка при
выполнении. Poz, N – целочисленные выражения.
Пример: St:= 'ABCDEF'; Copy (St, 2, 3) выделит 'BCD'.
Concat (Str1, Str2, ..., StrN) – выполняет сцепление строк Str1, Str2, ... в том порядке, как
они указаны в списке. Сумма символов сцепленных строк не должна превышать 255.
Пример: Concat ('индекс', ' 656099') даст 'индекс 656099'.
Length (St) – вычисляет длину в символах строки St. Результат имеет целочисленный тип.
Пример: St:= '1234567890', Length (St) даст 10.
Роs (Str1, Str2) – обнаруживает первое появление в строке Str2 подстроки Str1. Результат имеет
целочисленный тип и равен номеру той позиции, где находится первый символ подстроки Str1. Если
подстрока Str1 в строке Str2 не найдена, результат равен нулю.
Пример: Роs ('тройка', 'перестройка') будет равно 6.
UpCase (Ch) – преобразует строчную букву в прописную (только латинский алфавит). Параметр и
результат имеют литерный тип.
Обработка строковых данных – необходимый элемент таких программ, как текстовые редакторы. Ниже
приведен пример программы простейшей лингвистической обработки, в котором к строковым данным
применяются наиболее часто употребляемые функции и процедуры.
Program DemoStr;
{Программа формирует строку из трех исходных строк. Определяется номер позиции первого появления в
результирующей строке буквы 'а' и общая длина строки. }
Var
А, В, С: string [12];
{А, В, С – исходные строки}
Str, Str1: string [40];
{Str – результирующая строка,
Ch1: string [1];
Str1 – инвертированная строка}
Ch: char ;
�Оглавлен ие
i, n: integer ;
Begin
A:= 'electronic';
B:= 'digit'; C:= 'machine';
Ch1:= Copy (A, 1,1);
{Выделение первой буквы в А };
Writeln;
Ch:= UpCase(Ch1[1]);
{Преобразование выделенной буквы из строчной в прописную };
Writeln;
Str:= Сoncat(A, В, C);
{Конкатенация строк А, В, С};
Writeln;
Delete(Str, 1, 1);
позицию прописной буквы};
{Стирание первой буквы для последующей записи в первую
Writeln(Str);
Insert(Ch, Str, 1);
{Вставка прописной буквы}
Insert(' ', Str, 11);
{Вставка первого пробела}
Insert(' ', Str, 17);
{Вставка второго пробела}
Writeln(Str);
{Вывод результирующей строки}
Writeln('Первая буква “а” появилась в позиции ', Pos('a',Str));
n:= Length(Str);
WriteIn('Длина строки = ', n);
Str1:= ";
For i:= 1 to n do
Str1:= Str1 + Copy(Str, n–i + 1, 1);
Writeln(Str1)
End.
{Получение и вывод инвертированной строки}
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Дано несколько слов. Составить программу, которая определяет, одинаковы ли длины слов или нет,
и определяет наибольшее и наименьшее по длине слова.
2. Составить программу, которая меняет местами первые и последние буквы слов данного
предложения.
3. Дано предложение. Составить программу, обращающую отдельные слова в предложении, но
сохраняющую порядок слов.
4. Составить программу, которая подсчитывает количество сдвоенных букв в предложении.
5. В строке длиной 30 содержится имя, отчество и фамилия так, что каждая часть занимает 10 позиций.
Напечатать фамилию и инициалы.
6. Целочисленные переменные i, j, k содержат информацию о длинах сторон треугольника.
Напечатать фразу «Рассмотрим треугольник со сторонами ... см, ... см,... см», где вместо многоточий
указаны соответствующие значения.
7. Составить программу, которая печатает отдельно каждое слово из за-данного предложения.
8. Дана дата в виде «месяц–число–год». Напечатать дату в виде «число–месяц–год».
9. В переменной содержится существительное первого склонения, оканчивающееся на «а». Напечатать
слово во всех падежах.
10. Дано несколько строковых переменных. В каждой из них даны имена и фамилии (например: Илья
Муромец, Александр Невский). Напечатать отдельно первые, а затем вторые слова из пар.
11. Определить, какая гласная встречается в заданной фразе наиболее часто.
12. Определить длину предъявленного слова. Напечатать «В этом слове N букв». Употребить форму
«буква», «буквы» или «букв».
13. Дано предложение. Напечатать длины слов, встречающихся в предложении.
14. Дано предложение. Напечатать все слова из этого предложения, которые содержат букву «а».
15. Составить слово, содержащее первые буквы слов заданного предложения.
�Оглавлен ие
Лабораторная работа № 10
ПРОЦЕДУРЫ И ФУНКЦИИ
При решении задач часто возникает необходимость повторять одни и те же вычисления при
различных значениях параметров. Для уменьшения размера программ целесообразно выделить эти
вычисления в отдельную подпрограмму. В основной программе при необходимости осуществляются
обращения к подпрограмме. В языке Turbo Pascal в качестве подпрограмм используются функции и
процедуры.
Функции представляют собой группу операторов, в результате выполнения которых вычисляется одно
значение, присваиваемое имени функции.
Функция включает в себя заголовок функции, разделы описаний (меток, констант, типов, переменных,
дополнительных функций и процедур, являющихся локальными по отношению к описываемой
функции), тело функции.
В заголовке функции за ключевым словом Function указывается имя функции, а в скобках – список
параметров со своими типами. В заголовке должен быть определен тип значения, возвращаемого
функцией. Окончательный результат присваивается имени функции в конце тела функции. Общая
структура записи функции имеет такой вид:
Function F(q1: T1; q2: T2; ...): T;
{Разделы определений и описаний локальных параметров и подпрограмм}
begin
p1;
p2;
• • •
F:= < вычисленное начение >
end;
где F – имя функции, q1, q2 – имена формальных параметров, Т1, T2 – типы параметров, Т – тип
имени функции, р1, p2 – операторы тела функции.
Функция может иметь свои локальные константы, типы, переменные и вспомогательные процедуры и
функции.
Обращение к функции осуществляется в правой части оператора присваивания указанием имени
функции и фактических параметров в виде F(b1, b2, ...), где F – имя функции, bi – фактические
параметры.
Пример 1. Составить программу для определения числа сочетаний
C nm
n!
,
m !(n m )!
используя функцию при вычислении факториала.
Program Number;
Var
�Оглавлен ие
n, m: byte;
nсm: longint;
Function Fact (k: byte): longint;
Var
p: longint;
i: byte;
begin
p:= 1;
for i:= 1 to k do
p:= p*i;
Faсt:= p;
end;
Begin
writeln('Введите данные для определения числа сочетаний');
readln(n, m);
nсm:= Fact(n) div Fact(m) div Fact(n–m);
writeln('Число сочетаний = ', ncm);
End.
2
Пример 2. Составить программу для вычисления функции y ax bx c ,
20
20
40
i 1
i 1
i 1
где a pi , b ti , c ri .
Решение. Функция для вычисления сумм в общем виде может быть представлена как Sum =
Program Runy;
Const
MaxSize = 50;
Type
md = 1..MaxSize;
mas = array [md] of real;
Var
np, nt, nr, i: integer;
p, t, r: mas;
х, y: real;
Function Sum(z: mas; nd: integer): real;
k
z .
i 1
i
�Оглавлен ие
Var
j: integer;
s: real;
begin
s:= 0;
for j:= 1 to nd do
s:= s + z [ j ];
Sum:= s;
end;
Begin
write('Введите х:'); readln(x);
write('Введите число элементов в массивах p, t, r');
readln(np, nt, nr);
writeln('Вводите элементы массива p');
for i:= 1 to np do read(p[i]);
writeln('Вводите элементы массива t');
for i:= 1 to nt do read(t[i]);
writeln('Вводите элементы массива r');
for i:= 1 to nr do read(r[i]);
y:=Sum(p, np)*x*x + Sum(t, nt) *x + Sum(r, nr);
writeln('y= ', y);
End.
Процедуры используются в тех случаях, когда в подпрограмме необходимо получить несколько
результатов. Процедура определяется в разделе описания процедур.
Описание процедуры включает в себя заголовок, разделы описаний (меток, констант, типов,
переменных, процедур, функций), тело процедуры.
В заголовке процедуры за ключевым словом Procedure указывают имя процедуры и в скобках –
список формальных параметров со своими типами. Эти параметры используются только в теле
процедуры и локальны по отношению к ней. Общая структура записи процедуры имеет такой вид:
Procedure F(var q1: T1; q2 : T2 ; ...);
{Разделы определений и описаний локальных параметров и подпрограмм}
begin
p1;
p2
• • •
�Оглавлен ие
end;
где F – имя процедуры, qi – имена формальных параметров, Тi –типы формальных параметров, рi –
операторы тела процедуры.
Имена формальных параметров, являющихся результатами вычислений в процедуре, записываются
после зарезервированного слова var.
Обращение к процедуре осуществляется оператором процедуры, в котором записывается имя
процедуры и фактические параметры:
F (b1, b2 , …);
где bi – фактические параметры, которые должны соответствовать формальным по количеству, типу
и месту расположения.
Пример 3. Составить программу для вычисления функции
z
используя для вычисления процедуру
th x
th a th 2 a b
2
th a b
2
,
e x e x e 2x 1
.
e x e x e 2x 1
Решение. Формальными параметрами процедуры будет переменная х и результат с именем R. Чтобы
избежать двукратного вычисления e2x, вводится дополнительный оператор присваивания
c:=ехр(2.0*х).
Program Fun1;
Var
a, b, z, t1, t2, t3: real;
Procedure Th(x: real; var r: real);
Var
c: real;
begin
c:= exp(2*x);
r:= (c–1)/(c+1);
end;
Begin
writeln('Введите а и b'); read(a, b);
Th(a, t1);
Th((a – b), t2);
Th(sqr(a) – sqr(b), t3);
z:= (t1 + sqr(t2))/sqrt(t3);
�Оглавлен ие
writeln('z= ', z);
End.
Если в процедуре и главной программе используются одни и те же имена параметров (процедура
связана с главной программой посредством глобальных переменных), то процедура может быть
организована без параметров.
Пример 4. Составить программу с процедурой без параметров для вычисления полярных
координат x 2 y 2 и arctg y x по прямоугольным х и у (х>0) координатам.
Program PolKorl;
Var
х, у, r, f: real;
n, i: integer;
Procedure Polar;
begin
r:= sqrt(sqr(х) + sqr(y));
f:= arctan(y/x);
end;
Begin
write('Введите количество точек'); readln(n);
for i:= 1 to n do
begin
write('Введите координаты точки: ');
readln(х, у);
Polar;
writeln(' Прямоугольным координатам:', x:6:1, y:6:1);
writeln('–
f:10:2);
соответствуют
полярные
координаты:',
r:6:1,
end
End.
Формальные параметры функций и процедур можно указывать в любом порядке, параметры одного
типа не обязательно группировать в одном месте. При обращении к процедуре или функции
фактические параметры следует записывать в той же последовательности, что и формальные.
При выборе имен, содержащих процедуры и функции, целесообразно, чтобы имена локальных и
глобальных параметров не совпадали. Это делает программу нагляднее. Правилами определения
области действия допускается использование одного имени для глобального и формального
параметров. В этом случае глобальный параметр теряет свое имя внутри блока процедуры или
функции, так как с этим именем связан локальный параметр.
�Оглавлен ие
При организации процедур и функций в языке Turbo Pascal различают параметры-значения и
параметры-переменные.
Параметры-значения определяют исходные данные для работы процедур и функций при каждом
обращении к ним. В списке формальных параметров они описываются в виде:
(q1: T1; q2 : T2)
или
(q1, q2 : T);
где qi – имена параметров, T, Ti – тип параметров.
При обращении фактический параметр может быть любым выражением, результат вычисления
которого принадлежит тому же типу, что и формальный параметр. В качестве простейшего выражения
указанного типа может быть константа или переменная. При обращении к процедуре выражение
вычисляется, результат копируется в выделенную область параметров, передается в процедуру, а при
выходе из нее эта область освобождается.
Параметры-переменные определяют выходные данные процедуры (результаты обработки данных),
которые передаются в основную программу. Поэтому фактический параметр, определяющий результат,
должен описываться как переменная. Параметры-переменные в списке формальных параметров
описываются в виде
(var q1, q2, …, qn: T);
где qi – параметры-переменные, Т – их тип.
Параметры-переменные в заголовке функции не используются, т.к. результат присваивается имени
функции.
При обращении фактические параметры должны быть переменными того же типа. В процедуру
передается адрес переменной, и операторы непосредственно используют данную переменную.
Вычисление адресов производится в момент обращения к процедуре, поэтому, если переменная
является элементом массива, то ее индексное выражение вычисляется при обращении к процедуре.
При использовании процедур и функций может встречаться рекурсивное обращение – обращение к
самим себе. Рекурсия в языке Turbo Pascal возможна благодаря тому, что при вызове процедуры
динамически создаются новые локальные переменные. Рекурсивные вызовы процедуры и функции
приводят к увеличению времени решения. Многие математические функции можно выразить
рекурсивно.
Пример. Используя рекурсию, вычислить значение
если n 0,
1,
n!
n n 1!, если n 0.
Function Fact(n: integer): integer;
begin
if
n=0
then Fact:= 1
else Faсt:=Faсt(n–1)*n
end;
При вычислении значения m! в программе нужно записать оператор mfac:= Fact(m); при
обращении к функции Fact фактический параметр m заменяет формальный параметр n. Если m>0, то
�Оглавлен ие
возникает рекурсивное обращение к функции Fact со значением параметра m–1. Создается копия тела
функции и для нового параметра со значением m–1 выделяется новая переменная, локальная по
отношению к копии тела функции. Эта переменная получает вычисленное значение. Затем вновь
производится обращение к функции со значением m–2 и т.д., пока значение параметра не станет
равным 1.
Однако в большинстве случаев рекурсивное решение может быть заменено на итерационное.
Вот как можно реализовать вычисление n! с помощью функции, использующей итерацию:
Function Fact(n: integer): integer;
Var
i, p: integer;
begin
if n = 0 then Fact:= 1
else
begin
p:= 1;
for i:= 1 to n do p:= p*i;
Fact:= p
end
end;
Различные способы объявления процедур рассмотрим на примере задачи о вычислении площади
выпуклого четырехугольника ABCD, заданного длинами четырех сторон и диагонали АС. Диагональ
делит выпуклый четырехугольник на два треугольника, к которым применима формула Герона
S = р(р – а)(p – b)(p – c),
где р=(а+b+с)/2 – полупериметр треугольника, а а, b, с – длины сторон треугольника.
Простейшее решение – дважды выписать в программе операторы, задающие вычисления по формуле
Герона. Мы же организуем процедуру и будем к ней обращаться.
Процедура без параметров
Program F1;
Var АВ, ВС, CD, DA, АC, s1, s, а, b, c, p: real;
Procedure Str1;
{Описание процедуры}
begin
p:= (a + b + c)/2;
s:= sqrt(р*(р – a)*(p – b)*(p – c))
end;
Begin
�Оглавлен ие
read(AB, ВС, CD, DA, AC);
a:= АВ; b:= ВС; c:= АС;
Str1;
{Первый вызов процедуры}
s1:= s;
а:= DA; b:= AC; с:= CD;
Str1;
{Очередной вызов процедуры}
s1:= s1 + s;
writeln(s1)
End.
В программе два обращения к процедуре Str1, после которых переменная s имеет значение площади
соответствующего треугольника. Связь процедуры Str1 с остальными операторами программы
осуществляется через переменные а, b, с, s. В процедуре имеется вспомогательная переменная р,
причем в основной программе она не используется. Удобнее в этом случае сделать переменную р
локальной, исключив ее из описательной части программы F1. Описание же процедуры будет
выглядеть так:
Procedure Str1;
Var
р: real;
begin
р:= (а + b + c)/2;
s:= sqrt(p*(p – a)*(p – b)*(p – c))
end;
После выполнения процедуры значение переменной р забудется.
Параметры - переменные
Продемонстрированный способ использования процедур неудобен из-за большого числа операторов
присваивания, определяющих значения переменных а, b, с. Есть другой способ – описать
процедуру с параметрами (аргументами). Вторая версия той же программы будет такой:
Program P2;
Var
АВ, ВС, CD, DA, AC, s1, s2: real;
Procedure Str2(Var a, b, c, s: real);
Var
p: real;
begin
p:= (a + b + c)/2;
�Оглавлен ие
s:= sqrt(p*(p – a)*(p – b)*(p – c));
end;
Begin
read(AB, ВС, CD, DA, AC);
Str2(AB, ВС, АC, s1);
Str2(CD, DA, AC, s2);
writeln(s1 + s2)
End.
Указанные в скобках при описании процедуры параметры а, b, с, s – это формальные параметры.
При выполнении программы в момент обращения к процедуре они заменяются фактическими
параметрами. Порядок следования параметров существенен и важно соответствие типов переменных.
Формальные параметры не описываются. Первое обращение к процедуре приведет к выполнению
оператора
begin
р:= (АВ + ВС + АС)/2;
s1:= sqrt(p*(p – АВ)*(р – ВС)*(р – АС))
end;
Параметры - значения
Заголовок процедуры может быть устроен так, что некоторые группы формальных параметров не
содержат слова Var. Например, Procedure Str3(a, b, c: real; var s: real). Формальные
параметры, которые входят в группы, не содержащие слова Var, называются формальными
параметрами-значениями. В приведенном выше примере а, b, с – это формальные
параметры-значения, a s – это формальный параметр-переменная. К процедуре Str3 можно
обратиться, например, так: Str3(3.14*2, х, Sqrt(10 – Sqr(х)), у). Это обращение повлечет
за собой вначале присвоения: а:= 3.14*2; b:= х; с:=Sqrt(10 – Sqr(х)); а затем отработку
самой процедуры.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Если координаты вершин треугольника в прямоугольной системе координат равны, соответственно
x1 , y1 , x2 , y2 , x3 , y3 , то площадь этого треугольника равна
0.5 x1 y2 x2 y3 x3 y1 x1 y3 x2 y1 x3 y2
.
Используя этот факт, написать программу вычисления площади выпуклого четырехугольника ABCD,
заданного координатами четырех вершин
x A , y A , xB , yB , xC , yC , xD , yD .
2. Даны вершины треугольника А x1 , y1 , В x2 , y2 и С x3 , y3 . Найти длины медиан.
3. Даны длины сторон треугольника а, b, с. Найти длины медиан треугольника. Замечание: длина
медианы, проведенной к стороне а, равна 0.5 2 b 2 2 c 2 a 2 .
4. Даны координаты вершин двух треугольников. Определить, какой из них имеет большую площадь.
5. Составить программу, вычисляющую 1) скалярное, 2) векторное, 3) смешанное произведения
векторов, заданных своими координатами. Составить программу, вычисляющую 4) сумму векторов и
5) угол между векторами.
6. Составить программу, вычисляющую следующие величины:
1)
4)
7)
s gt 2
p nkT;
2) v 2 gh ; 3)
;
l
E
;
Rr
v
kT
;
m
mv 2
;
2
5)
Ek
8)
E mc 2 ;
6)
9)
En mgh ;
Rобщ
R1 R2
R1 R2
7. Гиперболические функции определяются следующим образом:
1) sh x
e x e x
;
2
2) ch x
ex ex
;
2
3) th x
sh x
;
ch x
4) cth x
ch x
;
sh x
где х – вещественно. Вычислить эти функции, а также:
5)
2
sh x th ( x 1) th (2
sh( x 1));
6)
ch 2 x sh 2 x;
8. Дано: вещественные х, у. Вычислить
1) z = (sign х + sign y) sign(x+y), 2) z = sign(x) sign(y) sign(x+y),
3) z sign x sign 2 y 1 / 1 3 sign x sign y , где
�Оглавлен ие
1, при
sign a 0, при
1, при
a 0,
a 0,
a 0.
9. Даны действительные числа s, t. Получить
1) f(t, –2s, 1.17) + f(2.2, t, s–t), где
f ( a , b, c )
2a b sin c
,
5 c
2) g(1.2, –s) + g(t, s) – g(2s – 1, st), где
g (a , b )
a 2 b2
.
a 3ab 3b 2 4
2
10. Даны действительные числа a, b, c. Получить
1)
min( a, a b) max( a, b c)
,
1 max( a bc,1.15)
2)
min( u v 2,3.14),
где u min a , b , v min ab, a b ,
10
1.7 t 2 t 1 a
3) 6 t bc 2 1 , где t x
x
k 0
2 k 1
10
2k 1!
x 2 k 2k !
.
k 0
11. Даны действительные числа s, t. Получить
1)
2)
h s ,t max h 2 s t , st ,h 4 s t , s t
h 1,1
,
h t , s max h t , s , h s , t , h t, t ,
где h s, t
a
b
a b 3 .
2
1 b 1 a2
12. Даны массивы целых чисел х i, уi, zi, где i = 1..n.
Вычислить
n
x y
i 1
i
z.
n i 1 i
13. Дано: натуральные m, n (m>1), целые a1, ..., an , b1, ..., bn, с1, ..., c30. Получить
min b1 , , bm min c1 , , c30 , при min a1 , an 10,
l
2
1 min c1 , , c30 , в противном случае.
14. Дано: натуральные k, l, m, действительные x 1, ..., xk , y1, ..., yl, z1, ..., zm. Получить
max y1 , , yl max z1 , , zm , при max x1 , xk 0,
l
2
1 max x1 , , xk , в противном случае.
�Оглавлен ие
15. Дано натуральное n, действительные а1, ..., а3n. Получить
где
x a1a 2 a n ,
y a n 1a n 2 a 2n ,
x y2 z3,
z a 2 n 1a 2 n 2 a 3n .
16. Заданы массивы целых чисел. Вычислить:
1)
20 2
xi
i 1
u 20
y2
i
i 1
2)
max ci
min bi
, при min ai max bi ,
t max ai min bi ci
max b c min c , иначе.
i
i
i
3)
x y
10
i 1
i
n i 1
при
15
x y
i 1
i
i
0,
иначе.
.
17. Даны действительные числа a1, ..., an , b1, ..., bn. Образовать новые последовательности, в которых
1) элементы последовательности ai , следующие за членом с наибольшим значением заменены на
0.5;
2) элементы последовательности {bi}, меньшие 1, заменены на 1.
18. Даны три целые матрицы размера N*N. Вывести ту из них,
1) у которой сумма диагональных элементов максимальна;
2) в которой присутствует максимальный элемент;
3) в которой присутствует строка с максимальной суммой элементов;
4) в которой присутствует столбец с минимальной суммой элементов.
19. Даны N слов. Напечатать:
1) те из них, которые начинаются с буквы 'а';
2) слово максимальной длины;
3) слова, заканчивающиеся на 'b';
4) буквы, входящие одновременно во все слова;
5) буквы, содержащиеся в первом слове и не содержащиеся в остальных.
20. Составить процедуру, позволяющую определить позиции
1) самого правого вхождения заданного символа в исходную строку;
2) крайнего левого вхождения символа в строку;
3) вхождения сдвоенных букв в слово. Если таковых нет, результатом работы процедуры должна быть
–1.
21. Составить процедуру, заменяющую в исходной строке символов все единицы нулями и все нули
�Оглавлен ие
единицами.
22. Вычислить
b
f ( x )dx,
a
где f ( x) равно
1) ехр(х),
4) ln(x),
7) 1/(1+x 2),
2) sin(x),
5) arctg(x),
8) ехр(х),
3) cos(x),
6) 1/x,
9) cos(ln(x)).
23. Вычислить Z – сумму значений функции
Z=f(a, b)+f(a2 ,b2)+f(a-b, b)+f(a2+b2, b2-1),
где
u sin t ,
f u ,t
2
u t ,
1) a = 2.5; b = –7.3;
если u 0;
если u 0.
3) a = –0.2; b = –0.42;
2) a = –0.2; b = 4.2; 4) a = 23.5; b = 41.2.
24. Вычислить Z – сумму значений функции
Z = f(sin , a)+f(cos , a)+f(sin2 , a-1)+f(sin - cos , a2 - 1) +f (sin2 - 1, cos +1),
где
u sin t ,
f u ,t
2
u t ,
если u 0;
если u 0.
1) α = π/18; a = –2.1; 3) α = –π/14; a = –0.2;
2) α = 3.3; a = –2.1;
4) α = –π/10; a = 31.2;
�Оглавлен ие
Лабораторная работа № 11
МНОЖЕСТВА
Множества – это структурированный тип данных, представляющий набор взаимосвязанных по
какому–либо признаку или признакам объектов, которые можно рассматривать как единое целое.
Каждый объект множества называется элементом множества. Все элементы множества должны
принадлежать одному из скалярных типов, кроме вещественного. Этот тип называется базовым типом
множества.
Базовый тип задается диапазоном или перечислением. Область значений типа множество – набор
всевозможных подмножеств, составленных из элементов базового типа.
Если базовый тип принимает n значений, то тип множество для него будет иметь 2n вариантов
значений. В выражениях на языке Turbo Pascal значения элементов множества указываются в
квадратных скобках: [1, 2, 3, 4], ['a', 'b', 'c', 'd'], ['a'...'z'].
Если множество не имеет элементов, оно называется пустым и обозначается как [ ]. Для описания
множественного типа используется словосочетание Set of (множество из ...). Для задания типа
множество следует указать элементы этого множества, как правило, в виде перечисления или
диапазона, например:
Пример 1
Type
Alfa = Set of 'A'..'Z';
Count = Set of (Plus, Minus, Mult, Divid);
Ten = Set of 0..9;
Number = Set of '0'..'9';
Введя тип множество, можно задать переменные или типизированные константы этого типа. При
задании значений константе типа множество элементы константы задаются перечислением через
запятую элементов, помещенных в квадратные скобки. Например, для введенных выше типов можно
задать такие переменные и типизированные константы:
Пример 2
Var
CharVal: Set of 'A'..'Z';
Operac: Sет of (Plus, Minus, Mult, Divid);
Num: Ten;
Const
Index: Set of 0..9 = [0, 2, 4, 6, 8];
Digit: Set of '0'..'9' = ['0'..'9'];
Переменная CharVal может принимать значения 'A', 'B', 'C', ... – любое значение от 'A' до 'Z',
переменная Num может принимать значение 0, 1, 2, 3, ..., т.е. любое значение в диапазоне
0..9. Попытка присвоить другие значения вызовет программное прерывание. Переменной или
�Оглавлен ие
типизированной константе типа множество можно в программе присвоить то или иное значение.
Обычно значение задается с помощью конструктора множества. Конструктор задает множество
элементов с помощью перечисления в квадратных скобках выражений, значения которых дают
элементы множества. Допустимо использовать диапазоны элементов. Следующие структуры являются
конструкторами множеств (пример 4).
Пример 3
[Plus, Minus]
[1..K mod 12,15]
[Cur(0)..Cur(32),'A','B']
В каждое множество включается и так называемое пустое множество [ ], не содержащее никаких
элементов. Конструктор множества можно использовать и непосредственно в операциях над
множествами.
Количество элементов (мощность) множества в Turbo Pascal не может быть больше 256, а
порядковые номера элементов (т.е. значение функции Ord) должны находиться в пределах от 0 до
255. Контроль диапазонов осуществляется директивой {$R+}. Объем памяти, занимаемый одним
элементом множества, составляет 1 байт.
При работе co множествами Turbo Pascal допускает использование операций "=", "<>", ">=",
"<=", объединения (+), пересечения (*), разности (–) и операции In. Результатом выражений с
применением этих операций является значение True или False, в зависимости от того, истинно это
выражение или ложно.
Операция «равно» (=). Два множества A и B считаются равными, если они состоят из одних и тех же
элементов. Порядок следования элементов в сравниваемых множествах значения не имеет.
Значение A
Значение B
Выражение
Результат
[1, 2, 3, 4]
[1, 2, 3, 4]
A = B
True
['a'..'2']
['b'..'2']
A = B
False
['a'..'2']
['2'..'a']
A = B
True
Операция «не равно» (<>). Два множества A и B считаются не равными, если они отличаются по
мощности или по значению хотя бы одного элемента.
Значение A
Значение B
Выражение
Результат
[1, 2, 3]
[3, 1, 2, 4]
A <> B
True
['a'..'2']
['6'..'2']
A <> B
True
['c'..'t']
['t'..'c']
A <> B
False
Операция «больше или равно» (>=). Используется для определения принадлежности множества.
Результат операции A >= B равен True, если все элементы множества B содержатся во множестве A.
В противном случае результат равен False.
Значение A
Значение B
Выражение
Результат
[1, 2, 3, 4]
[2, 3, 4]
A >= B
True
['a'..'2']
['b'..'t']
A >= B
True
�Оглавлен ие
['z','x','c']
['c','x']
A >= B
True
Операция «меньше или равно» (<=). Используется аналогично предыдущей операции. Результат
выражения A <= B равен True, если все элементы множества A содержатся во множестве B. В
противном случае результат равен False.
Значение A
Значение B
Выражение
Результат
[1, 2, 3]
[1, 2, 3, 4]
A <= B
True
['a'..'h']
['2'..'a']
A <= B
True
['a','v']
['a','n','v']
A <= B
True
Операция In. Используется для проверки принадлежности какого-либо значения указанному
множеству. Обычно применяется в условных операциях.
Значение A
Выражение
Результат
2
if A in [1, 2, 3] then...
True
'v'
if A in ['a'..'n'] then...
False
x1
if A in [x0, x1, x2, x3] then...
True
При использовании операции In проверяемое на принадлежность значение и множество в
квадратных скобках не обязательно описывать в разделе объявлений.
Операция In позволяет эффективно производить сложные проверки условий, заменяя иногда десятки
операций. Например, выражение
if (a=1) or (a=2) or (a=3) or (a=4) or (a=4) or (a=5) then...
можно заменить более коротким
if a in [1..5] then ... .
Часто операцию in пытаются записать с отрицанием: X not in M. Такая запись является ошибочной,
т. к. две операции следуют подряд: правильная конструкция имеет вид: not (X in M).
Объединение множеств (+). Объединением массивов является третье множество, содержащее
элементы обоих множеств.
Значение A
Значение B
Выражение
Результат
[1, 2, 3]
[1, 4, 5]
A + B
[1, 2, 3, 4, 5]
['A'..'D']
['E'..'Z']
A + B
['A'..'Z']
[ ]
[ ]
A + B
[ ]
Пересечение множеств (*). Пересечением двух множеств является третье множество, которое
содержит элементы, входящие одновременно в оба множества.
Значение A
Значение B
Выражение
Результат
[1, 2, 3]
[1, 4, 2, 5]
A*B
[1, 2]
['A'..'Z']
['B'..'R']
A*B
['B'..'R']
[ ]
[ ]
A*B
[ ]
�Оглавлен ие
Разность множеств (–). Разностью двух множеств является третье множество, которое содержит
элементы первого множества, не входящие во второе множество.
Значение A
Значение B
Выражение
Результат
[1, 2, 3, 4]
[3, 4, 1]
A – B
[2]
['a'..'z']
['d'..'z']
A – B
['a'..'c']
СТАРШИНСТВО МНОЖЕСТВЕННЫХ ОПЕРАТОРОВ.
Приоритетный уровень
Операторы
Операции
*
пересечение
+, –
объединение, разность
=, <>, >=, <=, In
равенство, неравенство, подмножество, принадлежность
1 (высший)
2
3 (низший)
Для изменения порядка выполнения используются круглые скобки.
Средства работы с множествами позволяют в некоторых случаях сократить программы и сделать их
более наглядными и эффективными за счет уменьшения числа различных проверок.
Пример 5
Program Prim 5;
Var Stroka: string;
i: integer;
Prav: boolean;
Begin
i:= 1;
writeln('введите строку');
readln(Stroka);
L:= Length(Stroka);
{число введенных символов}
Prav:= L > 0;
{True, если не нулевая строка}
while Prav and (i <= L) do
begin
{проверка допустимости символа}
Prav:= Stroka[i] In
['0'..'9', 'A'..'Z', 'a'..'z', ' '];
i:= Succ(i);
{следующий номер}
end;
if Prav then writeln('правильная строка')
else writeln('неправильная строка');
End.
�Оглавлен ие
Для вывода элементов некоторого множества, сформированного в процессе выполнения программы,
необходимо воспользоваться оператором цикла, внутри которого была бы проверка на
принадлежность текущего значения параметра цикла выводимому множеству. Например, для
множества ВВ, описанного как ВВ: Set of 'A'..'Z'; можно организовать вывод элементов
следующим образом:
Пример 6
For i:= 'A' to 'Z' do
if i in BB then write(i:2);
Причем параметр цикла i должен быть описан либо как символьная переменная, либо как i:
'A'..'Z'. Печать элементов множества производится в том порядке, в котором они встречаются в
базовом множестве. Приведенная ниже программа Lat формирует множество LB, в которое входят
только заглавные латинские буквы, встретившиеся во входной строке, и множество знаков
препинания PR из входной строки (пример 7).
Пример 7
Program Lat;
Var
c, i, j: char;
LB: Set of 'A'..'Z';
PR: Set of '!'..'?';
Begin
write('=>');
LB:= [ ]; PR:= [ ];
repeat
read(c);
if c in ['A'..'Z'] then LB:= LB + [C]
else
if c In [':', ';', '.', ',', '!', '?'] then PR:= PR + [C]
until Eoln;
writeln('Латинские буквы:');
for i:= 'A' to 'Z' do
if i in LB then write(i:2);
writeln;
writeln('Знаки препинания:');
for j:= '!' to '?' do
if j in PR then write(j:2);
End.
�Оглавлен ие
ВОПРОСЫ И УПРАЖНЕНИЯ
1. Какие типы данных используются в качестве базовых при построении множественных типов?
2. Дано описание переменной множественного типа: Var Pm: Set of (Red, Grey, Blue,
Black). Выписать все допустимые значения этой переменной.
3. Какие операции определены над переменными множественного типа и каков их приоритет?
4. Будут ли равны множества:
a) ['A'..'D'] и ['A','B','C','D'];
b) [White, Black] и [Black, White].
5. Вычислить следующие выражения:
а) [5] <= [1..5];
b) ['A'..'D', 'K'..'M'] + ['D'..'K'];
c) [Jan, Feb, Мar]*[Mar];
d) [2, 1, 3..6] = [1..7];
e) 15 In [1..10];
f) [',', '(', ')', '.'] – [',', '.'].
6. Вычислить выражение:
[1..14]*[5, 12..60] + [4..7] – [2*16]*[6].
7. Упростить данные выражения множественного типа:
а) [11..17]*[2] + [7, 17..40]*[2..17] – [2..8];
b) (A – B)*A + (A – B)*B;
c) (A + B)*(A – B)*(B – A);
d) A – B – (A – B) – (B – A);
e) A – (A – B).
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
I. Дана непустая последовательность символов. Требуется построить и напечатать множество,
элементами которого являются встречающиеся в последовательности:
1) цифры от '0' до '9';
2) буквы от 'A' до 'F' и от 'X' до 'Z';
3) буквы от 'G' до 'N' и цифры от '0' до '9';
4) знаки препинания;
5) буквы от 'A' до 'Z' и цифры от '0' до '5';
6) буквы от 'T' до 'X' и знаки препинания;
7) знаки арифметических операций и знаки препинания;
8) цифры и знаки арифметических операций;
9) знаки препинания и буквы от 'E' до 'N';
10) цифры от '5' до '9' и знаки препинания;
11) знаки операций отношения;
12) цифры от '3' до '9', буквы от 'A' до 'F' и знаки препинания;
13) знаки арифметических операций и операций отношения;
14) буквы от 'F' до 'M' и знаки арифметических операций;
15) знаки препинания и операций отношения;
16) цифры от '0' до '5' и буквы от 'K' до 'R'.
II. Операции над массивами. При выполнении задания следует учесть приемы программирования,
использованные в приведенной ниже программе:
Program Eratosphen;
Const
n = 255;
Var
Sieve, Primes: Set of 2..n;
Next: byte;
j: word;
Begin
Sieve:= [2..n];
Primes:= [ ];
Next:= 2;
repeat
�Оглавлен ие
while not (Next in Sieve) do
Next:= Next + 1;
Primes:= Primes + [Next];
j:= Next;
while j <= n do
begin
Sieve:= Sieve-[j];
j:= j + Next
end;
until Sieve = [ ];
for j:= 2 to n do
if j In Primes then Write(j:5)
End.
1. Из множества целых чисел [1..1000] методом решета Эратосфена получить множество простых
чисел и вывести их на экран.
2. Из множества целых чисел [1..1000] получить множество чисел, являющихся квадратами четных
чисел и вывести их на экран.
3. Из множества целых чисел [1..1000] получить множество чисел, являющихся квадратами нечетных
чисел и вывести их на экран.
4. Дано целое n от 2 до 1000. Используя метод решета Эратосфена, напечатать в убывающем порядке
все простые числа из диапазона n..2n.
5. Из множества целых чисел [1..500] методом решета Эратосфена получить множество простых чисел
и вывести их на экран.
6. Из множества целых чисел [1..500] получить множество чисел, являющихся квадратами четных
чисел и вывести их на экран.
7. Из множества целых чисел [1..500] получить множество чисел, являющихся квадратами нечетных
чисел и вывести их на экран.
8. Дано целое n от 2 до 500. Используя метод решета Эратосфена, напечатать в убывающем порядке все
простые числа из диапазона n..2n.
�Оглавлен ие
Лабораторная работа № 12
ЗАПИСИ
Комбинированный тип характеризует объекты, называемые записями.
Запись – это сложная переменная с несколькими компонентами, называемыми полями. В отличие от
массивов компоненты записи (поля) могут иметь разные типы и доступ к ним осуществляется не по
индексу, а по имени поля. При определении комбинированного типа задаются имя и тип каждого
поля. Описание комбинированного типа начинается со служебного слова Record и заканчивается
словом End. После зарезервированного слова Record следует перечислить все поля записи с указанием
через двоеточие их типов. Поля отделяются друг от друга точкой с запятой (;). Поля записи могут быть
любого типа.
Пример 1
Пример 2
Type
Type
Complex = Record
Date = Record
Re:real;
Year: integer;
Im:real
Month: 1..12;
End;
Day: 1..31
End;
Var
Var
x,y,z: Complex;
MyBirthday: Date;
Пример 3
Пример 4
Type
Type
Person = Record
Complex = Record
Name: string[20];
Re,Im:Real
Sex: (Male,Female);
Age: integer;
Married: Boolean
End;
Var
x,y,z: Complex;
End;
Var
Man: Person;
Если несколько полей записи имеют один и тот же тип, то имена полей можно перечислить через
запятую и затем указать общий тип. Так, рассмотренный в примере 1 тип комплексных чисел можно
ввести и другим образом (см. пример 4).
После введения типа запись можно задать переменные или типизированные константы этого типа.
При задании значений константе типа запись поля задаются в круглых скобках через точку с запятой.
В отличие от констант типа массив для задания значения каждого поля сначала указывается имя
�Оглавлен ие
поля, а затем через двоеточие – его значение. Так для введенных выше типов можно
например, следующие переменные и константы:
ввести,
Пример 5
Var
x, y, z: Complex;
Dat, Dat1: Data;
Const
Birthday: Data = (Year:1971; Month:12; Day:9);
Ivanov: Person = (Name: 'Иванов';
Sex: Male;
Age: 40;
Married: True);
Примечание. Так же, как и при введении типа массив, тип запись можно вводить непосредственно при
определении переменных или типизированных констант. Фрагмент (пример 6) определяет те же
комплексные переменные, что и в примере 4.
Пример 6
Var
x, y, z: Record
Re,Im: real
End;
Доступ к полям переменной или константы типа запись осуществляется указанием имени переменной
(константы) и имени поля, записываемого через точку, например:
Man.Name; MyBirthday.Year; X.Re; MyBirthday.Month;
Dat.Day; MyBirthday.Day;
и т.д. Такие имена в программах используются так же, как и переменные других типов.
Использование полей записей. Оператор присваивания заносит в соответствующее поле значение
компоненты записи:
Пример 7
X.Re:= 1.5;
X.Im:= 1.7;
Y.Re:= -X.Re;
Y.Im:= -X.Im;
Ivanov.Married:= False;
Значения переменных и констант типа Record можно присваивать другим переменным того же типа,
например Dat:= Dat1; (см. пример 5). Паскаль допускает вложение записей друг в друга, т.е.
�Оглавлен ие
компоненты записи (поля) в свою очередь могут иметь тип запись. Уровень вложения не должен
превышать 9.
Пример 8
Type
Student = Record
Surname: string[25];
Birthday: Record
Day: 1..31;
Month: (Jan, Feb, Mar, Apr, May, Jun,Jul, Aug,
Sep, Ocт, Nov, Dec);
Year: integer
End;
Sex: (Male, Female);
End;
Var
St: Student;
Group: array[1..30] of Student;
К каждому из компонентов записи можно получить доступ, если указать имя переменной типа Record,
затем через точку и имя поля. Для вложенных полей приходится продолжать уточнения:
Пример 9
St.Birthday.Day:= 25;
St.Birthday.Month:= Feb;
St.Birthday.Year:= 1977;
Для того, чтобы не выписывать каждый раз имя переменной при обращении к полям переменной
типа запись, можно использовать оператор присоединения, имеющий вид
With <список переменных–записей, полей> do <оператор>;
Имена переменных-записей и полей, указанные в заголовке оператора присоединения, можно
опускать при обращении к компонентам записей в области действия оператора with. Внутри
оператора к компонентам записи можно обращаться только с помощью имени компоненты.
Пример 10
With x do
begin
Re:= 1.5;
Im:= 1.7;
Y.Re:= -Re;
�Оглавлен ие
Y.Im:= -Im;
end;
With Ivanov do
Married:= False;
Приведенный выше фрагмент эквивалентен фрагменту из примера 7, а фрагмент:
Пример 11
With St.Birthday do
begin
Day:= 25;
Month:= Feb;
Year:= 1977
end;
эквивалентен фрагменту из примера 9.
Записи могут входить в качестве компонентов в другие переменные. Например, переменная Group это вектор, состоящий из 30 записей. Оператор присваивания нового значения полю Month в пятой
записи массива имеет вид:
Group[5].Birthday.Month:= Feb;
Легко видеть, что к каждой записи (элементу массива) доступ осуществляется при помощи индекса.
Приведенный ниже фрагмент программы подсчитывает число студентов мужского пола, родившихся в
1974 году:
Пример 12
k:= 0;
for i:= 1 to 30 do
With Group[i].Birthday do
if (Year = 1974) and (Sex = Male) then k:= k + 1;
writeln('число мужчин = ', k:2);
Следует обратить внимание на то, что оператор присоединения стоит внутри цикла по i. Это
объясняется тем, что в области действия оператора присоединения нельзя изменять элементы списка
переменных–записей и полей, указанные в заголовке. В данном примере в заголовке оператора With
стоит Group[i] - элемент массива, зависящий от параметра i.
Тип запись может иметь вариантную часть. Вариантная часть записи может быть только одна и
должна располагаться в конце записи.
Пример 13
a) Type Sex = (Male,Female);
Man = Record;
�Оглавлен ие
FirstName: String[25];
Born: 1800..2000;
Mn: Sex;
Case sex of
Male: (Military: Boolean; Job: String[20]);
Female: (Married: Boolean; Children: byte)
End;
Var
M1, M2: Man;
b) Type Figure = (Square, Triangle, Circle);
Param = Record
x, y: real;
Fig: Figure
Case Figure of
Square: (side: real);
Triangle: (side1, side2, Angle: real);
Circle: (Radius:real)
End;
Var
Kwadrat, Krug: Param;
Вариантная часть записи начинается оператором Case и следует за общей частью; после ее окончания
в записи не могут появляться никакие другие поля, поэтому оператор Case не закрывается служебным
словом End.
Обычно некоторое из полей общей части указывает вариант. В примере (13.а) это поле Мn, называемое
полем признака или дискриминантом. Все варианты описываются внутри оператора Case. Каждый
вариант характеризуется задаваемым в скобках списком описаний присущих ему компонентов.
Перед списком стоит одна или несколько меток. Тип этих меток указывается в заголовке вариантной
части (в отличие от оператора варианта, где селектором варианта является выражение, а не тип).
Отметим, что тип должен быть скалярным, при этом он задается именем.
В явном виде указывать тип в заголовке не разрешается. Часто для сокращения записи поле признака
(дискриминант) включается в заголовок вариантной части:
Case Mn: Sex of
или
Case Fig: Figure of.
Для переменной М1 типа Man можно написать следующие операторы присваивания:
M1.Firstname:= 'Иванов'; M1.Born:= 1911;M1.Mn:= Male;
M1.Military:= True; M1.Job:= 'Pilot';
�Оглавлен ие
Задав значение поля признака Mn (некоторую константу типа Sex), можно присваивать новые
значения только полям вариантной части, помеченным такой же константной. Хотя никакого контроля
поля селектора при обращении к компоненту из вариантной части не производится, для надежности
работы программы следует придерживаться этого правила.
Примечание. В стандартном Паскале в качестве ключа выбора необходимо указывать некоторую
переменную порядкового типа, причем в исполняемой части программы можно присваивать значения
этой переменной и таким образом влиять на работу полей. В Тurbo Pascal также можно в поле
ключа выбора описывать переменную порядкового типа и даже присваивать ей какое-либо значение,
однако это не повлияет на выбор поля: значения констант выбора могут быть в Тurbo Рascal
произвольными и даже повторяющимися.
�Оглавлен ие
ВОПРОСЫ И УПРАЖНЕНИЯ
1. Какой тип характеризует объекты, называемые записями?
2. Могут ли компоненты записи быть различных типов?
3. К какому типу относится следующее описание? Назвать компоненты записи и их типы.
Book = Record
Nazv: string[15];
Godizdan: 1000..1992;
Cena: real
End;
4. Имеется описание
Type Family = Record
Glava: string[20];
Age: 18..100;
Children: array[1..2] of Record
Name: String[25];
Born: 1900..2000
End
End;
Занести исходную информацию в переменную А без использования оператора присоединения и
продублировать ее в переменной В.
5. Известно, что
Type Time = Record
hour: 0..23;
minute: 0..59;
second: 0..59
End;
Var
T1, T2: Time;
Написать программу, которая вводит значения полей записей T1 и Т2 и печатает True, если Т1
предшествует Т2, и печатает False в противном случае.
6. Как осуществляется доступ к полям записей?
7. Что является селектором в операторе Case при задании вариантной части записи?
8. Могут ли записи входить компонентами в другие переменные?
�Оглавлен ие
9. Даны названия 15 ЭВМ. Для каждой ЭВМ известны объем памяти, стоимость и быстродействие.
Составить программу, которая вводит данные о всех ЭВМ, определяет, какая ЭВМ имеет минимальное
отношение стоимость/быстродействие, и печатает название этой машины и ее характеристики.
Перед выполнением контрольных заданий проанализируйте работу программы, приведенной ниже.
Программа Zap вводит информацию о пяти студентах: фамилию, год рождения, год поступления в вуз
и оценки последней сессии. Результатом работы программы является список отличников. В программе
показаны возможности организации работы с записями с использованием оператора присоединения:
Program Zap;
Uses Crt;
Const n = 3;
Type Student = Record
Surname: String[20];
Born: 1965..1978;
Year: 1988..1991;
Mark: Record
Inf, Phys, Hist: 1..5
End
End;
Var
Group: array[1..5] of Student;
S1: Student;
i, j: integer;
Begin
ClrScr;
Writeln('Вводите данные :'#61#61#62);
With S1, Mark do
begin
for i:=1 to n do
begin
write('фамилия - '); readln(Surname);
write('Год.рожд., Год.пост., Отметки...');
readln(Born, Year, Inf, Phys, Hist);
Group[i]:= S1
end
end;
�Оглавлен ие
writeln ('Список отличников:');
j:=0;
For i:=1 to n do
With Group[i], Mark do
if (Inf = 5) and (Phys = 5) and (Hist = 5) then
begin
writeln(Surname,' Год рождения- ',Born:4,
' Год поступления- ',Year:4);
j:=j+1;
end;
if j=0 then writeln(‘Отличников нет’)
End.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1.
Опишите структуры, показанные на рисунках, пользуясь словесными выражениями, например:
“a подразделяется на b и c” и т.д. Затем то же сделайте на Turbo Pascal: объявите каждую запись,
задавшись подходящими типами всех компонентов.
2. Описать комбинированный тип для представления следующего понятия:
1) сведения о 10 персонах (дата рождения: число, день недели, месяц, год; место жительства: город,
улица, номер дома, номер квартиры);
2) семинар (предмет, преподаватель, номер группы, день недели, часы занятий, аудитория);
3) бланк требования на книгу (сведения о книге: шифр, автор, название, год издания; сведения о
читателе: номер читательского билета, фамилия; дата заказа);
4) экзаменационная ведомость (предмет, номер группы, дата экзамена, 25 строчек с полями: фамилия
студента, номер его зачетной книжки, оценка за экзамен);
5) сведения о 10 студентах группы (фамилия, имя, отчество; дата рождения: число, месяц, год; пол;
семейное положение; отношение к воинской службе);
6) сведения о заводе-изготовителе компьютеров (название завода; название заводов-поставщиков
комплектующих изделий; номера магазинов потребителей; название производимых ЭВМ (5..10
�Оглавлен ие
наименований): цена каждого товара за штуку в рублях и в долларах; количество каждого вида изделий
в штуках);
7) сведения об ЭВМ (название; объем памяти; быстродействие, стоимость в рублях и в долларах;
фирма поставщик; тип монитора и дисководов);
8) сведения о 5 персонах (фамилия, имя, отчество, пол, национальность, семейное положение,
образование (высшее, среднее специальное, среднее, неполное среднее); адрес: улица, номер дома,
номер квартиры, почтовый индекс, номер телефона).
9) сведения о заводе-изготовителе автомобилей (название завода, название заводов-поставщиков
комплектующих изделий, номера фирменных магазинов, марка производимых автомобилей, цена
автомобиля в рублях - долларах, количество каждой выпускаемой марки автомобилей.
Каждому компоненту записи присвоить значение: a) с помощью оператора присваивания; b)
используя оператор присоединения With.
Организуйте вывод значений компонент записи.
3.
1) распечатать анкетные данные студентов-отличников;
2) распечатать анкетные данные студентов, успевающих на 4 и 5;
3) распечатать анкетные данные студентов, получивших одну оценку 3 за все время обучения;
4) распечатать анкетные данные студентов, получивших в последнюю сессию оценки 2;
5) распечатать анкетные данные студентов, получивших в первую сессию все оценки 5;
6) распечатать анкетные данные студентов, получивших за все время обучения одну оценку 4, а все
остальные оценки - 5;
7) распечатать список и даты рождения студентов, фамилии которых начинаются с буквы 'А';
8) распечатать список студентов, фамилии которых начинаются с буквы 'Б' и их оценки за все время
обучения;
9) распечатать оценки в последнюю сессию студентов, фамилии которых начинаются с букв 'В' и 'Г';
10) распечатать фамилии и даты рождения студентов, не получивших ни одной оценки 3 за все
время обучения;
11) упорядочить список студентов по среднему баллу последней сессии и распечатать его;
12) упорядочить список студентов по среднему баллу и распечатать его;
13) вычислить средний балл группы и распечатать список студентов, имеющих средний балл выше
среднего балла группы;
14) вычислить средний балл группы и распечатать список студентов, имеющих средний балл ниже
среднего балла группы;
15) вычислить средний балл группы в последнюю сессию и распечатать список студентов, имеющих
средний балл, равный среднему баллу группы.
16) упорядочить список студентов по году рождения и распечатать его;
�Оглавлен ие
17) распечатать список студентов, упорядоченный по алфавиту;
18) распечатать список студентов, упорядоченный по месяцу рождения;
19) распечатать список отличников, упорядоченный по году рождения;
20) распечатать список студентов, упорядоченных по дате рождения.
�Оглавлен ие
Лабораторная работа № 13
ФАЙЛЫ
Файл – это
информации.
клавиатурой,
языка Turbo
поименованная часть памяти на внешнем носителе, предназначенная для хранения
Файл может быть связан с любым источником или потребителем информации:
принтером, магнитным диском и др. Будем рассматривать лишь стандартные файлы
Pascal и дисковые файлы, созданные пользователем.
Стандартные файлы определены разработчиками системы и их можно только использовать.
Файлы пользователя размещаются на внешних носителях. В файлах могут храниться программы,
данные, тексты документов, закодированные изображения и т.п. Файл может быть входным или
выходным. Из входного файла программа получает данные, в выходной файл выводит их. Каждый
файл имеет имя, зарегистрированное в директории (оглавлении диска).
Определение файлового типа. Файл с точки зрения языка Turbo Pascal – это структурированный
тип данных, состоящий из последовательности компонентов одного типа и одной длины.
Определение типа файла начинается словосочетанием file of, после которого задается тип
компонентов файла, который описывает, что содержит данный файл. Далее следует идентификатор
предварительно определенного типа файла. Число компонентов, называемое длиной файла, не
фиксируется.
Формат:
Type
<имя типа> = File of <тип компонент>;
Var
<идентификатор>:<имя типа>;
Пример:
Type
Karta = File of Record
{здесь элементами}
Dlina: byte;
{файла объявлены}
Ves: real
{данные типа ЗАПИСЬ}
End;
Var
Kartfile: Karta;
Для описания файлов, состоящих из записей, можно использовать и другую форму, которая не
вызывает ошибок даже у новичков.
Формат:
Type
<тип компонент> = Record
<поле>:<тип>;
�Оглавлен ие
...
<поле>:<тип>
End;
Var
FV: File of <тип компонент>;
{переменная для доступа к файлу}
RV: <тип компонент>;
{переменная для доступа к записи}
Пример:
Type
Zapis = Record
Nomer: integer;
FIO: string[20];
Oklad: real
End;
Var
FV: File of Zapis;
RV: Zapis;
Переменные файлового типа нельзя использовать в выражениях. Файл хранится во внешней памяти и
вызывается в оперативную память для обработки. Доступ к компонентам файла осуществляется через
указатель файла (буферную переменную). При чтении или записи этот указатель перемещается к
следующему компоненту и делает его доступным для обработки. Существует два способа доступа к
компонентам файла: последовательный и произвольный (прямой). При последовательном способе
доступа поиск начинается с начала файла и проверяется по очереди каждый элемент, пока не будет
найден нужный. Произвольный способ доступа позволяет обращаться к компоненту по его
порядковому номеру в файле.
Спецификация файла. Имя файла состоит из собственно имени (1–8 символов: букв и цифр) и
необязательного типа файла (3 символа). Тип файла присваивается обычно в мнемонической
зависимости от содержания файла. Например, programm.pas, programm.bas, pascal.doc, instruct.txt.
Стандартные процедуры и функции обработки файлов. При их описании используем следующие
обозначения: FV – файловая переменная; Str – строковое выражение; P – переменные p1, p2,
...,pn того же типа, что и компоненты переменной FV; n – целочисленное выражение.
Процедуры. Осуществляют все необходимые действия по организации файлов и доступу к
компонентам файлов.
Str) – связывает файловую переменную FV с именем файла Str. С момента
выполнения этой процедуры все действия над переменой FV будут эквивалентны действиям над
файлом, определяемым значением Str.
Assign(FV,
�Оглавлен ие
Rewrite(FV) – создать новый файл на диске. Имя файла предварительно определяется в процедуре
Assign. Указатель файла устанавливается на первую позицию (с номером 0), файл подготовлен для
загрузки.
Reset(FV) – установить указатель в начало файла. Эта процедура, примененная к несуществующему
файлу, вызывает ошибку ввода–вывода.
Read(FV, P) – читать из файла FV значения переменных p1,p2,..,pn. После выполнения
процедуры указатель перемещается на следующий компонент.
Write(FV, P) – записать в файл. Переменные p1,...,pn записываются в дисковый файл,
определенный переменной FV, и указатель перемещается к следующему компоненту.
Seek(FV, n) – установить указатель на компонент с порядковым номером n в файле. Счет
начинается с нуля, т. е. первый компонент имеет номер 0, второй – 1 и т.д.
Flush(FV) – очистить буфер сектора. Выполнение процедуры вызывает выталкивание внутреннего
буфера в файл, если ранее выполнялись операции записи. К закрытому файлу процедура не
применяется. Файл – текстовый.
Close(FV) – закрыть файл. Если файл был открыт, никогда не следует выходить из программы,
предварительно не закрыв его.
Erase(FV) – уничтожить файл. Для уничтожения открытого файла, его предварительно закрывают
процедурой Close.
Rename(FV, Str) – переименовать файл. Его новое имя дается переменной Str.
Truncate(FV) – уничтожить все компоненты файла, начиная с места текущего положения указателя,
и подготовить файл для записи.
Функции. Выполняют дополнительные действия,
существующих файлов.
облегчающие программисту обслуживание уже
Eof(FV) – проверить маркер “конец файла”. Значение функции равно True, если указатель файла
находится сразу за последним компонентом файла, и False в любом другом случае.
FileSize(FV) – определить длину файла. Функция возвращает целочисленное значение, равное
количеству компонентов файла. Размер файла берется из директория. Функция используется для того,
чтобы проверить, содержит файл информацию или является пустым.
IOResult(FV) – проверка результата выполнения последней операции на наличие ошибок. Функция
возвращает номер ошибки, если она обнаружена, и 0 – если ошибок нет.
�Оглавлен ие
СТАНДАРТНЫЕ ФАЙЛЫ
В языке Pascal все внешние устройства трактуются как логические устройства, которым
соответствуют заранее определенные (стандартные) файлы. Эти файлы фактически являются
драйверами, обеспечивающими операции ввода–вывода между процессором и конкретными
физическими устройствами. Используются следующие логические устройства:
Con: – (консоль) пульт управления. Для ввода – это клавиатура, для вывода – дисплей. Вводимая
информация отображается и может редактироваться. Непосредственно ввод осуществляется нажатием
клавиши “Ввод”.
Prn: – логическое имя принтера.
Aux: – вспомогательное устройство.
Nul: – логическое имя “пустого устройства”.
Для организации работы с логическими устройствами используются стандартные файлы. Система
сама открывает и закрывает эти файлы, поэтому к ним не применяются процедуры Assign, Flush,
Reset, Rewrite. В системе имена логических устройств и соответствующих им стандартных
файлов, за исключением основных файлов ввода–вывода, совпадают:
Input – основной файл для ввода. Назначается устройству Con.
Output – основной файл для вывода. Назначается устройству Con.
Con – назначается устройству Con, Aux – назначается устройству Aux,
устройству Nul, Prn – назначается устройству Prn.
Nul – назначается
�Оглавлен ие
ФАЙЛЫ ПОСЛЕДОВАТЕЛЬНОГО ДОСТУПА
Используются для решения задач, требующих поочередной обработки компонент файла. Работа с
последовательными файлами предполагает создание файла, его обработку и корректировку. Для
создания последовательного файла необходимо выполнить следующие шаги:
1) связать имя файла с файловой переменной (процедура Assign);
2) открыть новый файл (процедура Rewrite);
3) подготовить информацию для ввода;
4) записать в файл компоненты (процедура Write);
5) закрыть созданный файл (процедура Close).
Пример. Организовать последовательный файл с именем BIBL.DOC на дисководе А. Структура
записи следующая: порядковый номер книги; автор книги; название книги; индекс книги. Блок
организации оформить процедурой с именем Org. Значения полей ввести с клавиатуры. Признак
окончания ввода – число 99 в области номера.
Program Posled_File;
Type Books = Record
Nomer: integer;
Avtor: string[16];
Nazv: string[30];
Index: integer;
End;
Var BooksFile: File of Books;
RecBooks: Books;
I,Rej: integer;
Procedure Org;
{ Выход из процедуры – ответ 99 для поля Nomer }
begin
Assign(BooksFile, 'A:BIBL.DOC');
Rewrite(BooksFile);
with RecBooks do
while True do
begin
writeln('Введите номер книги'); readln(Nomer);
end;
if Nomer = 99 then begin Close(BooksFile); Exit
writeln('Введите имя автора'); readln(Avtor);
�Оглавлен ие
writeln(' Введите название книги'); readln(Nazv);
writeln(' Введите значение индекса'); read(Index);
write(BooksFile, RecBooks)
end;
end;
.......................
Доступ к компонентам последовательного файла. Чтобы обработать хранящиеся в файле данные,
необходимо получить доступ к компонентам файла. Для этого надо: 1) связать имя файла с файловой
переменной (процедура Assign); 2) открыть уже существующий на диске файл (процедура Reset); 3)
последовательно считать компоненты до нужного (процедура Read); 4) выполнить обработку; 5)
закрыть файл (процедура Close).
Пример
Вывести на экран содержание всех записей файла. Блок вывода оформить процедурой с именем Obr.
Procedure Obr;
begin
Assign(BooksFile, 'A:BIBL.DOC');
Reset(BooksFile);
with RecBooks do
while not Eof(BooksFile) do
begin
read(BooksFile, RecBooks);
writeln(Nomer:1, Avtor:16, Nazv:30, Index:6)
end;
Close(BooksFile)
end;
Корректировка последовательного файла. Возможны три вида корректировки: расширение файла
внесением дополнений, полная замена содержимого записи, корректировка значений полей
отдельных записей. Все три вида одинаково применимы и к последовательным, и к произвольным
файлам.
Рассмотрим технологию расширения файлов. Новые компоненты записываются сразу за последним
компонентом корректируемого файла. Расширение файла предполагает следующие шаги: 1) связать
имя файла с файловой переменной (процедура Assign); 2) открыть уже существующий на диске файл
(процедура Reset); 3) установить указатель файла за последним компонентом; 4) подготовить
информацию для нового компонента; 5) записать новый компонент (процедура Write); 6) закрыть
файл (процедура Close).
Для установки указателя за последним компонентом можно использовать следующую инструкцию:
Seek(FV, FileSize(FV)); которая значительно эффективнее и короче, чем поиск конца файла
�Оглавлен ие
путем перебора всех существующих в файле компонентов.
Пример
Расширить файл BIBL.DOC двумя новыми компонентами. Оформить блок корректировки процедурой с
именем Korr.
Procedure Korr;
begin
Assign(BooksFile, 'A:BIBL.DOC');
Reset(BooksFile);
Seek(BooksFile, FileSize(BooksFile));
with RecBooks do
while true do
begin
writeln('Введите номер');
readln(Nomer);
if Nomer = 99 then
begin
Close(BooksFile);
Exit
end;
writeln(' Введите имя автора');
readln(Avtor);
writeln(' Введите название книги');
readln(Nazv);
writeln(' Введите значение индекса');
readln(Index);
write(BooksFile, RecBooks);
end
end;
Объединив все процедуры, получим следующую программу:
Program Posled_File;
Uses Crt;
Type Books = Record
Nomer: integer;
Avtor: string[16];
�Оглавлен ие
Nazv: string[30];
Index: integer;
End;
Var BooksFile: File of Books;
RecBooks: Books;
I,Rej: integer;
Procedure Org;
{описание процедур}
<.........>;
Procedure Obr;
<.........>;
Procedure Korr;
<.........>;
Begin
while True do
begin
writeln('Укажите режимы: ');
writeln(' 1: Создание файла ');
writeln(' 2: Обработка файла ');
writeln(' 3: Расширение файла ');
writeln(' 4: Выход из программы ');
readln(Rej);
case Rej of
1: Org;
2: Obr;
3: Korr;
4: Halt
else writeln ('Повторите ввод')
end
end
End.
�Оглавлен ие
ФАЙЛЫ ПРОИЗВОЛЬНОГО ДОСТУПА
Организация файла произвольного доступа. Создаются для решения задач, требующих оперативного
доступа к хранимой информации или при наличии зависимости значения поля компонента от
порядкового номера компонента в файле. Работа с таким файлом предполагает его организацию,
обработку и корректировку. Организовать файл произвольного доступа можно двумя способами: 1)
создать последовательный файл и обращаться к компонентам по их порядковому номеру, трактуя
последовательный файл как произвольный; 2) создать файл фиктивных записей (например, пробелов
или нулей; это т.н. форматизация файла), затем загрузить его по ключу фактическими данными;
обращение к компонентам по ключу предполагает использование процедуры Seek. Рассмотрим 2–й
способ.
Пример
Форматизовать файл произвольного доступа из 10 записей. Формат компонентов такой же, как и в
предыдущем примере. Оформить блок как процедуру с именем Form.
Program Proizv_File;
Const Razmer = 10;
Type Books = Record
Nomer: integer;
Avtor: string[14];
Nazv: string[30];
Index: integer
End;
Var BooksFile: File of Books;
RecBooks: Books; k,K1: integer;
i,Rej: integer; FileName: string[12];
Procedure Form;
begin
writeln(' Введите имя форматируемого файла');
readln(FileName);
Assign(BooksFile, FileName);
Rewrite(BooksFile);
with RecBooks do
begin
for i:=1 to Razmer do
begin
Nomer:= 0;
{ если нужно, при форматизации сразу в запись заносится значение номера 1 .. i, можно записать Nomer:= i;}
�Оглавлен ие
Avtor:= ' '; Nazv:= ' '; Index:= 0;
write(BooksFile, RecBooks);
end
end;
writeln('Форматизация ', Razmer,' записей выполнено');
Close(BooksFile)
end;
После форматизации файла можно приступить к его загрузке по ключу фактической информацией,
которая заменит фиктивную.
Пример
Внести в файл BIBL2.DOC фактические записи с номерами 3, 7, 8. Оформить блок загрузки процедурой
с именем ZagrKl.
Procedure ZagrKl;
begin
writeln(' Введите имя загружаемого по ключу файла');
readln(FileName);
Assign(BooksFile, FileName);
Reset(BooksFile);
writeln('Сколько записей будете вводить?');
readln(k);
with RecBooks do
for i:= 1 to k do
begin
writeln(' Введите номер '); readln(Nomer);
K1:= Nomer; writeln(' Введите имя автора ');
readln(Avtor);
writeln(' Введите название книги ');
readln(Nazv);
writeln(' Введите индекс '); readln(Index);
Seek(BooksFile,K1–1);
write(BooksFile, RecBooks);
end;
Close(BooksFile);
end;
�Оглавлен ие
Доступ к компонентам файла. Может быть как последовательным, так и произвольным.
Последовательный уже описан. Для организации произвольного доступа используется процедура
Seek. Произвольный доступ организовывается по ключу, значение которого равно порядковому
номеру в файле нужного элемента. Ключ должен быть целочисленным, не превышающим количество
компонентов в файле. Порядок действий при обработке файлов произвольного доступа следующий: 1)
связать имя файла с файловой переменной (процедура Assign); 2) открыть файл (процедура Reset) и
запросить ключ; 3) подвести указатель по ключу к нужному компоненту (процедура Seek); 4) считать
нужный компонент (процедура Read); 5) выполнить обработку считанной информации; 6) закрыть
файл (процедура Close).
Пример. Вывести на экран 6–й и 7–й компоненты файла BIBL2.DOC. Блок вывода оформить
процедурой с именем ObrKl.
Procedure ObrKl;
begin
writeln(' Введите имя файла:'); readln(FileName);
Assign(BooksFile, FileName);
Reset(BooksFile);
while True do
begin
writeln('Дайте ключ выводимой записи:');
readln(K1);
if K1 = 99 then begin Close(BooksFile); Exit
end;
Seek(BooksFile, K1–1);
read(BooksFile, RecBooks);
with RecBooks do
writeln(Nomer:4, Avtor:16, Nazv:15, Index:4);
end
end;
Корректировка файла произвольного доступа. Заключается в изменении значений полей
компонентов в целом (или частично) или расширении файла. Для корректировки полей компонентов
файла необходимо: 1) связать имя файла с файловой переменной (процедура Assign); 2) открыть
корректируемый файл (процедура Reset); 3) подвести указатель файла к корректируемому компоненту
(Seek); 4) считать корректируемый компонент (процедура Read); 5) откорректировать нужные поля; 6)
повторить инструкцию подвода указателя (процедура Seek); 7) записать откорректированный
компонент (процедура Write); 8) закрыть файл (процедура Close).
Пример
Откорректировать «название книги» и «индекс книги» в рассмотренных выше примерах. Блок вывода
оформить процедурой с именем KorrKl.
Procedure KorrKl;
�Оглавлен ие
Var NewAvtor: string[16];
NewNazv: string[30];
NewIndex: integer;
begin
Write(' Введите имя файла:'); readln(FileName);
Assign(BooksFile, FileName);
Reset(BooksFile);
with RecBooks do
begin
Write('Сколько записей будете корректировать? ');
Readln(k);
for i:=1 to k do
begin
Write('Номер корректируемой записи:');
Readln(K1);
Write('Название книги: '); Readln(NewNazv);
Write('Индекс: '); Readln(NewIndex);
Seek(BooksFile, K1–1);
Read(BooksFile, RecBooks);
Avtor:= NewAvtor;
Nazv:= NewNazv;
Index:= NewIndex;
Seek(BooksFile, K1–1);
Write(BooksFile, RecBooks);
end;
end;
Close(BooksFile)
end;
Процедура корректировки полной записи аналогична описанной ранее (см. корректировка
последовательного файла), только новая запись вносится на место уже существующей, а не фиктивной.
Желательно при создании файла спроектировать файл такого размера, чтобы его по возможности не
расширять.
Все приведенные выше процедуры работы с файлом удобно объединить в одной программе. В этом
случае процедуры вызываются из основной программы путем указания номера нужного режима в
меню. После выполнения процедуры происходит возврат в основную программу.
�Оглавлен ие
Program Proizv_File;
Const Razmer = 20;
Type Books = Record
Nomer: integer;
Avtor: string[14];
Nazv: string[30];
Index: integer
End;
Var BooksFile: File of Books;
RecBooks: Books; k,K1: integer;
i,Rej: integer; FileName: string[12];
Procedure Form;
{описание процедур}
<.........>;
Procedure ZapKl;
<.........>;
Procedure ObrKl;
<.........>;
Procedure KorKl;
<.........>;
Begin
while True do
begin
Writeln('Укажите режимы: ');
Writeln(' 1: Форматизация ');
Writeln(' 2: Загрузка по ключу ');
Writeln(' 3: Обработка по ключу ');
Writeln(' 4: Корректировка ');
Writeln(' 5: Выход из программы ');
Readln(Rej);
case Rej of
1: Form;
2: ZagrKl;
3: Obrkl;
�Оглавлен ие
4: KorrKI;
5: Halt
else Writeln ('Повторите ввод')
end
end
End.
�Оглавлен ие
ТЕКСТОВЫЕ ФАЙЛЫ
Определение типа. Текстовый файл – это файл, состоящий из компонентов, являющихся строками.
Длина строки может меняться от 0 до 255. Каждая строка завершается маркером конца строки CR/LF
(код $0D/$0A), файл – маркером конца файла CTRL/Z (код $1A). Для описания файловых переменных
используется стандартный идентификатор Text.
Формат: Var
<идентификатор>: Text;
Приме р:
Var Instr1,Instr2: Text;
Dokument: Text;
�Оглавлен ие
ПРОЦЕДУРЫ И ФУНКЦИИ ОБРАБОТКИ ТЕКСТОВОГО ФАЙЛА
Assign(FV, Str) – связывает текстовый файл с файловой переменной;
Rewrite(FV) – открывает для создания новый текстовый файл;
Reset(FV) – открывает уже существующий текстовый файл;
Close(FV) – закрывает текстовый файл (при выполнении записывается маркер конца файла);
Append(FV) – открывает файл и устанавливает маркер на указатель конца файла;
Read(FV, Ch) – считывает символ Ch из файла FV;
Write(FV, Ch) – записывает символ Ch в файл FV;
Readln(FV, Str) – читает из файла FV строку Str;
Readln(FV) – переход на новую строку;
Writeln(FV, Str) – записывает в файл FV строку Str;
Writeln(FV) – записывает в файл пустую строку;
Eoln(FV) – возвращает True, если указатель файла достиг маркера конца строки. В противном случае
возвращает False;
SeekEoln(FV) – аналогична предыдущей, но указатель файла переходит все пробелы и знаки
табуляции;
SeekEof(FV) – возвращает значение True, если указатель файла находится на маркере конца файла.
Процедуру Readln(FV) используют, как правило, для подсчета количества компонентов в файле
St:= 0;
{обнуление счетчика}
while not Eof(FV) do begin
readln(FV);
{пропуск строки}
St:= St+1
{увеличение счетчика на 1}
end;
write('В файле находится ', St:4,' строк');
а процедуру Writeln(FV) – для создания строк–пробелов
for i:= 1 to 7 do writeln(FV);
Если файловая переменная FV не указана, по умолчанию подразумевается файл вывода на экран
Output.
Оpганизация текстового файла. Осуществляется таким образом: 1) объявляется файловая переменная
в качестве текстовой; 2) имя файла связывается с файловой переменной (процедура Assign); 3)
открывается файл для записи (процедура Rewrite); 4) подготавливается строка для записи (например,
вводится с клавиатуры); 5) записывается строка в файл (процедура Writeln); 6) закрывается файл
(процедура Close).
�Оглавлен ие
Пример:
Создать текстовый файл с произвольным именем и типом на дисководе А. Файл содержит строки
делового письма. Каждая строка состоит из не более чем 60 символов. Если значение строки равно
'kkk', то прекратить запись в файл. Оформить в виде процедуры с именем SozdT.
Program TextFiles;
Type Dlina = string[60];
Var Stro: Text; FileName: string[14];
S: Dlina;
Rej: char;
Procedure SozdT;
begin
write(' Введите имя создаваемого текстового файла ');
readln(FileName);
Assign(Stro, FileName); rewrite(Stro);
while True do
begin
readln(S);
if S='kkk' then
begin
Close(Stro);
Exit
end;
writeln(Stro, S)
{ Запись в файл }
end
end;
Доступ к компонентам текстового файла. Осуществляется таким образом: 1) связать имя файла с
файловой переменной (процедура Assign); 2) открыть файл для чтения (процедура Reset); 3)
прочитать компонент файла (оператор Readln); 4) обработать компонент (например, распечатать на
экране монитора); 5) закрыть файл (процедура Close).
Пример.
Распечатать все компоненты файла, созданного в предыдущем примере. Имя процедуры распечатки
ObrT.
Procedure ObrT;
begin
{$I–}
repeat
{Отмена контроля операций ввода–вывода}
�Оглавлен ие
write(' Введите имя выводного файла: ');
readln(FileName);
Assign(Stro, FileName);
reset(Stro);
until (IOResult = 0) or (FileName = 'kkk');
{$I+}
{Включение контроля операций ввода–вывода}
while not SeekEof(Stro) do
begin
readln(Stro, S); {Чтение из файла}
writeln(S);
end;
end;
Корректировка текстового файла. Заключается в расширении текстового файла новыми
компонентами. Для корректировки необходимо: 1) связать имя файла с файловой переменной
(процедура Assign); 2) открыть файл для внесения новых компонентов (процедура Append); 3)
записать новые компоненты (процедура Write); 4) закрыть файл (процедура Close).
Пример. Расширить ранее созданный файл новыми компонентами. Если значение строки равно
'kkk', прекратить запись. Имя процедуры расширения RasshT.
Procedure RasshT;
begin
{$I–}
{Отмена контроля операций ввода–вывода}
repeat
writeln('Имя корректируемого файла: '); readln(FileName);
Assign(Stro, FileName);
Append(Stro);
until IOResult = 0;
{$I+}
{Включение контроля операций ввода–вывода }
while True do
begin
writeln('Вводите строку'); readln(S);
if S = 'kkk' then begin Close(Stro); Exit; end;
writeln(Stro, S)
end
end;
Все приведенные выше процедуры работы с файлом объединим в одной программе. В этом случае
�Оглавлен ие
процедуры вызываются из основной программы путем указания номера нужного режима в меню.
После выполнения процедуры происходит возврат в основную программу.
Пример.
Объединить функциональные блоки по созданию, обработке и расширению текстовых файлов в одной
программе. Имя файла запрашивать у пользователя. Если при обработке и расширении указанный файл
на диске не найден, запросить имя заново.
Program TextFiles;
Uses Crt;
Type Dlina = string[60];
Var Stro: Text;
S: Dlina;
Rej: char;
Procedure SozdT;
{описание процедур}
<.........>;
Procedure ObrT;
<.........>;
Procedure RasshT;
<.........>;
Begin
while True do
begin
ClrScr; writeln('Укажите режим: ');
writeln(' 1: Создание текстового файла ');
writeln(' 2: Вывод текстового файла: ');
writeln(' 3: Расширение текстового файла: ');
writeln(' 4: Выход из программы: ');
read(Rej);writeln;
case Rej of
'1': SozdT;
'2': ObrT;
'3': RasshT;
'4': Halt;
�Оглавлен ие
else writeln('Повторите ввод режима');
end
end
End.
�Оглавлен ие
ФАЙЛЫ БЕЗ ТИПА
Файлы, не имеющие типа (нетипизированные), описываются с помощью зарезервированного слова
File.
Формат: Var <файловая переменная>: File;
Нетипизированные файлы считываются и записываются только блоками по 128 байт, для чего
используются специальные процедуры BlockRead и BlockWrite соответственно.
Формат: BlockRead(FV, Var, Count);
BlockWrite(FV, Var, Count);
или
BlockRead(FV, Var, Count, Result);
BlockWrite(FV, Var, Count, Result);
где FV – идентификатор файловой переменной, Var – переменная любого типа (обычно это массив),
Count – количество блоков по 128 байт, которое нужно считать или записать, Result – количество
блоков, которое было передано фактически. Размер Var должен быть больше или равен 128 Count.
Пример
Программа быстрого копирования файлов.
Program Untypped_File;
Var OldFile, NewFile: File;
OldName, NewName: string[14];
Oblbuf: array[1..128, 1..200] of byte;
Count: integer;
Begin
writeln('Дайте имя исходного файла '); readln(OldName);
Assign(OldFile, OldName);
Reset(OldFile);
writeln('Дайте имя выходного файла: '); readln(NewName);
Assign(NewFile, NewName); rewrite(NewFile);
repeat
BlockRead(OldFile, Oblbuf, 200, Count);
BlockWrite(NewFile, Oblbuf, Count);
until Count = 0;
Close(OldFile); Close(NewFile);
End.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
Вариант 1
1. Создать файл из 50 целых чисел, используя генератор случайных чисел. Вывести эти числа на
экран. Вывести на экран все числа из этого файла, оканчивающиеся на 7. Найти среднее
арифметическое всех чисел, входящих в созданный файл. Найти наименьшее из них.
2. Создать два упорядоченных файла целых чисел. Объединить их, создав новый упорядоченный
файл.
3. Создать текстовый файл. Подсчитать количество предложений в нем. Найти самое длинное слово.
Вариант 2
1. Создать файл из 55 целых чисел, используя генератор случайных чисел. Переписать все четные
числа из этого файла в другой. Вывести оба файла на экран. Найти в новом файле среднее
арифметическое его элементов. Найти наибольший элемент в новом файле.
2. Создать два упорядоченных по возрастанию файла: 1–й из четных чисел, 2 – из нечетных чисел.
3. Создать текстовый файл. Подсчитать количество знаков препинания в нем. Найти самое короткое
слово.
Вариант 3
1. Используя генератор случайных чисел, создать файл из 20 целых чисел, кратных 5. Вывести его на
экран. Найти среднее арифметическое этих чисел. Найти количество элементов, оканчивающихся
нулем. Найти наименьшее из них.
2. Создать два упорядоченных по убыванию файла. Объединить их в упорядоченный по убыванию
файл.
3. Создать текстовый файл. Убрать лишние пробелы. Вывести на экран слова, начинающиеся с буквы
“А”.
Вариант 4
1. С помощью датчика случайных чисел создать файл из 35 целых чисел. Вывести его на экран.
Найти наибольшее из чисел, оканчивающихся на 3. Посчитать числа, оканчивающиеся на 3. Найти
среднее арифметическое остальных чисел.
2. Создать два упорядоченных по убыванию файла. Объединить их в упорядоченный по
возрастанию файл.
3. Создать текстовый файл. Определить количество вопросительных предложений и количество
слов в первом предложении.
Вариант 5
1. С помощью датчика случайных чисел создать файл из 40 целых чисел. Вывести все четные числа,
встречающиеся в созданном файле. Посчитать их количество. Найти их среднее арифметическое.
Найти число, ближайшее к среднему арифметическому.
2. Создать два упорядоченных файла: один – по убыванию, другой – по возрастанию.
3. Создать текстовый файл. Зашифровать его, используя метод обратного чтения
�Оглавлен ие
Вариант 6
1. Создать файл из 20 вещественных чисел, выбранных случайным образом из отрезка [10..30].
Вывести его на экран. Найти наибольший и наименьший элементы в этом файле. Найти сумму всех
элементов файла.
2. Создать два упорядоченных файла: один – по не убыванию, другой – по не возрастанию.
Объединить эти файлы в новый, упорядоченный по убыванию.
3. Создать текстовый файл. Вывести его на экран. Вывести на экран последнее предложение.
Определить количество слов в нем.
Вариант 7
1. Создать файл из 30 вещественных чисел, выбранных случайным образом из отрезка [5, 8]. Вывести
его на экран. Найти среднее арифметическое его элементов. Найти все элементы, расстояние которых
от среднего арифметического не превышает 1 и записать их в новый файл. Найти наибольший среди
них.
2. Создать два упорядоченных по возрастанию файла. Объединить их в упорядоченный по
убыванию файл.
3. Создать текстовый файл. Вывести его на экран. Определить, есть ли в тексте слово “заряд”.
Вариант 8
1. Создать файл из 25 вещественных чисел, выбранных случайным образом из отрезка [10, 12].
Вывести файл на экран. Найти наибольший и наименьший элементы. Найти среднее арифметическое
первых 10 элементов.
2. Создать два файла. Первый по закону x n = 1/n, второй – yn = 1/(n+1). Объединить их в
упорядоченный по возрастанию файл.
3. Создать текстовый файл. Вывести его на экран. Поменять местами первое и последнее слово.
Вариант 9
1. Создать файл из 50 вещественных чисел, выбранных случайным образом из отрезка [1, 4]. Вывести
файл на экран. Найти наибольший элемент. Найти среднее арифметическое последних 15 чисел.
2. Создать два файла. Первый по закону x n = n2 , где n = 1..10, а второй – y = n2 + 1, где n = 1 .. 15.
Создать новый файл, упорядоченный по убыванию, путем слияния двух ранее созданных.
3. Создать текстовый файл. Вывести его на экран. Сколько в этом файле слов, оканчивающихся на
“м”.
Вариант 10
1. Создать файл из 25 вещественных чисел, выбранных случайным образом из отрезка [1, 8]. Вывести
файл на экран. Найти наименьший элемент. Найти среднее арифметическое всех элементов. Вывести
на экран все элементы, которые отличаются от среднего арифметического не более чем на 0.5.
2. Создать два файла. Первый – по правилу x n = 3n + 1, где n = 5..15, второй – n = 4..18. Создать
новый файл, упорядоченный по возрастанию, путем слияния двух созданных.
3. Создать текстовый файл. Вывести его на экран. Вывести на экран самое длинное предложение.
�Оглавлен ие
Вариант 11
1. Создать файл из 30 вещественных чисел, выбранных случайным образом из [1..5]. Вывести его на
экран. Найти наибольший элемент. Найти среднее арифметическое 18 последних чисел, среднее
арифметическое всех чисел.
2. Создать два файла. Первый – по правилу x n = n + 1, второй yn = 1 – 2n, где n = 1...20. Получить
новый файл, упорядоченный по возрастанию, путем слияния двух созданных.
3. Создать текстовый файл. Вывести его на экран. Вывести на экран предпоследнее предложение.
Вариант 12
1. Создать файл из 28 целых чисел, используя датчик случайных чисел из отрезка [30, 100]. Вывести
его на экран. Найти среднее арифметическое всех нечетных чисел. Найти наименьшее среди четных
чисел.
2. Создать два файла. Первый по правилу x n = (1 –2n)/n, где n = 1 .. 20, второй – y = 1/n, где n = 1 .. 10.
Создать новый файл, упорядоченный по убыванию, путем слияния двух созданных.
3. Создать текстовый файл. Вывести его на экран. Вывести на экран предложения, начинающиеся с
буквы “В”.
Вариант 13
1. Дан файл f, компоненты которого являются действительными числами. Найти: a) сумму компонент
файла f; b) произведение компонент файла f; c) сумму квадратов компонент файла f; d) модуль суммы и
квадрат произведения компонент файла f; e) последнюю компоненту файла.
2. Даны символьные файлы f и g. Определить, совпадают ли компоненты файла f с компонентами
файла g. Если нет, то получить номер первой компоненты, в которой файлы f и g отличаются между
собой.
3. Дан текстовый файл f. Получить все его строки, содержащие более 60 символов.
Вариант 14
1. Дан файл f, компоненты которого являются действительными числами. Найти: a) наибольшее из
значений компонент; b) наименьшее из значений компонент с четными номерами; c) наибольшее из
значений модулей компонент с нечетными номерами; d) сумму наибольшего и наименьшего из
значений компонент; e) разность первой и последней компонент файла.
2. Дан символьный файл f. Получить копию файла в файле g.
3. Дан текстовый файл f. Переписать в файл g все компоненты файла f с заменой в них символа 0 на
символ 1 и наоборот.
Вариант 15
1. Дан файл f, компоненты которого являются целыми числами. Найти: а) количество четных чисел
среди компонент; b) количество удвоенных нечетных чисел среди компонент; c) количество квадратов
нечетных чисел среди компонент.
2. Даны символьные файлы f 1 и f 2. Переписать с сохранением порядка следования компоненты
файла f в файл f 2, а компоненты файла f 2 – в файл f. Использовать вспомогательный файл h.
3. Дан текстовый файл f. Записать в перевернутом виде строки файла f в файл g. Порядок строк в
�Оглавлен ие
файле g должен a) совпадать с порядком исходных строк в файле f; b) быть обратным по отношению к
порядку строк исходного файла.
Вариант 16
1. Дан файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты
файла f: a) являющиеся четными числами; b) делящиеся на 3 и не делящиеся на 7; c) являющиеся
точными квадратами.
2. Дан символьный файл f. Добавить в его конец символы e, n, d (если это необходимо, использовать
дополнительный файл g).
3. Дан текстовый файл f. Переписать компоненты файла f в файл g, вставляя в начало каждой строки
по одному пробелу. Порядок компонент должен быть сохранен.
Вариант 17
1. Дан файл f, компоненты которого являются целыми числами. Записать в файл g все четные числа
файла f, а в файл h – все нечетные. Порядок следования чисел сохраняется.
2. Дан символьный файл f. Подсчитать число вхождений в файл сочетаний ab. Определить, входит
ли в файл сочетание abcdefgh. Подсчитать число вхождений в файл каждой из букв a, b, c, d, e, f и
вывести результат в виде таблицы
a–N b–N c–N
d–N e–N f–N
3. Дан текстовый файл f. Получить самую длинную строку файла. Если в файле имеется несколько
строк с наибольшей длиной, то получить одну из них.
Вариант 18
1. Дан файл f, компоненты которого являются целыми числами. Ни одна из компонент файла не
равна нулю. Файл f содержит столько же отрицательных чисел, сколько и положительных. Используя
вспомогательный файл h, переписать компоненты файла f в файл g так, чтобы в файле g: a) не было
двух соседних чисел с одним знаком; b) сначала шли положительные, потом отрицательные числа; c)
числа шли в следующем порядке: два положительных, два отрицательных, два положительных, два
отрицательных и т.д. (предполагается, что число компонент в файле f делится на 4).
2. Дан символьный файл f. Записать в файл g компоненты файла f в обратном порядке.
3. Дан текстовый файл f. Исключить пробелы, стоящие в концах его строк. Результат поместить в
файл f .
Вариант 19
1. Дан файл f, компоненты которого являются целыми числами. Число компонент файла делится на
100. Записать в файл g наибольшее значение первых ста компонент файла f, затем – следующих ста
компонент и т.д.
2. Даны символьные файлы f и g. Записать в файл h все начальные совпадающие компоненты
файлов f и g.
3. Даны текстовый файл и строка s. Получить все строки файла f, содержащие в качестве фрагмента
строку s.
�Оглавлен ие
Вариант 20
1. Дан файл f, компоненты которого являются целыми числами. Получить файл g, образованный из
файла f исключением повторных вхождений одного и того же числа.
2. Сведения об автомобиле состоят из его марки, номера и фамилии владельца. Дан файл f,
содержащий сведения о нескольких автомобилях. Найти: a) фамилии владельцев и номера
автомобилей данной марки; b) количество автомобилей каждой марки.
3. Даны два текстовых файла f и g. Определить, совпадают ли компоненты файла f с компонентами
файла g. Если нет, то получить номер первой строки и позицию первого символа в этой строке, в
которых файлы f и g отличаются между собой.
Вариант 21
1. Прямая на плоскости задается уравнением ax + by + c = 0, где a и b одновременно не равны нулю.
Будем рассматривать только прямые, для которых коэффициенты a, b, c – целые числа. Пусть f – файл,
содержащий коэффициенты нескольких прямых (не менее трех). Требуется получить в файле g
коэффициенты всех различных прямых файла f.
2. Дан символьный файл f. Записать в файл g с сохранением порядка следования те символы файла f:
a) которым в этом файле предшествует буква 'a'; b) вслед за которым в этом файле идет буква 'a'.
3. Дан файл f, который содержит номера телефонов сотрудников учреждения: указывается фамилия
сотрудника, его инициалы и номер телефона. Найти телефон сотрудника по его фамилии и инициалам.
Вариант 22
1. Дан файл f, компоненты которого являются натуральными числами. Количество чисел в файле
кратно 4. Первые два числа из каждых четырех задают координаты левого верхнего угла
прямоугольника, следующие два числа – координаты его правого нижнего угла. Построить
прямоугольники, заданные в файле f.
2. Дан символьный файл f. В файле f не менее двух компонент. Определить, являются ли два первых
символа файла цифрами. Если да, то установить, является ли число, образованное этими цифрами,
четным.
3. Дан символьный файл f, содержащий произвольный текст длиной более 5000 слов. Слова в тексте
разделены пробелами и знаками препинания. Получить 100 наиболее часто встречающихся слов и
число их появлений. Решить задачу: a) без ограничения на длины слов; b) предполагая, что любое
слово текста состоит не более чем из 16 букв.
Вариант 23
1. Дан файл f, содержащий различные даты. Каждая дата – это число, месяц и год. Найти: a) год с
наименьшим номером; b) все весенние даты; в) самую позднюю дату.
2. Дан символьный файл f. Группы символов, разделенные пробелами (одним или несколькими) и
не содержащие пробелов внутри себя, будем называть словами. Найти самое длинное слово среди
слов, вторая буква которых есть e; если слов с наибольшей длиной несколько, то найти последнее.
Если таких слов нет вообще, то сообщить об этом. Решить эту задачу: а) полагая, что слова состоят не
более чем из 10 символов; b) без ограничения на число символов в слове.
3. Создать текстовый файл. Подсчитать количество знаков препинания в нем. Найти самое короткое
слово.
�Оглавлен ие
Вариант 24
1. Создать файл из 35 целых чисел с помощью датчика случайных чисел. Вывести его на экран.
Найти наибольшее из чисел, оканчивающихся на 5. Посчитать числа оканчивающиеся на 5. Найти
среднее геометрическое остальных чисел.
2. Дан файл f, содержащий сведения о веществах: указывается название вещества, его удельный вес и
проводимость (проводник, полупроводник, изолятор). Найти удельные веса и названия всех
полупроводников. Выбрать данные о проводниках и упорядочить их по убыванию удельных весов.
3. Дан символьный файл f, содержащий сведения о сотрудниках учреждения, записанные по
следующему образцу: фамилия_имя_отчество, фамилия_имя_отчество, ... Записать эти сведения в
файле g, используя образцы: а) имя_отчество_фамилия, имя_отчество_фамилия, ...; b) фамилия_и.о.,
фамилия_и.о., ...
Вариант 25
1. Дан файл f, компоненты которого являются целыми числами. Записать в файл g все четные числа
файла f, а в файл h – все нечетные. Порядок следования чисел сохраняется.
2. Сведения об ученике состоят из его имени, фамилии и названия класса (года обучения и буквы), в
котором он учится. Дан файл f, содержащий сведения об учениках школы. Выяснить, имеются ли в
школе однофамильцы. Выяснить, имеются ли однофамильцы в каких-либо параллельных классах.
Выяснить, имеются ли однофамильцы в каком-нибудь классе.
3. Дан файл f, содержащий сведения об экспортируемых товарах: указывается наименование товара,
страна, импортирующая товар, и объем поставляемой партии в штуках. Найти страны, в которые
экспортируется данный товар, и общий объем его экспорта.
Вариант 26
1. Создать файл из 20 вещественных чисел, выбранных случайным образом из отрезка [10..30].
Вывести его на экран. Найти наибольший и наименьший элементы в этом файле и их произведение.
2. Дан файл f, содержащий сведения о кубиках: размер каждого кубика (длина ребра в сантиметрах),
его цвет (красный, желтый, зеленый или синий) и материал (деревянный, металлический, картонный).
Найти: a) количество кубиков каждого из перечисленных цветов и их суммарный объем; b) количество
деревянных кубиков с ребром 3 см и количество металлических кубиков с ребром, большим 5 см.
3. Дан файл f, содержащий сведения о книгах. Сведения о каждой из книг – это фамилия автора,
название и год издания. Найти названия книг данного автора, изданных с 1960 г. Определить, имеется
ли книга с названием “Информатика”. Если да, то сообщить фамилию автора и год издания. Если таких
книг несколько, то сообщить имеющиеся сведения обо всех этих книгах.
Вариант 27
1. Создать файл из 55 целых чисел, используя генератор случайных чисел. Переписать все четные
числа из этого файла в другой. Вывести оба файла на экран. Найти в новом файле среднее
арифметическое его элементов. Найти наибольший элемент в новом файле.
2. Сведения об ученике состоят из его имени и фамилии и названия класса (года обучения и буквы), в
котором он учится. Дан файл f, содержащий сведения об учениках школы и дополнительно отметки,
полученные учениками в последней четверти. Выяснить, сколько учеников школы не имеют отметок
ниже четырех. Собрать в файле g сведения о лучших учениках школы, т.е. об учениках, не имеющих
�Оглавлен ие
отметок ниже четырех и по сумме баллов не уступающих другим ученикам своего и параллельных
классов.
3. Дан файл f, содержащий сведения об игрушках: указывается название игрушки (например, кукла,
кубики, мяч, конструктор и т.д.), ее стоимость в рублях и возрастные границы детей, для которых
игрушка предназначена (например, для детей от двух до пяти лет). Получить следующие сведения: a)
названия игрушек, цена которых не превышает 400 руб. и которые подходят детям 5 лет; b) цену самого
дорогого конструктора, оформленную по образцу ... руб.; c) названия наиболее дорогих игрушек (цена
которых отличается от цены самой дорогой игрушки не более чем на 100 руб.).
�Оглавлен ие
Лабораторная работа № 14
МОДУЛИ
Модули в Turbo Pascal появились в связи с необходимостью упрощения процесса разработки
сложных программ. Модуль является независимо компилируемой частью программы и представляет
собой мощный инструмент создания различных прикладных программ. Компилятор Turbo Pascal
размещает программный текст каждого модуля в отдельном сегменте памяти. Хотя максимальная
длина сегмента не может превышать 64 Кбайт, число одновременно открытых модулей ограничено
лишь объемом доступной памяти, что позволяет создавать достаточно большие программы.
Структура модуля выглядит следующим образом:
Unit <имя>;
INTERFACE
<интерфейсная часть>
IMPLEMENTATION
<исполняемая часть>
[ Begin
<инициирующая часть> ]
End.
Где
Unit – служебное слово, начинающее заголовок модуля;
<имя> – имя модуля (правильный идентификатор);
INTERFACE – служебное слово, начинающее интерфейсную часть модуля;
IMPLEMENTATION – служебное слово, начинающее исполняемую часть;
Begin – служебное слово, начинающее инициирующую часть (квадратные скобки означают, что эта
часть необязательна);
End – признак конца модуля.
Любая из перечисленных трех частей модуля может быть пустой.
Для правильной компиляции модуля его имя должно совпадать с именем файла на диске, в котором
этот модуль будет храниться. Если, например, модуль определен заголовком
Unit Complex;
то его текст должен быть сохранен в файле с именем Complex.pas. Имя модуля служит для его связи
с другими модулями и основной программой. Эта связь осуществляется специальным предложением
USES <список модулей>;
где Uses – служебное слово, <список модулей> – имена используемых модулей, перечисленные через
запятую. Например:
�Оглавлен ие
USES CRT, Graph, Complex;
Если в программе используются модули, то слово Uses должно открывать раздел описаний основной
программы или следовать сразу за служебным словом Interface в модуле.
Интерфейсная часть. В этой части содержатся объявления всех глобальных объектов модуля (типов,
констант, переменных и блоков), которые должны стать доступными основной программе и другим
модулям. При объявлении процедур и функций в интерфейсной части указывается только их заголовок,
например:
Unit Vect;
INTERFACE
Type vector = Record
x, y, z: real;
end;
Var a, b, c : vector; i: real;
Procedure Summa(var f,d,e: vector);
Procedure ProizvScal(var f,d: vector; var k: real);
Procedure ProizvVect(var f,d,e: vector);
Если теперь в основной программе будет записана строка
USES Vect;
то в ней станут доступными тип Vector и процедуры Summa, ProizvScal и ProizvVect.
Исполняемая часть. Содержит тела процедур и функций, объявленных в интерфейсной части. Здесь
же могут объявляться локальные для модуля объекты – вспомогательные типы, константы,
переменные, процедуры и т. д. Ранее объявленные процедуры и функции должны быть описаны в той
же последовательности, в какой их заголовки записаны в интерфейсной части. Описанию глобального
блока в исполняемой части должен предшествовать заголовок, в котором разрешается опускать список
формальных переменных (и тип результата для функции), поскольку они уже описаны в интерфейсной
части.
Инициирующая часть. Она может отсутствовать вместе с начинающим ее словом Begin или быть
пустой. В эту часть помещают исполняемые операторы, содержащие некоторый фрагмент программы.
Эти операторы исполняются до передачи управления основной программе и обычно используются
для подготовки ее работы. В инициирующей части, например, могут открываться необходимые файлы,
устанавливаться значения переменных и т.д.
КОМПИЛЯЦИЯ МОДУЛЕЙ.
В Turbo Pascal определены три режима компиляции: COMPILE, MAKE и BUILD. Они отличаются
только способом связи компилируемого модуля или основной программы с другими модулями,
объявленными в предложении USES.
При компиляции в режиме COMPILE все упоминающиеся в предложении USES модули должны быть
предварительно откомпилированы и результаты их компиляции помещены в одноименные файлы с
расширением TPU. Например, если в программе (или модуле) есть строка
�Оглавлен ие
USES Vect;
то на диске в каталоге, объявленном опцией UNIT DIRECTORIES, уже должен быть файл VECT.TPU.
Такой файл создается в результате компиляции самого модуля.
В режиме MAKE компилятор проверяет наличие TPU–файлов для каждого объявленного модуля. Если
какой-либо из файлов не обнаружен, система пытается отыскать одноименный файл с расширением
PAS (то есть файл с исходным текстом модуля) и приступает к его компиляции. В этом режиме система
следит за возможными изменениями исходного текста любого используемого модуля. Если внесены
какие-либо изменения в исходный текст модуля, то, независимо от того, есть ли уже соответствующий
TPU-файл или нет, система осуществляет его компиляцию перед компиляцией основной программы.
Если внесены изменения в интерфейсную часть модуля, то будут перекомпилированы также и все
другие модули, обращающиеся к нему.
В режиме BUILD существующие TPU-файлы игнорируются, а система ищет и компилирует
соответствующие PAS-файлы для каждого из объявленных модулей. После компиляции в этом режиме
можно быть уверенным, что учтены все изменения, сделанные в любом из модулей.
Пример
В качестве примера создадим модуль, реализующий операции над векторами в координатной форме
(сложение векторов, их скалярное и векторное произведение).
Unit Vect;
INTERFACE
Type vector=Record
x,y,z: real;
end;
Var a, b, c : vector; i: real;
Procedure Summa(var f,d,e: vector);
Procedure ProizvScal(var f,d: vector; var k: real);
Procedure ProizvVect(var f,d,e: vector);
IMPLEMENTATION
Procedure Summa;
Begin
e.x:=f.x+d.x;
e.y:=f.y+d.y;
e.z:=f.z+d.z;
End;
Procedure ProizvScal;
Begin
k:= f.x*d.x+f.y*d.y+f.z*d.z;
End;
�Оглавлен ие
Procedure ProizvVect;
Begin
e.x:=f.y*d.z-f.z*d.y;
e.y:=f.z*d.x-f.x*d.z;
e.z:=f.x*f.y-f.y*d.x;
End;
END.
Текст этого модуля необходимо сохранить в файле с именем VECT.PAS. После этого можно написать
такую, например, программу:
Program PrimerModul;
Uses Vect;
Var a,b,c: vector;
BEGIN
Writeln('Введите координаты вектора а');
With a do
Readln(x,y,z);
Writeln('Введите координаты вектора b');
With b do
Readln(x,y,z);
Summa(a,b,c);
Writeln('Сумма векторов a и b равна', c.x: 2, c.y: 2, c.z: 2);
ProizvScal(a,b,i);
Writeln('Скалярное произведение векторов a и b равно ', i: 2);
ProizvVect(a,b,c);
Writeln('Векторное произведение векторов a и b равно ', c.x: 2,
c.y: 2, c.z: 2);
readln;
END.
Стандартные модули. В Turbo Pascal имеется восемь стандартных модулей, в которых
содержится большое число разнообразных типов, констант, процедур и функций. Эти модули имеют
имена SYSTEM, DOS, CRT, PRINTER, GRAPH, OVERLAY, TURBO3 и GRAPH3. Модули GRAPH,
TURBO3 и GRAPH3 содержатся в одноименных TPU-файлах, остальные входят в состав библиотеки
TURBO.TPL. Модуль SYSTEM подключается ко всем паскалевским программам автоматические,
остальные доступны лишь после их объявления в списке USES.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ.
Создайте модуль, содержащий процедуры обработки файлов различных типов (см. предыдущую
лабораторную работу). Напишите короткую программу с использованием этого модуля.
�Оглавлен ие
Лабораторная работа № 15
ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ
До сих пор мы имели дело с такими переменными, которые описывались в разделе Var какого-либо
блока программы. Транслятор после анализа этого раздела отводит каждой переменной
соответствующее число ячеек памяти и закрепляет их за данной переменной на все время работы
блока. Такие переменные называют статическими. Они не могут быть использованы системой под
другие нужды, даже если в процессе работы программы эти переменные больше не понадобятся.
Данные могут быть организованы и другим образом. Их можно хранить в некоторой области памяти,
не обозначая именем переменной, а используя ссылку на эту область, – аналогично тому, как иногда
"обозначают" зрителя: "человек с 5-го ряда, 3-го места".
Такой вид доступа позволяет динамически захватывать и освобождать память в процессе работы блока
программы. Поэтому и сами переменные, которые могут создаваться и ликвидироваться по мере
надобности, называют динамическими.
Рассмотрим подробнее работу с динамическими переменными, которые чаще всего реализуются как
связанные структуры.
Проиллюстрируем особенности такой связанной структуры на примере очереди приема к врачу.
Каждый пациент запоминает человека, за которым занял очередь. Все пациенты связаны в цепочку
согласно очереди, но в пространстве они размещены произвольным образом: т.е. соседние элементы
очереди могут располагаться в пространстве произвольно.
Подобным образом строится структура связанных данных, которые могут занимать память не подряд, а
размещаться там, где есть свободное место. Каждый элемент такой структуры должен "знать", за кем он
"стоит", т.е. содержать ссылку на предыдущий элемент цепочки.
Чтобы проиллюстрировать преимущества динамических переменных, продолжим аналогию с
очередью пациентов.
Пусть один из пациентов покидает очередь. Этот процесс не требует перемещения в пространстве
остальных пациентов: просто стоящий за ушедшим теперь запоминает другого человека. Т.е.
исключение элемента из цепочки данных сводится к изменению одной-единственной ссылки и не
требует перемещения остальных элементов, как это имело бы место для массива.
На рис. 1. показано исключение элемента цепочки.
Исключенный элемент теперь можно освободить от участия в работе блока и использовать
занимаемый им участок памяти для других целей.
С помощью ссылок легко вставить новую компоненту в цепочку данных. Для этого достаточно
изменить две ссылки (рис. 2).
�Оглавлен ие
Новая динамическая компонента может быть размещена в любом свободном месте памяти,
отведенном под такие переменные. Сама динамическая переменная не обозначается
идентификатором. Динамическая переменная – это "невидимка" в программе: идентификатором она не
обозначается, транслятор ей место в памяти не отводит. Память под такую переменную резервируется
и освобождается динамически в процессе счета (с помощью специальных процедур).
Обращение к динамической переменной происходит посредством ссылочной переменной, которая
содержит адрес соответствующей динамической переменной.
Под ссылочную переменную транслятор отводит место в памяти машины; эта переменная имеет имя и
явно упоминается в программе.
Ссылочные переменные образуют новый тип данных – "ссылки" (указатели).
Динамические переменные, как правило, имеют тип "запись" (Record), т.к. должны содержать,
помимо значения (целого, вещественного и т.п.), ссылку на другую динамическую переменную
связанной структуры.
Пусть в памяти машины имеется динамическая переменная, содержащая поле целого значения 2 и
поле ссылки (указатель) на другую компоненту связанной структуры (цепочки):
Адрес данной переменной (ссылки) содержится в ссылочной переменной R:
Обозначим тип ссылочной переменной через Point, а тип динамической переменной – через DT.
Тогда этот факт описывается следующим образом:
Type
Point = ^ DT;
Говорят, что "тип Point указывает (ссылается) на компоненты типа DT" или "тип Point связан с
типом DT".
Ссылочную переменную R можно описать двумя способами:
a)
Type Point = ^ DT;
�Оглавлен ие
Var R: Point;
либо
b)
Var R: ^ DT;
Переменная R указывает на компоненты типа DT.
Чтобы связать динамические переменные в цепочку, надо в каждой компоненте иметь ссылку на
предыдущую компоненту. Например, компоненты, содержащие числа 5, 10, 15, 8, должны иметь еще
информацию о том, где находится предыдущий элемент, т.к. это не массив и компоненты размещаются
не обязательно подряд
Опишем тип таких данных, обозначив его DT. Очевидно, этот тип есть "запись" с двумя полями: полем
целого значения (I) и полем ссылки (P)
Type DT = Record
I: Integer;
P: Point;
End;
Очевидно, ссылочная переменная, указывающая на такого типа данные, должна иметь тот же тип
Point. Опишем этот тип:
Type Point = ^ DT;
Как видим, возник порочный круг: для описания типа Point привлекается понятие DT, а при
описании типа DT необходимо использовать Point.
Условились в этом случае сначала описывать тип ссылочной переменной, а затем уже тип
компоненты:
Type
Point = ^ DT;
DT = Record
I: Integer
End;
Правила языка Pascal только при описании ссылок допускают использование идентификатора (DT)
до его описания; во всех остальных случаях, прежде чем упомянуть идентификатор, необходимо
описать его тип.
Рассмотрим схему образования цепочки динамических данных, содержащих числа 5, 10:
ЭВМ необходимо произвести следующие действия:
1. Найти и зарезервировать место в памяти для компоненты:
�Оглавлен ие
2. Заслать ссылку на эту компоненту (адрес) в ссылочную переменную R:
3. Присвоить полю I значение 5:
4. Присвоить некоторой ссылочной переменной Q значение R (скопировать):
5. Найти и зарезервировать место в памяти для новой компоненты:
6. Заслать в переменную R адрес этой компоненты:
7. Заслать в поле I значение 10:
8. Заслать в поле P значение Q:
Последовательность таких действий создает цепочку динамических переменных. Для резервирования
места в памяти под динамическую переменную и засылки этого адреса в ссылочную переменную R
используют процедуру NEW (R). При этом выделяется столько ячеек памяти, сколько требует
динамическая переменная, с которой связана R. Все эти данные система получает из раздела описания
типов в программе. Динамические переменные, созданные посредством процедуры NEW(R),
называют также указанными переменными (указатель R).
Пусть переменная R имеет тип Point, описанный выше. Тогда после обращения к процедуре NEW(R)
будет создана указанная переменная, в которой предусмотрено поле под значение типа Integer и
поле ссылки. При этом ссылочная переменная R содержит адрес указанной переменной. Через R^
обозначается сама указанная переменная; R^.I – поле целого значения; R^.P – поле ссылки P:
�Оглавлен ие
ОПЕРАЦИИ НАД ССЫЛОЧНЫМИ ПЕРЕМЕННЫМИ
Значение ссылочной переменной R можно присваивать другой ссылочной переменной того же типа.
Пусть Q, R: ^ Point; тогда оператор Q:= R; зашлет в Q тот же адрес, что хранится в R.
Рассмотрим действия со ссылочными переменными на следующей схеме. Пусть Q и R указывают на
различные компоненты динамических переменных типа C:
C = Record
I: Integer;
P: Point
End;
Пусть в памяти ЭВМ размещены две цепочки динамических переменных (Рис. 3).
Выполним один из четырех операторов:
Q:= R;
Q^:= R^;
Q^.I:= R^.I;
Q^.P:= R^.P;
a) После выполнения оператора Q:= R; переменная Q указывает на ту же динамическую переменную,
что и R;
b) После выполнения оператора Q^:= R^; из исходного состояния (Рис. 3.) получим
На место указанной переменной
указывавшей на 30, заслана переменная
�Оглавлен ие
указывающая на 25.
c) После выполнения оператора Q^.I:= R^.I; из исходного состояния (Рис. 3.) получим следующее:
На место целого значения 20 заслано значение 15; поле указателя не изменилось.
d) После выполнения оператора Q^.P:= R^.P; из исходного состояния получим:
На место ссылки на компоненту 30 заслана ссылка на компоненту 25, поле целого значения не
изменилось.
Ссылочные переменные могут указывать на одну и ту же переменную, т.е. быть равными, как R и Q в
случае a).
Ссылочные переменные можно сравнивать посредством операций = и <>. Логическое выражение Q =
R имеет значение True для случая a) и значение False для случаев b) и c), т.к. для b) ссылочные
переменные Q и R указывают на разные динамические переменные, имеющие равные значения.
В качестве аналога нуля для ссылочных переменных принято специальное значение Nil. Если
переменная имеет значение Nil, то это означает, что она не указывает ни на какую переменную.
Значение Nil в поле указателя имеет всегда первая компонента цепочки динамических переменных.
Пример
Значение Nil можно заслать оператором присваивания: L:= Nil; если L = Nil, то цепочка пуста.
Чтобы определить, что данный элемент является первым в цепочке переменных, достаточно
проверить на Nil значение поля указателя этой переменной.
Пример
If L^.P = Nil then . . .
Замечание. Попытка обратиться к указанной переменной с указателем, имеющим значение Nil,
приводит к ошибке. Диагностика при этом не всегда выдается.
Динамическая переменная, созданная процедурой New, может быть "стерта" только процедурой
Dispose. Общий вид:
�Оглавлен ие
Dispose (R);
Здесь R – ссылочная переменная, указывающая на ту динамическую переменную, которую следует
стереть. После стирания динамической переменной R^ нельзя использовать значение R, такая ошибка
может привести к порче памяти и другим серьезным последствиям.
Динамические переменные, не стертые посредством Dispose, продолжают занимать место в памяти
после окончания работы соответствующего блока программы (становятся "мусором"). Поэтому
необходимо все лишние динамические переменные стереть перед окончанием работы блока.
Процедуры и функции управления динамической памятью приведены в таблице 1.
Таблица 1
Процедуры и функции
Назначение
New (Var P: Pointer);
Отводит место для хранения динамической переменной P^ и присваивает
ее адрес ссылке P.
Dispose (Var P: Pointer);
Уничтожает связь, созданную ранее New, между ссылкой P и значением,
на которое она ссылалась.
GetMem (Var P: Pointer; Size: Отводит место в Size байт в динамической памяти (куче), присваивая
Word);
адрес его начала указателю (ссылке) P.
FreeMem (Var P: Pointer; Size: Освобождает Size байт в куче, начиная с адреса, записанного в указателе
Word);
(ссылке) P.
Mark (Var P: Pointer);
Запоминает в указателе P текущее состояние кучи.
Release (Var P: Pointer);
Возвращает кучу в состояние, запомненное ранее в P вызовом процедуры
Mark (P).
MaxAvail: LongInt;
Возвращает длину (в байтах) самого длинного свободного участка памяти
в куче.
MemAvail: LongInt;
Возвращает сумму длин всех свободных участков памяти (в байтах).
Динамические переменные чаще всего реализуются как связанные структуры: списки.
Списком называется упорядоченная структура, каждый элемент которой содержит ссылку,
связывающую его со следующим элементом.
Для организации списков используются записи, состоящие из смысловых частей: основной и
дополнительной. Основная часть содержит подлежащую обработке информацию, в дополнительной
находится указатель на следующую запись списка.
Начало списка указывается в переменной, которая всегда присутствует в программе обработки
списков. Если в списке нет элементов, т.е. список пустой, значение этой переменной равно Nil. Если
список не заполнен, последний элемент содержит в дополнительной части значение Nil.
Наибольшее распространение получили два вида списков – стеки и очереди.
Стек ("магазин") – это список с одной точкой доступа к его элементам, которая называется вершиной
списка. Добавить или убрать элемент можно только через его вершину. Принцип работы стека:
"последний пришел – первый вышел".
�Оглавлен ие
Пример.
Пусть в трубку с запаянным концом закатывают шарики.
Извлекать их можно только в обратном порядке: тот шарик, что закатился последним, будет извлечен
первым.
Рис. 4.
Стек состоит из переменного числа компонент одинакового типа.
Основные операции над стеком: формирование стека, добавление, удаление и просмотр элементов
стека. Для их демонстрации используем описание:
Type
StackP = ^ StackComp;
StackComp = Record
I : Integer;
Next: StackP;
End;
Var
Top, Kon, NewElement: StackP;
Value: Integer;
Организация стека:
Procedure OrgS;
Begin
Top:= Nil;
While True do
begin
read (Value);
if Value = 999 then Exit;
{Ввод элементов прекращается,}
New (Kon);
если введено значение 999}
Kon^.Next:= Top;
Kon^.I:= Value;
Top:= Kon
end
End;
Добавление элементов в стек:
�Оглавлен ие
Procedure DobS;
With NewElement do
Begin
begin
While True do
Next:= Top;
begin
I:= Value;
read (Value);
end;
if Value = 999 then Exit;
New (NewElement);
NewElement^.Next:= Top;
NewElement^.I:= Value;
Top:= NewElement
end
end;
Удаление элементов из стека:
Procedure Out_St(Var K: Integer);
Var
Procedure Out_St;
begin
IOld: StackP;
begin
Top:= Top^.Next
end;
IOld:= Top;
K:= IOld^.I;
Top:= IOld^.Next;
Dispose (IOld)
end;
Просмотр элементов стека:
Procedure ProsS;
begin
Kon:= Top;
While Kon <> Nil do
begin
Writeln (Kon^.I)
Kon:= Kon^.Next
end
end;
{ вывод элементов в обратном порядке }
�Оглавлен ие
Замечание: Пустым стеком называется стек, не содержащий компонент. Такой стек можно получить,
присвоив значение Nil соответствующей ссылочной переменной (в нашем случае Top:= Nil;).
Нельзя применять процедуру Out к пустому стеку.
Стеки позволяют гибко и экономно использовать память, т.к. в каждый момент в стеке могут
находиться только те переменные, которые нужны для дальнейшей работы программы.
Другим видом списка является очередь. Очередь – это структура данных, в один конец которой
добавляются элементы, а с другого – изымаются. Принцип работы очереди: "первый пришел – первый
вышел". В этом случае вводят два указателя: один на начало очереди, другой – на ее конец.
Назовем их соответственно Left и Right.
При добавлении элемента в очередь он располагается в памяти в соответствии со значением Right, а
значение Right изменяется и указывает на следующее свободное место памяти.
Выборка элемента из очереди происходит исходя из значения N, которое изменяется и указывает на
следующий элемент очереди. Очевидно, что, когда очередь пуста, значение Right равно значению
Left.
Операции над очередью те же, что и над стеком. Для их демонстрации используем описание:
Type
StackP = ^StackComp;
StackComp = record
I: Integer;
Next: StackP;
end;
Var
Pp, Top, Kon: StackP;
NewElement, Left, Right: StackP;
Value: Integer;
Организация очереди:
Procedure OrgO;
begin
read (Value);
if Value = 999 then Exit;
New (Kon);
Kon^. Next:= Nil;
Kon^. I:= Value;
Right:= Kon; Left:= Kon;
While True do
�Оглавлен ие
begin
read (Value);
if Value = 999 then Exit;
New (Kon);
Kon^. Next:= Left;
Kon^. I:= Value;
Left:= Kon
end
end;
Добавив в раздел операторов инструкцию Right^. Next = Left;, получим замкнутый,
кольцеобразный список, в котором и Right, и Left можно равнозначно принимать за начало списка.
Добавление элементов в очередь:
Procedure DobO;
begin
read (Value);
if Value = 999 then Exit;
New (NewElement);
Right^. Next:= NewElement;
NewElement^. Next:= Nil;
NewElement^. I:= Value;
Right:= NewElement
end;
Удаление элементов из очереди:
Procedure OutO;
begin
Left:= Left^. Next;
end;
Просмотр элементов очереди:
Procedure ProsO;
begin
Pp:= Left;
While Pp <> Nil do
begin
Write (Pp^. I : 3
�Оглавлен ие
Pp:= Pp^. Next
end
end;
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Описать процедуру, которая по списку L строит два новых списка: L1 – из положительных
элементов и L2 из остальных элементов списка L (тип элементов – Real).
2. Описать процедуру, которая вставляет в начало списка L элемент E.
3. Описать процедуру, которая вставляет в конец списка L элемент E.
4. Описать процедуру, которая вставляет новый элемент E после первого элемента непустого списка L.
5. Описать процедуру, которая вставляет в список L новый элемент E1 за каждым вхождением
элемента E.
6. Описать процедуру, которая вставляет в список L новый элемент E1 перед первым вхождением
элемента E, если E входит в L.
7. Описать процедуру, которая вставляет в непустой список L пару новых элементов E1 и Е2 перед его
последним элементом.
8. Описать процедуру, которая вставляет в непустой список L, элементы которого упорядочены по
неубыванию, новый элемент E так, чтобы сохранилась упорядоченность (тип элементов – Real).
10. Описать процедуру, которая удаляет из непустого списка L первый элемент.
11. Описать процедуру, которая удаляет из списка L второй элемент, если такой есть.
12. Описать процедуру, которая удаляет из списка L за каждым вхождением элемента E один элемент,
если такой есть, и он отличен от E.
13. Описать процедуру, которая удаляет из непустого списка L последний элемент.
14. Описать процедуру, которая удаляет из списка L первый отрицательный элемент, если такой есть
(тип элементов – Real).
15. Описать процедуру, которая удаляет из списка L все отрицательные элементы (тип элементов –
Real).
16. Заданный во входном файле текст (за ним следует точка) распечатать в обратном порядке.
17. Дана непустая последовательность натуральных чисел, за которой следует 0. Напечатать
порядковые номера тех чисел последовательности, которые имеют наибольшую величину.
18. Дано целое число n > 1, за которым следует n вещественных чисел. Напечатать эти числа в порядке
их неубывания.
19. Описать процедуру или функцию, которая проверяет на равенство списки L1 и L2.
20. Описать процедуру или функцию, которая определяет, входит ли список L1 в список L2.
21. Описать процедуру или функцию, которая проверяет, есть ли в списке L хотя бы два одинаковых
элемента.
22. Описать процедуру или функцию, которая переносит в конец непустого списка L его первый
элемент.
23. Описать процедуру или функцию, которая переносит в начало непустого списка L его последний
элемент.
�Оглавлен ие
24. Описать процедуру или функцию, которая добавляет в конец списка L1 все элементы списка L2.
25. Описать процедуру или функцию, которая вставляет в список L за первым вхождением элемента E
все элементы списка L1, если E входит в L.
26. Описать процедуру или функцию, которая переворачивает список L, т.е. изменяет ссылки в этом
списке так, чтобы его элементы оказались расположенными в обратном порядке.
27. Описать процедуру или функцию, которая в списке L из каждой группы подряд идущих равных
элементов оставляет только один.
28. Описать процедуру или функцию, которая оставляет в списке L только первые вхождения
одинаковых элементов.
29. Описать рекурсивную функцию или процедуру, которая определяет, входит ли элемент E в список
L.
30. Описать рекурсивную функцию или процедуру, которая подсчитывает число вхождений элемента
E в список L.
31. Описать рекурсивную функцию или процедуру, которая находит максимальный элемент непустого
списка L (тип элементов – Real).
32. Описать рекурсивную функцию или процедуру, которая печатает в обратном порядке элементы
списка L (тип элементов – Char).
33. Описать рекурсивную функцию или процедуру, которая заменяет в списке L все вхождения Е1 на
Е2.
34. Описать рекурсивную функцию или процедуру, которая удаляет из списка L первое вхождение
элемента E, если такое есть.
35. Описать рекурсивную функцию или процедуру, которая удаляет из списка L все вхождения
элемента E.
36. Описать рекурсивную функцию или процедуру, которая создает L1 – копию списка L.
37. Описать рекурсивную функцию или процедуру, которая удваивает каждое вхождение элемента E в
список L.
38. Описать рекурсивную функцию или процедуру, которая находит среднее арифметическое всех
элементов непустого списка L (тип элементов – Real).
39. Описать процедуру, которая формирует список L, включив в него по одному разу элементы,
которые входят хотя бы в один из списков L1 и L2.
40. Описать процедуру, которая формирует список L, включив в него по одному разу элементы,
которые входят одновременно в оба списка L1 и L2.
41. Описать процедуру, которая формирует список L, включив в него по одному разу элементы,
которые входят в список L1, но не входят в список L2.
42. Описать процедуру, которая формирует список L, включив в него по одному разу элементы,
которые входят в один из списков L1 и L2, но в тоже время не входят в другой из них.
43. Описать процедуру, которая объединяет два упорядоченных по неубыванию списка L1 и L2 (тип
�Оглавлен ие
элементов – Real) в один новый упорядоченный по неубыванию список L.
44. Описать процедуру, которая объединяет два упорядоченных по неубыванию списка L1 и L2 (тип
элементов – Real) в один упорядоченный по неубыванию список, меняя соответствующим образом
ссылки в L1 и L2 и присвоив полученный список параметру L1.
�Оглавлен ие
Лабораторная работа № 16
ПРОЦЕДУРЫ ПОДГОТОВКИ К РАБОТЕ В ГРАФИЧЕСКОМ РЕЖИМЕ
При работе с библиотекой графического модуля Graph необходимо в программе после служебного
слова Uses указать имя этого модуля:
Uses Graph;
Модуль Graph представляет собой библиотеку программ, обеспечивающую полное управление
графическими режимами различных адаптеров дисплеев.
Все процедуры и функции модуля Graph можно разбить на функциональные группы:
1. Управление графическими режимами и их анализ.
2. Рисование графических примитивов и фигур:
a) управление «текущим указателем»;
b) собственно рисование;
c) стиль линий и коэффициент сжатия изображения.
3. Управление цветами и шаблонами заполнения.
4. Битовые операции.
5. Управление страницами.
6. Графические окна.
7. Управление выводом текста.
Любая программа, использующая графику, обязательно должна содержать блок вызовов процедур
инициализации (установления в исходное состояние) графического режима и обращение к процедуре
его закрытия.
Процедура инициализации имеет вид:
InitGraph (Var GraphDriver: Integer;
Var GraphMode:
DriverPath:
Integer;
String);
{тип адаптера}
{режим графики}
{путь к драйверу}
В модуле Graph определены константы для задания вида графического адаптера параметром
GraphDriver перед вызовом InitGraph
Const
Detect = 0;
{для автоматического выбора адаптера}
CGA = 1;
{адаптер CGA}
MCGA = 2;
{адаптер MCGA}
EGA = 3;
{адаптер EGA 256 k}
EGA64 = 4;
{адаптер EGA 64 k}
�Оглавлен ие
EGAMono = 5;
{адаптер EGA c монодисплеем}
IBM8514 = 6;
{адаптер 8514}
HercMono = 7;
{адаптер Hercules}
ATT400 = 8;
{адаптер для ПЭВМ AT&T}
VGA = 9;
{адаптер VGA}
PC3270 = 10;
{адаптер 3270}
Current Driver = - 128;{для GetMode Range}
Если параметру GraphDriver присвоить значение константы Detect, то система включится в
режим автоопределения. Если возможно переключение системы в графический режим, то
инициализируется соответствующий BGI-драйвер и включается режим с максимальным разрешением.
В параметрах GraphDriver и GraphMode при этом будут возвращены автоматически выбранные
значения или код ошибки. Если же параметр GraphDriver содержит номер конкретного адаптера, то
и второй параметр, GraphMode, должен иметь значение (номер) режима, допустимого при этом
адаптере.
Все остальные графические установки (положение текущего указателя, палитра, цвет, параметры
графического окна) при инициализации принимаются по умолчанию.
Параметр PathDriver указывает путь в каталог, содержащий файлы с необходимыми драйверами.
Если в него передается значение '' (пустая строка), то драйверы должны находиться в текущем
каталоге.
Простейший блок инициализации графического режима в программе может выглядеть так:
Uses Graph;
{подключен модуль Graph}
Procedure GrInit;
{инициализация режима графики}
Var
GraphDriver: Integer;
{для графического адаптера}
GraphMode: Integer;
{для графического режима}
ErrorCode: Integer;
{для кода ошибки}
Begin
GraphDriver:= Detect;
{режим автоопределения}
InitGraph (GraphDriver, GraphMode, '');
{инициализация}
ErrorCode:= GraphResult;
{результат инициализации}
if ErrorCode <> grOk then
{если не успешно, то ...}
begin
Writeln ('Ошибка графики:');
GraphErrorMsg (ErrorCode);
Writeln ('Программа остановлена');
Halt (1)
�Оглавлен ие
end
{if}
end;
{= пример инициализации =}
Begin
GrInit;
{вызов процедуры инициализации}
Line (0, 0, GetMaxX, GetMaxY);
{работа с графикой ...}
Readln;
{пауза до нажатия клавиши ввода}
CloseGraph
{закрытие графического режима}
End.
Для окончательного завершения работы в графическом режиме необходимо всегда производить вызов
процедуры CloseGraph. Эта процедура не имеет параметров. Она очищает экран, переводит экран в
текстовый режим. Последующий возврат в графический режим возможен только через повторную
инициализацию.
Процедура InitGraph возвращает также и результат своей работы в параметре GraphDriver. В
случае ошибки он может принимать значения, приведенные в таблице 1.
Таблица 1.
Значение
Объяснение
–2
нет графического адаптера
–3
не найден файл драйвера
–4
ошибка в драйвере (его коде)
–10
не возможен режим для выбранного драйвера
– 15
нет такого драйвера
В модуле Graph реализован еще один способ проверки результата проведения графической операции.
Он осуществляется с помощью функции
GraphResult: Integer;
которая возвращает код результата последнего вызова одной из процедур или функций: Bar, Bar3D,
ClearViewPort,
CloseGraph,
DetectGraph,
DrawPoly,
FillPoly,
FloodFill,
GetGraphMode,
ImageSize,
InitGraph,
InstallUserDriver,
InstallUserFont,
PieSlice, RegisterBGIdriver, RegisterBGIfont, SetAllPalette, SetFillPattern,
SetFillStyle,
Set-GraphBufSize,
SetGraphMode,
SetLineStyle,
SetPalette,
SetTextJustify, SetTextStyle.
Для быстрой выдачи простого сообщения о типе ошибки графической системы используется функция,
преобразующая результат вызова функции GraphResult в сообщение, которое можно вывести на
экран процедурой Write.
Эта функция имеет вид:
GraphErrorMsg (ErrorCode: Integer): String;
Возможные графические режимы для различных адаптеров приведены в библиотеке модуля Grаph.
�Оглавлен ие
Для тестирования графического адаптера в модуле Graph объявлена процедура:
DetectGraph (Var GraphDriver, GraphMode: Integer);
Эта процедура может быть вызвана до инициализации графики. Через формальные параметры
GraphDriver и GraphMode процедура DetectGraph возвращает значения, которые рекомендуется
подставлять в качестве фактических в процедуру InitGraph.
Номер текущего графического режима для установленного драйвера определяется функцией
GetGraphMode: Integer,
а функция
GetMaxMode: word
возвращает номер максимального режима графического адаптера.
Таким образом, каждый драйвер поддерживает диапазон режимов 0 .. GetMaxMode.
Этот же результат может быть получен из процедуры
GetModeRange (GraphDriver: Integer; Var LoMode, HiMode: Integer),
через параметры LoMode, HiMode возвращающей соответственно нижнюю и верхнюю границы
режимов для драйвера GraphDriver.
Функция
GetModeName (GraphMode: Word): String;
возвращает строку, в которой содержится последовательно через пробелы разрешение, имя константы
и название палитры для графического режима GraphMode.
Представленный ниже пример поможет определить, в каких графических режимах может работать
используемая ЭВМ.
Uses Graph;
{подключен модуль Graph}
Var
mode: Integer;
Procedure GrInit;
{процедура инициализации}
<...........>;
Begin
GrInit;
{инициализация}
for mode:= 0 to GetMaxMode do
{показ всех режимов}
OutTextXY (10, 10 + mode * 10,GetModeName (mode));
Readln;
CloseGraph;
End.
Функция
�Оглавлен ие
GetDriveName: string
позволяет получить имя используемого драйвера. Ее применение обосновано только в том случае,
если в процедуре InitGraph переменная GraphDriver определена, как Detect.
Для очистки графического экрана используют процедуры
ClearDevice,
которая очищает графический экран и устанавливает указатель позиции в положение (0, 0), и
GraphDefaults,
которая, кроме очистки экрана, устанавливает ряд параметров графической системы:
1) графическое окно становится равным размеру экрана;
2) восстанавливается системная цветовая палитра;
3) переназначаются цвета основных линий и фона экрана;
4) толщина и стиль линий принимаются как по умолчанию;
5) цвет и шаблон заливки геометрических фигур и замкнутых ломаных принимаются как по
умолчанию;
6) переустанавливается активный шрифт и его стиль.
Переключение системы в другой графический режим осуществляется процедурой
SetGraphMode (GraphMode: integer),
которая переключает систему в указанный параметром GraphMode графический режим и очищает
экран монитора. При этом все дополнительные характеристики устанавливаются по умолчанию.
Переключения возможны только в рамках текущего драйвера.
При написании некоторых программ, использующих и графические, и текстовые режимы работы
ЭВМ, используют процедуру
RestoreCRTMode,
которая возвращает систему в текстовый режим, работавший до инициализации графики. В этом
случае возвращение в графический возможно без его инициализации. Обратное переключение
осуществляется при помощи процедуры
GetGraphMode,
которая возвращает номер текущего графического режима. При работе RestoreCRTMode выгрузки
графического драйвера не происходит, т.е. он остается в памяти ЭВМ активным. Рассмотрим пример:
Uses Graph;
Const
graph_str = 'Это графический режим';
text_str = 'А это текстовый режим';
graph_back = 'А это снова графический режим';
Procedure GrInit;
�Оглавлен ие
<.......>;
Begin
GrInit;
{инициализация графики}
Line (0, 0, GetMaxX, GetMaxY);
{диагональ экрана}
OutTextXY (0, 100, graph_str);
{вывод первого сообщения}
Readln;
{пауза до нажатия ввода}
RestoreCRTMode;
{восстановление текстового режима}
Write (text_str);
{вывод второго сообщения}
Readln;
{пауза до нажатия ввода}
SetGraphMode(GetGraphMode);
{восстановление графического режима}
Line (0, 0, GetMaxX, GetMaxY);
{диагональ экрана}
OutTextXY (0, 100, graph_back);
{вывод третьего сообщения}
Readln;
{пауза до нажатия ввода}
CloseGraph;
End.
Используя процедуру SetGraphMode, следует помнить, что обратное включение графики
устанавливает в исходное состояние все графические параметры модуля Graph и, кроме того,
сбрасывает изображение с экрана.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
I. Составить программу инициализации графического режима, предварительно выполнив
тестирование графического адаптера. Выполнить построение линии, окружности, эллипса,
прямоугольника, многоугольника.
II. Составить программу инициализации графического режима, используя режим автоопределения
графического адаптера. Определить: a) тип адаптера, b) номер текущего графического режима, c) номер
максимального режима для данного графического адаптера. Вывести на экран информацию: a) о
графическом режиме, b) используемом драйвере, c) о разрешающей способности графического режима.
Переключиться в текстовый режим, а затем обратно включить графический, сопровождая эти действия
выводом информации с использованием процедуры write/writeln.
�Оглавлен ие
Лабораторная работа № 17
РИСОВАНИЕ ГРАФИЧЕСКИХ ПРИМИТИВОВ И ФИГУР
Система координат. Текущий указатель.
Линии и их стили.
Прямоугольники и ломаные.
Коэффициент сжатия изображения.
Окружности, эллипсы, дуги.
Контрольные задания
�Оглавлен ие
Система координат. Текущий указатель. Любое изображение на экране образуется как
композиция светящихся или погашенных пикселов. Эти точки адресуются двумя координатами X и Y,
отсчет которых ведется от верхнего левого угла (для X – слева направо, для Y – сверху вниз).
Координаты верхней левой точки – (0,0). Максимальные адресуемые координаты различных
режимов и типов адаптеров дисплеев различны. В модуле Graph предусмотрена возможность
программного опроса максимальных координат экрана. Она реализована функциями
GetMaxX: Integer;
GetMaxY: Integer.
Координаты X и Y могут принимать только целые значения, а значения GetMaxX и GetMaxY должны
быть инициализированы сразу после включения соответствующего режима.
При рисовании графических фигур пользуются понятием “текущий указатель”, который выполняет те
же функции, что и курсор в текстовом режиме, однако является при этом невидимым.
Положение графического курсора указывает на начальные координаты изображения графического
примитива, выводимого от “текущей позиции”.
Текущий указатель перемещается специальными процедурами. Процедура MoveTo (X,Y: Integer)
перемещает его в точку с координатами X и Y, а процедура MoveRel (dX,dY: Integer) перемещает
текущий указатель на dX пикселов по горизонтали и соответственно на dY – по вертикали
относительно последнего положения текущего указателя. Положительные значения dX и dY
увеличивают его координаты, а отрицательные – уменьшают.
Для определения текущего положения графического курсора используют функции
GetX: Integer;
GetY: Integer,
возвращающие положение указателя соответственно по оси X и по оси Y.
Не все графические процедуры перемещают текущий указатель. Кроме вышеназванных, изменяют его
положение лишь процедуры LineTo, LineRel, OutText.
Все процедуры инициализации и очистки экрана устанавливают его в положение (0,0).
�Оглавлен ие
Линии и их стили. Процедура вывода линии (отрезка) на экран (в текущем цвете и стиле)
определена в следующем виде
Line (X1,Y1,X2,Y2 : Integer),
где X1,Y1 – координаты начала, а X2,Y2 – конца отрезка.
Возможны еще два метода рисования отрезков:
a) из текущей точки в точку с заданными координатами (X,Y) процедурой
LineTo (X,Y : Integer);
b) относительно текущей позиции процедурой
LineRel (dX,dY : Integer),
где dX и dY – приращения координат X и Y относительно точки с текущими координатами. После
выполнения текущий указатель переместится в конец отрезка.
В Turbo Pascal можно управлять стилем линий: задавать толщину, тип (сплошные линии,
пунктирные и т.п.). Для этого определены следующие типы и константы стилей изображаемых линий:
Type
LineSettingsType = Record
LineStyle: Word;
{стиль (тип)}
Pattern: Word;
{шаблон типа}
Thickness: Word;
{толщина}
End;
Const
{для значений поля LineStyle:}
SolidLn = 0;
{сплошная линия}
DottedLn = 1;
{точечная линия}
CenterLn = 2;
{штрихпунктирная линия}
DashedLn = 3;
{пунктирная линия}
UserBitLn = 4;
{тип линии задан явно шаблоном для значений поля Thickness:}
NormWidth = 1;
{толщина линии в 1 пиксель}
ThickWidth = 3;
{толщина линии в 3 пикселя}
Для получения информации о текущем стиле линий используют процедуру
GetLineSettings (Var LineType: LineSettingsType),
а чтобы установить новый стиль линий, необходимо использовать процедуру
SetLineStyle (LineStyle, Pattern, Thickness : Word),
подставив в нее соответствующие значения.
Если LineStyle равен UserBitLn, то при определении типа линии следует руководствоваться
следующими правилами:
�Оглавлен ие
a) линия представляет собой совокупность отрезков, длина каждого из которых 16 пикселов (если
длина отрезка не делится на 16 нацело, последний отрезок обрезается);
b) шаблон-комбинацию задают в виде 16 светящихся или погашенных точек (светящейся точке
ставится в соответствие 1, погашенной – 0).
Поскольку Turbo Pascal не позволяет работать с числами, представленными в двоичной системе
счисления, необходимо перевести полученное число в десятичную или шестнадцатеричную системы
счисления и поставить его фактическим параметром на место Pattern. Например, 1100110011001100
соответствует 52428 десятичное или $CCCC шестнадцатеричное.
Назначение стиля влияет на действие всех процедур, выводящих на экран отрезки или фигуры, из них
состоящие.
Процедуры, выводящие на экран дуги, учитывают только толщину, заданную в стиле.
�Оглавлен ие
Коэффициент сжатия изображения. Т.к. отношение высоты экрана к ширине не равно
отношению его разрешающей способности по вертикали к разрешающей способности по горизонтали,
то для учета этого неравенства вводится специальный показатель – коэффициент сжатия изображения
(aspect ratio). Его значения могут иметь широкий диапазон. Разрешающая способность адаптеров
колеблется от 640×200 для CGA до 1024×768 для IBM8514, и отношение GetMaxX к GetMaxY
меняется от 0.3125 (640×200) до 0.75 (1024×768). Таким образом, на единицу длины экрана
приходится разное количество пикселов по горизонтали и вертикали. Поскольку все операции
производятся с пикселaми, то в результате вместо окружности может получиться эллипс,
горизонтальная полуось которого равна радиусу, а вертикальная – радиусу, деленному на коэффициент
сжатия.
В модуле Graph есть две процедуры:
GetAspectRatio (Var A,B: Word),
возвращающая в переменных A и B значения, отношение которых (A/B) и есть коэффициент сжатия
изображения, и
SetAspectRatio (A,B: Word),
позволяющая изменить текущий коэффициент сжатия на равный (A/B) и позволяющая писать
программы, одинаково работающие на различных ЭВМ.
�Оглавлен ие
Окружности, эллипсы, дуги. Для изображения окружностей используется процедура
Circle (X,Y: Integer; Radius: Word),
где (X,Y) – координаты центра окружности, Radius – ее радиус.
В модуле Graph представлены процедура рисования эллипсов, дуг, секторов и процедура,
позволяющая рисовать сектор, залитый по данному шаблону. Все они используют параметры
StartAngle и EndAngle – начальный и конечный угол дуги. За 0 принято направление оси X (слева
направо), и углы отмеряются от оси X против часовой стрелки. Все значения этих параметров даются в
градусах.
Arc (X,Y: Integer; StartAngle, EndAngle, Radius: Word) –
рисование дуги радиуса Radius из центра (X,Y) от угла StartAngle до EndAngle.
Ellipse (X,Y: Integer;
StartAngle,
EndAngle,
XRadius, YRadius: Word)
рисование эллиптической дуги с аналогичными параметрами, где XRadius, YRadius – размеры
горизонтальной и вертикальной полуосей соответственно.
Некоторые другие процедуры, изображающие секторы (Sector, PieSlice), а также FillEllipse,
выполняют попутно их заливку.
Для определения координат начала и конца дуг окружности или эллипса используют процедуру
GetArcCoords (Var ArcCoords: ArcCoordsType).
Тип ArcCoordsType объявлен в модуле Graph следующим образом:
Type
ArcCoordsType = Record
X,Y: Integer;
{центр}
XStart,YStart: Integer;
{начало}
XEnd,YEnd: Integer;
{конец}
End;
�Оглавлен ие
Прямоугольники и ломаные. Для построения прямоугольника необходимо вызвать процедуру
Rectangle (X1,Y1,X2,Y2: Integer),
которая изобразит на экране прямоугольник с диагональю (X1,Y1) – (X2,Y2).
Чтобы построить фигуры с большим количеством вершин (в том числе и незамкнутых), можно
использовать процедуру
DrawPoly (NumPoints: Word; Var PolyPoints).
Параметр NumPoints – количество точек ломаной, PolyPoints – бестиповый параметр, состоящий
из набора двухкомпонентных записей. Обычно набор точек организуется как массив из записей типа
PointsType:
Type
PointsType = Record
X,Y: Integer;
End;
Ниже рассмотрен пример построения графика с помощью данной процедуры.
Для построения графиков в декартовой системе координат выберем систему координат таким образом,
чтобы ее начало находилось в точке с координатами (GetMaxX div 2, GetMaxY div 2).
Для рисования осей координат OX и OY используем процедуру Line:
Line (0, GetMaxY div 2, GetMaxX, GetMaxY div 2)
рисует ось X, a
Line (GetMaxX div 2, 0, GetMaxX div 2, GetMaxY)
рисует ось Y.
Рис. 1
После этого необходимо произвести разметку осей OX и OY. Выберем цену деления в пикселах. Теперь
введем коэффициент масштабирования MasKoefX, равный числу пикселов, приходящихся на одно
деление.
Отрезок OX будет содержать k подотрезков, по величине равных MasKoefX,
k = (GetMaxX div 2) div MasKoefX.
�Оглавлен ие
Для разметки оси ОX нужно вычислить величину остатка, получающегося при разбиении, т.к. именно с
этой позиции следует вести разметку, чтобы она прошла через начало координат.
X = (GetMaxX div 2) mod MasKoefX
Для выполнения разметки воспользуемся циклом While.
While x < GetMaxX do
begin
Line (x, GetMaxY div 2 – dy, x, GetMaxY div 2 + dy);
x:= x + MasKoefX;
end;
Здесь 2dy – длина вертикальных штрихов разметки.
Аналогичным образом выполняется разметка оси Y. Следует, однако, помнить, что разрешающая
способность по оси X и оси Y неодинакова, поэтому и коэффициент масштабирования по оси Y будет
другим:
MasKoefY = Round (Xasp /Yasp
* MasKoefX).
Значения Xasp и Yasp получим, используя функцию
GetAspectRatio (Xasp , Yasp ).
После разметки осей координат экран будет иметь вид (рис. 2.).
Рис. 2
Для рисования графика функции y = f(x) в системе координат XOY необходимо выполнить
следующий фрагмент программы:
Koord x:= –k; h:= 0.1;
While Koord x < k do
begin
x:= round (Koord x);
y = f(x);
PutPixel (x,round (y));
�Оглавлен ие
Koord x:= Koord x + h;
end;
Так как компьютер выполняет все графические процедуры относительно собственной системы
координат, то нужно выполнить переход из одной системы координат в другую. Из рис. 2. видно, что
координаты точки A в различных системах координат связаны простым соотношением:
xs
= GetMaxX div 2 – (–x) = GetMaxX div 2 + x;
ys
= GetMaxY div 2 – y;
Учитывая все эти соображения, составим программу рисования графиков в среде Turbo Pascal.
Program Grafik;
Uses Crt, Graph;
Const
n=1000;
a=1;
b=0;
MasKoefX=40;
Var
Xasp,Yasp: Word;
y_func: array[1..n] of PointType;
MasKoefY: Word;
Ratio: Extended;
{--------------------------------------------------}
Function f(x: Extended):Extended;
begin
f:= sin(x*x)/cos(x);
end;
{--------------------------------------------------}
Procedure GrInit;
var
grDriver : Integer;
grMode
: Integer;
ErrCode : Integer;
begin
grDriver:= Detect;
InitGraph(grDriver, grMode, 'g:\progr\tp');
�Оглавлен ие
GetAspectRatio(Xasp, Yasp);
Ratio:= Xasp/Yasp;
MasKoefY:=round(Ratio*MasKoefX);
end;
{--------------------------------------------------}
Procedure SysCoord;
Const
dx=2;
dy=2;
var
Delen: Word;
x,y: Word;
Rat: Extended;
begin
Line(0, GetMaxY div 2, GetMaxX, GetMaxY div 2);
x:= (GetMaxX div 2) mod MasKoefX;
While x < GetMaxX do
begin
Line(x, GetMaxY div 2 – dy, x, GetMaxY div 2 + dy);
x:= x + MasKoefX;
end;
Line(GetMaxX div 2, 0, GetMaxX div 2, GetMaxY);
y:= (GetMaxY div 2) mod MasKoefY;
While y < GetMaxY do
begin
Line(GetMaxX div 2 – dx, y, GetMaxX div 2 + dx, y);
y:= y + MasKoefY;
end;
end;
{--------------------------------------------------}
Procedure DrawGraph;
var
i: Word;
xi,yi: Extended;
�Оглавлен ие
Delen: Word;
h: Extended;
CountPoint: Word;
begin
Delen:= (GetMaxX div 2) div MasKoefX;
h:=1/MasKoefX;
i:=0;
xi:= –Delen;
While xi<Delen do
begin
yi:= f(xi);
y_func[i].x:= GetMaxX div 2 + round(xi*MasKoefX);
y_func[i].y:= GetMaxY div 2 – round(yi*MasKoefY);
xi:= xi + h;
inc(i)
end;
CountPoint:=i–1;
DrawPoly(CountPoint, y_func);
end;
{--------------------------------------------------------------}
Begin
GrInit;
SysCoord;
DrawGraph;
ReadLn;
CloseGraph;
End.
С помощью DrawPoly можно вывести график части функции. Для этого достаточно указать при
передаваемом массиве номер n первого рассматриваемого элемента (т.е. точки), а в первом параметре
– количество рассматриваемых точек, начиная с n–ой, например,
DrawPoly (20, y_func [100]);
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
I. Исследовав область определения и выбрав расположение координатных осей на экране и масштаб,
построить графики функций:
1. y = ex ;
2. y = ln x;
3. y = 10x ;
4. y = ctg x;
5. y = arcctg x;
6. y = arcsin (sin x);
7. y = arctg (tg x);
8. y = x ;
9. y = 1/(x + 1);
10. y = (x + 3)/(x + 1);
11. y = 1 + 2/x + 3/x;
13. y = sin x – cos x;
12. y = 3 – 2/x – 1/x ;
14. y = 2x – cos 0.5x;
15. y = x+x
16. y = x+3cos x
17. y = x – 2x2 + x3 ;
18. y = x + ln (x + 1) + 2;
19. y = x + ex ;
20. y = x1/x ;
21. y = (x – 3) e –x/2 ;
22. y = cos (0.5x) – x ;
23. y = lg x;
24. y = 1/x;
25. y = tg x;
26. y = sin x;
27. y = arccos (cos x);
28. y = arcctg (ctg x);
29. y = 1/x2 ;
30. y = 1/x3 ;
31. y = x/ln x;
32. y = 3x2 – 2x + 5;
33. y = 1/(3x2 + 2x + 1);
34. y = 1/(x2 + 2x + 1);
35. y = (x + 1)2 – sin x;
36. y = (1 + x2 )/x;
37. y = x2ex ;
38. y = x3 – 3x;
39. y = e–x – (x – 4)2;
40. y = 1/(x3 + 1);
41. y = x2/3;
42. y = (x – 4) e–x/10 ;
43. y = (sin x – cos x)e–x/5 ;
44. y = e–x/3 sin x.
II. Построить кривые по заданному параметрическому представлению:
1. Окружность радиуса r с центром в начале координат:
x = r cost, y = r sin t, t [0, 2π ).
2. Эллипс с большой и малой полуосями, равными соответственно r1 и r2 и расположенными
параллельно осям координат:
x = r1 cos t, y = r2 sin t, t [0, 2π ).
3. Улитку Паскаля:
�Оглавлен ие
x = a cos2 t + b cos t, y = a cos t sin t + b sin t, a > 0, b > 0, t [0, 2π ). Рассмотреть случаи,
когда b >= 2a, a < b < 2a, a > b.
4. Кардиоиду:
x = a cos t (1 + cos t), y = a sin t (1+cos t), a > 0, t [0, 2π ).
5. Эпициклоиду:
x = (a + b) cos t – a cos ((a + b) t/a), y = (a +b) sin t – a sin ((a + b) t/a), a > 0, b > 0.
Рассмотреть следующие случаи:
a) если b/а есть целое положительное число, t [0, 2π );
b) если b/a = p/q, где p и q – положительные целые взаимно простые числа, t [0, 2qπ ).
6. Астроиду: x = b cos3 t, y = b sin3 t, t [0, 2π ).
7. Циссоиду: x = at2 /(1 + t 2), y = at3/(1 + t 2 ), t (– , ), a > 0.
8. Строфоиду: x = a(t 2 – 1)/(t 2 + 1), y = at(t 2 –1)/(t 2 +1), t (– , ), a > 0.
9. Конхоиду Никомеда: x = a +lcost, y = atgt +lsint, t (– π /2, π /2) – правая ветвь, t (π /2, 3π /2) –
левая ветвь, a >0, l > 0. Рассмотреть случаи, когда l < a, l > a, l = a.
10. Астроиду: x = R cos3 (t/4), y = R sin3 (t/4).
11. Гипоциклоиду: x = (R – mR) cos mt + mR cos(t – mt),
y = (R –mR)sinmt – mR sin (t – mt), mR = r, (m = r/R), m = 1/4; m = 1/2; m = 2/3; m = 2/5.
12. Декартов лист: x = 3at / (t 3 + 1); y = 3at2 / (t 3 + 1).
13. Кардиоиду: x = 2r cos t –r cos 2t, y = 2r sin t – r sin 2t.
14. Строфоиду: x = 2at2 / (1 + t 2 ), y = at (t 2 – 1) / (1 + t 2 ).
15. Трактрису: x = a (ln tg t/2 + cos t), y = a sin t.
16. Циклоиду: x = a (t – sin t), y = a (1 – cos t).
17. Удлиненную (укороченную) циклоиду: : x = at – d sin t, y = a – d cos t.
18. Циссоиду Диоклеса:x = a / (t 2+ 1), y = a / t(t 2+ 1).
19. Эвольвенту окружности: x = a (cos t + t sin t), y = a (sin t – t cos t).
III. Построить кривые по их уравнениям, заданным в полярных координатах:
1. r = а sin 3α ;
2. r = а sin 2α ;
3. r = а α ;
4. r = а α 2 – l; l >= 0;
5. r = а sin (4α /3);
6. r = а sin (5α /3);
7. r = а/α 2 ;
8. r = а/cos α ± a tg α ;
19. r a 2 cos 2
11. r = а ebα ;
10. r a cos 2 / cos
12. r = а(4cos a – 1/cos a);
�Оглавлен ие
13. r a ;
14. r a 1;
15. r = а sin 3α ;
16. r = а/sinα ± l;
17. r = аα , a>0;
18. r = 1 + sin(2α );
19. r = sin 2α ;
20. r = 3a sinα cosα /(sin3 α +cos3 α );
21. r = а sin (α /2);
22. r = а sin (α /3);
23. r = а/α ;
24.
25. r = 1 + cos a;
26. r = 2а cos a – l;
ra
27. r = 2а(1 – cos α );
28. r = 2а sin 2α /cos α ;
29. r = b + а sinα ;
30. r = а(1 + cosα );
31. r = а sin α ;
32. r = 2а sin2 α /cos α ;
33. r = 2а(1 – cos α );
34. r = α /4;
35. r = b + а sin α ;
36. r = 1 + 2cos α ;
37. r = а sin α ;
38. r = 1 + 2cos 2α ;
39. r = sin 5α ;
40. r = sin 7α .
IV.
1. Построить ход лучей в собирающей линзе. Свет распространяется параллельно оптической оси.
2. Построить ход лучей в собирающей линзе. Свет распространяется под углом a к оптической оси.
3. Построить ход лучей в собирающей линзе. Источник света находится в главном фокусе.
4. Построить ход лучей в собирающей линзе. Источник света находится в фокальной плоскости.
5. Построить ход лучей в рассеивающей линзе. Свет распространяется параллельно оптической
оси.
6. Построить ход лучей в рассеивающей линзе. Источник света находится в главном фокусе.
7. Выполнить построение изображения в собирающей линзе. Предмет расположен на расстоянии
l>f от линзы.
8. Выполнить построение изображения в собирающей линзе. Предмет расположен на расстоянии
l<f от линзы.
9. Выполнить построение изображения в рассеивающей линзе. Предмет расположен на
расстоянии l>f от линзы.
10. Выполнить построение изображения в рассеивающей линзе. Предмет расположен на
расстоянии l<f от линзы.
11. Выполнить построение изображения в сферическом вогнутом зеркале. Предмет расположен на
расстоянии l>f от зеркала.
�Оглавлен ие
12. Выполнить построение изображения в сферическом выпуклом зеркале. Предмет расположен на
расстоянии l<f от зеркала.
13. Построить ход лучей в треугольной призме.
V. Составить программу, иллюстрирующую:
a) часы–ходики;
b) секундомер;
c) вращающийся квадрат;
d) вращающийся треугольник;
e) вращающийся вокруг центра отрезок;
f) вращающийся пятиугольник;
g) вращающийся прямоугольник;
h) вращающаяся пятиконечная звезда;
i) вращающаяся шестиконечная звезда.
�Оглавлен ие
Лабораторная работа № 18
УПРАВЛЕНИЕ ЦВЕТАМИ И ШАБЛОНАМИ ЗАЛИВКИ (ЗАПОЛНЕНИЯ)
В модуле Graph предусмотрены процедуры, с помощью которых можно заполнить (залить)
определенным “узором” любую замкнутую область изображения. Вид “узора” задается так называемым
шаблоном заливки. В Turbo Pascal предопределены ряд стандартных шаблонов, но, кроме того,
имеется возможность конструировать собственные.
Назначение шаблона заполнения (заливки) производится процедурой
SetFillStyle (Pattern: Word; Color: Word),
где параметр Pattern определяет вид шаблона заливки, а Color – его цвет. Все разрешенные
значения параметра Pattern предопределены в модуле Graph в виде констант:
Const
EmptyFill = 0;
{ сплошная штриховка цветом фона (узор отсутствует) }
SolidFill = 1;
{ сплошная штриховка текущим цветом }
LineFill = 2;
{ штриховка линиями ======= }
LtSlashFill = 3;
{ штриховка линиями / / / / / / / }
SlashFill = 4;
{ штриховка утолщенными линиями / / / / / / / }
BkSlashFill = 5;
{ штриховка линиями \ \ \ \ \ \ \ }
LtBkSlashFill = 6;
{ штриховка утолщенными линиями \ \ \ \ \ \ \ }
HatchFill = 7;
{ штриховка +++++++ }
XHatchFill = 8;
{штриховка }
InterLeaveFill = 9;
{ штриховка в прямоугольную клеточку }
WideDotFill = 10;
{ штриховка редкими точками }
CloseDotFill = 11;
{ штриховка частыми точками }
UserFill = 12;
{ штриховка определяется пользователем }
Константа UserFill используется для определения типа заливки, который предварительно был задан
в программе.
Для задания нового шаблона необходимо воспользоваться процедурой
SetFillPattern (PattMatrix: FillPatternType; Color: Word),
передав ей в параметре PattMatrix матрицу шаблона заливки и указав цвет параметром Color. Эта
процедура по действию аналогична SetFillStyle, но устанавливает только «самодельные»
шаблоны. Получение информации о текущих установках шаблона заливки производится процедурой
GetFillSettings (Var FillType: FillSettingsType),
которая возвращает в переменной FillType предопределенного типа
�Оглавлен ие
Type
FillSettingsType = Record
Pattern: Word;
Color: Word;
{шаблон}
{цвет}
End;
номер шаблона из списка, представленного при описании процедуры SetFillStyle (поле Pattern),
и цвет, которым наносится этот шаблон (поле Color).
Если значение поля Pattern оказалось равным UserFill, то для получения подробной информации
следует вызвать процедуру
GetFillPattern (Var PatternMatrix: FillPatternType),
возвращающую в переменной типа FillPatternType
пользователем шаблона.
матрицу последнего определенного
Заливка областей изображения. В модуле Graph имеется ряд процедур, рисующих графические
фигуры и сразу же заполняющих их по заданному шаблону.
Процедура
Bar (X1,Y1,X2,Y2: Integer)
рисует прямоугольник, внутренняя область которого залита по текущему шаблону. Параметры
(X1,Y1) и (X2,Y2) – координаты верхнего левого и нижнего правого углов прямоугольника.
Процедура
Bar3D (X1,Y1,X2,Y2: Integer; D3: Word; Top: Boolean)
рисует параллелепипед, лицевая сторона которого заливается по текущему шаблону, а глубина задается
в пикселах параметром 3D. Параметр Top задает режим отображения верхней плоскости: True –
отображать, False – не отображать. Этот параметр необходим при рисовании столбцов, стоящих друг
на друге.
В модуле Graph определены две константы для нее:
Const
TopOn = True;
{ верхняя плоскость нужна }
TopOff = False;
{ верхняя плоскость не нужна }
Рисование сектора эллипса, который будет залит цветом по текущему шаблону, осуществляется
процедурой
Sector (X,Y: Integer; StartAngle, EndAngle, XRadius, YRadius: Word).
Параметры процедуры имеют тот же смысл, что и в процедурах Arc, Ellipse. Для задания кругового
сектора надо задавать YRadius с учетом коэффициента сжатия:
Var
R,A,B: Word;
Begin
{R – радиус кругового сектора}
�Оглавлен ие
. . . . . .
GetAspectRatio (A,B);
Sector (100, 100, 0, 90, R, R * LongInt (A) div B );
. . . . . .
End.
Этого же эффекта можно достичь, используя процедуру
PiveSlice (X,Y: Integer; StartAngle, EndAngle, Radius: Word),
которая рисует сектор окружности, площадь которого заливается по текущему шаблону заполнения.
Процедура
FillEllipse (X,Y: Integer; XRadius, YRadius: Word);
рисует эллипс текущим цветом и заполняет его по установленному шаблону.
Заполнение более сложных геометрических фигур, в том числе и неправильной формы, производится
процедурой
FillPoly (NumPoints: Word; Var PolyPoints).
Ее параметры имеют такое же назначение, как и в процедуре DrawPoly. Отличие только в том, что
координаты первой и последней вершин многоугольника могут не совпадать. Все равно они будут
соединены линией, и внутренность фигуры будет залита.
Пример.
Uses Graph;
{$I initgraph.pas }
Const
our_figure: Array [1..4] of PointType =
(( x : 319 ; y : 40 ),
{задание координат}
( x : 398 ; y : 146 ),
{концов отрезков }
( x : 240 ; y : 146 ),
( x : 400 ; y : 40 ));
Begin
GrInit;
SetFillStyle (InterLeaveFill, Red);
FillPoly
фигуры}
Readln;
CloseGraph
End.
(SizeOf
(our_figure)
div
{задание шаблона}
SizeOf
(PointType),Our_figure);{рисование
�Оглавлен ие
Универсальная процедура
FloodFill (X,Y: Integer; Border: Word)
заливает всю область вокруг точки (X,Y), ограниченную линиями цвета Border. Например, если
точка (X,Y) находится внутри области, ограниченной окружностью, то вся область будет залита по
шаблону и цветом, установленными процедурами SetFillPattern или SetFillStyle. Если же
точка будет находится вне этой области, то залитым будет весь экран, за исключением этой области.
Опрос и установка цветов пера и фона. Различные адаптеры поддерживают разное количество
цветов, выводимых одновременно на экран в графическом режиме. Но для всех BGI–драйверов оно
ограничено диапазоном 0..15. Нумерация и названия цветов таковы:
Черный
Синий
Зеленый
Голубой
Красный
Фиолетовый
Коричневый
Светло–серый
Темно–серый
Светло–синий
Светло–зеленый
Светло–голубой
Розовый
Светло–фиолетовый
Желтый
Белый
Black = 0
Blue = 1
Green = 2
Cyan = 3
Red = 4
Magenta = 5
Brown = 6
Gray = 7
DarkGray = 8
LightBlue = 9
LightGreen = 10
LightCyan = 11
LightRed = 12
LightMagenta = 13
Yellow = 14
White = 15
Максимальный номер цвета, воспринимаемый данным адаптером в текущем графическом режиме,
может быть получен при помощи функции
GetMaxColor: Word.
На экране всегда различаются цвет фона и цвет пера. Все процедуры изображения фигур, если не
содержат в себе явной установки цвета, рисуют эти фигуры цветом пера. Этот цвет устанавливается
процедурой
SetColor (Color: Word).
Цвет фона всегда един в поле экрана. Он может быть изменен процедурой
SetBkColor (Color: Word).
После использования этой процедуры цвет экрана сразу же меняется на заданный. Цветом фона может
быть любой из разрешенных цветов. По умолчанию и при реинициализации графики цвет фона равен
0 (Black), а цвет пера равен значению GetMaxColor.
Всегда можно опросить текущие установки цвета. Функция
GetColor: Word
возвращает текущие установки пера, а функция
GetBkColor: Word
�Оглавлен ие
возвращает текущий цвет фона.
Управление палитрой. Максимальный набор
цветов,
поддерживаемых
одновременно
BGI–драйвером, называется палитрой и может состоять из 16 цветов, пронумерованных от 0 до 15
(для графических адаптеров EGA и VGA).
Стандартная палитра режима 320×200 адаптера CGA (палитра C0) состоит всего лишь из четырех
цветов:
0 – черный;
2 – малиновый;
1 – синий;
3 – белый.
А для того же адаптера CGA в режиме CGAHi (640×200) палитра состоит из двух цветов: черного (0) и
белого (1).
Числа от 0 до 15, которые используются для обозначения цветов, определяют цветовые атрибуты или
“программные” цвета. Каждому “программному” цвету присваивается “аппаратный” цвет из так
называемой палитры. Например, для адаптера EGA, выводящего одновременно до 16 цветов,
программные цвета выбираются из полной палитры в 64 цвета, имеющейся в этом адаптере. А в
адаптере VGA аппаратная палитра содержит 256 цветов. Для адаптера CGA полная палитра составляет
16 аппаратных цветов, но на экране может одновременно появиться лишь 4 цвета одной из четырех
программных палитр (C0 ... C3).
Для управления соответствием между программными и аппаратными цветами в модуле Graph
предусмотрен ряд процедур, охватывающих практически все возможные операции с палитрой.
В модуле Graph определен тип для описания палитры:
Const
MaxColors = 15;
{максимальный программный номер цвета}
Type
PaletteType = Record
Size: Byte;
Colors: Array [0..MaxColors] of ShortInt;
End;
Поле Size содержит количество цветов в палитре, а поле Colors содержит действующие цвета в
первых Size элементах массива.
Процедуры GetPalette и GetDefaultPalette возвращают в фактических параметрах значение
PaletteType:
GetDefaultPalette (Var Palette: PaletteType);
GetPalette (Var Palette: PaletteType).
Первая возвращает набор цветов, который устанавливается при инициализации графического режима,
т.е. по умолчанию, а вторая процедура возвращает текущий набор цветов.
Функция
GetPaletteSize: Word
�Оглавлен ие
возвращает результат типа Word, который показывает, какое количество цветов входит в текущую
программную палитру. Для установки палитры в модуле Graph представлены три процедуры.
Процедура
SetPalette (ColorNum: Word; Color: ShortInt)
управляет только одним цветом в палитре. ColorNum – это номер программного цвета, Color – номер
аппаратного цвета, который будет под ним пониматься. Например, вызов SetPalette (0,Red)
делает красный цвет первым цветом палитры. При некорректном вызове процедуры функция
GraphResult вернет значение grError.
Процедура
SetAllPalette (Var Palette)
позволяет самостоятельно производить “перетасовку” всей палитры сразу и назначать соответствие
между программными и аппаратными цветами. Параметр Palette является бестиповым, переменной
длины. Первый его байт должен содержать количество цветов в устанавливаемой палитре,
следующие N байтов должны содержать цвета из аппаратной палитры, которые будут использоваться в
дальнейшем. Каждый из этих байтов может принимать значение от – 1 до максимального
аппаратного, причем диапазон чисел от 0 и выше представляет устанавливаемые цвета, а число – 1
задается в том случае, если соответствующий цвет остается без изменения.
Более сложная процедура
SetRGBPalette (ColorNum, RedValue, GreenValue, BlueValue: Integer),
позволяет манипулировать цветовыми сочетаниями развитых графических адаптеров VGA и IBM8514.
Параметр программного цвета ColorNum должен быть в диапазоне 0..15 для VGA и 0..255 для
IBM8514. Последние три параметра показывают смешение красного, зеленого и синего цветов. На
практике применение этой процедуры проблематично из–за сложности представления “аппаратных”
цветов.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
I. Дано n целых чисел x 1, x2 ,.... , xn и y1, y2, .... , yn. Рассматривая их как количество изделий,
выпущенных двумя предприятиями за n-й день, построить диаграмму,
отдельные
элементы
которой имеют вид, показанный на рис 1. Прямоугольник соответствует количеству изделий,
выпущенных за день одним предприятием.
Решить данную задачу используя процедуру Bar3D с
наложением столбцов один на другой.
1. n = 5; заполнение типа /// и === ;
2. n = 5; заполнение типа /// (тонкими линиями) и крупный горошек;
3. n = 6; заполнение типа === и косой клеткой;
4. n = 6; заполнение типа /// (тонкими линиями) и мелкий горошек;
5. n = 7; заполнение типа /// (тонкими линиями) и клеткой;
6. n = 5; заполнение типа === и косой клеткой;
7. n = 5; заполнение типа \\\\\ (тонкими линиями) и клеткой;
8. n = 6; заполнение типа //// (тонкими линиями) и частой клеткой.
II. Написать программу построения диаграммы с элементами, имеющими вид, показанный на рис. 2.
Высота столбцов и шаблон заполнения задаются случайным образом. Представить эти же данные
секторной диаграммой (секторы пропорциональны заданным числам).
�Оглавлен ие
Лабораторная работа № 19
БИТОВЫЕ ГРАФИЧЕСКИЕ ОПЕРАЦИИ
Turbo Pascal позволяет организовать прямой доступ к каждому пикселу экрана. Делается это
функцией
GetPixel (X, Y: Integer),
которая возвращает значение типа Word – номер цвета пиксела с координатами (X,Y). Поскольку
обычно номер цвета лежит в диапазоне 0..15 или меньше, значащим является только младший байт.
Управление пикселами заключается в возможности назначить цвет любому пикселу экрана. Процедура
PutPixel (X, Y: Integer; Color: Word)
«зажигает» на экране в точке с координатами (X,Y) пиксел цвета Color. На применении этой
процедуры построен следующий пример.
Uses Graph, Crt;
{ $I initgraph.pas }
Const
minx = 290; miny = 70;
{левый верхний угол области}
maxx = 350; maxy = 130;
{правый нижний угол области}
Nx = Succ(maxx – minx);
{ширина области в пикселах}
Ny = Succ(maxy – miny);
{высота области в пикселах}
Npixels = Nx * Ny;
{число пикселов в области }
Var
countpixels, Color: Word;
{счетчик точек и их цвет}
X, Y: Integer;
{координаты текущей точки}
Begin
GrInit;
{инициализация графики}
Color:= GetMaxColor;
{цвет выводимых точек}
countpixels:= 0;
{обнуление счетчика точек}
Repeat
x:= minx + Random(Nx);
{случайные координаты}
y:= miny + Random(Ny);
{точки в прямоугольнике }
if GetPixel(X,Y) = Black then
{если в точке (X,Y) }
begin
{ничего нет, то }
PutPixel(X,Y,Color);
{подсветить ее и }
Inc(countpixels)
{увеличить счетчик }
�Оглавлен ие
end;
until countpixels = Npixels;
Repeat Until KeyPressed;
{пауза до нажатия клавиши }
Repeat
x:= minx + Random(Nx);
{случайные координаты}
y:= miny + Random(Ny);
{точки в прямоугольнике}
if GetPixel(X,Y) = Color then
begin
{если точка (X,Y) }
PutPixel(X,Y,Black);
{светится, то “потушить” }
Dec(countpixels)
{ее и уменьшить счетчик }
end;
Until countpixels = 0;
CloseGraph
End.
Работа с фрагментами изображения. Для запоминания в буфере и восстановления из него
прямоугольных фрагментов графического изображения используют процедуры
GetImage(X1,Y1,X2,Y2: Integer; Var BitMap)
и
PutImage(X1,Y1: Integer; Var BitMap; Mode: Word),
где (X1,Y1), (X2,Y2) – координаты левого верхнего и правого нижнего углов области, а вместо
бестипового параметра BitMap должна подставляться переменная – буфер, занимающая область
памяти размера, необходимого для полного сохранения изображения. Для определения этого размера
используется функция
ImageSize(X1,Y1,X2,Y2: Integer): Word;
которая возвращает размер памяти в байтах, необходимый для сохранения прямоугольной области
экрана. Максимальный размер сохраняемого изображения не должен превышать 64 К.
Обратите внимание, что у процедуры PutImage, которая восстанавливает изображение из буфера
BitMap в прямоугольник, указывается всего одна точка (X1,Y1). Объясняется это тем, что в
структуре BitMap первые два слова (четыре байта) содержат ширину и высоту в пикселах
запомненного изображения.
В этой процедуре имеется возможность определять режим вывода изображения: можно суммировать
изображение на экране и изображение в буфере, можно уничтожать изображение, находящееся в
определяемой области, можно инвертировать изображение, содержащееся в буфере. Эти операции
задаются параметром Mode, для которого в модуле Graph определены константы:
Const
CopyPut = 0;
{операция MOV (замещения)}
�Оглавлен ие
XORPut = 1;
{операция XOR}
ORPut
{операция OR }
= 2;
ANDPut = 3;
{операция AND}
NOTPut = 4;
{операция NOT}
Из этих пяти режимов самым интересным является XOR, поскольку произведенные последовательно
две операции XOR с одинаковым вторым аргументом оставляют первый из них без изменения. Это
свойство используется в тех случаях, когда необходимо изобразить некий подвижный объект на
сложном фоне; два раза выведя один и тот же фрагмент в одно и то же место в режиме XOR, мы
оставим фон неизменным.
Uses Graph,Crt;
{$I initgraph.pas }
Const
r = 10;
{ радиус подвижного шарика}
X1,Y1,X2,Y2,Sx,Sy: Integer;
{переменные для оживления фрагмента }
Var
maxx,maxy,Sxmove,Symove: Integer;
Size: Word;
{ размер фрагмента }
P: Pointer;
{ указатель на буфер }
GrInit;
{ инициализация графики }
maxx:= GetMaxX;
{ максимальное поле экрана }
Begin
maxy:= GetMaxY;
X1:= maxx div 2 – r;
{ координаты области экрана,}
Y1:= maxy div 2 – r;
{ в которой будет нарисован }
X2:= X1 + 2 * r;
{ шарик и которая будет }
Y2:= Y1 + 2 * r;
{ сохраненным фрагментом }
Sx:= X1; Sxmove:= 3;
{ начальная точка движения }
Sy:= Y1; Symove:= –1;
{ и шаг перемещения шарика}
SetFillStyle(SolidFill, Red);
{ выбор типа заливки}
PieSlice(X1 + r, Y1 + r, 0, 360, r); { рисование шарика }
Size:= ImageSize(X1, Y1, X2, Y2);
{ фрагмент в байтах }
GetMem(P, Size);
{ размещение буфера }
GetImage(X1, Y1, X2, Y2, P^);
{ фрагмент и в буфер }
SetFillStyle(CloseDotFill, Blue);
{ тип заливки фона}
Bar(50, 50, maxx – 50, maxy – 50);
{ фоновая картинка}
�Оглавлен ие
repeat
{ начало движения шарика}
PutImage(Sx, Sy, P^, XORPut);
{ вывод шарика }
Delay(120);
{ пауза}
PutImage(Sx, Sy, P^, XORPut);
{ стирание шарика }
{ограничения на движения шарика в пределах поля
фона }
if (Sx < 50) or (Sx > maxx – 50 – 2 * r)
then Sxmove:= – Sxmove;
if (Sy < 50) or (Sy > maxy – 50 – 2 * r) then Symove:= – Symove;
Inc(Sx, Sxmove);
{следующая точка появления }
Inc(Sy, Symove);
{шарика на экране }
until KeyPressed;
{... пока не нажата клавиша}
FreeMem(P, Size);
{освобождение памяти буфера}
CloseGraph
{закрытие режима графики}
End.
В примере продемонстрирован алгоритм мультипликации. Скорость движения картинки сильно
зависит от разрешения экрана и количества цветов.
Обращаем внимание на стандартную связку:
Size:= ImageSize(X1, Y1, X2, Y2); {фрагмент в байтах }
GetMem(P, Size);
{размещение буфера}
GetImage(X1, Y1, X2, Y2, P^);
{фрагмент и в буфер}
. . . . . . . . . .
PutImage (X, Y, P^, ***Put);
{вывод фрагмента(ов)}
FreeMem(P,Size);
{освобождение буфера}
организующую хранение динамического фрагмента через переменную P типа Pointer.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
I. Составить программу, моделирующую абсолютно упругий центральный удар двух шаров с массами
m1 и m2 движущихся со скоростями v1 и v2.
a) m1 = m2 , v1 = 2v2 , шары движутся навстречу друг другу;
b) m1 = m2 , v1 = v2 , шары движутся навстречу друг другу;
c) m1 = 2m2 , v1 = 2v2 , шары движутся навстречу друг другу;
d) m1 = 0.5m2 , v1 = v2 , шары движутся навстречу друг другу;
e) m1 = 2m2 , v1 = 2v2 , один шар догоняет другой;
f) m1 = m2 , v1 = 0.5v2 , один шар догоняет другой;
g) m1 = 0.5m2 , v1 = 2v2 , один шар догоняет другой;
h) m1 = 2m2 , v1 = 4v2 , один шар догоняет другой.
II. Составить программу, моделирующую:
a) процесс колебания математического маятника;
b) пружинного маятника (колебания происходят в направлении оси Y);
c) движение искусственного спутника Земли;
d) движение двух молекул идеального газа в замкнутом сосуде (соударение молекул друг с другом не
учитывать);
e) движение тела, брошенного под углом к горизонту;
f) модель атома Бора;
g) взаимодействие зарядов (одноименных, разноименных);
h) эксперимент по определению скорости пули с помощью баллистического маятника.
III. Изображение прямоугольной области с координатами (X1,Y1), (X2,Y2) в левом верхнем углу
экрана скопировать в свободные углы экрана. При копировании одно изображение инвертировать.
a) в прямоугольной области изображены 5 окружностей разных радиусов с общим центром;
b) многоугольник, закрашенный в мелкую точку;
c) прямоугольник, закрашенный в крупную точку;
d) эллипс, заполненный по шаблону \\\\\\\;
e) пятиугольник, заполненный по шаблону ====== ;
f) шестиугольник, заполненный по шаблону ////;
g) равносторонний треугольник, заполненный по шаблону – – –;
h) олимпийские кольца.
�Оглавлен ие
Лабораторная работа № 20
УПРАВЛЕНИЕ ВИДЕОСТРАНИЦАМИ. ГРАФИЧЕСКИЕ ОКНА. ВЫВОД ТЕКСТА
Управление видеостраницами. Память видеоадаптеров разделена на так называемые страницы, или
видеостраницы. По умолчанию в графическом режиме действия производятся с нулевой страницей.
Однако, если направить вывод изображений на ненулевую страницу (при условии, что такая доступна
в текущем режиме видеоадаптера), то на экране ничего не отобразится, поскольку по умолчанию
видимой является нулевая страница. Если же после этого дать команду считать видимой “скрытую”
страницу, то она появится на экране буквально мгновенно. Проделать все это позволяют две
процедуры:
SetVisualPage(Page: Word),
которая устанавливает “видимой” на экране видеостраницу номер Page, и процедура
SetActivePage(Page: Word),
устанавливающая перенаправление всех графических операций на страницу номер Page (т.е.
делающая активной). Обратите внимание, что активность не тождественна видимости страницы на
экране.
Рассмотрим типичный пример использования этих процедур.
Uses Graph, Crt;
{используются Graph и Crt}
{ $I initgraph.pas }
{инициализация графики}
Procedure Forms (kadr: Byte);
{рисование кадров 0..1}
Const
Radius: Array [0..3] of integer = (20, 40, 60,
80); {радиусы эллипсов в кадрах}
Var
r, rr: Integer;
Begin
r:= Radius [kadr];
{максимальный радиус}
rr:= 0;
{радиус вложенного эллипса}
Repeat
Ellipse (GetMaxX div 2, GetMaxY div 2, 0, 360, r, rr);
Inc (rr, 5);
Until rr >= r;
End;
Procedure Anim;
{процедура смены кадров}
Const
ms = 60;
Var
{задержка между кадрами, мc}
�Оглавлен ие
i: Byte;
{параметр циклов смены}
Begin
repeat
for i:= 0 to 1 do
begin
SetVisualPage (i);
{смены видеостраниц прямо}
Delay (ms)
end;
for i:= 1 downto 0 do
begin
SetVisualPage (i);
{... и обратно}
Delay (ms)
end;
until KeyPressed
{условие окончания показа}
End;
Var
i: Byte;
{параметр (номер кадра)}
Begin
GrInit;
{инициализация графики}
SetGraphMode(GetGraphMode);
{ режим . . . . . }
for i:= 1 downto 0 do
begin
{цикл заполнения страниц}
SetVisualPage (Succ (i) mod 4);
{ видим пустоту }
SetActivePage (i);
{ и готовим кадр }
Forms (i);
{ рисунок кадра }
end;
Anim;
{начало “оживления” кадров}
Close Graph
{закрытие режима графики}
End.
Особенность программы в том, что сначала кадры записываются на соответствующие страницы, а
затем производится последовательное переключение отображения страниц на дисплей процедурой
SetVisualPage.
Графические окна. Графическое окно (viewport) – это область просмотра, окно экрана, в
компьютерной графике – часть пространства отображения, в которой изображается и просматривается
часть моделируемого объекта. При образовании графического окна получается как бы “экран в экране”
�Оглавлен ие
заданного размера.
В модуле Graph для описания графического окна объявлен следующий тип и две константы:
Type
ViewPortType = Record
X1, Y1, X2, Y2: Integer;
{границы окна}
Clip: Boolean;
{режим отсечения}
End;
Const
ClipOn= True;
{отсечение по границе окна включено}
ClipOff= False;
{отсечение по границе окна выключено}
Значение ClipOn указывает на то, что все элементы изображения, попавшего за границы области
окна, обрезаются по границам графического окна, а ClipOff указывает на то, что все рисуется без
изменений, как бы “не глядя” на границы окна.
Объявление графического окна производится процедурой
SetViewPort (X1, Y1, X2, Y2: Integer; ClipMode: Boolean),
где входные параметры соответствуют полям записи типа ViewPortType. После выполнения этой
процедуры все текущие установки станут относиться к окну. Текущий указатель установится в его
левый верхний угол, и туда же переносится начало системы координат дисплея, т.е. мы получаем
локальную систему координат.
Если параметры процедуры заданы неправильно, то функция GraphResult возвращает ошибку
grError (– 11).
Назначение графического окна можно использовать для перемещения начала системы координат. Так,
если задать окно вызовом
SetViewPort (GetMaxX div 2, GetMaxY div 2, GetMaxX, GetMaxY, ClippOff),
то получим систему координат с началом в центре экрана. При этом станет “видимой” адресация
отрицательных координат. Графическое окно не меняет масштаба системы координат, а лишь
выбирает систему отсчета адресуемых пикселов.
Для определения текущих параметров графического окна используют процедуру
GetViewSettings (Var ViewSettings: ViewPortType).
Если воспользоваться ею сразу после инициализации графического режима, то обнаружится, что
графическим окном является весь экран.
Для очистки графического окна служит специальная процедура
ClearViewPort.
Процедура PutImage работает одинаково как для значения параметра ClipOn, так и для ClipOff. Об
этом следует помнить при использовании данной процедуры.
Вывод текста. Вывод текста в графическом режиме имеет ряд особенностей. Основное отличие в
�Оглавлен ие
том, что все действия производятся только со строковыми константами и переменными, т.е. вся
числовая информация должна предварительно преобразовываться в строковую (процедурой Str).
Другое отличие в том, что можно использовать различные шрифты.
В комплекте поставки есть файлы с расширением .CHR. Это набор штриховых шрифтов, которые могут
быть использованы для вывода информации. Поскольку они построены не матричным способом (как
сделаны стандартные шрифты для текстового режима), а векторным, можно изменять размеры
шрифтов без потери качества их изображения.
С пакетом Turbo Pascal поставляется 4 шрифта. Кроме того, доступен системный матричный шрифт
88 для графических режимов (всегда доступны символы с кодами от 0 до 127 и символы с кодами от
128 до 255 при условии, что их матрицы загружены в память ЭВМ.
Для обозначения шрифтов введены пять констант:
Const
DefaultFont = 0;
{матричный шрифт 8x8 (по умолчанию)}
TriplexFont = 1;
{полужирный}
SmallFont
{светлый шрифт (тонкое начертание)}
= 2;
SansSerifFont = 3;
{рубленый шрифт}
GothicFont = 4;
{готический шрифт}
Активизация любого из названных шрифтов осуществляется процедурой
SetTextStyle (Font, Direction: Word; CharSize: Word).
Здесь параметр Font – номер шрифта, Direction – расположение. Возможны лишь две ориентации
текста, обозначенные константами
Const
HorizDir = 0;
{горизонтальное, слева направо}
VertDir = 1;
{вертикальное, снизу вверх}
На самом деле есть еще один вариант регулирования направления шрифтов. Если задать Direction =
2, то буквы будут повернуты так же, как и при Direction = VertDir, но вывод строки будет
производиться горизонтально, слева направо.
Размер символа устанавливается параметром CharSize, диапазон изменения которого составляет от 0
до 10. Стандартное значение для матричного шрифта 88 равно 1, а для штриховых шрифтов – 4.
При каждом вызове процедурой SetTextStyle какого–либо шрифта он загружается в память ЭВМ.
Поэтому, если программа использует штриховые шрифты, необходимо, чтобы файлы этих шрифтов
находились в известном каталоге совместно с BGI–файлами.
Для вывода текста есть две процедуры:
OutText (TexString: String),
которая выводит на графический экран строку TexString, ориентированную относительно позиции
текущего указателя, и
OutTextXY (TexString: String),
�Оглавлен ие
которая выводит строку, ориентированную относительно координат (X,Y). Шрифт предварительно
может быть установлен вызовом SetTextStyle. Существует несколько вариантов ориентировки
строки относительно стартовой точки. Они задаются процедурой
SetTextJustify (Horisontal, Vertical: Word),
параметры которой могут принимать одно из трех объявленных в модуле Graph значений:
Const
{ для горизонтального ориентирования }
LeftText
= 0;
{ координата X задает левый край строки }
CenterText = 1;
{ координата X задает середину строки }
RightText = 2;
{ координата X задает правый край строки}
BottomText = 0;
{ координата Y задает нижний край строки }
CenterText = 1;
{ координата Y задает середину строки }
{ для вертикального ориентирования }
TopText
= 2;
{ координата Y задает верхний край строки}
Эта процедура позволяет ориентировать выводимую строку относительно стартовой координаты
(X,Y). По умолчанию параметры соответствуют LeftText, TopText.
Текстовые процедуры GoToXY, Write/Writeln и установки цвета текста в графическом режиме
работают только, если переменная модуля CRT – DirectVideo равна False (или модуль CRT не
подключен). Ввод текста через Read/Readln действует всегда. При этом текст стирает фоновое
изображение.
При выводе текста всегда важно знать вертикальный и горизонтальный размер выводимой строки в
пикселах. Это позволяет располагать строки пропорционально разрешающей способности
графического режима.
Функции
TextHeight (TextString: String): Word
TextWidth (TextString: String): Word
возвращают высоту и ширину строк TextString в пикселах, при условии, что они будут выведены
текущим шрифтом и размером.
Пример анализа расположения строк текста приведен ниже:
Uses Graph;
{ $I initgraph.pas }
Const
my_str = 'Turbo Pascal';
{выводимая строка }
maxx, maxy: Integer;
{текущее разрешение экрана}
tx, ty, i, j: Word;
{временные переменные}
Var
�Оглавлен ие
Begin
GrInit;
maxx:= GetMaxX; maxy:= GetMaxY;
{разрешение}
SetTextJustify (CenterText, CenterText);
{ориентация }
SetTextStyle (SmallFont, HorizDir, 6);
{стиль шрифта }
tx:= TextWidth (my_str);
{ширина строки }
ty:= TextHeight (my_str);
{высота строки }
for j:= 1 to (maxy div ty) do
{цикл по оси Y }
for j:= 1 to (maxx div tx) do
{цикл по оси X }
OutTextXY (i * tx, j* ty, my_str);
{тело циклов }
SetTextStyle (DefaultFont, HorizDir, 6);
{смена шрифта }
tx:= TextWidth ('W') div 6;
{1/6 ширины }
ty:= TextHeight ('E') div 6;
{1/6 высоты }
SetColor (LightRed);
OutTextXY (maxx div 2 + tx, maxy div 2 + ty, my_str);
Readln;
{пауза до нажатия ввода }
CloseGraph
{закрытие режима графики}
End.
У процедуры OutTextXY есть одна особенность: выводимая текстовая строка всегда обрезается по
границе графического окна. Более того, если активным является матричный шрифт (DefaultFont), то
“вылезающая” строка вообще не выводится на экран. Решать подобные проблемы можно, точно
рассчитывая место выводимых в графике строк.
Размер букв (высота и ширина) штриховых шрифтов (и только их) может задаваться процедурой
SetUserCharSize (multX, divX, multY, divY: Word).
Она позволяет оперативно менять размер шрифта, установленный SetTextStyle. Отношение
multX/divX задает масштабирование ширины начертания шрифта, а отношение multY/divY
выражает масштаб изменения высоты шрифта. Например, задание multX = 3 и divX = 1 говорит о
том, что буквы выводимого шрифта будут в три раза шире нормы.
Полную информацию о текущем режиме вывода текста можно получить, используя процедуру
GetTextSettings (Var Settings: TextSettingsType).
В параметре Settings она возвращает информацию обо всем, что относится к выводу строк. Тип
этого параметра определен в модуле Graph:
Type
TextSettingsType = Record
Font: Word;
{номер шрифта}
�Оглавлен ие
Direction: Word;
{направление }
CharSize: Word;
{размер шрифта }
Horiz: Word;
{ориентация по X }
Vert: Word;
{ориентация по Y }
End;
Текущим всегда является один тип. При необходимости быстро переключаться с одного шрифта на
другой удобно сохранять и восстанавливать их параметры через переменные описанного типа.
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Создайте на экране четыре окна. В двух окнах поместите простые графические рисунки (например,
ряд концентрических окружностей разного цвета) с использованием различных режимов отсечения. В
два других окна поместите тексты, иллюстрирующие возможность использования шрифтов разного
типа, размера и расположения.
2. Подобным образом заполните пассивную страницу. Организуйте переключение между страницами
по нажатию клавиши “пробел”.
�Оглавлен ие
Лабораторная работа № 21
УПРАВЛЕНИЕ КЛАВИАТУРОЙ
Технические особенности клавиатуры. Клавиатура ПЭВМ – достаточно сложное устройство,
содержащее разнообразные электронные компоненты, в том числе встроенный микропроцессор. Он
устраняет многочисленные ложные импульсы, возникающие в момент нажатия клавиши и ее
отпускания, и тем самым разгружает центральный процессор. Кроме того, микропроцессор
запоминает коды нажатых клавиш в буферной памяти, если по каким-либо причинам центральный
процессор не успевает их обработать достаточно быстро, а затем по запросу центрального процессора
передает их из памяти в том порядке, в каком они туда поступали. Наконец, микропроцессор следит за
временем, в течении которого клавиша удерживается в нажатом состоянии и осуществляет автоповтор
кода клавиши, если это время превышает одну-две секунды.
С точки зрения программирования, наиболее существенным обстоятельством является то, что коды,
вырабатываемые клавиатурой и коды, передаваемые в программу – это разные коды. Выработанный
клавиатурой код называется кодом сканирования. Кодов сканирования ровно столько, сколько клавиш
на клавиатуре. Именно эти коды поступают от микропроцессора клавиатуры. Чтобы сообщить
центральному процессору о готовности клавиатуры к передаче кода, микро-процессор вырабатывает
прерывание с номером 9. Программа обработки этого прерывания (драйвер клавиатуры) входит в
состав DOS и размещается в ПЗУ. Драйвер клавиатуры осуществляет преобразование кода
сканирования с учетом того, что могут быть одновременно нажаты две или более клавиш (например,
клавиша Shift и какая - нибудь литерная клавиша). В результате этого преобразования на выходе
драйвера клавиатуры формируется тот код, который и воспринимается программой.
Микропроцессор клавиатуры дважды вырабатывает прерывание 9 – в момент нажатия клавиши и в
момент ее отпускания. При отпускании клавиши передается двухбайтовая последовательность: сначала
код $F0 (240), а затем код сканирования клавиши. Именно поэтому программа обработки
прерываний может следить за одновременным нажатием нескольких клавиш.
На клавиатуре ПЭВМ имеются три особые клавиши, называемые клавишами смещения – они
предназначены для расширения возможностей клавиатуры. К ним относятся клавиши Shift
(временная смена регистра), Alt (дополнительный регистр) и Ctrl (управляющий регистр).Драйвер
клавиатуры никогда не сообщает программе о нажатии на эти клавиши, однако он соответствующим
образом преобразует код сканирования, так что, например, а и А имеют разные коды, хотя вызываются
нажатием на одну и ту же клавишу.
Стандартная клавиатура IBM AT имеет 101 (или 102) клавишу. С учетом возможностей
использования литерных клавиш совместно с тремя клавишами смещения, число возможных
комбинаций составляет около 400, что много больше емкости одного байта. Поэтому информация на
выходе драйвера клавиатуры должна кодироваться двумя байтами, причем далеко не каждая
комбинация может быть отражена условным знаком (символом) на экране.
Все обычные алфавитно-цифровые клавиши, как в нижнем, так и в верхнем регистрах, вырабатывают
на выходе драйвера однобайтный код символа. Этот код совпадает с указанным в таблице ASCII
кодом соответствующего символа. Некоторые специальные клавиши, такие как F1...F10, курсорные
клавиши и др., а также комбинации всех клавишей с Alt и Ctrl – вырабатывают коды из так
называемого
расширенного
набора
символов.
Эти
коды
передаются
двухбайтной
последовательностью, причем первый байт в этой последовательности нулевой. В таблице 1
приведены коды из расширенного набора.
�Оглавлен ие
Таблица 1
Код
Клавиша или комбинация клавиш
3
Ctrl-2
15
Shift-Tab
16...25
Alt-Q...Alt-P (верхний ряд букв)
30...38
Alt-A...Alt-L (средний ряд букв)
44...50
Alt-Z...Alt-M (нижний ряд букв)
59...68
F1...F10
71
Home
72
Курсор вверх
73
PageUp
75
Курсор влево
77
Курсор вправо
79
End
80
Курсор вниз
81
PageDown
82
Insert
83
Delete
84...93
Shift-F1...Shift-F10
94...103
Ctrl-F1...Ctrl-F10
104...113
Alt-F1...Alt-F10
114
Ctrl-PrintScreen
115
Ctrl-курсор влево
116
Ctrl-курсор вправо
117
Ctrl-End
118
Ctrl-PageDown
119
Ctrl-Home
120...131
132
Alt-1...Alt-= (верхний ряд клавишей)
Ctrl-PageUp
Как видно из этой таблицы используются далеко не все коды и возможны не все комбинации
клавишей. При вводе не предусмотренных комбинаций драйвер их просто игнорирует. Некоторые
комбинации имеют специальное назначение – они не могут восприниматься программой, но
обрабатываются операционной системой. Так, например, Ctrl-S (Ctrl-C) приводит к приостановке
работы программы, Ctrl-Break вообще прекращает ее выполнение, Ctrl-Alt-Del вызывает
перезагрузку компьютера, PrintScreen приводит к копированию содержимого экрана с помощью
�Оглавлен ие
принтера.
Кроме клавишей смещения на клавиатуре имеются четыре клавиши переключателя: Insert
(включение/отключение режима вставки символов), CapsLock (фиксация режима заглавных букв),
NumLock (фиксация дополнительных цифровых и служебных клавишей) и ScrollLock (фиксация
режима прокрутки экрана). В DOS выделены два байта с адресами 1047 и 1048, в которых хранится
информация о состоянии этих переключателей.
Комбинация Ctrl-NumLock приводит к так называемому состоянию захвата: в этом состоянии
драйвер непрерывно сканирует клавиатуру, ожидая нажатие на любую клавишу. В состоянии захвата
не может исполняться ни одна программа, кроме процедур обработки прерываний.
Управление клавиатурой. Для управления клавиатурой в Turbo Pascal имеется несколько
возможностей разного уровня. Прежде всего это стандартные процедуры Read и Readln. Это
процедуры самого верхнего логического уровня – они не только осуществляют взаимодействие с
драйвером клавиатуры, но и преобразуют символьные данные во внутренний формат представления
соответствующих переменных. Однако они обладают тремя существенными недостатками. Во-первых,
с их помощью невозможно опознать нажатие на любые не литерные клавиши (например, на клавиши
управления курсором). Во-вторых, ввод символов с помощью этих процедур сопровождается их
воспроизведением (эхо - повтором) на экране, что не всегда удобно. В-третьих, обращение к этим
процедурам приостанавливает выполнение программы до нажатия клавиши ввода.
Почти все перечисленные недостатки можно преодолеть, если обратиться к двум функциям
стандартного модуля CRT.
Функция KeyPressed. Возвращает значение типа Boolean, указывающая была ли нажата какая нибудь клавиша после последнего чтения из буфера клавиатуры или нет. Обращение
KeyPressed;
Обращение к этой функции никак не влияет ни на подготовленный клавиатурой код нажатой клавиши,
ни на саму функцию KeyPressed: сколько бы раз мы не обращались к ней, она будет возвращать True,
если была нажата какая - либо клавиша, – до тех пор, пока буфер клавиатуры будет прочитан
процедурами Read/Readln или функцией ReadKey. Функция не задерживает работу программы и
возвращает False, если ни одна клавиша не была нажата.
Функция ReadKey. Возвращает значение типа Char – код очередной нажатой клавиши. Обращение
ReadKey;
В отличие от KeyPressed эта функция приостанавливает работу программы до тех пор, пока не будет
нажата любая клавиша. Замечательной особенностью этой функции является то, что с ее помощью
можно опознать нажатие почти на любую клавишу – исключение составляют только клавиши
смещения и клавиши - переключатели. Кроме того, функция вводит символ “вслепую”, т.е. без эхо повтора на экране.
Приводимый ниже пример иллюстрирует возможность опознавания нажатия на клавиши,
генерирующие расширенные коды:
Uses CRT;
Var
ExtChar: Boolean;
{флаг – признак расширенного кода}
�Оглавлен ие
c: Char;
{вводимый символ}
................
Begin
................
c:=ReadKey;
if c=#0 then ExtChar:=True
else ExtChar:=False;
if ExtChar then c:=ReadKey;
................
Следующая программа читает клавиатуру и выводит на экран коды клавишей, до тех пор, пока не будет
нажата комбинация клавиш Ctrl+2:
Program TestOfKeyboard;
Uses CRT;
Var
c1,c2: char;
BEGIN
repeat
c1:=ReadKey;
if c1 = #0 then c2:=ReadKey;
if c1 = #0 then writeln(ord(c1):5, ord(c2):5)
else writeln(ord(c1):5)
until (c1 = #0) and (c2 = #3)
END.
Функции KeyPressed и ReadKey относятся к среднему логическому уровню работы с клавиатурой.
Как уже отмечалось, с их помощью невозможно опознать нажатие на клавиши смещения и клавиши
переключатели. Это становится возможным при переходе на самый нижний логический уровень,
связанный с непосредственным обращением к драйверу клавиатуры или самой клавиатуре. Такие
обращения реализуются с помощью двух прерываний – прерывания с номером 9 – от микропроцессора
клавиатуры и с номером 22 – обращение к драйверу.
Прерывание с номером 22 содержит следующие функции:
AH=0 – читать символ с ожиданием нажатия на клавишу;
AH=1 – проверить готовность клавиатуры;
AH=2 – прочитать статус (байт с адресом 1047).
При обращении к функции АН=0 в AL возвращается код нажатой клавиши или 0; если эта клавиша
генерирует код из расширенного набора, в АН возвращается код сканирования клавиши. При
�Оглавлен ие
обращении к функции АН=2 в регистре АН возвращается содержимое байта с адресом 1047.
Следующая программа читает и выводит коды сканирования клавишей до тех пор, пока не будет
нажата клавиша Esc:
Program ScanCodesDemo;
Uses DOS;
Var
r: registers;
BEGIN
with r do
begin
repeat
repeat
Flags:=0; AH:=1; Intr(22,r);
until Flags<>2022;
AH:= 0;
Intr(22,r);
writeln(AL:5, AH:5);
until (AL=27) and (AH=1)
end
END.
Довольно часто возникает необходимость очистить буфер ввода клавиатуры. Это позволяет сделать
следующий прием:
Var
c: Char;
.................
while KeyPressed do c:=ReadKey;
�Оглавлен ие
КОНТРОЛЬНЫЕ ЗАДАНИЯ
I. При запуске файла Turbo.exe на экране монитора появляется исходное изображение:
Составить программу рисующую эту заставку и позволяющую выполнять операции по активизации
опций основного меню (верхняя строка). Выбор опций производится клавишами “стрелка вправо”,
“стрелка влево”, “стрелка вниз”, “стрелка вверх”. При нажатии клавиши “ввод” активизируется
соответствующее подменю: File, Edit, Run, Compile, Options, Debug, Break/watch и
исчезает центральная часть изображения.
Варианты:
1. активизируется подменю File;
2. активизаруется подменю Edit;
3. активизаруется подменю Run;
4. активизаруется подменю Compile;
5. активизаруется подменю Options;
6. активизаруется подменю Debug;
7. активизаруется подменю Break/watch;
8. при нажатии клавиши F10 активизируется главное меню.
II. Составить программу управления объектом при помощи клавиш управления курсором. При это
нажатие клавиши “стрелка вправо”, “стрелка влево”, “стрелка вверх”, “стрелка вниз” изменяет
координаты объекта на dX и dY соответственно, а попарное нажатие этих клавиш (например,
“стрелка влево” + “стрелка вверх”) проводит к одновременному изменению координат X и Y. Значение
текущих координат объекта индицируется в левом верхнем углу экрана. Для вывода значений
координат использовать процедуры write/writeln и OutTextXY. В качестве объекта использовать
точку, оставляющую след на экране при перемещении. Предусмотреть возможность отключения
“следа”.
�Оглавлен ие
Лабораторная работа № 22
ОСНОВНЫЕ ПОНЯТИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
В Турбо Паскале, начиная с версии 5.0, наряду со стандартными типами данных, введен
процедурный тип. Он позволяет рассматривать обычные процедуры и функции как новую
разновидность переменных.
Описание этого типа производится по принятым в Турбо Паскале правилам, например:
Type
NewProc=Procedure(St: string, i,j: byte);
NewFunc=Function(X,Y: real): string;
Из этого примера видно, что при объявлении процедурного типа используются зарезервированные
слова Procedure и Function, после которых производится описание всех параметров, а для функции
дополнительно указывается тип результата.
После того, как описан процедурный тип данных, становится возможным использование в программе
и переменных данного типа. Их объявление производится обычным способом:
var
a, b: NewProc;
c, d: NewFunc;
Если в программе встречается переменная процедурного типа, то происходит выполнение
соответствующей процедуры или функции с заданными после идентификатора переменной
параметрами. Процедурный тип совместим со стандартным типом Pointer, и процедурная
переменная после установки ее значения содержит указатель на выполнимый код процедуры или
функции.
Для корректного выполнения присваивания значений переменных процедурного типа программа,
содержащая такие переменные, должна компилироваться с использованием дальней модели памяти,
то есть с установленной опцией OPTION/COMPILLER/FORCE FAR (директива компилятора {$F+}).
Кроме того, в объявлении процедурного типа не могут быть использованы процедуры и функции,
зарезервированные в любом из стандартных модулей Турбо Паскаля и процедуры типа Inline.
После выполнения операции присваивания имя переменной становится синонимом имени
соответствующей процедуры или функции.
Следующий простой пример иллюстрирует использование данных процедурного типа:
Program DataProc;
Type
Sum= Function(X,Y: integer): integer;
var
S: Sum;
I,J: integer;
{$F+}
�Оглавлен ие
Function Summa(X,Y: integer): integer;
Begin
Summa:=X+Y;
End;
{$F-}
BEGIN
Write('Введите первое слагаемое '); Readln(I);
Write('Введите второе слагаемое '); Readln(J);
S:=Summa;
Writeln('Сумма чисел ',I,' и ',J,' равна ', S(I,J));
END.
Следует отметить, что в Турбо Паскале в передаваемой процедурной переменной могут быть
использованы как параметры-значения, так и параметры-переменные.
Следующим шагом в развитии типов данных является появление в Турбо Паскале (начиная с версии
5.5) объектного типа данных, в котором происходит объединение данных и операций над ними.
Объектный тип составляет основу объектно-ориентированного программирования (ООП).
Описание этого типа происходит в разделе Type с использованием зарезервированных слов Object
и End. Данные объектного типа определяются значениями своих полей (как и записи – данные типа
Record) и процедурами и функциями, определяющими правила обработки полей.
Например:
Type
Str= string;
Data=byte;
StudentType=object
Famaly: Str;
Name: Str;
Grup: Str;
Procedure Init(Fm,Nm,Gr: Str);
Procedure Show;
end;
DataType=object(StudentType)
DataMath: Data;
DataPhis: Data;
DataInf: Data;
Procedure Init(Fm,Nm,Gr: Str; Mt,Ph,Inf: Data);
�Оглавлен ие
Procedure Show;
end;
В этом примере тип данных StudentType определен как объект. Он содержит три поля Famaly,
Name и Grup, принадлежащие к типу string. Процедуры Init и Show устанавливают правила или
методы работы с полями объекта. Естественно, что они должны быть описаны в вашей программе.
Тип данных DataType описан как объект, порожденный объектом StudentType или, как говорят,
объект DataType является потомком объекта StudentType. В описании типов этому соответствует
слово object и идентификатор объекта-родителя. В Турбо Паскале принято соглашение, согласно
которому объект-потомок наследует все поля и методы объекта-родителя. Поэтому объект типа
DataType, кроме своих собственных полей DataMath, DataPhis и DataInf будет содержать и
наследуемые поля Famaly, Name и Grup.
Непосредственное определение объекта (экземпляра объекта) происходит в разделе описания
переменных, например:
var
Std1, Std2: StudentType;
Dt1, Dt2: DataType;
В результате такого объявления в памяти будет выделено соответствующее место для размещения
объектов Std1 и Std2 типа StudentType и объектов Dt1 и Dt2 типа DataType, после чего
становится возможным обращение к полям и методам этих объектов. Как и в случае записей, для этих
целей можно использовать оператор With или непосредственное обращение к нужному полю:
With Std1 do begin
Famaly:=‘Иванов’;
Name:=‘Сергей’;
Grup:=‘542’;
Еnd;
Dt1.DataPhis:=4;
Dt1.DataMath:=4;
Вместе с тем, как будет видно из дальнейшего знакомства с методами ООП, прямое обращение является
не лучшим способом инициализации полей объекта. Более корректно для этих целей использовать
специальные правила – каковыми и являются методы Init, включенные в описания типов
StudentType и DataType.
Описанием типа, разумеется, не заканчивается формирование объекта – необходимо написать еще
коды процедур и функций (то есть методов), включенных в описание типа объекта. Лишь после этого
объект сможет выступать как единое целое, в неразрывной связи своих свойств и поведения. Такое
объединение кода и данных при создании типа объекта носит название инкапсуляции.
Заголовки методов при их описании должны соответствовать тем, которые указаны в разделе Type.
Так как сразу несколько типов объектов могут иметь правила с одинаковыми именами, то перед
заголовком метода указывается через точку наименование типа объекта. Так, например, описание
методов Init и Show для объектов типа StudentType может выглядеть следующим образом:
�Оглавлен ие
Procedure StudentType.Init(Fm,Nm,Gr: Str);
Begin
Famaly:=Fm;
Name:=Nm;
Grup:=Gr;
End;
Procedure StudentType.Show;
Begin
Writeln;
Writeln('ФАМИЛИЯ: ',Famaly);
Writeln('ИМЯ: ',Name);
Writeln('ГРУППА: ',Grup);
End;
Первая процедура предназначена для инициализации полей объекта, вторая – для вывода их значений
на экран. Объединение через точку имен Init и StudentType служит для указания компилятору, что
процедура Init является методом, принадлежащим объекту типа StudentType. Обращение к полям
объекта внутри процедуры происходит как к обычным переменным, без непосредственного указания
на то, какому объекту эти поля принадлежат.
Как указывалось выше, объект DataType является потомком объекта StudentType, соответственно
последний выступает в роли родителя или предка. Если теперь построить объект-потомок от объекта
DataType, то он будет потомком и объекта StudentType, но уже более далеким. В устанавливаемых
отношениях наследования важным является то, что каждый объект может иметь сколько угодно
потомков, но лишь одного близкого предка. Используя один родительский тип, можно построить
иерархию или дерево порожденных объектов.
В механизме наследования можно условно выделить два основных момента: наследование полей и
наследование методов. Объект типа DataType автоматически унаследовал поля Famaly, Name и
Grup. Поэтому в его описании нет упоминания об этих полях.
Наследование правил имеет свои особенности. Тип DataType наследует от своего предка два метода
Init и Show, служащие для инициализации полей и вывода их значений на экран. Однако, у объекта
DataType число полей на три больше, поэтому для него придется ввести новые правила:
Procedure DataType.Init(Fm,Nm,Gr: Str; Mt,Ph,Inf: Data);
Begin
StudentType.Init(Fm,Nm,Gr);
DataMath:=Mt;
DataPhis:=Ph;
DataInf:=Inf;
�Оглавлен ие
End;
Procedure DataType.Show;
Begin
StudentType.Show;
Writeln('МАТАНАЛИЗ: ',DataMath);
Writeln('ОБЩАЯ ФИЗИКА: ',DataPhis);
Writeln('ИНФОРМАТИКА: ',DataInf);
End;
В описании происходит обращение к родительским методам Init и Show, при этом для методов
объекта потомка сохранены старые наименования, хотя текст процедур стал иным. Использование
одинаковых имен методов для порожденных объектов называется полиморфизмом и отражает важное
свойство ООП. Оно заключается в том, что под наследованием правила для всей иерархии
порожденных объектов подразумевается конкретное логическое действие над объектами, а не способ
его реализации. Так метод Init описывает инициализацию полей объекта, независимо от его типа.
Созданные объекты удобно хранить в отдельном модуле, подключая его к программе с помощью
стандартной директивы Uses. Напомним, что модуль в Турбо Паскале имеет стандартную структуру
программы, но начинается не служебным словом Program, а словом Unit, после которого идет имя
модуля. Описание объектов располагается в секции модуля INTERFACE, а описание методов – в
секции IMPLEMENTATION. Для наших объектов модуль выглядит следующим образом:
Unit Student;
INTERFACE
Type
Str= string;
Data=byte;
StudentType=object
Famaly: Str;
Name: Str;
Grup: Str;
Procedure Init(Fm,Nm,Gr: Str);
Procedure Show;
end;
DataType=object(StudentType)
DataMath: Data;
DataPhis: Data;
DataInf: Data;
Procedure Init(Fm,Nm,Gr: Str; Mt,Ph,Inf: Data);
�Оглавлен ие
Procedure Show;
end;
IMPLEMENTATION
Procedure StudentType.Init(Fm,Nm,Gr: Str);
Begin
Famaly:=Fm;
Name:=Nm;
Grup:=Gr;
End;
Procedure StudentType.Show;
Begin
Writeln;
Writeln('ФАМИЛИЯ: ',Famaly);
Writeln('ИМЯ: ',Name);
Writeln('ГРУППА: ',Grup);
End;
Procedure DataType.Init(Fm,Nm,Gr: Str; Mt,Ph,Inf: Data);
Begin
StudentType.Init(Fm,Nm,Gr);
DataMath:=Mt;
DataPhis:=Ph;
DataInf:=Inf;
End;
Procedure DataType.Show;
Begin
StudentType.Show;
Writeln('МАТАНАЛИЗ: ',DataMath);
Writeln('ОБЩАЯ ФИЗИКА: ',DataPhis);
Writeln('ИНФОРМАТИКА: ',DataInf);
End;
BEGIN
END.
Теперь модуль следует сохранить в файле с таким же именем (в нашем случае – в файле
�Оглавлен ие
Student.pas). Соответственно, исполняемая программа примет вид:
Program Stud;
USES Student;
var
NameStd: StudentType;
DataStd: DataType;
Begin
NameStd.Init('Иванов','Петр','544');
NameStd.Show;
DataStd.Init('Иванов','Петр','544',3,5,4);
DataStd.Show;
End.
Напомним, что компиляцию данной программы необходимо производить в режиме Make или Build
опции COMPILER.
Правила и объекты, которые мы использовали в этом примере, являются статическими. Компилятор
резервирует для них место в памяти точно так же, как он это делает для обычных переменных. Если
названного по имени правила не оказывается у объекта данного уровня, то поиск его продолжается у
родителя на более высоком уровне в дереве иерархии. Если и у корневого объекта дерева не находится
правила с заданным именем, то компилятор выдает сообщение об ошибке. Для обращения к
статическому правилу родителя необходимо указать тип родителя и, через точку, имя правила.
Статические правила сильно привязаны к типу объекта, для которого они были введены. Этого
недостатка лишены виртуальные правила. Подобно динамическим переменным виртуальные правила
не имеют полного определения в памяти до непосредственного выполнения программы. При их
объявлении добавляется зарезервированное слово Virtual:
Procedure Show; virtual;
Следует помнить, что, однажды определив правило как виртуальное, необходимо определять его
таковым и для всех объектов-потомков.
Следующий шаг – придание свойства динамичности самим объектам. Это можно сделать, вводя
указатели на экземпляры объектов, например:
Type
PStudentType=^StudentType;
PDataType=^DataType;
var
PNamStd: PStudentType;
PDataStd: PDataType;
Обращение к динамическим объектам становится возможным только после выделения памяти в куче
(Heap). Это можно сделать, используя стандартную процедуру New:
�Оглавлен ие
New(PDataStd);
После этого обращение к экземпляру объекта производится с помощью соответствующей
переменной-указателя PDataStd^. Так, чтобы проинициализировать поля экземпляра объекта
PDataStd^, достаточно выполнить следующее обращение:
PDataStd^.Init(‘Иванов’,’Петр’,’543’,2,4,3);
Необходимость инициализации любого объекта и некоторая шаблонность необходимых для этого
действий привели к появлению в Турбо Паскале двух новых зарезервированных слов Constructor
и Destructor. В синтаксис стандартных процедур New и Dispose добавлен второй необязательный
параметр-указатель на специальное правило объекта. Это правило носит название конструктор и
предназначено для размещения динамического объекта в памяти и инициализации его полей. Для его
описания и используется ключевое слово Constructor, заменяющее слово Procedure. Выделение
памяти для динамического объекта PDataStd с одновременной инициализацией его полей
осуществляется с помощью процедуры
New(PDataStd, Init(‘Иванов’,’Петр’,’543’,2,4,3));
Обратиться к New можно и как к функции:
PDataStd:= New(PDataType, Init(‘Иванов’,’Петр’,’543’,2,4,3));
Результатом функционального вызова New будет значение указателя на распределенный динамический
объект в куче. Соответственно, вместо первого параметра используется тип указателя на объект.
Деструктор предназначен для очистки и освобождения из памяти динамических объектов с помощью
расширенного вызова стандартной процедуры Dispose . При этом объем освобождаемой памяти
точно соответствует размеру объекта. Для нашего примера текст деструктора имеет вид:
Destructor StudentType.Done;
Begin
End;
Destructor DataType.Done;
Begin
End;
Для освобождения из кучи ранее распределенного динамического объекта PDataStd следует
использовать вызов
Dispose(PDataStd, Done);
С учетом всех сделанных выше замечаний наш модуль Student принимает вид
Unit Student;
INTERFACE
Uses Crt;
Type
Str= string;
Data=byte;
�Оглавлен ие
PStudentType=^StudentType;
StudentType=object
Famaly: Str;
Name: Str;
Grup: Str;
Constructor Init(Fm,Nm,Gr: Str);
Destructor Done; virtual;
Procedure Show; virtual;
Procedure ShowClrScr;
end;
PDataType=^DataType;
DataType=object(StudentType)
DataMath: Data;
DataPhis: Data;
DataInf: Data;
Constructor Init(Fm,Nm,Gr: Str; Mt,Ph,Inf: Data);
Destructor Done; virtual;
Procedure Show; virtual;
end;
IMPLEMENTATION
Constructor StudentType.Init(Fm,Nm,Gr: Str);
Begin
Famaly:=Fm;
Name:=Nm;
Grup:=Gr;
End;
Procedure StudentType.Show;
Begin
Writeln;
Writeln('ФАМИЛИЯ: ',Famaly);
Writeln('ИМЯ: ',Name);
Writeln('ГРУППА: ',Grup);
End;
Constructor DataType.Init(Fm,Nm,Gr: Str; Mt,Ph,Inf: Data);
�Оглавлен ие
Begin
StudentType.Init(Fm,Nm,Gr);
DataMath:=Mt;
DataPhis:=Ph;
DataInf:=Inf;
End;
Procedure DataType.Show;
Begin
StudentType.Show;
Writeln('МАТАНАЛИЗ: ',DataMath);
Writeln('ОБЩАЯ ФИЗИКА: ',DataPhis);
Writeln('ИНФОРМАТИКА: ',DataInf);
End;
Procedure StudentType.ShowClrScr;
Begin
ClrScr;
Show;
End;
Destructor StudentType.Done;
Begin
End;
Destructor DataType.Done;
Begin
End;
BEGIN
END.
Исполняемая же часть программы может быть записана в виде:
Program Stud;
USES Student;
var
NameStd: StudentType;
DataStd: DataType;
PStudent: PStudentType;
PData: PDataType;
�Оглавлен ие
Begin
DataStd.Init('Иванов','Петр','544',3,5,4);
DataStd.ShowClrScr;
New(PData,Init('Иванов','Петр','544',3,5,4));
NameStd.Init('Петров','Иван','545');
PStudent:=@NameStd;
PStudent^.Show;
PStudent:=PData;
PStudent^.Show;
Dispose(PStudent,Done);
End.
�Оглавлен ие
Задания для самостоятельной работы
Просмотрите выполнение программы Stud в пошаговом режиме (опции RUN/GO TO CURSOR и
RUN/STEP OVER), следя за изменением полей объектов (опция DEBUG/WATCHES/ADD WATCH).
Создайте объект-потомок объекта DataType, содержащий дополнительное поле Stipend со
значениями ‘Yes’ и ‘No’.
�Оглавлен ие
Лабораторная работа № 23
ЭЛЕМЕНТЫ TURBO VISION
Рассмотренный в предыдущей работе пример создания программы с использованием основных
методов ООП (объектно-ориентированного программирования), несмотря на его простоту и
невыразительность, демонстрирует, тем не менее, многие преимущества такого подхода:
1. Становится совершенно прозрачной структура исполняемой части программы. Программа,
написанная с использованием принципов ООП, должна выполнить три основных действия:
инициализировать объект (процедура Init), показать объект (процедура Show), закрыть объект
(процедура Done).
2. Создание объекта отделено от написания кода программы. Для того, чтобы использовать созданный
объект, совсем не нужно знать, как выглядят включенные в него методы, то есть как устроен блок
IMPLEMENTATION соответствующего модуля – вполне достаточно сведений о том какие поля имеются
у объекта и какими методами он располагает. В этом смысле "объект" в ООП действительно объект –
он имеет определенную "форму" и "знает, как себя вести".
3. Если имеющийся объект чем-то Вас не устраивает, нет нужды менять код модуля, который этот
объект описывает. Принцип наследования позволяет изменять объекты, расширяя их. Вы создаете
объект-потомок, добавляя новые поля и перекрывая унаследованные методы.
Ясно, что указанные преимущества могут проявиться в полной мере лишь при написании сложных
программ, требующих многократного повторения сходных действий. Примером таких программ могут
служить программы, требующие разветвленного пользовательского интерфейса – системы меню,
строк-подсказок, окон помощи, окон ввода данных и так далее. Понятно, насколько бы упростилось
создание подобных программ, если бы в нашем распоряжении имелась библиотека соответствующих
объектов. Turbo Vision и есть такая библиотека! Если Вы работаете в текстовом режиме (хотя
Turbo Vision не исключает, естественно, графических возможностей Паскаля), то в этой
библиотеке Вы найдете все, что нужно для создания Вашей программы. Разветвленное иерархическое
дерево Turbo Vision позволяет найти "плод" на любой вкус. Поэтому нельзя не присоединиться к
призыву разработчиков Turbo Vision – не изобретайте колесо, наследуйте наше!
На самом высоком уровне Turbo Vision – это объединение видимых элементов, событий и
невидимых объектов.
Видимый элемент – это любой элемент программы, который виден на экране. Все видимые
элементы являются объектами. Подробнее эти объекты мы рассмотрим ниже. Отметим только, что все
видимые объекты имеют прямоугольную форму, так как Turbo Vision работает в текстовом режиме.
События – это все то, на что должна отреагировать Ваша программа. События могут приходить от
мышки, от клавиатуры или от других частей Turbo Vision. Они поступают в очередь внутри Turbo
Vision по мере их поступления и затем обрабатываются обработчиком событий. Объект
TАpplication, который является ядром любой программы, содержит обработчик событий. Если
событие не может быть обработано TАpplication, то оно передается в другие видимые элементы до
тех пор, пока не найдется объект, который обработает событие или пока не возникнет ошибка "отказ от
события".
Невидимые объекты – это любые другие объекты программы, отличные от видимых элементов. Они
"невидимы", поскольку сами ничего на экран не выводят. Они производят вычисления, осуществляют
�Оглавлен ие
связь с периферией и выполняют другую работу программы. Если невидимому объекту нужно что-то
вывести на экран, он должен связаться с видимым элементом.
Что собой представляют видимые объекты, Вы можете увидеть на экране монитора после загрузки
Турбо Паскаля 6.0, поскольку его IDE (интегрированная среда разработки программ) создана на
основе Turbo Vision.
Вы видите, прежде всего, DeskTop (панель экрана или рабочий стол) – большой прямоугольник
заштрихованный светлым фоном. Сверху располагается полоса меню, доступ к которой осуществляется
нажатием клавиши F10, клавиши Alt с любой литерной клавишей, выделенной красным цветом
(«горячие» клавиши), или с помощью мыши. Активизация любой команды меню приводит к
появлению дополнительных выпадающих меню. Здесь Вы можете перемещаться с помощью
курсорных клавиш или литерных «горячих» клавиш (без Alt).
Внизу расположена строка статуса, которая содержит наиболее часто употребляемые команды и
может использоваться для вывода различного рода сообщений и подсказок о текущем состоянии
системы (ее статусе).
При выборе команды New в меню File панель экрана перекрывается окном. Окно имеет рамку с
именем и управляющие кнопки вверху. Левая закрывает окно (при ее нажатии мышкой), правая –
изменяет размеры, раскрывая окно на полный экран или сворачивая до прежних размеров. Нажав
клавишу мыши на верхней стороне рамки, Вы можете мышью перемещать окно по экрану. Потянув
мышкой за правый нижний угол окна, можно изменять его размеры.
При отсутствии мышки те же действия можно выполнить и с клавиатуры. Для этого можно войти в
меню Window (Окно) или сразу воспользоваться "горячей" клавишей Ctr+F5, после чего курсорными
клавишами можно перемещать окно или изменять его размеры (при нажатой клавише Shift).
Обратите внимание на то, как при этом изменяется статусная строка. Клавиша F5 распахивает окно на
полный экран или восстанавливает его прежние размеры (разумеется, если они были меньше полных).
Закрыть окно можно командой Close из меню Window или комбинацией клавиш Alt+F3.
С помощью команды New из меню File Вы можете раскрыть какое угодно число новых окон.
Расположить на экране их можно либо каскадом (Cascade из меню Windows) либо мозаикой (Tile).
Переход от окна к окну осуществляется командой Next, клавишей F6 или нажатием клавиши Alt и
цифры, соответствующей номеру окна (последнее возможно лишь для первых 9 окон, остальные не
нумерованы). Естественно, что нужное окно можно выбрать и мышкой (IDE – «мышиная» система, все
действия с помощью мыши осуществляются проще и быстрее).
Окно имеет полосу прокрутки (скроллинга), позволяющую просматривать большие тексты. Скроллинг
– сам по себе видимый элемент. Вместе с вертикальной и горизонтальной полосами прокрутки
скроллинг составляет с окном единое целое, объединяясь в группу видимых элементов.
Войдя, например, в меню Options и выбрав в нем команду Linker, Вы получите еще один пример
видимого элемента – диалоговое окно. Оно окрашено в другой цвет и содержит некоторый текст,
управляющие кнопки и другие элементы. Существуют различные типы диалоговых окон, с которыми
мы познакомимся позже.
Управляющие кнопки могут быть нажаты мышкой. Одна из кнопок выделена цветом надписи (в
нашем случае – кнопка Ok) и является кнопкой по умолчанию – она нажимается клавишей Enter.
Сменить кнопку по умолчанию можно клавишей Tab.
После знакомства с основными элементами Turbo Vision можно перейти к написанию Вашей
�Оглавлен ие
первой программы, воспользовавшись рекомендациями разработчиков Turbo Vision.
Как уже отмечалось, основным объектом при составлении программ в Turbo Vision является
TАpplication (он описан в модуле АPP.TPU). Это абстрактный объект, который сам ничего не
делает. Если выполнить программу:
program MyFirst;
uses App;
var
MyApp: TApplication;
BEGIN
MyApp.Init;
MyApp.Run;
MyApp.Done;
END.
то можно увидеть этот объект в «чистом виде» – он создает панель экрана и активизирует клавишу
выхода Alt+X. Кроме того, из приведенного примера видно, что в Turbo Vision принято
соглашение называть процедуру инициализации объекта Init, процедуру вывода на экран – Run и
процедуру закрытия объекта – Done. Эти три процедуры и составляют исполняемую часть
практически любой программы в Turbo Vision. На самом деле метод Run сложнее – он включает в
себя не только вывод объектов на экран, но и обработку событий.
Поскольку объект TApplication слишком прост, Вам придется модифицировать его, то есть
создавать объекты-потомки, расширяя его поля и перекрывая его методы. Посмотрим, прежде всего,
как изменить статусную строку (напомним, что TApplication в этой строке имеет единственную
клавишу AltX). Наша первая в Turbo Vision программа будет иметь вид:
program MyFirst1;
uses App,Objects,Menus,Drivers,Views; {нам понадобятся константы и
const
cmNewWin=199;
переменные, определенные в этих модулях}
{эта константа определяет реакцию на новую команду}
type
TMyApp=Object(TApplication)
{создаем объект-потомок TApplication
procedure InitStatusLine; virtual; и перекрываем его метод InitStatusLine}
end;
var
MyApp: TMyApp;
procedure TMyApp.InitStatusLine;
{описываем новый метод}
var R:TRect;
{эта переменная хранит границы статусной строки}
begin
�Оглавлен ие
GetExtent(R);
{устанавливает R в границы всего экрана}
R.A.Y:=R.B.Y-1;
{передвигаем вершину выше нижней границы на одну строку}
StatusLine:=New(PStatusLine,Init(R, {создаем строку статуса}
NewStatusDef(0,$FFFF,
{устанавливаем диапазон контекстной помощи}
NewStatusKey('~Alt-X~ Exit',kbAltX,cmQuit,
NewStatusKey('~F4~ New',kbF4,cmNewWin,
{определяем элемент строки}
{еще один}
NewStatusKey('~Alt-F3~ Close',kbAltF3,cmClose, {и еще один}
nil))),
{больше нет определений}
end;
BEGIN
MyApp.Init;
MyApp.Run;
MyApp.Done;
END.
Запустив программу на выполнение, вы увидите результат: в статусной строке появились две новые
команды – New и Close с соответствующими им «горячими» клавишами. Правда, обе пока не
отзываются на их нажатие. Причина этого проста – первую команду мы придумали сами и еще не
указали обработчику событий, как на нее реагировать. Вторая же команда, хотя и является внутренней
командой Turbo Vision, но пока не активизирована – на это указывает бледный цвет надписи – так как по
определению команда закрывает окно, а окон у нас еще нет!
Теперь заполним полосу меню. Она описывается переменной MenuBar, которая инициализируется
вложенными вызовами стандартных функций NewMenu (новое меню), NewSubMenu (новое подменю),
NewItem (новая команда), NewLine (новая разделительная линия).
Создадим сначала простую полосу меню с одним элементом, содержащим одну команду. Для этого в
нашу программу потребуется внести следующие изменения:
const
cmFileOpen=200;
{определяем новую команду}
procedure TMyApp.InitMenuBar;
{добавляем новый метод (не забудьте внести
var R:TRect;
изменения в описание TMyApp)}
begin
GetExtent(R);
R.B.Y:=R.A.Y+1;
{передвигаем вершину ниже верхней
MenuBar:=New(PMenuBar,Init(R,NewMenu(
{создаем полосу меню}
границы на одну строку}
NewSubMenu('~F~ile',hcNoContext,NewMenu(
{определяем подменю}
NewItem('~O~pen','F3',kbF3,cmFileOpen,
определяем элемент подменю}
�Оглавлен ие
hcNoContext,
nil)),
{больше нет элементов}
nil))))
{больше нет подменю}
end;
Чтобы окончательно разобраться, что к чему в этом фрагменте, достаточно запустить MyFirst1 с
внесенными изменениями и посмотреть на результат.
Чтобы добавить второй элемент в меню File, нужно вложить еще одну функцию NewItem:
MenuBar:=New(PMenuBar,Init(R,NewMenu(
NewSubMenu('~F~ile',hcNoContext,NewMenu(
NewItem('~O~pen','F3',kbF3,cmFileOpen,
hcNoContext,
NewItem('~N~ew','F4',kbF4,cmNewWin,
hcNoContext,
nil))),
nil))))
end;
Для добавления второго меню вкладываем другую функцию NewSubMenu:
NewSubMenu('~W~indow',hcNoContext,NewMenu(
NewItem('~N~ext','F6',kbF6,cmNext,
hcNoContext,
NewItem('~Z~oom','F5',kbF5,cmZoom,
hcNoContext,
nil))),
nil)))));
Добавим еще разделительную линию в меню File, после чего наша процедура примет окончательный
вид:
procedure TMyApp.InitMenuBar;
var R:TRect;
begin
GetExtent(R);
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar,Init(R,NewMenu(
NewSubMenu('~F~ile',hcNoContext,NewMenu(
NewItem('~O~pen','F3',kbF3,cmFileOpen,
�Оглавлен ие
hcNoContext,
NewItem('~N~ew','F4',kbF4,cmNewWin,
hcNoContext,
NewLine(
NewItem('E~x~it','Alt-X',kbAltX,cmQuit,
hcNoContext,
nil))))),
NewSubMenu('~W~indow',hcNoContext,NewMenu(
NewItem('~N~ext','F6',kbF6,cmNext,
hcNoContext,
NewItem('~Z~oom','F5',kbF5,cmZoom,
hcNoContext,
nil))),
nil)))))
end;
Добавим еще в статусную строку команду «F10 Menu» для активизации меню с помощью «горячей
клавиши», и наша программа примет такой вид:
program TFirst2;
uses App,Objects,Menus,Drivers,Views;
const
cmNewWin=199;
cmFileOpen=200;
type
TMyApp=Object(TApplication)
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
end;
var
MyApp: TMyApp;
procedure TMyApp.InitStatusLine;
var R:TRect;
begin
GetExtent(R);
R.A.Y:=R.B.Y-1;
�Оглавлен ие
StatusLine:=New(PStatusLine,Init(R,
NewStatusDef(0,$FFFF,
NewStatusKey('~Alt-X~ Exit',kbAltX,cmQuit,
NewStatusKey('~F4~ New',kbF4,cmNewWin,
NewStatusKey('~Alt-F3~ Close',kbAltF3,cmClose,
NewStatusKey('~F10~ Menu',kbF10,cmMenu,
nil)))),
nil)))
end;
procedure TMyApp.InitMenuBar;
var R:TRect;
begin
GetExtent(R);
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar,Init(R,NewMenu(
NewSubMenu('~F~ile',hcNoContext,NewMenu(
NewItem('~O~pen','F3',kbF3,cmFileOpen,
hcNoContext,
NewItem('~N~ew','F4',kbF4,cmNewWin,
hcNoContext,
NewLine(
NewItem('E~x~it','Alt-X',kbAltX,cmQuit,
hcNoContext,
nil))))),
NewSubMenu('~W~indow',hcNoContext,NewMenu(
NewItem('~N~ext','F6',kbF6,cmNext,
hcNoContext,
NewItem('~Z~oom','F5',kbF5,cmZoom,
hcNoContext,
nil))),
nil)))))
end;
BEGIN
MyApp.Init;
�Оглавлен ие
MyApp.Run;
MyApp.Done;
END.
�Оглавлен ие
Задания для самостоятельной работы
1. Выполните программу TFirst2 в пошаговом режиме. Обратите внимание на то, как происходит
инициализация объекта MyApp.
2. Замените в Вашей программе названия команд меню и статусной строки их русскими
эквивалентами. Проверьте, сохранились ли возможности «горячих клавиш».
3. Добавьте новые пункты меню (и подменю) и новые элементы статусной строки по Вашему выбору.
�Оглавлен ие
Лабораторная работа № 24
ОКНА
Как уже отмечалось, окна в Turbo Vision – это видимые объекты, «знающие» правила своего
поведения. Они умеют открываться, изменять размер, перемещаться и закрываться, реагируя на
команды с клавиатуры или от мышки. Для того, чтобы что-то появилось в окне, мы должны вставить в
окно другие видимые элементы, которыми и сможет управлять наше окно. Поэтому начать нужно с
создания стандартного окна, а затем уже добавлять новые возможности. В нашей программе TFirst2
уже зарезервирована клавиша F4 с соответствующей командой NewWin, которая должна открывать
окно. Необходимо лишь написать соответствующие процедуры: для инициализации окна и для
подключения обработки события, возникающего при нажатии клавиши F4.
Поскольку мы включаем в нашу программу новый объект, то необходимо внести добавления в раздел
описания типов:
Type
PDemoWindow=^TDemoWindow;
TDemoWindow=object(TWindow)
end;
Кроме того, нам понадобится новая константа WinCount:
инициализируется счетчик окон.
Integer=0, с помощью которой
Для того, чтобы окно Turbo Vision – его объект TWindow – смогло себя инициализировать, ему
необходимо передать три параметра: его размер и положение на экране, заголовок и номер окна.
Первый параметр – переменная типа TRect – описывает прямоугольный объект в Turbo Vision. Его
метод Assign задает положение верхнего левого угла окна (относительно верхнего левого угла
DeskTop) и положение нижнего правого угла окна. Второй параметр – строка (то есть величина типа
string) – будет выведен на экран в качестве заголовка окна. Наконец, последний параметр –
величина типа integer – задает номер окна. Если он имеет значения от 1 до 9, он выводится в рамке
окна и выбор пронумерованного окна можно осуществлять, нажимая клавиши от Alt+1 до Alt+9.
Если Вы не хотите назначать окну номер, передайте процедуре инициализации в качестве третьего
параметра константу wnNoNumber.
С учетом сказанного процедура создания окна может выглядеть следующим образом:
procedure TMyApp.NewWindow;
var
Window: PDemoWindow;
R: TRect;
begin
Inc(WinCount);
{задаем номер следующего окна}
R.Assign(0,0,30,7);
{задаем положение и размер окна}
R.Move(Random(58),Random(16));
{определяем случайное смещение, чтобы окна не перекрывали
друг друга}
�Оглавлен ие
Window:=New(PDemoWindow,
{инициализируем окно}
Init(R,'Demo Window ', WinCount));
DeskTop^.Insert(Window);
{выводим окно на панель экрана}
end;
Теперь нужно сделать так, чтобы записанная выше процедура начинала свою работу при нажатии
соответствующей клавиши (или при выборе пункта меню). Для этого нужно задействовать обработчик
событий Turbo Vision. Как уже упоминалось, объект TApplication владеет методом
HandleEvent и нам нужно расширить его, включив новую команду (не забудьте добавить новую
процедуру в описание TMyApp):
procedure TMyApp.HandleEvent(var Event: TEvent);
var R: TRect;
begin
TApplication.HandleEvent(Event);
{наследуем старый метод}
if Event.What=evCommand then
begin
case Event.Command of
{но добавляем в него новые команды}
cmNewWin: NewWindow;
else
Exit;
end;
ClearEvent(Event);
{очищает событие после обработки}
end;
end;
Внеся перечисленные дополнения в Вашу программу, Вы получаете возможность открыть любое
число окон. Обратите внимание на то, что после открытия окон немедленно активизируются команды
Close в статусной строке и Next и Zoom в меню Window. Как уже указывалось, окно, кроме того,
умеет перемещаться по экрану и менять свой размер. Если Вы пользуетесь мышкой, то изменить размер
окна или передвинуть его можно с ее помощью, ничего не добавляя в код программы. Если же мышки
нет, то соответствующие возможности появятся лишь после включения стандартной команды
Size/Move, которая обычно связывается с клавишей CtrlF+5. Эту команду можно внести в меню
Window:
NewItem('~S~ize/Move','Ctr-F5',kbCtrlF5,cmResize,
hcNoContext,
(напомним, что после выбора команды Size/Move перемещение окна осуществляется курсорными
клавишами, а изменение его размера – курсорными клавишами с нажатой клавишей Shift). После
всех необходимых изменений Ваша программа примет вид:
program TFist3;
�Оглавлен ие
uses App,Objects,Menus,Drivers,Views;
const
cmNewWin=199;
cmFileOpen=200;
winCount: Integer=0;
type
TMyApp=Object(TApplication)
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
procedure NewWindow; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
end;
type
PDemoWindow=^TDemoWindow;
TDemoWindow=object(TWindow)
end;
var
MyApp: TMyApp;
procedure TMyApp.InitStatusLine;
var R:TRect;
begin
GetExtent(R);
R.A.Y:=R.B.Y-1;
StatusLine:=New(PStatusLine,Init(R,
NewStatusDef(0,$FFFF,
NewStatusKey('~Alt-X~ Exit',kbAltX,cmQuit,
NewStatusKey('~F4~ New',kbF4,cmNewWin,
NewStatusKey('~Alt-F3~ Close',kbAltF3,cmClose,
NewStatusKey('~F10~ Menu',kbF10,cmMenu,
nil)))),
nil)))
end;
procedure TMyApp.InitMenuBar;
var R:TRect;
�Оглавлен ие
begin
GetExtent(R);
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar,Init(R,NewMenu(
NewSubMenu('~F~ile',hcNoContext,NewMenu(
NewItem('~O~pen','F3',kbF3,cmFileOpen,
hcNoContext,
NewItem('~N~ew','F4',kbF4,cmNewWin,
hcNoContext,
NewLine(
NewItem('E~x~it','Alt-X',kbAltX,cmQuit,
hcNoContext,
nil))))),
NewSubMenu('~W~indow',hcNoContext,NewMenu(
NewItem('~N~ext','F6',kbF6,cmNext,
hcNoContext,
NewItem('~Z~oom','F5',kbF5,cmZoom,
hcNoContext,
NewItem('~S~ize/Move','Ctr-F5',kbCtrlF5,cmResize,
hcNoContext,
nil)))),
nil)))))
end;
procedure TMyApp.NewWindow;
var
Window: PDemoWindow;
R: TRect;
begin
Inc(WinCount);
R.Assign(0,0,30,7);
R.Move(Random(58),Random(16));
Window:=New(PDemoWindow, Init(R,'Demo Window ', WinCount));
DeskTop^.Insert(Window);
end;
�Оглавлен ие
procedure TMyApp.HandleEvent(var Event: TEvent);
var R: TRect;
begin
TApplication.HandleEvent(Event);
if Event.What=evCommand then
begin
case Event.Command of
cmNewWin: NewWindow;
else
Exit;
end;
ClearEvent(Event);
end;
end;
BEGIN
MyApp.Init;
MyApp.Run;
MyApp.Done;
END.
Окна, которые создаются в Вашей программе, обладают свойствами, установленными по умолчанию
для объектов типа TWindow. Для того, чтобы их изменить, необходимо обратиться к полям, которыми
располагает этот объект (описание всех объектов можно найти в справке помощи Турбо Паскаля –
меню Help). Одно из полей TWindows – Options – это переменная типа Word, которая содержит
флаги, управляющие поведением окон (или других видимых элементов). По умолчанию при создании
окна Options установлено в (ofSelectabl + ofTopSelect). Это означает, что окно может быть
выбрано мышкой (или командой Next), и выбранное окно передвигается наверх других окон. Изменим
поле Options, добавив флаг ofTileable, который позволяет окнам заполнять DeskTop каскадом
или мозаикой. Сделать это нужно после того, как окно создано, то есть в процедуру
TMyApp.NewWindow после строки, вызывающей процедуру инициализации окна, нужно добавить
строку
Window^.Options:=Window^.Options+ofTileable;
Кроме того, добавим соответствующие команды в меню Window
NewItem('~T~ile','',0,cmTile,
hcNoContext,
NewItem('~C~ascade','',0,cmCascade,
hcNoContext,
�Оглавлен ие
Наконец, мы должны определить реакцию на выбор этих команд, то есть добавить в процедуру
TMyApp.HandleEvent описание действий, которые нужно выполнить:
cmTile:
begin
DeskTop^.GetExtent(R);
DeskTop^.Tile(R);
end;
cmCascade:
begin
DeskTop^.GetExtent(R);
DeskTop^.Cascade(R);
end;
Если Вы все сделали правильно, то открытые Вами окна теперь можно будет располагать каскадом или
мозаикой.
Еще одно поле, которым располагает TWindow – поле Palette типа integer. Это поле задает цвет
wpCyanWindow
и
элементов окна. Стандартными являются значения wpBlueWindow,
wpGrayWindow. Легко, например, сделать серыми второе и четвертое из открываемых окон. Для этого
в процедуру TMyApp.NewWindow достаточно добавить строку:
if ((WinCount=2) or (WinCount=4)) then
Window^.Palette:=wpGrayWindow;
Для того, чтобы изменить стандартную “раскраску” окон, необходимо воспользоваться виртуальной
функцией GetPalette: PPalette. Это выглядит так:
function TDemoWindow.GetPalette: PPalette;
const
CDemoWindow=#15#9#5;
PDemoWindow: string[Length(CDemoWindow)]=CDemoWindow;
begin
GetPalette:=@PDemoWindow;
end;
Константа CDemoWindow и содержит описание новой палитры окна. Ее первый бит (#15) определяет
цвет рамки пассивного окна, второй (#9) – цвет рамки активного окна, третий (#5) – цвет кнопок
управления окном. Всего в CDemoWindow содержится восемь бит, определяющих полную окраску
окна. Вы можете удивиться, почему, указав цвет 15, Вы получили не белое окно, а красное (15 номер
соответствует белому цвету в стандартном Паскале). Дело в том, что передача цветов в Turbo
Vision происходит достаточно сложным образом. Во-первых, для отображения некоторого видимого
объекта нужно задать два цвета – цвет фона и цвет изображения. Во-вторых, каждый видимый объект
имеет своего “хозяина”, который этим объектом владеет, соответственно должны быть согласованы
�Оглавлен ие
цвета различных объектов. Поэтому в CDemoWindow на самом деле Вы указываете не сам цвет окна, а
то место, которое нужный Вам цвет (точнее пара – цвет фона + цвет изображения) занимает в палитре
цветов объекта-хозяина. Хозяином всех наших окон является DeskTop, который, однако, собственной
палитры не имеет. Поэтому, поднимаясь по дереву иерархии, мы находим другого хозяина –
TProgram, в палитре которого и находятся выбранные нами цвета. Не вдаваясь в подробности
описания сложной палитры TProgram, Вы можете попробовать «экспериментально» подобрать те
цвета, которые покажутся Вам наиболее удачными.
После всех внесенных изменений Ваша программа должна принять окончательный вид:
program TFirst3;
uses App,Objects,Menus,Drivers,Views;
const
cmNewWin=199;
cmFileOpen=200;
winCount: Integer=0;
type
TMyApp=Object(TApplication)
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
procedure NewWindow; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
end;
type
PDemoWindow=^TDemoWindow;
TDemoWindow=object(TWindow)
function GetPalette: PPalette;virtual;
end;
var
MyApp: TMyApp;
function TDemoWindow.GetPalette: PPalette;
const
CDemoWindow=#15#13#4;
PDemoWindow: string[Length(CDemoWindow)]=CDemoWindow;
begin
GetPalette:=@PDemoWindow;
end;
�Оглавлен ие
procedure TMyApp.InitStatusLine;
var R:TRect;
begin
GetExtent(R);
R.A.Y:=R.B.Y-1;
StatusLine:=New(PStatusLine,Init(R,
NewStatusDef(0,$FFFF,
NewStatusKey('~Alt-X~Exit',kbAltX,cmQuit,
NewStatusKey('~F4~New',kbF4,cmNewWin,
NewStatusKey('~Alt-F3~Close',kbAltF3,cmClose,
NewStatusKey('~F10~Menu',kbF10,cmMenu,
nil)))),
nil)))
end;
procedure TMyApp.InitMenuBar;
var R:TRect;
begin
GetExtent(R);
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar,Init(R,NewMenu(
NewSubMenu('~F~ile',hcNoContext,NewMenu(
NewItem('~O~pen','F3',kbF3,cmFileOpen,
hcNoContext,
NewItem('~N~ew','F4',kbF4,cmNewWin,
hcNoContext,
NewLine(
NewItem('E~x~it','Alt-X',kbAltX,cmQuit,
hcNoContext,
nil))))),
NewSubMenu('~W~indow',hcNoContext,NewMenu(
NewItem('~N~ext','F6',kbF6,cmNext,
hcNoContext,
NewItem('~Z~oom','F5',kbF5,cmZoom,
hcNoContext,
�Оглавлен ие
NewItem('~S~ize/Move','Ctr-F5',kbCtrlF5,cmResize,
hcNoContext,
NewItem('~T~ile','',0,cmTile,
hcNoContext,
NewItem('~C~ascade','',0,cmCascade,
hcNoContext,
nil)))))),
nil)))))
end;
procedure TMyApp.NewWindow;
var
Window: PDemoWindow;
R: TRect;
begin
Inc(WinCount);
R.Assign(0,0,30,7);
R.Move(Random(58),Random(16));
Window:=New(PDemoWindow, Init(R,'Demo Window ', WinCount));
Window^.Options:=Window^.Options+ofTileable;
DeskTop^.Insert(Window);
end;
procedure TMyApp.HandleEvent(var Event: TEvent);
var R: TRect;
begin
TApplication.HandleEvent(Event);
if Event.What=evCommand then
begin
case Event.Command of
cmNewWin: NewWindow;
cmTile:
begin
DeskTop^.GetExtent(R);
DeskTop^.Tile(R);
end;
�Оглавлен ие
cmCascade:
begin
DeskTop^.GetExtent(R);
DeskTop^.Cascade(R);
end
else Exit;
end;
end;
end;
BEGIN
MyApp.Init;
MyApp.Run;
MyApp.Done;
END.
�Оглавлен ие
Задания для самостоятельной работы
Поупражняйтесь в изменении атрибутов создаваемых программой TFirst3 окон:
а) сделайте так, чтобы первые десять окон имели индивидуальные заголовки (например, Первое
окно, Второе окно и т. д.);
б) сделайте так, чтобы первые четыре окна при их выводе на экран располагались каскадом;
в) сделайте так, чтобы первые четыре окна при выводе их на экран располагались мозаикой.
Измените атрибуты третьего окна так, чтобы оно стало недоступным для пользователя, то есть после
создания не реагировало бы ни на какие команды от мышки или клавиатуры.
�Оглавлен ие
Лабораторная работа № 25
ИНТЕРЬЕР
В предыдущей работе мы научились создавать окна, правда, пока совершенно пустые. Попробуем
теперь заполнить окно, поместив в него для начала какую-нибудь простую фразу, например «Я Вам
пишу». В стандартном Паскале мы воспользовались бы для этой цели оператором Write. Однако в
Turbo Vision он явно не годится – этот оператор просто выведет данную фразу на экран, а нам
этого мало! Наши окна умеют делать множество вещей – перемещаться, изменять свои размеры,
закрываться, а написанная с помощью Write фраза ничего этого не знает. Вместе с тем,
приобретенный в предыдущих работах опыт подсказывает, что нам нужно – нам нужен видимый
объект, который составит с окном группу и, следовательно, будет себя вести в соответствии с
требованиями хозяина (т.е. окна) – перемещаться вместе с ним, исчезать при его закрытии и так далее.
Этот видимый объект и называют интерьером окна или просто интерьером. Как мы уже отмечали, все
видимые объекты являются потомками TView, поэтому его объявление в соответствии с общими
правилами Turbo Vision будет иметь вид:
PInterior=^TInterior;
TInterior=object(TView)
Для инициализации объекта TInterior нам достаточно указать размеры той области, которую он
будет занимать, то есть инициализировать единственное поле, определяемое переменной типа TRect.
Следовательно, в описание объекта войдет конструктор
constructor TInterior.Init(var Bounds: TRect);
Наконец, TInterior должен уметь себя рисовать. Все видимые объекты рисуют себя с помощью
родительского метода Draw, который нам необходимо расширить, поскольку создаем мы наш
собственный интерьер (в предыдущей работе мы создавали стандартные окна и расширение метода
Draw нам не потребовалось). Следовательно, в описание TInterior войдет виртуальная процедура
Draw и раздел описания типов нашей программы TFirst3 пополнится строками:
PInterior=^TInterior;
TInterior=object(TView)
constructor TInterior.Init(var Bounds: TRect);
procedure Draw; virtual;
end;
Входящие сюда конструктор и процедура описываются следующим кодом:
constructor TInterior.Init(var Bounds: TRect);
begin
TView.Init(Bounds);
{вызываем метод Init предка}
GRowMode:=gfGrowHiX+gfGrowHiY;
{и устанавливаем, что при изменении размеров окна его
интерьер будет сохранять постоянное расстояние от правой и нижней границ окна-владельца}
end;
procedure TInterior.Draw;
�Оглавлен ие
var
S: string;
begin
TView.Draw;
{вызываем метод предка}
S:='Я Вам пишу';
WriteStr(4,2,S,6);
{добавляем в интерьер необходимую запись; первые две цифры
— относительные координаты строки S, последняя — код цвета строки}
end;
Теперь нужно подсоединить интерьер к окну. На языке Turbo Vision это означает, что мы должны
снова инициализировать окно, теперь уже с добавлением к нему интерьера. Поэтому придется
написать конструктор Init для нашего объекта TDemoWindow. Он может выглядеть, например, так:
constructor TDemoWindow.Init(Bounds: TRect; WinTitle: string; WindowNo:
Integer);
Var
{не забудьте обновить описание типов}
S: string[3];
Interior: PInterior;
begin
Str(WindowNo, S);
{переводим численное значение
номера окна в строку}
TWindow.Init(Bounds, WinTitle+' '+S, wnNoNumber); {и добавляем его к заголовку окна}
GetClipRect(Bounds);
{запрашиваем размеры доступного
Bounds.Grow(-1,-1);
{устанавливаем размеры интерьера на
Interior:=New(PInterior, Init(Bounds));
{инициализируем интерьер}
Insert(Interior);
{и вставляем его в окно}
пространства окна}
единицу меньше размеров окна}
end;
Если Вы правильно внесли изменения в программу TFirst3, то можете увидеть на экране результат
своих трудов и поупражняться в изменении атрибутов созданного интерьера.
Кроме процедуры WriteStr для записи в окно может использоваться и процедура
WriteChar(X,Y,Ch,Color,Count),
которая позиционирует свой вывод в координаты (X,Y) относительно видимого элемента и пишет
Count копий символа Ch, цветом Color из палитры видимого элемента. Эту процедуру удобно
использовать при создании, например, рамок.
После внесенных изменений Ваша программа должна принять вид:
program TFirst4;
uses App,Objects,Menus,Drivers,Views;
�Оглавлен ие
const
cmNewWin=199;
cmFileOpen=200;
winCount: Integer=0;
type
TMyApp=Object(TApplication)
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
procedure NewWindow; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
end;
type
PDemoWindow=^TDemoWindow;
TDemoWindow=object(TWindow)
constructor Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
end;
type
PInterior=^Tinterior;
TInterior=object(TView)
constructor Init(var Bounds: TRect);
procedure Draw; virtual;
end;
var
MyApp: TMyApp;
S: string;
constructor TInterior.Init(var Bounds: TRect);
begin
TView.Init(Bounds);
GRowMode:=gfGrowHiX+gfGrowHiY;
end;
procedure TInterior.Draw;
var
S: string;
�Оглавлен ие
begin
TView.Draw;
S:='Запись в окно';
WriteStr(4,2,S,6);
end;
constructor TDemoWindow.Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
var
S: string[3];
Interior: PInterior;
begin
Str(WindowNo, S);
TWindow.Init(Bounds, WinTitle+' '+S, wnNoNumber);
GetClipRect(Bounds);
Bounds.Grow(-1,-1);
Interior:=New(PInterior, Init(Bounds));
Insert(Interior);
end;
procedure TMyApp.InitStatusLine;
var R:TRect;
begin
GetExtent(R);
R.A.Y:=R.B.Y-1;
StatusLine:=New(PStatusLine,Init(R,
NewStatusDef(0,$FFFF,
NewStatusKey('~Alt-X~Exit',kbAltX,cmQuit,
NewStatusKey('~F4~New',kbF4,cmNewWin,
NewStatusKey('~Alt-F3~Close',kbAltF3,cmClose,
NewStatusKey('~F10~Menu',kbF10,cmMenu,
nil)))),
nil)))
end;
procedure TMyApp.InitMenuBar;
var R:TRect;
begin
�Оглавлен ие
GetExtent(R);
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar,Init(R,NewMenu(
NewSubMenu('~F~ile',hcNoContext,NewMenu(
NewItem('~O~pen','F3',kbF3,cmFileOpen,
hcNoContext,
NewItem('~N~ew','F4',kbF4,cmNewWin,
hcNoContext,
NewLine(
NewItem('E~x~it','Alt-X',kbAltX,cmQuit,
hcNoContext,
nil))))),
NewSubMenu('~W~indow',hcNoContext,NewMenu(
NewItem('~N~ext','F6',kbF6,cmNext,
hcNoContext,
NewItem('~Z~oom','F5',kbF5,cmZoom,
hcNoContext,
NewItem('~S~ize/Move','Ctr-F5',kbCtrlF5,cmResize,
hcNoContext,
NewItem('~T~ile','',0,cmTile,
hcNoContext,
NewItem('~C~ascade','',0,cmCascade,
hcNoContext,
nil)))))),
nil)))))
end;
procedure TMyApp.NewWindow;
var
Window: PDemoWindow;
R: TRect;
begin
Inc(WinCount);
R.Assign(0,0,30,7);
R.Move(Random(58),Random(16));
Window:=New(PDemoWindow, Init(R,'Demo Window ', WinCount));
�Оглавлен ие
Window^.Options:=Window^.Options+ofTileable;
DeskTop^.Insert(Window);
end;
procedure TMyApp.HandleEvent(var Event: TEvent);
var
R: TRect;
begin
TApplication.HandleEvent(Event);
if Event.What=evCommand then
begin
case Event.Command of
cmNewWin: NewWindow;
cmTile:
begin
DeskTop^.GetExtent(R);
DeskTop^.Tile(R);
end;
cmCascade:
begin
DeskTop^.GetExtent(R);
DeskTop^.Cascade(R);
end
else Exit;
end;
ClearEvent(Event);
end;
end;
BEGIN
MyApp.Init;
MyApp.Run;
MyApp.Done;
END.
Выбранный нами способ записи в окно выглядит слишком примитивно и вряд ли может быть полезен
на практике. Очевидно, что гораздо эффективнее записывать нужную для вывода информацию в файл,
�Оглавлен ие
а уж затем помещать ее в окно. Поэтому напишем процедуру чтения информации из файла. Она может
выглядеть так:
procedure ReadFile;
var
F: Text;
S: String;
begin
LineCount:= 0;
Assign(F,FileToRead);
Reset(F);
while not Eof(F) and (LineCount < MaxLines) do
begin
Readln(F, S);
Lines[LineCount]:= NewStr(S);
Inc(LineCount);
end;
Close(F);
end;
Эта процедура считывает информацию из файла F и помещает ее в строковый массив Lines:
- 1] of PString. Переменная LineCount типа integer является
счетчиком строк, а постоянная MaxLines задает максимальное значение числа строк в массиве.
Понятно, что эти величины должны быть добавлены в раздел описания данных Вашей программы (как
станет ясным из дальнейшего, это глобальные величины). Кроме того, в раздел описания констант
нужно добавить и путь к файлу, из которого будет читаться информация, то есть задать значение
строковой постоянной FileToRead. В качестве этого файла можно просто использовать файл, в
котором хранится код Вашей программы. Например, если Ваша программа записана на диске С: в
каталоге tp6 под именем MyFirst3.pas, то объявление константы будет иметь вид:
FileToRead='с:\tp6\ MyFirst3.pas'. Однако, для того, чтобы не возникало ощущения, что Вы
наблюдаете через окно редактор Турбо Паскаля, лучше написать с его помощью любой текст и
сохранить его под любым именем с расширением txt. Не забудьте добавить вызов ReadFile в код
основной программы (перед MyApp.Init).
array[0..MaxLines
Поскольку Вы занимаете под хранение информации, считанной из файла, определенную память, то
после использования этой информации память необходимо освободить. Для этого напишем
процедуру DoneFile (в этом тоже проявляется один из принципов Turbo Vision – все, что было
открыто, нужно закрыть!):
procedure DoneFile;
var
I: Integer;
begin
�Оглавлен ие
for I:= 0 to LineCount - 1 do
if Lines[I] <> nil then DisposeStr(Lines[i]);
end;
Осталось изменить код процедуры Draw:
procedure TInterior.Draw;
var
Y: Integer;
begin
for Y:= 0 to Size.Y - 1 do
begin
WriteStr(0, Y, Lines[Y]^, $06);
end;
end;
Запустив после внесенных изменений программу, Вы увидите, что на тех местах, где должны быть
пустые строки, появляются лишние символы. Это произошло потому, что мы нарушили принцип,
согласно которому метод Draw должен покрывать всю площадь, за которую отвечает использующий
его видимый элемент. Поэтому еще раз изменим процедуру Draw, помещая считываемые из файла
Turbo
Vision
строки не
в
массив,
а в
буфер
(буфер
в
–
это
тип
TDrawBuffer=array[0..MaxViewWidth] и постоянная MaxViewWidth равна 132 символам).
Новый Draw будет иметь вид:
procedure TInterior.Draw;
var
Color: Byte;
Y: Integer;
B: TDrawBuffer;
begin
Color:= GetColor(6);
for Y:= 0 to Size.Y - 1 do
begin
MoveChar(B, ' ', Color, Size.X);
{заполняет буфер пробелами}
if (Y < LineCount) and (Lines[Y] <> nil) then
MoveStr(B, Copy(Lines[Y]^, 1, Size.X), Color);
{и копирует строку в буфер}
WriteLine(0, Y, Size.X, 1, B);
{выводит содержимое буфера}
end;
end;
Запустив программу, Вы увидите, что теперь все работает нормально – пустые места заполнены
пробелами, как и должно быть. Для пересылки текста в буфер были использованы две глобальные
�Оглавлен ие
процедуры: MoveChar – для пересылки символов и MoveStr – для пересылки строк. Кроме них могут
использоваться MoveСStr – для пересылки управляющих символов и управляющих строк (с «~» для
элементов меню и статуса) и MoveBuf – для пересылки буфера в буфер.
Для вывода содержимого буфера имеются две процедуры. WriteLine(X, Y, W, H, Buf) выводит
содержимое буфера Buf в строку длиной в W символов, начиная с позиции X, Y. Если параметр H
больше единицы, буфер повторяется H раз. WriteBuf(X, Y, W, H, Buf) также выводит
содержимое буфера, но W и H задают ширину и высоту вывода. Так, если в буфере – «Я Вам пишу», то
процедура WriteBuf(0, 0, 3, 3, Buf) выведет
Я В
ам
пиш
Со всеми внесенными изменениями Ваша программа должна принять вид:
program TFirst4;
uses App,Objects,Menus,Drivers,Views;
const
FileToRead='e:\tp6\tutor\urok.txt';
{здесь должен быть к путь Вашему файлу}
MaxLines = 100;
cmNewWin=199;
cmFileOpen=200;
winCount: Integer=0;
type
TMyApp=Object(TApplication)
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
procedure NewWindow; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
end;
type
PDemoWindow=^TDemoWindow;
TDemoWindow=object(TWindow)
constructor Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
end;
type
PInterior=^Tinterior;
�Оглавлен ие
TInterior=object(TView)
constructor Init(var Bounds: TRect);
procedure Draw; virtual;
end;
var
MyApp: TMyApp;
S: string;
LineCount: Integer;
Lines: array[0..MaxLines - 1] of PString;
constructor TInterior.Init(var Bounds: TRect);
begin
TView.Init(Bounds);
GRowMode:=gfGrowHiX+gfGrowHiY;
end;
procedure ReadFile;
var
F: Text;
S: String;
begin
LineCount:= 0;
Assign(F,FileToRead);
Reset(F);
while not Eof(F) and (LineCount < MaxLines) do
begin
Readln(F, S);
Lines[LineCount]:= NewStr(S);
Inc(LineCount);
end;
Close(F);
end;
procedure DoneFile;
var
I: Integer;
begin
for I:= 0 to LineCount - 1 do
�Оглавлен ие
if Lines[I] <> nil then DisposeStr(Lines[i]);
end;
procedure TInterior.Draw;
var
Color: Byte;
Y: Integer;
B: TDrawBuffer;
begin
Color:= GetColor(6);
for Y:= 0 to Size.Y - 1 do
begin
MoveChar(B, ' ', Color, Size.X);
if (Y < LineCount) and (Lines[Y] <> nil) then
MoveStr(B, Copy(Lines[Y]^, 1, Size.X), Color);
WriteLine(0, Y, Size.X, 1, B);
end;
end;
constructor TDemoWindow.Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
var
S: string[3];
Interior: PInterior;
begin
Str(WindowNo, S);
TWindow.Init(Bounds, WinTitle+' '+S, wnNoNumber);
GetClipRect(Bounds);
Bounds.Grow(-1,-1);
Interior:=New(PInterior, Init(Bounds));
Insert(Interior);
end;
procedure TMyApp.InitStatusLine;
var R:TRect;
begin
GetExtent(R);
R.A.Y:=R.B.Y-1;
�Оглавлен ие
StatusLine:=New(PStatusLine,Init(R,
NewStatusDef(0,$FFFF,
NewStatusKey('~Alt-X~Exit',kbAltX,cmQuit,
NewStatusKey('~F4~New',kbF4,cmNewWin,
NewStatusKey('~Alt-F3~Close',kbAltF3,cmClose,
NewStatusKey('~F10~Menu',kbF10,cmMenu,
nil)))),
nil)))
end;
procedure TMyApp.InitMenuBar;
var R:TRect;
begin
GetExtent(R);
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar,Init(R,NewMenu(
NewSubMenu('~F~ile',hcNoContext,NewMenu(
NewItem('~O~pen','F3',kbF3,cmFileOpen,
hcNoContext,
NewItem('~N~ew','F4',kbF4,cmNewWin,
hcNoContext,
NewLine(
NewItem('E~x~it','Alt-X',kbAltX,cmQuit,
hcNoContext,
nil))))),
NewSubMenu('~W~indow',hcNoContext,NewMenu(
NewItem('~N~ext','F6',kbF6,cmNext,
hcNoContext,
NewItem('~Z~oom','F5',kbF5,cmZoom,
hcNoContext,
NewItem('~S~ize/Move','Ctr-F5',kbCtrlF5,cmResize,
hcNoContext,
NewItem('~T~ile','',0,cmTile,
hcNoContext,
NewItem('~C~ascade','',0,cmCascade,
�Оглавлен ие
hcNoContext,
nil)))))),
nil)))))
end;
procedure TMyApp.NewWindow;
var
Window: PDemoWindow;
R: TRect;
begin
Inc(WinCount);
R.Assign(0,0,30,7);
R.Move(Random(58),Random(16));
Window:=New(PDemoWindow, Init(R,'Demo Window ', WinCount));
Window^.Options:=Window^.Options+ofTileable;
DeskTop^.Insert(Window);
end;
procedure TMyApp.HandleEvent(var Event: TEvent);
var
R: TRect;
begin
TApplication.HandleEvent(Event);
if Event.What=evCommand then
begin
case Event.Command of
cmNewWin: NewWindow;
cmTile:
begin
DeskTop^.GetExtent(R);
DeskTop^.Tile(R);
end;
cmCascade:
begin
DeskTop^.GetExtent(R);
DeskTop^.Cascade(R);
�Оглавлен ие
end
else Exit;
end;
ClearEvent(Event);
end;
end;
BEGIN
ReadFile;
MyApp.Init;
MyApp.Run;
MyApp.Done;
END.
�Оглавлен ие
Задания для самостоятельной работы
1. Меняя состояния окон, наблюдайте за изменениями их интерьера.
2. Поэкспериментируйте с процедурами пересылки текста в буфер и вывода из него, меняя их
параметры.
3. Поэкспериментируйте с цветами окон и выводимого текста, добиваясь наилучшего соотношения
цветов.
�Оглавлен ие
Лабораторная работа № 26
СКРОЛЛИНГ
Созданный нами в предыдущей работе интерьер обладает тем недостатком, что позволяет просмотреть
лишь несколько первых строк открываемого файла. Поэтому удобнее использовать в качестве
интерьера другой видимый объект – TScroller. Этот объект позволяет добавить к нему полосы
скроллинга, так что TInterior становится окном, скользящим по текстовому файлу. Для этого нам
придется изменить объявление TInterior:
type
PInterior=^TInterior;
TInterior=object(TScroller)
constructor Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
procedure Draw; virtual;
end;
Вы видите, что теперь TInterior объявляется как объект TScroller, при инициализации которого
задаются занимаемая им область (переменная Bounds типа TRect) и полосы вертикальной и
горизонтальной прокрутки (AHScrollBar, AVScrollBar).
Кроме того, удобно изменить и объект TDemoWindow, добавив в него метод MakeInterior, с тем,
чтобы отделить эту процедуру от механизма открытия окна:
type
PDemoWindow=^TDemoWindow;
TDemoWindow=object(TWindow)
constructor Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
procedure MakeInterior(Bounds: TRect);
end;
Понятно, что должно измениться и правило инициализации объекта TInterior:
constructor TInterior.Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
begin
TScroller.Init(Bounds, AHScrollBar, AVScrollBar);
GrowMode:= gfGrowHiX + gfGrowHiY;
Options:= Options or ofFramed;
SetLimit(128, LineCount);
{горизонтальная и вертикальная границы скроллинга}
�Оглавлен ие
end;
Соответственно, метод Draw для объекта TInterior и конструктор Init для TDemoWindow будут
выглядеть так:
procedure TInterior.Draw;
var
Color: Byte;
I,Y: Integer;
B: TDrawBuffer;
begin
Color:= GetColor(1);
for Y:= 0 to Size.Y - 1 do
begin
MoveChar(B, ' ', Color, Size.X);
i:= Delta.Y + Y;
if (I < LineCount) and (Lines[I] <> nil) then
MoveStr(B, Copy(Lines[I]^, Delta.X + 1, Size.X), Color);
WriteLine(0, Y, Size.X, 1, B);
end;
end;
constructor TDemoWindow.Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
var
S: string[3];
Interior: PInterior;
begin
Str(WindowNo, S);
TWindow.Init(Bounds, WinTitle+' '+S, wnNoNumber);
GetExtent(Bounds);
Bounds.Grow(-1,-1);
MakeInterior(Bounds);
end;
Теперь осталось лишь написать процедуру MakeInterior:
procedure TDemoWindow.MakeInterior(Bounds: TRect);
var
�Оглавлен ие
HScrollBar, VScrollBar: PScrollBar;
Interior: PInterior;
R: TRect;
begin
VScrollBar:= StandardScrollBar(sbVertical + sbHandleKeyboard);
HScrollBar:= StandardScrollBar(sbHorizontal + sbHandleKeyboard);
GetExtent(Bounds);
Bounds.Grow(-1,-1);
Interior:= New(PInterior, Init(Bounds, HScrollBar, VScrollBar));
Insert(Interior);
end;
Из записанных выше процедур видно, что вертикальная и горизонтальная полосы скроллинга
инициализируются и вставляются в группу, а затем передаются в TScroller при его инициализации.
Скроллер – это видимый элемент, спроектированный для отображения части большого видимого
элемента. Скроллер и его полосы прокрутки (скроллинга) объединяются для создания скользящего
видимого элемента с незначительными усилиями. Все, что нам нужно сделать – это создать метод
Draw, чтобы он отображал соответствующую часть виртуального видимого элемента. Полосы
скроллинга автоматически управляют значениями Delta.X (колонка, с которой начинается вывод) и
Delta.Y (строка, с которой начинается вывод) скроллера.
Мы должны перекрыть метод Draw в TScroller. Значения Delta изменяются в соответствии с
полосами скроллинга. Метод Draw вызывается каждый раз, когда изменяется Delta.
Если Вы правильно внесли все изменения в Вашу программу TFirst4, то она должна принять вид:
program TFirst5;
uses App,Objects,Menus,Drivers,Views;
const
FileToRead='e:\tp6\tutor\urok.txt';
MaxLines = 100;
cmNewWin=199;
cmFileOpen=200;
winCount: Integer=0;
type
TMyApp=Object(TApplication)
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
procedure NewWindow; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
�Оглавлен ие
end;
type
PDemoWindow=^TDemoWindow;
TDemoWindow=object(TWindow)
constructor Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
procedure MakeInterior(Bounds: TRect);
end;
type
PInterior=^Tinterior;
TInterior=object(TScroller)
constructor Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
procedure Draw; virtual;
end;
var
MyApp: TMyApp;
S: string;
LineCount: Integer;
Lines: array[0..MaxLines - 1] of PString;
constructor TInterior.Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
begin
TScroller.Init(Bounds, AHScrollBar, AVScrollBar);
GrowMode:= gfGrowHiX + gfGrowHiY;
Options:= Options or ofFramed;
SetLimit(128, LineCount);
end;
procedure ReadFile;
var
F: Text;
S: String;
begin
LineCount:= 0;
�Оглавлен ие
Assign(F,FileToRead);
Reset(F);
while not Eof(F) and (LineCount < MaxLines) do
begin
Readln(F, S);
Lines[LineCount]:= NewStr(S);
Inc(LineCount);
end;
Close(F);
end;
procedure DoneFile;
var
I: Integer;
begin
for I:= 0 to LineCount - 1 do
if Lines[I] <> nil then DisposeStr(Lines[i]);
end;
procedure TInterior.Draw;
var
Color: Byte;
I,Y: Integer;
B: TDrawBuffer;
begin
Color:= GetColor(1);
for Y:= 0 to Size.Y - 1 do
begin
MoveChar(B, ' ', Color, Size.X);
i:= Delta.Y + Y;
if (I < LineCount) and (Lines[I] <> nil) then
MoveStr(B, Copy(Lines[I]^, Delta.X + 1, Size.X), Color);
WriteLine(0, Y, Size.X, 1, B);
end;
end;
constructor TDemoWindow.Init(Bounds: TRect; WinTitle: string;
�Оглавлен ие
WindowNo: Integer);
var
S: string[3];
Interior: PInterior;
begin
Str(WindowNo, S);
TWindow.Init(Bounds, WinTitle+' '+S, wnNoNumber);
MakeInterior(Bounds);
end;
procedure TDemoWindow.MakeInterior(Bounds: TRect);
var
HScrollBar, VScrollBar: PScrollBar;
Interior: PInterior;
R: TRect;
begin
VScrollBar:= StandardScrollBar(sbVertical + sbHandleKeyboard);
HScrollBar:= StandardScrollBar(sbHorizontal + sbHandleKeyboard);
GetExtent(Bounds);
Bounds.Grow(-1,-1);
Interior:= New(PInterior, Init(Bounds, HScrollBar, VScrollBar));
Insert(Interior);
end;
procedure TMyApp.InitStatusLine;
var R:TRect;
begin
GetExtent(R);
R.A.Y:=R.B.Y-1;
StatusLine:=New(PStatusLine,Init(R,
NewStatusDef(0,$FFFF,
NewStatusKey('~Alt-X~Exit',kbAltX,cmQuit,
NewStatusKey('~F4~New',kbF4,cmNewWin,
NewStatusKey('~Alt-F3~Close',kbAltF3,cmClose,
NewStatusKey('~F10~Menu',kbF10,cmMenu,
nil)))),
�Оглавлен ие
nil)))
end;
procedure TMyApp.InitMenuBar;
var R:TRect;
begin
GetExtent(R);
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar,Init(R,NewMenu(
NewSubMenu('~F~ile',hcNoContext,NewMenu(
NewItem('~O~pen','F3',kbF3,cmFileOpen,
hcNoContext,
NewItem('~N~ew','F4',kbF4,cmNewWin,
hcNoContext,
NewLine(
NewItem('E~x~it','Alt-X',kbAltX,cmQuit,
hcNoContext,
nil))))),
NewSubMenu('~W~indow',hcNoContext,NewMenu(
NewItem('~N~ext','F6',kbF6,cmNext,
hcNoContext,
NewItem('~Z~oom','F5',kbF5,cmZoom,
hcNoContext,
NewItem('~S~ize/Move','Ctr-F5',kbCtrlF5,cmResize,
hcNoContext,
NewItem('~T~ile','',0,cmTile,
hcNoContext,
NewItem('~C~ascade','',0,cmCascade,
hcNoContext,
nil)))))),
nil)))))
end;
procedure TMyApp.NewWindow;
var
Window: PDemoWindow;
�Оглавлен ие
R: TRect;
begin
Inc(WinCount);
R.Assign(0,0,30,7);
R.Move(Random(58),Random(16));
Window:=New(PDemoWindow, Init(R,'Demo Window ', WinCount));
Window^.Options:=Window^.Options+ofTileable;
DeskTop^.Insert(Window);
end;
procedure TMyApp.HandleEvent(var Event: TEvent);
var
R: TRect;
begin
TApplication.HandleEvent(Event);
if Event.What=evCommand then
begin
case Event.Command of
cmNewWin: NewWindow;
cmTile:
begin
DeskTop^.GetExtent(R);
DeskTop^.Tile(R);
end;
cmCascade:
begin
DeskTop^.GetExtent(R);
DeskTop^.Cascade(R);
end
else Exit;
end;
ClearEvent(Event);
end;
end;
BEGIN
�Оглавлен ие
ReadFile;
MyApp.Init;
MyApp.Run;
MyApp.Done;
END.
Попытаемся теперь продублировать интерьер и создадим окно с двумя видимыми элементами для
текстового файла. Мышка или клавиша Tab автоматически выбирает один из двух интерьеров.
Каждый видимый элемент скользит независимо от другого и имеет собственную позицию курсора.
Для того, чтобы сделать это, расширьте метод MakeInterior так, чтобы он знал, какая часть окна
является активным интерьером и сделайте два вызова MakeInterior в TDemoWindow.Init. Это
можно осуществить следующим образом:
function TDemoWindow.MakeInterior(Bounds: TRect; Left: Boolean): PInterior;
{не забудьте изменить объявление MakeInterior}
var
HScrollBar, VScrollBar: PScrollBar;
R: TRect;
begin
R.Assign(Bounds.B.X-1, Bounds.A.Y+1, Bounds.B.X, Bounds.B.Y-1);
VScrollBar:= New(PScrollBar, Init(R));
VScrollBar^.Options:= VScrollBar^.Options or ofPostProcess;
if Left then VScrollBar^.GrowMode:= gfGrowHiY;
Insert(VScrollBar);
R.Assign(Bounds.A.X+2, Bounds.B.Y-1, Bounds.B.X-2, Bounds.B.Y);
HScrollBar:= New(PScrollBar, Init(R));
HScrollBar^.Options:= HScrollBar^.Options or ofPostProcess;
if Left then HScrollBar^.GrowMode:= gfGrowHiY + gfGrowLoY;
Insert(HScrollBar);
Bounds.Grow(-1,-1);
MakeInterior:= New(PInterior, Init(Bounds, HScrollBar, VScrollBar));
end;
constructor TDemoWindow.Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
var
S: string[3];
R: TRect;
�Оглавлен ие
RInterior, LInserior: PInterior;
begin
Str(WindowNo, S);
TWindow.Init(Bounds, WinTitle+' '+S, wnNoNumber);
GetExtent(Bounds);
R.Assign(Bounds.A.X, Bounds.A.Y, Bounds.B.X div 2 + 1,
Bounds.B.Y);
LInterior:= MakeInterior(R, True);
LInterior^.GrowMode:= gfGrowHiY;
Insert(Linterior);
R.Assign(Bounds.B.X div 2, Bounds.A.Y, Bounds.B.X, Bounds.B.Y);
RInterior:= MakeInterior(R,False);
RInterior^.GrowMode:= gfGrowHiX + gfGrowHiY;
Insert(RInterior);
end;
Если Вы правильно внесли изменения в Вашу программу, то, открыв окно, Вы увидите в нем два
интерьера, которые можно выбрать (сделать активными) с помощью мышки или клавиши Tab.
Однако, если Вы уменьшите размер окна, то заметите, что вертикальная полоса скроллинга будет
перекрыта левым интерьером, если правая сторона окна придвинута слишком близко к левой. Это
можно предотвратить, перекрывая метод SizeLimits в TWindow (это виртуальный метод):
procedure TDemoWindow.SizeLimits(var Min,Max:TPoint);
var R: TRect;
begin
TWindow.SizeLimits(Min,Max);
GetExtent(R);
Min.X:=R.B.X div 2;
end;
Заметим, что Вы не вызываете SizeLimits, Вы просто перекрываете его, и он будет вызываться в
соответствующее время. Это похоже на то, что Вы делали с методом Draw: Вы говорите видимому
элементу, как его рисовать, но не когда. Turbo Vision уже знает, когда вызывать Draw. Это же
применимо и к SizeLimits – Вы устанавливаете границы, а видимый элемент знает тот момент,
когда необходимо проверить их. После всех изменений Ваша программа должна принять следующий
окончательный вид:
program TFirst5;
uses App,Objects,Menus,Drivers,Views;
const
FileToRead='e:\tp6\tutor\urok.txt';
�Оглавлен ие
MaxLines
= 100;
cmNewWin=199;
cmFileOpen=200;
winCount: Integer=0;
type
TMyApp=Object(TApplication)
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
procedure NewWindow; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
end;
type
PInterior=^Tinterior;
TInterior=object(TScroller)
constructor Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
procedure Draw; virtual;
end;
type
PDemoWindow=^TDemoWindow;
TDemoWindow=object(TWindow)
constructor Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
function MakeInterior(Bounds: TRect; Left: Boolean): PInterior;
procedure SizeLimits(var Min,Max:TPoint);virtual;
end;
var
MyApp: TMyApp;
S: string;
LineCount: Integer;
Lines: array[0..MaxLines - 1] of PString;
procedure TDemoWindow.SizeLimits(var Min,Max:TPoint);
var R: TRect;
begin
�Оглавлен ие
TWindow.SizeLimits(Min,Max);
GetExtent(R);
Min.X:=R.B.X div 2;
end;
constructor TInterior.Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
begin
TScroller.Init(Bounds, AHScrollBar, AVScrollBar);
Options:= Options or ofFramed;
SetLimit(128, LineCount);
end;
procedure ReadFile;
var
F: Text;
S: String;
begin
LineCount:= 0;
Assign(F,FileToRead);
Reset(F);
while not Eof(F) and (LineCount < MaxLines) do
begin
Readln(F, S);
Lines[LineCount]:= NewStr(S);
Inc(LineCount);
end;
Close(F);
end;
procedure DoneFile;
var
I: Integer;
begin
for I:= 0 to LineCount - 1 do
if Lines[I] <> nil then DisposeStr(Lines[i]);
end;
�Оглавлен ие
procedure TInterior.Draw;
var
Color: Byte;
I,Y: Integer;
B: TDrawBuffer;
begin
Color:= GetColor(1);
for Y:= 0 to Size.Y - 1 do
begin
MoveChar(B, ' ', Color, Size.X);
i:= Delta.Y + Y;
if (I < LineCount) and (Lines[I] <> nil) then
MoveStr(B, Copy(Lines[I]^, Delta.X + 1, Size.X), Color);
WriteLine(0, Y, Size.X, 1, B);
end;
end;
constructor TDemoWindow.Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
var
S: string[3];
R: TRect;
RInterior, LInterior: PInterior;
begin
Str(WindowNo, S);
TWindow.Init(Bounds, WinTitle+' '+S, wnNoNumber);
GetExtent(Bounds);
R.Assign(Bounds.A.X, Bounds.A.Y, Bounds.B.X div 2 + 1,
Bounds.B.Y);
LInterior:= MakeInterior(R, True);
LInterior^.GrowMode:= gfGrowHiY;
Insert(Linterior);
R.Assign(Bounds.B.X div 2, Bounds.A.Y, Bounds.B.X, Bounds.B.Y);
RInterior:= MakeInterior(R,False);
RInterior^.GrowMode:= gfGrowHiX + gfGrowHiY;
�Оглавлен ие
Insert(RInterior);
end;
function TDemoWindow.MakeInterior(Bounds: TRect; Left: Boolean): PInterior;
var
HScrollBar, VScrollBar: PScrollBar;
R: TRect;
begin
R.Assign(Bounds.B.X-1, Bounds.A.Y+1, Bounds.B.X, Bounds.B.Y-1);
VScrollBar:= New(PScrollBar, Init(R));
VScrollBar^.Options:= VScrollBar^.Options or ofPostProcess;
if Left then VScrollBar^.GrowMode:= gfGrowHiY;
Insert(VScrollBar);
R.Assign(Bounds.A.X+2, Bounds.B.Y-1, Bounds.B.X-2, Bounds.B.Y);
HScrollBar:= New(PScrollBar, Init(R));
HScrollBar^.Options:= HScrollBar^.Options or ofPostProcess;
if Left then HScrollBar^.GrowMode:= gfGrowHiY + gfGrowLoY;
Insert(HScrollBar);
Bounds.Grow(-1,-1);
MakeInterior:= New(PInterior, Init(Bounds, HScrollBar, VScrollBar));
end;
procedure TMyApp.InitStatusLine;
var R:TRect;
begin
GetExtent(R);
R.A.Y:=R.B.Y-1;
StatusLine:=New(PStatusLine,Init(R,
NewStatusDef(0,$FFFF,
NewStatusKey('~Alt-X~Exit',kbAltX,cmQuit,
NewStatusKey('~F4~New',kbF4,cmNewWin,
NewStatusKey('~Alt-F3~Close',kbAltF3,cmClose,
NewStatusKey('~F10~Menu',kbF10,cmMenu,
nil)))),
nil)))
end;
procedure TMyApp.InitMenuBar;
�Оглавлен ие
var R:TRect;
begin
GetExtent(R);
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar,Init(R,NewMenu(
NewSubMenu('~F~ile',hcNoContext,NewMenu(
NewItem('~O~pen','F3',kbF3,cmFileOpen,
hcNoContext,
NewItem('~N~ew','F4',kbF4,cmNewWin,
hcNoContext,
NewLine(
NewItem('E~x~it','Alt-X',kbAltX,cmQuit,
hcNoContext,
nil))))),
NewSubMenu('~W~indow',hcNoContext,NewMenu(
NewItem('~N~ext','F6',kbF6,cmNext,
hcNoContext,
NewItem('~Z~oom','F5',kbF5,cmZoom,
hcNoContext,
NewItem('~S~ize/Move','Ctr-F5',kbCtrlF5,cmResize,
hcNoContext,
NewItem('~T~ile','',0,cmTile,
hcNoContext,
NewItem('~C~ascade','',0,cmCascade,
hcNoContext,
nil)))))),
nil)))))
end;
procedure TMyApp.NewWindow;
var
Window: PDemoWindow;
R: TRect;
begin
Inc(WinCount);
�Оглавлен ие
R.Assign(0,0,30,7);
R.Move(Random(58),Random(16));
Window:=New(PDemoWindow, Init(R,'Demo Window ', WinCount));
Window^.Options:=Window^.Options+ofTileable;
DeskTop^.Insert(Window);
end;
procedure TMyApp.HandleEvent(var Event: TEvent);
var R: TRect;
begin
TApplication.HandleEvent(Event);
if Event.What=evCommand then
begin
case Event.Command of
cmNewWin: NewWindow;
cmTile:
begin
DeskTop^.GetExtent(R);
DeskTop^.Tile(R);
end;
cmCascade:
begin
DeskTop^.GetExtent(R);
DeskTop^.Cascade(R);
end
else Exit;
end;
ClearEvent(Event);
end;
end;
BEGIN
ReadFile;
MyApp.Init;
MyApp.Run;
MyApp.Done;
�Оглавлен ие
DoneFile;
END.
�Оглавлен ие
Задание для самостоятельной работы
1. Как создать в одном окне два разных интерьера?
�Оглавлен ие
Лабораторная работа № 27
ДИАЛОГОВЫЕ ОКНА
Диалоговые окна представляют собой специальный тип окон. Их назначение – вывод различного рода
сообщений, ввод данных, установка параметров и т. д. Другими словами, диалоговые окна служат для
организации диалога с пользователем. В Turbo Vision диалоговое окно – это объект TDialog.
Заметим, что Вам не придется порождать новый тип объекта от TDialog, как Вы это делали с
TWindow. Вместо создания специального типа диалогового окна Вы добавляете «разумность» в
программу: вместо создания объекта типа «диалоговое окно», который знает «как себя вести», Вы
создаете общее диалоговое окно и говорите ему, что оно должно сделать.
Для того чтобы использовать окно диалога в Вашей программе, необходимо выполнить следующие
действия:
• подключить модуль Dialogs;
• определить константу cmNewDialog, соответствующую команде открытия диалогового окна;
• в меню Window добавить новый элемент меню, который генерирует команду открытия диалогового
окна (связав ее, например, с клавишей F2);
• добавить метод, который знает, как открыть диалоговое окно:
procedure TMyApp.NewDialog;
var
Dialog: PDemoDialog;
R: TRect;
begin
R.Assign(0, 0, 40, 13);
R.Move(Random(39), Random(10));
Dialog:= New(PDemoDialog, Init(R, 'Demo Dialog'));
DeskTop^.Insert(Dialog);
end;
• добавить строку
cmNewDialog: NewDialog;
в метод HandleEvent, чтобы связать команду с действием.
Если Вы все сделали правильно, то сможете открыть несколько диалоговых окон и увидеть их отличие
от тех окон, которые использовались ранее:
• цвет диалогового окна по умолчанию серый вместо синего;
• диалоговое окно не может изменять размер;
• диалоговое окно не имеет номера.
�Оглавлен ие
Созданное Вами окно является примером диалогового «немодального» окна, то есть окна без режимов.
Однако в большинстве случаев Вам будут нужны модальные окна – окна, определяющие режим
действия. Если Вы откроете модальное окно, то активным будет только оно. Отметка других окон или
меню не вызывает никаких действий до тех пор, пока Вы не закроете активное модальное окно
(отметим, что клавиша ESC по умолчанию закрывает модальное диалоговое окно).
Для того, чтобы сделать диалоговое окно модальным, нужно изменить метод NewDialog:
procedure TMyApp.NewDialog;
var
Dialog: PDemoDialog;
R: TRect;
C: Word;
begin
R.Assign(0, 0, 40, 13);
R.Move(Random(39), Random(10));
Dialog:= New(PDemoDialog, Init(R, 'Demo Dialog'));
C:= DeskTop^.ExecView(Dialog);
Dispose(Dialog, Done);
end;
Модальное окно уже знает, как реагировать на событие по клавише ESC (которое преобразуется в
команду cmCancel) и событие от клавиши Enter (которое обрабатывается кнопкой по умолчанию
TButton). В ответ на команду cmCancel диалоговое окно всегда закрывается.
Вызов ExecView вставляет диалоговое окно в группу и делает его модальным. Выполнение
программы продолжается в ExecView до тех пор, пока диалоговое окно не закроется или не будет
удалено. После этого ExecView удаляет окно из группы и осуществляет выход. Значение,
возвращаемое функцией ExecView, сохраняется в переменной С и может быть использовано в
дальнейшем.
Проверьте теперь правильность внесения изменений в Вашу программу:
Program TFirst6;
uses App,Objects,Menus,Drivers,Views,Dialogs;
const
FileToRead='e:\tp60\urok.txt';
MaxLines = 100;
cmNewWin=199;
cmFileOpen=200;
cmNewDialog = 201;
winCount: Integer = 0;
�Оглавлен ие
type
TMyApp=Object(TApplication)
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
procedure NewWindow; virtual;
procedure NewDialog;
procedure HandleEvent(var Event: TEvent); virtual;
end;
type
PInterior=^Tinterior;
TInterior=object(TScroller)
constructor Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
procedure Draw; virtual;
end;
type
PDemoWindow=^TDemoWindow;
TDemoWindow=object(TWindow)
constructor Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
function MakeInterior(Bounds: TRect; Left: Boolean): PInterior;
procedure SizeLimits(var Min,Max:TPoint);virtual;
end;
type
PDemoDialog = ^TDemoDialog;
TDemoDialog = object(TDialog)
end;
var
MyApp: TMyApp;
S: string;
LineCount: Integer;
Lines: array[0..MaxLines - 1] of PString;
procedure TDemoWindow.SizeLimits(var Min,Max:TPoint);
var R: TRect;
�Оглавлен ие
begin
TWindow.SizeLimits(Min,Max);
GetExtent(R);
Min.X:=R.B.X div 2;
end;
constructor TInterior.Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
begin
TScroller.Init(Bounds, AHScrollBar, AVScrollBar);
Options:= Options or ofFramed;
SetLimit(128, LineCount);
end;
procedure ReadFile;
var
F: Text;
S: String;
begin
LineCount:= 0;
Assign(F,FileToRead);
Reset(F);
while not Eof(F) and (LineCount < MaxLines) do
begin
Readln(F, S);
Lines[LineCount]:= NewStr(S);
Inc(LineCount);
end;
Close(F);
end;
procedure DoneFile;
var
I: Integer;
begin
for I:= 0 to LineCount - 1 do
if Lines[I] <> nil then DisposeStr(Lines[i]);
�Оглавлен ие
end;
procedure TInterior.Draw;
var
Color: Byte;
I,Y: Integer;
B: TDrawBuffer;
begin
Color:= GetColor(1);
for Y:= 0 to Size.Y - 1 do
begin
MoveChar(B, ' ', Color, Size.X);
i:= Delta.Y + Y;
if (I < LineCount) and (Lines[I] <> nil) then
MoveStr(B, Copy(Lines[I]^, Delta.X + 1, Size.X), Color);
WriteLine(0, Y, Size.X, 1, B);
end;
end;
constructor TDemoWindow.Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
var
S: string[3];
R: TRect;
RInterior, LInterior: PInterior;
begin
Str(WindowNo, S);
TWindow.Init(Bounds, WinTitle+' '+S, wnNoNumber);
GetExtent(Bounds);
R.Assign(Bounds.A.X, Bounds.A.Y, Bounds.B.X div 2 + 1,
Bounds.B.Y);
LInterior:= MakeInterior(R, True);
LInterior^.GrowMode:= gfGrowHiY;
Insert(Linterior);
R.Assign(Bounds.B.X div 2, Bounds.A.Y, Bounds.B.X, Bounds.B.Y);
RInterior:= MakeInterior(R,False);
�Оглавлен ие
RInterior^.GrowMode:= gfGrowHiX + gfGrowHiY;
Insert(RInterior);
end;
function TDemoWindow.MakeInterior(Bounds: TRect; Left: Boolean): PInterior;
var
HScrollBar, VScrollBar: PScrollBar;
R: TRect;
begin
R.Assign(Bounds.B.X-1, Bounds.A.Y+1, Bounds.B.X, Bounds.B.Y-1);
VScrollBar:= New(PScrollBar, Init(R));
VScrollBar^.Options:= VScrollBar^.Options or ofPostProcess;
if Left then VScrollBar^.GrowMode:= gfGrowHiY;
Insert(VScrollBar);
R.Assign(Bounds.A.X+2, Bounds.B.Y-1, Bounds.B.X-2, Bounds.B.Y);
HScrollBar:= New(PScrollBar, Init(R));
HScrollBar^.Options:= HScrollBar^.Options or ofPostProcess;
if Left then HScrollBar^.GrowMode:= gfGrowHiY + gfGrowLoY;
Insert(HScrollBar);
Bounds.Grow(-1,-1);
MakeInterior:= New(PInterior, Init(Bounds, HScrollBar, VScrollBar));
end;
procedure TMyApp.InitStatusLine;
var R:TRect;
begin
GetExtent(R);
R.A.Y:=R.B.Y-1;
StatusLine:=New(PStatusLine,Init(R,
NewStatusDef(0,$FFFF,
NewStatusKey('~Alt-X~Exit',kbAltX,cmQuit,
NewStatusKey('~F4~New',kbF4,cmNewWin,
NewStatusKey('~Alt-F3~Close',kbAltF3,cmClose,
NewStatusKey('~F10~Menu',kbF10,cmMenu,
nil)))),
nil)))
�Оглавлен ие
end;
procedure TMyApp.InitMenuBar;
var R:TRect;
begin
GetExtent(R);
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar,Init(R,NewMenu(
NewSubMenu('~F~ile',hcNoContext,NewMenu(
NewItem('~O~pen','F3',kbF3,cmFileOpen,
hcNoContext,
NewItem('~N~ew','F4',kbF4,cmNewWin,
hcNoContext,
NewLine(
NewItem('E~x~it','Alt-X',kbAltX,cmQuit,
hcNoContext,
nil))))),
NewSubMenu('~W~indow',hcNoContext,NewMenu(
NewItem('~N~ext','F6',kbF6,cmNext,
hcNoContext,
NewItem('~Z~oom','F5',kbF5,cmZoom,
hcNoContext,
NewItem('~S~ize/Move','Ctr-F5',kbCtrlF5,cmResize,
hcNoContext,
NewItem('~T~ile','',0,cmTile,
hcNoContext,
NewItem('~C~ascade','',0,cmCascade,
hcNoContext,
NewItem('~D~ialog', 'F2', kbF2, cmNewDialog, hcNoContext,
nil))))))),
nil)))))
end;
procedure TMyApp.NewDialog;
var
Dialog: PDemoDialog;
�Оглавлен ие
R: TRect;
C: Word;
begin
R.Assign(0, 0, 40, 13);
R.Move(Random(39), Random(10));
Dialog:= New(PDemoDialog, Init(R, 'Demo Dialog'));
C:= DeskTop^.ExecView(Dialog);
Dispose(Dialog, Done);
end;
procedure TMyApp.NewWindow;
var
Window: PDemoWindow;
R: TRect;
begin
Inc(WinCount);
R.Assign(0,0,30,7);
R.Move(Random(58),Random(16));
Window:=New(PDemoWindow, Init(R,'Demo Window ', WinCount));
Window^.Options:=Window^.Options+ofTileable;
DeskTop^.Insert(Window);
end;
procedure TMyApp.HandleEvent(var Event: TEvent);
var R: TRect;
begin
TApplication.HandleEvent(Event);
if Event.What=evCommand then
begin
case Event.Command of
cmNewWin: NewWindow;
cmNewDialog: NewDialog;
cmTile:
begin
DeskTop^.GetExtent(R);
DeskTop^.Tile(R);
�Оглавлен ие
end;
cmCascade:
begin
DeskTop^.GetExtent(R);
DeskTop^.Cascade(R);
end
else Exit;
end;
ClearEvent(Event);
end;
end;
BEGIN
ReadFile;
MyApp.Init;
MyApp.Run;
MyApp.Done;
DoneFile;
END.
�Оглавлен ие
Управление диалоговыми окнами
Созданное нами диалоговое окно обладает существенным недостатком – оно не несет никакой
информации. Чтобы диалоговое окно имело смысл, в него нужно добавить элементы управления.
Элементы управления – это изменяющиеся элементы внутри диалогового окна, которые позволяют
Вам манипулировать информацией. Важно помнить, что элементы управления действуют только
внутри диалогового окна. Существует только одно исключение из этого правила – в случае кнопки в
немодальном диалоговом окне. Поскольку кнопки генерируют команды, эти команды будут
распространяться от текущего модального видимого элемента. Если же диалоговое окно – это
немодальный видимый элемент, то его команды могут распространяться за пределы окна, что
приводит, как правило, к неожиданным эффектам.
Когда элементы управления установлены в диалоговом окне, появляется возможность отделить
видимое представление от обработки данных. Это означает, что Вы можете легко спроектировать все
диалоговое окно без создания кода, который устанавливает или использует данные из этого окна
(точно так же, как Вы устанавливали элементы меню и статуса без кода, реагирующего на
сгенерированные команды). Приступим теперь к рассмотрению основных элементов управления.
�Оглавлен ие
Статический текст
Добавим, прежде всего, в диалоговое окно некоторое сообщение. Для этого нам придется
использовать объект TStaticText, который является потомком от TView. Это видимый элемент,
который просто отображает строку, переданную в него. Строка представляет собой слово,
располагаемое внутри прямоугольника видимого элемента с переносом. Текст будет центрироваться,
если строка начинается с Ctr-C, она может быть разбита с помощью Ctr-М. По умолчанию текст не
может активизироваться и объект не получает данных от него. Для вставки текста изменим процедуру
TMyApp.NewDialog следующим образом:
procedure TMyApp.NewDialog;
var
Bruce: PView;
Dialog: PDemoDialog;
R: TRect;
C: Word;
s: string;
begin
R.Assign(20, 6, 60, 19);
Dialog:= New(PDemoDialog, Init(R, 'Demo Dialog'));
s:='Это простое диалоговое окно';
with Dialog^ do
begin
R.Assign(6, 6, 35, 7);
Bruce:=New(PStaticText,Init(R,s));
Insert(Bruce);
end;
C:= DeskTop^.ExecView(Dialog);
Dispose(Dialog, Done);
end;
�Оглавлен ие
Кнопки
Кнопки – это объекты TButton. Они работают во многом аналогично элементам строки статуса: это
закрашенная область с текстовой меткой и, если Вы отметите ее, она генерирует команду. На экране
видна тень от кнопки, так что при ее "нажатии" создается эффект движения. Большинство диалоговых
окон имеет, по крайней мере, одну или две кнопки. Наиболее общие кнопки – ОК (обозначающая «Я
все сделал». Вы можете закрыть диалоговое окно и использовать результаты) и Cancel (означающая
«Я хочу закрыть диалоговое окно и игнорировать изменения, сделанные в нем»). Кнопка Cancel по
умолчанию генерирует ту же команду cmCancel, что и закрывающая кнопка.
Модуль Dialogs определяет пять стандартных диалоговых команд, которые могут быть связаны с
TButton: cmOK, cmCancel, cmYes, cmNo, cmDefault. Первые четыре команды также
закрывают диалоговое окно, вызывая метод EndModel из TDialog, который восстанавливает
предыдущий модальный видимый элемент в статус модальности. Естественно, что кнопки могут
использоваться и для генерации команд, специфичных для Вашей программы.
Из предыдущего примера должно быть ясно, как следует модифицировать метод TMyApp.NewDialog,
для того, чтобы добавить в диалоговое окно кнопки OK и Cancel:
procedure TMyApp.NewDialog;
var
Bruce: PView;
Dialog: PDemoDialog;
R: TRect;
C: Word;
s: string;
begin
R.Assign(20, 6, 60, 19);
Dialog:= New(PDemoDialog, Init(R, 'Demo Dialog'));
s:='Это простое диалоговое окно';
with Dialog^ do
begin
R.Assign(6, 6, 35, 7);
Bruce:=New(PStaticText,Init(R,s));
Insert(Bruce);
R.Assign(15, 10, 25, 12);
Insert(New(PButton, Init(R, '~O~k', cmOK, bfDefault)));
R.Assign(28, 10, 38, 12);
Insert(New(PButton, Init(R, 'Cancel', cmCancel, bfNormal)));
end;
�Оглавлен ие
C:= DeskTop^.ExecView(Dialog);
Dispose(Dialog, Done);
end;
Как Вы видите, создание кнопки требует задание четырех параметров в конструкторе Init:
1. Область, закрываемая кнопкой (не забудьте оставить место для тени!).
2. Текст, который появляется в кнопке.
3. Команда, связанная с кнопкой.
4. Флаг типа кнопки (нормальная или по умолчанию).
Заметим, что нет смысла окрашивать букву "С" в слове "Cancel", поскольку уже определена горячая
клавиша (Esc) для этой команды.
Создавая кнопку, Вы устанавливаете ее флаг bfNormal или bfDefault. Большинство кнопок
являются нормальными (bfNormal). Кнопка, помеченная как bfDefault, будет кнопкой по
умолчанию, то есть она «нажимается», когда Вы нажимаете клавишу Enter. Turbo Vision не
проверяет, используете ли Вы только одну кнопку по умолчанию, – за это отвечаете Вы. Если Вы
назначили более чем одну кнопку по умолчанию, результат будет непредсказуемым. Обычно кнопка ОК
в диалоговом окне – это кнопка по умолчанию, и пользователь просто нажимает Enter, чтобы
закрыть диалоговое окно и использовать сделанные изменения.
Когда диалоговое окно открыто, один из элементов управления всегда подсвечен – это активный
элемент управления. Активизация элемента управления наиболее полезна для направления ввода с
клавиатуры. Например, если кнопка активна, пользователь может "нажать" кнопку, нажав пробел.
Символы могут быть введены в строку ввода, только если она активна.
Пользователь может нажать клавишу Tab для того, чтобы сделать активным другой элемент
управления внутри диалогового окна. Метки не могут быть активными, поэтому клавиша Tab
проходит мимо них. Поскольку необходимо, чтобы пользователь мог активизировать элементы в
диалоговом окне в определенном порядке, то клавиша Tab переключает управление элементами в том
порядке, в каком они вставлялись в диалоговое окно. С точки зрения внутреннего представления
объекты поддерживаются в диалоговом окне в циклически связанном списке, с последним
вставленным элементом, связанным с первым.
По умолчанию активизируется последний вставленный объект. Вы можете активизировать другой
элемент управления либо используя метод SelectNext диалогового окна, либо прямо вызывая метод
Select элемента управления. SelectNext позволяет Вам передвигаться вперед или назад по списку
элементов управления. SelectNext(False) передвигает Вас вперед по циклическому списку (в
порядке Tab); SelectNext(True) передвигает в обратном направлении.
�Оглавлен ие
Создание кластеров
Обычно выбор, который Вы хотите предложить пользователю в диалоговом окне, это не просто
выбор, обрабатываемый индивидуальными кнопками. Turbo Vision обеспечивает несколько
полезных стандартных функций управления для выбора ряда опций. Две наиболее полезных – это
зависимые и независимые кнопки. Эти две функции в основном идентичны за тем исключением, что
Вы можете задать несколько независимых, но только одну зависимую кнопку. Идентичность
зависимых и независимых кнопок связана с тем, что они являются потомками одного и того же
объекта TClaster. Для того, чтобы ознакомиться с концепцией зависимых и независимых кнопок, Вы
можете посмотреть меню Options в интегрированной среде Turbo Pascal. Многие диалоговые
окна в этом меню используют такие кнопки.
Поскольку процесс создания кластера независимых кнопок аналогичен созданию кластера зависимых
кнопок, Вам требуется детально просмотреть этот процесс только однажды. Добавим следующий код в
метод TMyApp.NewDialog после создания диалогового окна, но до добавления кнопок. Вставим
кнопки в последнюю очередь в том порядке, в котором они должны обходиться с помощью Tab (для
того, чтобы освободить место в окне, удалите из него статический текст).
R.Assign(3, 3, 18, 6);
Bruce:= New(PCheckBoxes, Init(R,
NewSItem('~H~varti',
NewSItem('~T~ilset',
NewSItem('~J~arlsberg',
nil)))
));
Insert(Bruce);
Инициализация очень проста. Вы устанавливаете прямоугольник, в котором находятся элементы (не
забудьте оставить место для самих независимых кнопок), а затем создаете связанный список указателей
на строки, завершаемый nil, которые будут показаны в следующих независимых кнопках).
Приведенный код создает набор независимых кнопок с тремя выборами. Заметьте, что Вы не дали
указание по установке каждого элемента в списке. По умолчанию они все не установлены. Часто Вам
потребуется установить все или некоторые элементы независимых кнопок. Turbo Vision
предоставляет способ легко устанавливать и сохранять значения (его мы рассмотрим ниже).
Набор независимых кнопок может содержать до 16 элементов. Информация о включенных или
выключенных элементах представляется 16 битным словом, каждый бит которого соответствует
одному элементу.
Добавим теперь набор из трех зависимых кнопок. Для этого понадобится следующий код:
R.Assign(22, 3, 34, 6);
Bruce:= New(PRadioButtons, Init(R,
NewSItem('~S~olid',
NewSItem('~R~unny',
NewSItem('~M~elted',
�Оглавлен ие
nil)))
));
Insert(Bruce);
Главное отличие между зависимыми и независимыми кнопками в том, что Вы можете выбрать только
одну зависимую кнопку в группе и что первый элемент в группе зависимых кнопок выбран по
умолчанию.
Поскольку Вам не требуется знать состояние каждой зависимой кнопки (достаточно знать, какая
именно кнопка выбрана), данные о зависимых кнопках не побитовые. Это означает, что Вы можете
использовать более 16 зависимых кнопок. Данные о зависимых кнопках хранятся в слове и в Вашем
распоряжении 65536 зависимых кнопок на один кластер. Значение 0 указывает, что выбрана первая
зависимая кнопка, 1 – вторая и так далее.
Конечно, установки управляющих элементов может быть недостаточно. Простое предоставление
набора выборов может ничего не говорить пользователю о том, что именно он выбирает. Turbo
Vision предоставляет удобный метод для установки меток управляющих элементов в виде другого
управляющего элемента TLabel.
TLabel делает больше, чем кажется на первый взгляд. TLabel не только отображает текст, но и
связывается с другим видимым элементом. Отметка мышкой метки приведет к активизации
связанного выделенного элемента. Вы также можете определить букву сокращенного набора для
метки, окружив букву символами “~”.
Чтобы пометить независимые кнопки, добавьте следующий код сразу после вставки независимых
кнопок в диалоговое окно:
R.Assign(2, 2, 10, 3);
Insert(New(PLabel, Init(R, 'C~h~eeses', Bruce)));
Вы теперь можете активизировать набор независимых кнопок, отметив слово Cheeses (или нажав
Alt + h). Это слово предоставляет информацию и об элементах в данном окне. Аналогично
добавляется метка к зависимым кнопкам:
R.Assign(21, 2, 33, 3);
Insert(New(PLabel, Init(R, 'Cons~i~stency', Bruce)));
�Оглавлен ие
Строка ввода
Существует еще один тип элемента управления, который Вы можете добавить в диалоговое окно –
TInputLine, называемый строкой ввода. Работа строки ввода чрезвычайно сложна, но с Вашей точки
зрения как программиста, это очень простой для использования объект.
Добавим следующий код после кода, назначающего метку зависимым кнопкам и до выполнения
диалогового окна:
R.Assign(3, 8, 37, 9);
Bruce:= New(PInputLine, Init(R, 34));
Insert(Bruce);
R.Assign(2, 7, 24, 8);
Insert(New(PLabel, Init(R, 'Delivery instructions', Bruce)));
Установка строки ввода проста: Вы назначаете прямоугольник, который определяет длину строки
ввода на экране. Необходим еще один параметр для определения максимальной длины редактируемой
строки. Эта длина может превышать отображаемую длину, поскольку объект TInputLine знает, как
выполнять скроллинг строки. По умолчанию строка ввода может обрабатывать клавиши, команды
редактирования, выбор и движение с помощью мышки. Строка ввода также имеет метку, поскольку
непомеченная строка ввода может быть еще более непонятной для пользователя, чем непомеченный
кластер.
�Оглавлен ие
Установка и получение данных
Сейчас, когда Вы сконструировали достаточно сложное диалоговое окно, Вам нужно узнать, как его
использовать. Вы создали интерфейс пользователя, теперь Вам необходимо связать его с программой.
Элементы управления бесполезны, если Вы не знаете, как получить информацию от них.
Вы должны иметь возможность:
1) установить начальные значения элементов управления при открытии диалогового окна;
2) прочитать значения, когда диалоговое окно закрывается.
Все изменения должны быть учтены лишь тогда, когда окно успешно закрыто. Если же пользователь
решил отменить диалог с окном, то все внесенные изменения должны быть проигнорированы.
Возможности Turbo Vision позволяют сделать это. Ваша программа управляет записью информации
в диалоговое окно при его открытии. Когда пользователь заканчивает работу с диалоговым окном,
Вашей программе требуется проверить, отменено диалоговое окно или было закрыто нормально. Если
оно было отменено, Вы просто работаете без изменения записи. Если диалоговое окно было закрыто
успешно, Вы можете прочитать запись из диалогового окна в той же форме, в которой она была
передана в него.
Для копирования данных в видимый элемент и из него используются методы SetData и GetData.
Каждый видимый элемент имеет эти методы. Когда группа (такая как TDialog) инициализируется с
помощью вызова SetData, она передает данные дальше, вызывая методы SetData для каждого из его
подэлементов. (Заметим, что когда Вы вызываете SetData для группы, Вы передаете ему запись
данных, которая содержит данные для каждого из видимых элементов в группе. Вам необходимо
расположить данные для них в том же порядке, в каком они были вставлены в группу).
Вам также требуется установить правильный размер данных для каждого из видимых элементов. Все
видимые элементы имеют метод DataSize, который возвращает размер данных видимого элемента.
Каждый видимый элемент копирует DataSize данных из этой записи данных, а затем передвигает
указатель, чтобы показать следующему видимому элементу, с какого места следует начинать. Если
данные видимого подэлемента будут иметь неверный размер, каждый последующий подэлемент будет
копировать неверные данные.
Если Вы создаете новый видимый элемент и добавляете в него поля данных, не забудьте перекрыть
методы DataSize, SetData и GetData так, чтобы они обрабатывали правильные значения. Порядок
обработки и размеры данных всецело в Ваших руках. Компилятор не будет возвращать сообщения,
если Вы сделаете ошибку.
После выполнения диалогового окна Ваша программа должна убедиться вначале, что диалоговое окно
не было отменено, затем вызвать GetData для передачи информации в Вашу программу. Так в Вашем
примере Вы инициализируете по порядку кластер независимых кнопок, метку, кластер зависимых
кнопок, метку, строку ввода до 128 символов, метку и две кнопки (ОК и Cancel). Таблица 6.1
приводит все требуемые для этого данные.
�Оглавлен ие
Данные для элементов управления диалогового окна
Таблица 6.1
Элементы управления
Требуемые данные
Независимые кнопки
Word
Метка
Нет
Зависимые кнопки
Word
Метка
Нет
Строка ввода
string[128]
Метка
Нет
Кнопка
Нет
Кнопка
Нет
Видимые элементы, которые не имеют данных (такие, как метки и кнопки), используют метод
GetData, который они наследуют от TView и который ничего не делает. Это означает, что когда Вы
получаете и устанавливаете данные, Вы можете пропустить метки и кнопки.
Вы можете установить запись данных для диалогового окна в глобальном типе:
type
DialogData = record
CheckBoxData: Word;
RadioButtonData: Word;
InputLineData: string[128];
end;
Теперь все, что Вам необходимо сделать, – это инициализировать запись при запуске программы
(например, в MyApp.Init), установить данные, когда Вы входите в диалоговое окно, и прочитать их,
когда диалоговое окно успешно закрыто. Это проще сказать в Паскале, чем по-русски! После того, как
Вы объявите тип, Вы объявляете глобальную переменную:
var
DemoDialogData: DialogData;
затем добавляете одну строку до выполнения диалогового окна и одну после:
Dialog^.SetData(DemoDialogData);
C:= DeskTop^.ExecView(Dialog);
if C <> cmCancel then Dialog^.GetData(DemoDialogData);
и добавляете шесть строк в метод TMyApp.Init, чтобы установить начальные значения для
диалогового окна:
with DemoDialogData do
�Оглавлен ие
begin
CheckboxData:= 1;
RadioButtonData:= 2;
InputLineData:= 'Phone home.';
end;
Сейчас все изменения, которые Вы сделаете в диалоговом должны сохраниться, когда Вы снова его
откроете, если только клавиша Cancel не отменила диалог.
�Оглавлен ие
Другие элементы управления
Модуль TDialog предоставляет дополнительные возможности, которые не были рассмотрены выше.
Они используются аналогично: Вы создаете новый экземпляр, вставляете его в диалоговое окно и
включаете соответствующие данные в запись данных.
Просмотр списка. TListViewer выводит список в одну или несколько колонок, и пользователь
может выбрать элемент из этого списка. TListViewer может взаимодействовать с двумя полосами
скроллинга. Он предназначен для построения блока и не используется отдельно. Он может
обрабатывать список, но сам списка не содержит. Его абстрактный метод GetText загружает
элементы списка для его метода Draw. Наследник TListViewer должен перекрывать GetText для
загрузки актуальных данных.
Окно списка. TListBox наследуется от TListViewer. Он владеет TCollection, который должен
быть указателем на строки. TListBox наследует только одну полосу скроллинга. Примером окна
списка является список выбора файлов в интегрированной среде Turbo Pascal. При получении и
установке данных окна списка удобно пользоваться типом записи TListBoxRec, который хранит
указатель на список строк и слово, указывающее на текущий выбранный элемент списка.
История. THistory реализует объект, который работает со строкой ввода и связанным окном списка.
Нажимая на символ стрелки, стоящей после строки ввода, пользователь вызывает список предыдущих
значений для этой строки и может выбрать любой из них. Это предотвращает повторный набор.
Стандартные диалоговые окна. Модуль StdDlg содержит предопределенное диалоговое окно,
называемое TFileDialog. Вы используете это окно в интегрированной среде, когда открываете
файл. TFileDialog использует ряд других объектов из модуля StdDlg, которые могут быть полезны:
TFileInputLine=object(TInputLine)
TFileCollection=object(TSortedCollection)
TSortedListBox=object(TListBox)
TFileList=object(TSortedListBox)
TFileInfoPane=object(TView).
В заключение приведем окончательный текст программы TFirst6 со всеми внесенными в нее
изменениями.
Program TFirst6;
uses App, Objects, Menus, Drivers, Views, Dialogs;
const
FileToRead='e:\tp60\urok.txt';
MaxLines = 100;
cmNewWin=199;
cmFileOpen=200;
cmNewDialog = 201;
winCount: Integer = 0;
type
�Оглавлен ие
TMyApp=Object(TApplication)
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
procedure NewWindow; virtual;
procedure NewDialog;
procedure HandleEvent(var Event: TEvent); virtual;
end;
type
PInterior=^Tinterior;
TInterior=object(TScroller)
constructor Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
procedure Draw; virtual;
end;
type
PDemoWindow=^TDemoWindow;
TDemoWindow=object(TWindow)
constructor Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
function MakeInterior(Bounds: TRect; Left: Boolean): PInterior;
procedure SizeLimits(var Min,Max:TPoint);virtual;
end;
type
PDemoDialog = ^TDemoDialog;
TDemoDialog = object(TDialog)
end;
type
DialogData = record
CheckBoxData: Word;
RadioButtonData: Word;
InputLineData: string[128];
end;
var
MyApp: TMyApp;
�Оглавлен ие
S: string;
LineCount: Integer;
Lines: array[0..MaxLines - 1] of PString;
DemoDialogData: DialogData;
procedure TDemoWindow.SizeLimits(var Min,Max:TPoint);
var R: TRect;
begin
TWindow.SizeLimits(Min,Max);
GetExtent(R);
Min.X:=R.B.X div 2;
end;
constructor TInterior.Init(var Bounds: TRect; AHScrollBar,
AVScrollBar: PScrollBar);
begin
TScroller.Init(Bounds, AHScrollBar, AVScrollBar);
Options:= Options or ofFramed;
SetLimit(128, LineCount);
end;
procedure ReadFile;
var
F: Text;
S: String;
begin
LineCount:= 0;
Assign(F,FileToRead);
Reset(F);
while not Eof(F) and (LineCount < MaxLines) do
begin
Readln(F, S);
Lines[LineCount]:= NewStr(S);
Inc(LineCount);
end;
Close(F);
end;
�Оглавлен ие
procedure DoneFile;
var
I: Integer;
begin
for I:= 0 to LineCount - 1 do
if Lines[I] <> nil then DisposeStr(Lines[i]);
end;
procedure TInterior.Draw;
var
Color: Byte;
I,Y: Integer;
B: TDrawBuffer;
begin
Color:= GetColor(1);
for Y:= 0 to Size.Y - 1 do
begin
MoveChar(B, ' ', Color, Size.X);
i:= Delta.Y + Y;
if (I < LineCount) and (Lines[I] <> nil) then
MoveStr(B, Copy(Lines[I]^, Delta.X + 1, Size.X), Color);
WriteLine(0, Y, Size.X, 1, B);
end;
end;
constructor TDemoWindow.Init(Bounds: TRect; WinTitle: string;
WindowNo: Integer);
var
S: string[3];
R: TRect;
RInterior, LInterior: PInterior;
begin
Str(WindowNo, S);
TWindow.Init(Bounds, WinTitle+' '+S, wnNoNumber);
GetExtent(Bounds);
R.Assign(Bounds.A.X, Bounds.A.Y, Bounds.B.X div 2 + 1,
�Оглавлен ие
Bounds.B.Y);
LInterior:= MakeInterior(R, True);
LInterior^.GrowMode:= gfGrowHiY;
Insert(Linterior);
R.Assign(Bounds.B.X div 2, Bounds.A.Y, Bounds.B.X, Bounds.B.Y);
RInterior:= MakeInterior(R,False);
RInterior^.GrowMode:= gfGrowHiX + gfGrowHiY;
Insert(RInterior);
end;
function TDemoWindow.MakeInterior(Bounds: TRect; Left: Boolean): PInterior;
var
HScrollBar, VScrollBar: PScrollBar;
R: TRect;
begin
R.Assign(Bounds.B.X-1, Bounds.A.Y+1, Bounds.B.X, Bounds.B.Y-1);
VScrollBar:= New(PScrollBar, Init(R));
VScrollBar^.Options:= VScrollBar^.Options or ofPostProcess;
if Left then VScrollBar^.GrowMode:= gfGrowHiY;
Insert(VScrollBar);
R.Assign(Bounds.A.X+2, Bounds.B.Y-1, Bounds.B.X-2, Bounds.B.Y);
HScrollBar:= New(PScrollBar, Init(R));
HScrollBar^.Options:= HScrollBar^.Options or ofPostProcess;
if Left then HScrollBar^.GrowMode:= gfGrowHiY + gfGrowLoY;
Insert(HScrollBar);
Bounds.Grow(-1,-1);
MakeInterior:= New(PInterior, Init(Bounds, HScrollBar, VScrollBar));
end;
procedure TMyApp.InitStatusLine;
var R:TRect;
begin
GetExtent(R);
R.A.Y:=R.B.Y-1;
StatusLine:=New(PStatusLine,Init(R,
NewStatusDef(0,$FFFF,
�Оглавлен ие
NewStatusKey('~Alt-X~Exit',kbAltX,cmQuit,
NewStatusKey('~F4~New',kbF4,cmNewWin,
NewStatusKey('~Alt-F3~Close',kbAltF3,cmClose,
NewStatusKey('~F10~Menu',kbF10,cmMenu,
nil)))),
nil)))
end;
procedure TMyApp.InitMenuBar;
var R:TRect;
begin
GetExtent(R);
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar,Init(R,NewMenu(
NewSubMenu('~F~ile',hcNoContext,NewMenu(
NewItem('~O~pen','F3',kbF3,cmFileOpen,
hcNoContext,
NewItem('~N~ew','F4',kbF4,cmNewWin,
hcNoContext,
NewLine(
NewItem('E~x~it','Alt-X',kbAltX,cmQuit,
hcNoContext,
nil))))),
NewSubMenu('~W~indow',hcNoContext,NewMenu(
NewItem('~N~ext','F6',kbF6,cmNext,
hcNoContext,
NewItem('~Z~oom','F5',kbF5,cmZoom,
hcNoContext,
NewItem('~S~ize/Move','Ctr-F5',kbCtrlF5,cmResize,
hcNoContext,
NewItem('~T~ile','',0,cmTile,
hcNoContext,
NewItem('~C~ascade','',0,cmCascade,
hcNoContext,
NewItem('~D~ialog', 'F2', kbF2, cmNewDialog, hcNoContext,
�Оглавлен ие
nil))))))),
nil)))))
end;
procedure TMyApp.NewDialog;
var
Bruce: PView;
Dialog: PDemoDialog;
R: TRect;
C: Word;
begin
R.Assign(20, 6, 60, 19);
Dialog:= New(PDemoDialog, Init(R, 'Demo Dialog'));
with Dialog^ do
begin
R.Assign(3, 3, 18, 6);
Bruce:= New(PCheckBoxes, Init(R,
NewSItem('~H~varti',
NewSItem('~T~ilset',
NewSItem('~J~arlsberg',
nil)))
));
Insert(Bruce);
R.Assign(2, 2, 10, 3);
Insert(New(PLabel, Init(R, 'Cheeses', Bruce)));
R.Assign(22, 3, 34, 6);
Bruce:= New(PRadioButtons, Init(R,
NewSItem('~S~olid',
NewSItem('~R~unny',
NewSItem('~M~elted',
nil)))
));
Insert(Bruce);
R.Assign(21, 2, 33, 3);
Insert(New(PLabel, Init(R, 'Consistency', Bruce)));
�Оглавлен ие
R.Assign(3, 8, 37, 9);
Bruce:= New(PInputLine, Init(R, 34));
Insert(Bruce);
R.Assign(2, 7, 24, 8);
Insert(New(PLabel, Init(R, 'Delivery instructions', Bruce)));
R.Assign(15, 10, 25, 12);
Insert(New(PButton, Init(R, '~O~k', cmOK, bfDefault)));
R.Assign(28, 10, 38, 12);
Insert(New(PButton, Init(R, 'Cancel', cmCancel, bfNormal)));
end;
Dialog^.SetData(DemoDialogData);
C:= DeskTop^.ExecView(Dialog);
if C <> cmCancel then Dialog^.GetData(DemoDialogData);
Dispose(Dialog, Done);
end;
procedure TMyApp.NewWindow;
var
Window: PDemoWindow;
R: TRect;
begin
Inc(WinCount);
R.Assign(0,0,30,7);
R.Move(Random(58),Random(16));
Window:=New(PDemoWindow, Init(R,'Demo Window ', WinCount));
Window^.Options:=Window^.Options+ofTileable;
DeskTop^.Insert(Window);
end;
procedure TMyApp.HandleEvent(var Event: TEvent);
var R: TRect;
begin
TApplication.HandleEvent(Event);
if Event.What=evCommand then
begin
case Event.Command of
�Оглавлен ие
cmNewWin: NewWindow;
cmNewDialog: NewDialog;
cmTile:
begin
DeskTop^.GetExtent(R);
DeskTop^.Tile(R);
end;
cmCascade:
begin
DeskTop^.GetExtent(R);
DeskTop^.Cascade(R);
end
else Exit;
end;
ClearEvent(Event);
end;
end;
BEGIN
with DemoDialogData do
begin
CheckboxData:= 1;
RadioButtonData:= 2;
InputLineData:= 'Phone home.';
end;
ReadFile;
MyApp.Init;
MyApp.Run;
MyApp.Done;
DoneFile;
END.
�Оглавлен ие
Задание для самостоятельной работы
1. Используя вышеприведенный текст программы TFirst6, создайте программу, реализующую идею
электронной записной книжки. Ваша книжка должна содержать сведения о студентах Вашей группы
(фамилия, имя, отчество, год рождения, год поступления, номер зачетной книжки, домашний адрес,
номер телефона, сведения о родителях и т. д.). Предусмотрите возможность просмотра записей и их
изменения и дополнения в режиме диалога с пользователем.
�Оглавлен ие
Приложение
Встроенный ассемблер
Сообщения и коды ошибок
�Оглавлен ие
ВСТРОЕННЫЙ АССЕМБЛЕР
Ассемблером называется машинно-зависимый компилятор, преобразующий специальным образом
составленные текстовые строки в машинные инструкции. Ассемблер упрощает разработку программ за
счет того, что предоставляет пользователю доступ к кодам машинных инструкций и операндам с
помощью символьных имен.
Встроенный ассемблер имеется в версиях 6.0 и 7.0 Турбо Паскаля и представляет собой мощный
инструмент, расширяющий возможности ПК.
ОПИСАНИЕ МП 8086/8088
Встроенный ассемблер дает возможность программировать на уровне отдельных машинных
инструкций. Это – главное отличие ассемблера от Паскаля и в этом сосредоточены его достоинства и
недостатки. Достоинство заключается в том, что, программируя на ассемблере, программист обычно
выбирает последовательность машинных инструкций так, чтобы реализовать нужные вычисления с
максимальной скоростью при минимальных затратах памяти, в то время как даже такой весьма
совершенный компилятор, как компилятор Турбо Паскаля, неизбежно вносит в машинный код
некоторую избыточность, уменьшающую скорость счета и увеличивающую затраты памяти. С другой
стороны, программирование на уровне машинных инструкций – сложное занятие и не может
сравниться по скорости разработки программ на Паскале – в этом заключается главный недостаток
ассемблера.
Чтобы использовать средства ассемблера, необходимо представлять себе детали архитектуры
микропроцессоров Intel 8086. К этому семейству относятся микропроцессоры:
8086 – 16-разрядный микропроцессор, используемый в ПК IBM PC/XT;
8088 – аналог 8086, отличается от него только взаимодействием с памятью: 8086 может
обмениваться с памятью как байтами, так и 16-разрядными словами, в то время как 8088 – только
байтами;
80286 – улучшенный вариант 8086, используемый в ПК IBM AT; может работать в двух режимах: в
реальном режиме, полностью эмулирующем работу МП 8086, и в защищенном режиме, в котором
способен адресовать память до 16 Мбайт (в реальном – до 1 Мбайт);
80386 – 32-разрядный вариант 80286; способен адресовать до 4 Гбайт;
80486 – комбинация 80386/80387, т.е. имеет внутреннюю подсистему реализации операций с
плавающей точкой;
80586
(Pentium) – имеет ряд усовершенствований, обеспечивающих ему увеличение
производительности в 2...3 раза по сравнению с 80486, в том числе возможность обрабатывать 64
– разрядные числа.
Микропроцессоры этого семейства наращивают свои возможности в перечисленном порядке, но
строго совместимы от младших моделей к старшим: все, что может 8086/8088, реализует и Pentium,
но не наоборот. Ниже обсуждается архитектура (внутреннее устройство, способы адресации и система
команд) МП 8086/8088.
Регистры
В МП 8086/8088 имеется 14 регистров. В функциональном отношении они делятся на группы:
регистры общего назначения (AX, BX, CX, DX); предназначены для хранения операндов и
�Оглавлен ие
выполнения основных команд; любой из них может использоваться как совокупность двух
независящих друг от друга 8 – разрядных регистров: старшего байта (АН, ВН, СН, DH) и младшего
байта (AL, BL, CL, DL); например, АХ состоит из АН и AL;
сегментные регистры (CS, DS, SS, ES); используются для указания сегмента при адресации
памяти;
регистры–указатели (SP, BP, IP); используются для указания смещения при адресации памяти;
индексные регистры (SI, DI); применяются для индексной адресации;
регистр флагов; используется для хранения признаков состояния процессора.
Внутри одной и той же функциональной группы регистры используются различным образом. Ниже
описывается специфика использования регистров.
Регистр АХ. Является основным сумматором. Используется во всех арифметических операциях
(сложить, умножить и т.п.). Только с помощью АХ и его полурегистров AH/AL возможен обмен
данными с портами ввода/вывода.
Регистр BX. Используется как сумматор в арифметических операциях, а также как базовый регистр при
индексной адресации.
Регистр CX. В основном используется как счетчик при выполнении операций повторения и сдвига.
Может также участвовать в арифметических операциях.
Регистр DX. Используется как регистр данных в операциях ввода/вывода, а также как сумматор при
обработке длинных целых чисел (32-разрядных).
Регистр CS. Содержит номер сегмента памяти (сегмента кода), в котором располагается текущая
машинная инструкция. Для получения полного адреса следующей команды его содержимое сдвигается
влево на 4 разряда и складывается с регистром-указателем IP. Содержимое CS автоматически
изменяется в командах дальнего (межсегментного) перехода и вызова процедур.
Регистр IP. Определяет смещение относительно начала сегмента кода CS очередной исполняемой
машинной инструкции. Содержимое IP автоматически изменяется в ходе исполнения инструкции,
обеспечивая правильный порядок выборки команд из памяти.
Регистр DS. Содержит номер сегмента памяти (сегмента данных), в котором располагаются данные
(константы и переменные). Все глобальные переменные и типизированные константы программы
Турбо Паскаля всегда располагаются в единственном сегменте, адресуемом этим регистром.
Регистр SS. Содержит номер сегмента стека. Стек – это участок автоматически адресуемой памяти,
предназначенный для временного хранения операндов. С помощью стека Турбо Паскаль организует
обмен данными между программой и процедурами, кроме того, в нем он размещает все локальные
переменные (т.е. переменные, объявленные внутри процедуры). Память стека используется по правилу
«последним пришел – первым ушел»: самый последний помещенный в стек операнд будет первым
извлекаться из него.
Регистр SP. Указывает на вершину стека, т.е. совместно с регистром SS адресует ячейку памяти, куда
будет помещаться операнд или откуда он будет извлекаться. Содержимое этого регистра
автоматически уменьшается после размещения в стеке очередного операнда и увеличивается после
извлечения операнда из стека.
�Оглавлен ие
Регистр ВР. Так называемый указатель базы. Облегчает создание и использование локального стека
(т.е. стека для использования внутри процедуры).
Регистр ES. Дополнительный сегментный регистр ES используется для межсегментного обмена
данными и в некоторых строковых операциях.
Регистр SI. Определяет адрес источника информации при индексной адресации данных (например,
при обработке массивов). Обычно используется в паре с регистром DS.
Регистр DI. В паре с регистром ES определяет приемник информации при межсегментном обмене
данными.
Регистр флагов. Отдельные разряды (биты) этого регистра имеют следующее назначение.
Флаг переноса CF. Содержит 1, если произошел перенос единицы при сложении или заем единицы
при вычитании. Используется также в циклических операциях и операциях сравнения.
Флаг четности PF. Содержит 1, если в результате операции получено число с четным количеством
значащих разрядов, т.е. дополняет результат до нечета – используется в операциях обмена для
контроля данных.
Флаг внешнего переноса АР. Контролирует перенос из 3-го бита данных. Используется при операциях
над упакованными десятичными числами.
Флаг нуля ZF. Равен 1, если в результате операции получен ноль, и равен 0 в противном случае.
Флаг знака SF. Равен 1, если в результате операции получено отрицательное число (с единицей в
старшем разряде).
Флаг трассировки TF. Равен 1, если программа исполняется по шагам, с передачей управления после
каждой выполненной команды по прерыванию с вектором 1.
Флаг прерываний IF. Содержит 1, если микропроцессору разрешена обработка прерываний.
Флаг направления DF. Управляет направлением передачи данных: если он содержит 0, то после
каждой индексной операции содержимое индексных регистров увеличивается на 1, в противном
случае – уменьшается на 1.
Флаг переполнения OF. Устанавливается в единицу, если в результате операции получено число,
выходящее за разрядную сетку микропроцессора.
Адресация
В архитектуре МП 8086/8088 адрес любого байта задается двумя 16-битовыми словами – сегментом и
смещением. При формировании 20-разрядного полного адреса, необходимого для адресации в
пределах 1 Мбайт, сегмент сдвигается влево на 4 разряда (умножается на 16) и складывается со
смещением. Поскольку емкость 16-разрядного смещения составляет 65536 значений, в пределах
одного сегмента можно адресовать до 64 Кбайт.
Архитектура МП позволяет использовать семь различных способов адресации.
Регистровая
Извлекает операнд из регистра или помещает его в регистр. Примеры:
mov ax, bx
{Извлекаем из ВХ и помещаем в АХ}
�Оглавлен ие
add сх, ах
{Содержимое АХ прибавляем к СХ}
push сх
{Заталкиваем в стек содержимое СХ}
Непосредственная
Операнд (8- или 16-разрядная константа) содержится непосредственно в теле команды. Примеры:
mov ах, 100
{Загружаем в АХ значение 100}
add ax, 5
{К содержимому АХ прибавляем 5}
mov cx, $FFFF
{Помещаем в СХ значение 65535}
Прямая
Смещение операнда задается в теле программы и складывается с регистром DS; например:
Var
X: Word;
В: Byte;
………
mov ах, Х
{Пересылаем значение переменной Х в регистр АX}
add ah, В
{К содержимому регистра АН прибавляем значение переменной В}
mov Х, ах
{Пересылаем содержимое регистра АХ в область памяти переменной X}
Косвенная регистровая
Исполнительный адрес операнда (его смещение) содержится в одном из регистров ВХ, ВР, SI или
DI. Для указания косвенной адресации этот регистр должен заключаться в квадратные скобки,
например:
mov ax, [bx]
АХ};
{Содержимое 16-разрядного слова, хранящегося в памяти по адресу DS:BX, пересылаем в регистр
Каждый из регистров BX...DI по умолчанию работает со своим сегментным регистром:
DS:BX, SS:BP, DS:SI, ES:DI
Допускается явное указание сегментного регистра, если он отличается от умалчиваемого, например:
mov ax, es:[bx]
Адресация по базе
Базовый регистр ВХ (или ВР) содержит базу (адрес начала некоторого фрагмента памяти),
относительно которой ассемблер вычисляет смещение, например:
mov ах, [bх]+10 {Загружаем в АХ 10-й по счету байт от начала базы памяти по адресу DS:BX};
Индексная адресация
Один из индексных регистров SI или DI указывает положение элемента относительно начала
некоторой области памяти. Пусть, например, АОВ – имя массива значений типа Byte. Тогда можно
использовать такие фрагменты:
mov si, 15
{Помещаем в SI константу 15}
mov ah, АОВ[si] {Пересылаем в АН 16-й по порядку байт от начала массива}
�Оглавлен ие
mov si, 0
mov АОВ[si], ah {Пересылаем полученное в самый первый элемент массива}
Адресация по базе с индексированием
Вариант индексной адресации для случая, когда индексируемая область памяти задается своей базой.
Например:
mov ax, [bx][si]
Этот тип адресации удобен при обработке двумерных массивов. Если, например, АОВ есть массив из
10ґ10 байт вида
Var
АОВ: array [0..9, 0..9] of Byte;
то для доступа к элементу АОВ [2,3] можно использовать такой фрагмент
Mov bx, 20
{База строки 2}
Mov si, 2
{Номер 3-го элемента}
Mov ax, АОВ[bx][si]
{Доступ к элементу}
Система команд
В приводимых ниже таблицах указывается мнемоника всех допустимых инструкций для МП
8086/8088. Для удобства пользования все команды разбиты на 6 функциональных групп – пересылки
данных, арифметические, битовые, строковые, передачи управления, прерываний. Внутри каждой
группы команды объединяются в подгруппы по общим дополнительным признакам.
Детальный анализ всех команд МП 8086/8088 занял бы слишком много места, поэтому в идущих за
таблицами пояснениях рассматриваются лишь наиболее популярные команды.
Команды пересылки данных
Мне моника
MOV
PUSH
POP
XCHG
XLAT
IN
OUT
LEA
LDS
LES
LAHF
SAHF
PUSHF
POPF
Формат
Поясне ние
КОМАНДЫ ОБЩ ЕГО НАЗНАЧЕНИЯ
MOV приемник, источник
Переслать значение
PUSH источник
Поместить в стек
POP приемник
Извлечь из стека
XCHG приемник, источник
Обменять значения
XLAT таблица
Загрузить в AL байт из таблицы
Команды ввода-вывода
IN аккумулятор, порт
Читать из порта
OUT порт, аккумулятор
Записать в порт
Команды пе ре сылки адре са
LEA регистр 16, память 16
Загрузить исполнительный адрес
LDS регистр 16, память 32
Загрузить в DS регистр 16 полный адрес
LES регистр 16, память 32
Загрузить в ES регистр 16 полный адрес
Команды пе ре сылки флагов
LAHF
Загрузить флаги в АН
SAHF
Установить флаги из АН
PUSHF
Поместить флаги в стек
POPF
Извлечь флаги из стека
�Оглавлен ие
Одна из наиболее часто используемых команд – MOV позволяет в защищенном режиме переслать байт
или слово из регистра в регистр из памяти в регистр или из регистра в память. Тип пересылаемых
данных (байт или слово) определяется регистром, участвующим в пересылке. Ниже приводятся
примеры использования команды:
mov ax, Table
{Пересылка слова из памяти в АХ}
mov Table, ah
{Пересылка байта из АН в память}
mov ds, ax
{Пересылка в сегмент данных}
mov es:[bx], ax {Пересылка слова в память: базовая адресация с заменой сегмента}
mov ch, -17
{Переслать константу в регистр}
mov Table, $FF
{Переслать константу в память}
С помощью MOV нельзя пересылать:
из памяти в память, например, вместо
mov Mem1, Mem2
следует использовать
mov ax, Mem2
mov Mem1, ах
константу или переменную в DS, например, нельзя
mov ds, Data_Seg
нужно:
mov ax, Data_Seg
mov ds, ax
один сегментный регистр в другой, например, нельзя
mov es, ds
но можно
mov ax, ds mov es, ax
в регистр CS; значение этого регистра (сегмента кода) автоматически меняется при выполнении
дальних команд CALL и JMP; кроме того, он загружается из стека при выполнении команды RETF
(выход из дальней процедуры).
Для временного сохранения регистров и данных, а также для обмена значениями между регистрами
широко используются стековые команды PUSH и POP. Каждая из них работает со словом, т.е. в стек
нельзя поместить или извлечь из него одиночный байт. При выполнении PUSH вначале уменьшается
на 2 содержимое указателя SP, а затем операнд помещается по адресу SS:SP. При извлечении из стека
сначала читается память по адресу SS:SP, а затем SP увеличивается на 2. Таким образом, при
заполнении указатель вершины стека SP смещается к младшим адресам, а при освобождении – к
старшим. При работе со стеком следует помнить о специфике использования стековой памяти
(«последним пришел – первым ушел»), а также о том, что эта память интенсивно используется при
вызове процедур, т.е. состояние стека к моменту выхода из процедуры должно быть строго
�Оглавлен ие
согласовано с дальнейшей работой программы. Первое условие определяет порядок извлечения
данных из стека – он должен быть обратным порядку, в котором эти данные помещались в стек.
Второе условие фактически означает, что после выхода из процедуры указатель SP должен содержать
то же смещение, что и к моменту входа в нее. Иными словами, процедура не должна «забыть» в стеке
лишнее слово или взять из него больше нужного.
Команда загрузки адреса LEA загружает в регистр адрес (смещение) нужного участка памяти. Этого же
можно достичь с помощью зарезервированного слова OFFSET, стоящего перед именем переменной.
Например:
Var
X: Word;
………….
Asm
mov ax, OFFSET X
{Загружаем смещение X в АХ}
lea ax, X
{To же действие}
end;
Разница состоит в том, что в случае команды LEA разрешается использовать индексную адресацию,
что особенно удобно при пересылке массивов данных.
Две другие команды адресной загрузки – LDS и LES загружают первое 16-разрядное слово из
источника в регистр-приемник, а затем следующее слово – в регистр DS или ES, т.е. они рассчитаны
на загрузку полного адреса операнда (сегмента и смещения).
Арифметические команды
Мне моника
Формат
Комме нтарий
Команды сложе ния
ADD
ADD приемник, источник
Сложить
ADC
ADC приемник, источник
Сложить, добавить перенос
ААА
ААА
Скорректировать сложение для таблицы ASCII
DAA
DAA
Скорректировать сложение для двоично-десятичных
чисел
INC
INC приемник
Увеличить на единицу
Команды вычитания
SUB
SUB приемник, источник
Вычесть
SBB
SBB приемник, источник
Вычесть с заемом
AAS
AAS
Скорректировать вычитание для таблицы ASCII
DAS
DAS
Скорректировать вычитание для двоично-десятичных
чисел
DEC
DEC приемник
Уменьшить на единицу
NEG
NBG приемник
Обратить знак
�Оглавлен ие
СМР
СМР приемник, источник
Сравнить
Команды умноже ния
MUL
MUL источник
Умножить без знака
IMUL
IMUL источник
Умножить со знаком
ААМ
ААМ
Скорректировать умножение для таблицы ASCII
Команды де ле ния
DIV
DIV источник
Делить без знака
IDIV
IDIV источник
Делить со знаком
AAD
AAD
Скорректировать деление для таблицы ASCII
Команды расшире ния знака
CBW
CBW
Преобразовать байт в слово
CWD
CWD
Преобразовать слово в двойное слово
При использовании арифметических команд следует помнить о том, что МП может обрабатывать
знаковые числа, числа без знака, а также двоично-десятичные числа. В беззнаковых числах для
представления значения используются все биты, т.е. они эквивалентны типам Byte и Word, в то
время как знаковые числа в старшем разряде хранят знак числа и эквивалентны типам Shortint и
Integer. Двоично-десятичные числа используют по 4 бита для каждого десятичного разряда и могут
быть упакованными или неупакованными. В первом случае один байт хранит 2 десятичные цифры
(старшая – в старшем полубайте), во втором – только одну (старший полубайт не используется).
SUB,
MUL,
DIV)
Основные арифметические команды МП (ADD,
не учитывают
двоично-десятичную форму представления чисел, поэтому в архитектуру МП включены команды
коррекции результата.
Битовые команды
Мне моника
Формат
Комме нтарий
Логические команды
AND
AND приемник, источник
Выполнить AND
OR
OR приемник, источник
Выполнить OR
XOR
XOR приемник, источник
Выполнить XOR
NOT
NOT приемник
Выполнить NOT
TEST
TEST приемник, источник
Проверить
Сдвиговые команды
SAL/SHL
SAL приемник, счетчик
Сдвинуть влево
SAR/SHR
SAR приемник, счетчик
Сдвинуть вправо
ROL
ROL приемник, счетчик
Сдвинуть влево циклически
ROR
ROR приемник, счетчик
Сдвинуть вправо циклически
RCL
RCL приемник, счетчик
Сдвинуть влево с переносом
�Оглавлен ие
RCR
RCR приемник, счетчик
Сдвинуть вправо с переносом
Битовые команды используются при исчислении логических выражений, а также в тех случаях, когда
необходимо изменить отдельные разряды операнда. Логические команды AND, OR, XOR и NOT
эквивалентны соответствующим операциям Турбо Паскаля в случае, когда операндами являются
целочисленные выражения. Команда TEST выполняет целочисленную операцию поразрядного
суммирования AND, но не изменяет значения операндов, а лишь устанавливает флаги в соответствии
со значением результата сравнения: обнуляет CF и OF, изменяет PF, ZF, SF и не меняет AF (флаг ZF
установится в 1 в том случае, когда оба операнда содержат по единице хотя бы в одном
соответствующем разряде). Команды сдвига SHL/SHR эквивалентны одноименным операциям Турбо
Паскаля и отличаются от команд циклического сдвига ROL/ROR тем, что вытесненные в ходе их
выполнения значащие разряды теряются, в то время как при циклическом сдвиге эти разряды
появляются «с другой стороны». Например, если выполнить фрагмент
mov a1, 1
{Загружаем в AL единицу}
shr a1, 1
{Сдвигаем вправо на 1 разряд}
регистр AL будет содержать 0 (вытесненная вправо единица будет помещена в CF), в то время как
после замены команды SHR на ROR в нем будет значение $80=128 (вытесненная единица будет
помещена в старший бит регистра).
Заметим, что счетчиком в командах сдвига может быть цифра 1 или количество сдвигов, указываемое
в регистре CL.
Команды передачи управления
Мне моника
Формат
Комме нтарий
Бе зусловные пе ре ходы
CALL
RET
JUMP
CALL имя
Войти в процедуру
RET
[количество_параметров]
Вернуться из процедуры
JUMP имя
Перейти
Условные пе ре ходы
JA/JNBE
JA близкая метка
Перейти, если выше (после сравнения беззнаковых операндов)
JAE/JNB
JAE близкая метка
Перейти если выше или равно
JB близкая метка
Перейти, если ниже
JBE близкая метка
Перейти если ниже или равно
JCXZ
JCXZ близкая метка
Перейти, если СХ=0
JE/JZ
JE близкая метка
Перейти, если равно
JG/JNLE
JG близкая метка
Перейти, если больше (после сравнения знаковых операндов)
JGE/JNL
LGE близкая метка
Перейти, если больше или равно
JL/JNGE
JL близкая метка
Перейти, если меньше
JLE/JNG
JLE близкая метка
Перейти, если меньше или равно
JB/JBAE/JC
JBE/JNA
�Оглавлен ие
JNC
JNC близкая метка
Перейти, если нет переноса
JNE/JNZ
JNE близкая метка
Перейти, если не равно
JNO
JNO близкая метка
Перейти, если нет переполнения
JNP/JPO
JNP близкая метка
Перейти, если нечетный
JO
JO близкая метка
Перейти, если перенос
JP/JPE
JP близкая метка
Перейти, если четный
JS
JS близкая метка
Перейти, если отрицательный
Команды управле ния циклами
LOOP
LOOP близкая метка
LOOPE/LOOPZ LOOPE близкая метка
LOOPNE/LOOPN LOOPNE близкая метка
Z
Повторить цикл
Повторять, пока равны
Повторять, пока не равны
Команды безусловных переходов CALL, RET, JMP могут использовать дальнюю или ближнюю
модель памяти, в то время как команды условных переходов – только малую (в пределах –128...+127
байтов). При дальней модели памяти (устанавливается опцией Options/Compiler/Force far
calls среды Турбо Паскаля или директивой компилятора {F+}) осуществляется как
внутрисегментная, так и межсегментная передача управления, при ближней – только
внутрисегментная.
Инструкция CALL работает следующим образом. Вначале адрес следующей за CALL инструкции (адрес
возврата) помещается в стек, затем в регистр IP (или в пару CS:IP) помещается адрес точки входа в
процедуру, таким образом сразу за командой CALL будет исполняться уже первая команда процедуры.
Оба адреса (точки входа и возврата) будут 16-битовыми смещениями для внутрисегментного вызова
или 32-битовыми полными адресами – для межсегментного. Все процедуры (функции) Паскаля,
оттранслированные в режиме {F+} или содержащие зарезервированное слово FAR в заголовке,
должны вызываться как дальние. Для этого за инструкцией CALL следует указать модель памяти:
Procedure MyProc; Far;
……
Asm
call FAR MyProc {Вызов дальней процедуры}
end;
Таким же способом должны вызываться все библиотечные подпрограммы (т.е. объявленные в
интерфейсных частях модулей). При дальнем вызове в стек сначала заталкивается содержимое
сегмента кода CS, а уже затем – смещение возврата.
При выходе из дальней процедуры команда RET извлекает из стека оба 16-разрядных слова и помещает
первое в IP, а второе в CS, а при выходе из ближней извлекает из стека только смещение и помещает
его в IP.
Команды условных переходов способны передавать управление на метку, расположенную в пределах
ближайших плюс–минус 128 байт от самой команды. Если нужно передать управление на метку,
расположенную дальше в том же сегменте, или на метку в другом сегменте, сразу: а командой условной
�Оглавлен ие
передачи располагают безусловную команду JMP или CAL, например:
cmp ах, 0
{Проверяем АХ}
jne @NotZero
{AX=0 ?}
jmp IsZero
{Да – переходим на дальнюю метку}
……
……
{Нет - продолжаем работу}
В таблице термин «выше/ниже» используется применительно к сравнению беззнаковых операндов, а
«больше/меньше» – знаковых.
Поскольку условные переходы реализуют ветвление программы на основе проверки флагов, обычно
непосредственно перед ними располагаются команды, изменяющие эти флаги, чаще всего – команда
сравнения СМР. Ниже показаны комбинации СМР–условный переход для различных соотношений
приемника и источника (первого и второго операнда) команды СМР:
Условие
Для беззнаковых чисел
Для чисел со знаками
Приемник больше источника
JA
JG
Приемник и источник равны
JE
JE
Приемник меньше источника
JB
JL
Приемник не меньше источника
JAE
JGE
Приемник не больше источника
JBE
JLE
Приемник и источник не равны
JNE
JNE
Например:
cmp ах, 5
{AX>5 ?}
ja @Above5
{Да, больше – переходим}
cmp bx, -3
{ВХ<= – 3 ?}
jle@LessM3
{Да, меньше или равен}
Команды LOOP/LOOPE/LOOPNE служат для организации циклов. Все они используют содержимое
регистра СХ как счетчик числа повторений. Команда LOOP уменьшает СХ на единицу и передает
управление на метку начала цикла, если содержимое этого регистра отлично от нуля. Команды
LOOPE/LOOPNE также уменьшают счетчик СХ, но передают управление в начало цикла при
совместном условии установки (или сброса) флага ZF и неравенства нулю счетчика СХ.
Вот как, например, можно отыскать нулевой байт в массиве АОВ:
Var
АОВ: array [1..1000] of Byte;
……
Asm
�Оглавлен ие
mov сx, 1000
{Инициируем счетчик СХ}
lea bx, AOB
{Помещаем адрес АОВ в BX}
dec bx
{Готовим цикл}
{Здесь начало цикла проверки}
(@Test: inc bx
cmp BYTE PTR
{Адрес очередного байта}
[bx], 0
{Проверяем байт}
loopne @Test
{Замыкаем цикл}
jnz @NotZero
{Если не найден нулевой байт}
……
{Нашли нулевой байт}
end;
Строковые команды
Мне моника
Формат
Комме нтарий
Пе ре сылка строк
MOVSB
MOVSB
Пересылать байты
MOVSW
MOVSW
Пересылать слова
Сравне ние строк
CMPSB
CMPSB
Сравнивать байты
CMPSW
CMPSW
Сравнивать слова
Сканирование
SCASB
SCASB
Искать байт
SCASW
SCASW
Искать слово
Загрузка и сохране ние
LODSB
LODSB
Загружать байты
LODSH
LODSW
Загружать слова
STOSB
STOSB
Сохранять байты
STOSW
STOSW
Сохранять слова
Строковые команды рассчитаны на обработку строк. Заметим, что термин «строка» здесь отнюдь не
эквивалентен аналогичному термину Турбо Паскаля и означает произвольную цепочку байт или
слов длиной до 64 Кбайт. Эти команды оперируют пятью примитивами, каждый из которых
обрабатывает лишь один байт или одно слово за раз. Перед примитивом обычно указывается префикс
повторения REP/REPE/REPNE, заставляющий выполняться примитив до тех пор, пока не обнулится
счетчик повторений СХ или не будет нарушено соответствующее условие.
При использовании строковых команд важно помнить два обстоятельства. Во-первых, эти команды
всегда берут адрес строки-источника из пары DS:SI, а строки-приемника – из пары ES:DI. Таким
образом, перед исполнением строковой команды необходимо инициировать сегментные регистры
нужным образом. Во-вторых, строковые команды используют индексную адресацию с автоматическим
�Оглавлен ие
изменением смещения в SI/DI после однократного исполнения примитива. Содержимое этих
регистров изменяется на 1 при обработке байтов и на 2 при обработке слов, причем наращивается,
если флаг направления DF сброшен, и уменьшается, если он равен 1.
Вот как можно осуществить пересылку массива А в массив В:
Var
А, В: array [1..250] of Integer;
……
Asm
lea si, A
{Смещение А - в SI (источник)}
push ds
pop
es
lea di, B
{Инициируем ES:= DS}
{Смещение В - в DI (приемник)}
mov ex, 250
{Счетчик переноса}
Сld
{Направление переноса – наращивать}
rep movsw
{Переносим 500 байт}
end;
В программе на Турбо Паскале регистр DS всегда содержит сегмент данных, поэтому инициировать
его необязательно. Что касается регистра дополнительного сегмента ES, такого правила нет, и хотя в
большинстве случаев он также ссылается на сегмент данных, рекомендуется проводить его инициацию
перед использованием строковой команды (см. выше команды push ds, pop es).
Команды прерываний
Мне моника
Формат
Комме нтарий
INT номер
Выполнить прерывание
INTO
INTO
Выполнить прерывание по переполнению
IRET
IRET
Вернуться из прерывания
INT
Выполнение прерываний во многом напоминает косвенный вызов дальней процедуры. По команде
INT (INTO) в стек помещается регистр флагов, сегмент CS и указатель IP, а новые значения этих
регистров берутся из 4 байтного вектора прерывания, соответствующего номеру прерывания в
команде INT, или из вектора 4 – для команды INTO. Таким образом, единственным отличием от
команды CALL является то, что в стек предварительно заносится регистр флагов. Следует, правда,
оговориться: перед передачей управления программе обработки прерывания микропроцессор
сбрасывает флаги трассировки TF и прерываний IF; сброс TF необходим для обеспечения нормальной
работы отладчиков, использующих прерывание по вектору 1 или 4, сброс IF блокирует вмешательство
других процессов в ход обработки прерывания.
Команда INTO представляет собой условное прерывание и выполняется, если в этот момент взведен
флаг переполнения OF. Команда IRET реализует правильный выход из программы обработки
прерывания: она считывает из стека 3 двухбайтные слова и помещает их в регистры IP, CS и регистр
�Оглавлен ие
флагов.
Команды управления
Мне моника
Формат
Комме нтарий
Управле ние флагами
STC
STC
Установить перенос
CLC
CLC
Очистить перенос
CMC
CMC
Инвертировать CF
STD
STD
Установить направление
CLD
CLD
Очистить направление
STI
STI
Разрешить прерывания
CLI
CLI
Запретить прерывания
Вне шняя синхронизация
HLT
WAIT
ESC
LOCK
HLT
Остановить вычисления
WAIT
Ждать активности на шине
ESC код, источник
Передать команду
LOCK
Захватить шину
Пустая команда
NOP
NOP
Нет операции
Команды внешней синхронизации работают следующим образом.
HALT переводит МП в состояние останова, из которого его можно вывести только при перезагрузке
системы или при наступлении немаскируемого прерывания.
WAIT заставляет МП выполнять холостой режим работы и каждые 5 тактов проверять уровень сигнала
на входной шине: пока на этой шине нет сигнала активности, процессор выполняет WAIT, но как
только шина активизируется, он продолжит исполнение программы. Эта инструкция обычно
используется для ожидания сигнала обслуживания (прерывания) высокоприоритетного устройства
типа контроллера прямого доступа к памяти.
Команда ESC используется для передачи указанного в ней операнда на шину данных. Тем самым
обеспечивается возможность передачи команд другим процессорам. Эта команда чаще всего
используется для управления работой арифметического сопроцессора. В этом случае код представляет
собой код команды сопроцессора, а источник – используемый в этой команде операнд.
Команда LOCK фактически представляет собой однобайтовый префикс, который можно использовать
совместно с любой другой командой микропроцессора. По этой команде МП активизирует
одноименный сигнал на своей шине, что исключает возможность использования этой шины любым
другим внешним устройством (процессором).
�Оглавлен ие
СПЕЦИФИКА ВСТРОЕННОГО АССЕМБЛЕРА
Приведенное выше общее описание архитектуры МП 8086/8088 является базовым для любого
ассемблера, в том числе и для встроенного ассемблера Турбо Паскаля. Однако ассемблеры содержат
массу дополнительных возможностей, облегчающих разработку готовых к работе программ. Эти
возможности отражаются в директивах и макрокомандах ассемблера. Встроенный ассемблер не
предназначен для написания законченных программ, поэтому в нем отсутствуют макрокоманды и
директивы. Главной особенностью встроенного ассемблера является практически полное отсутствие в
нем средств описания переменных и данных, т.к. эти объекты описываются средствами Турбо
Паскаля.
Оператор ASM
Зарезервированное слово ASM открывает доступ к средствам встроенного ассемблера. Этот оператор
может располагаться только внутри исполняемой части программы (подпрограммы). Область действия
оператора ASM ограничивается ближайшим по тексту зарезервированным словом END. Таким образом,
структура любого ассемблерного оператора такова:
Asm
<Одна или несколько команд встроенного ассемблера>
end;
С точки зрения Турбо Паскаля пара asm... end считается операторными скобками,
ограничивающими единственный оператор Паскаля, например:
if X>10 then
Asm
……
end
else
……;
for
k:= 1 to 5
do
Asm
……
end;
Тело ассемблерного оператора asm... end может быть пустым или содержать несколько
ассемблерных команд. Каждая ассемблерная команда должна располагаться на отдельной строке или
отделяться от следующей за ней команды символом «;». Ниже приводятся два разных способа
написания одной и той же последовательности ассемблерных команд:
Asm
mov ah, 0; int $16; mov ChCode, al; mov ScCode, ah
end;
Asm
�Оглавлен ие
mov ah, 0
int $16
mov ChCode, al
mov ScCode, ah
end;
В конце строки, содержащей единственную ассемблерную команду, или между двумя командами,
располагающимися на одной строке, разрешается вставлять комментарий, который должен
оформляться по обычным правилам Турбо Паскаля, т.е. ограничиваться символами «{», «}» или
«(*», «*)». Таким образом, комментарии разрешены между ассемблерными командами, но не внутри
них. Например, такой оператор будет правильным:
Asm
{Инициируем регистры}
lea si, X; push ds;
pop es;
{ES:= DS}
lea di,Y; mov ex,100
сld
{Перенос - вперед}
rep
{Выполняем Y:= X}
movsw
{Здесь нет ошибки - комментарий можно вставлять между префиксом и командой}
end;
а такой – неправильным:
Asm
{Готовим регистры}
lea si, X; push ds;
pop {ES:=DS} es;
{Ошибка! Комментарий разорвал мнемонику команды и ее операнд}
lea di, Y; mov ex, 100 {и направление} cld
{Комментарий является разделителем команд, поэтому перед ним можно не ставить ";"}
rep movsw
end;
В пределах ассемблерного оператора допускаются любые команды, но Турбо Паскаль требует
выполнения следующего соглашения:
В начале ассемблерного оператора регистр DS содержит сегмент кода, SS - сегмент стека, ВР –
текущий стек, SP указывает на вершину стека. Все эти регистры должны иметь точно такие же
значения к моменту завершения работы ассемблерного оператора.
Программист не должен делать каких-либо предположений о содержимом остальных регистров, и эти
регистры могут иметь произвольное значение после завершения работы ассемблерного оператора.
Исключением является случай ассемблерной функции, которая должна использовать некоторые
�Оглавлен ие
регистры для возврата своего значения.
Синтаксис ассемблерных команд
Здесь и далее ассемблерными командами называются команды на языке встроенного ассемблера,
вставляемые в тело ассемблерного оператора asm... end.
Структура ассемблерной команды такова:
[Метка] [Префикс] [Код [Операнд [/Операнд]]]
В квадратных скобках указываются необязательные элементы структуры.
Метки
Любой команде ассемблерного оператора может предшествовать одна или несколько меток. В
ассемблере используется два типа меток: глобальные и локальные. Глобальные метки – это обычные
метки Турбо Паскаля. Они объявляются в разделе описаний после зарезервированного слова Label.
С помощью глобальной метки можно передать управление в тело ассемблерного оператора
оператором GOTO. Например:
Label
AltEnt;
Begin
Goto AltEnd;
……
{Передаем управление внутрь ассемблерного оператора}
Asm
……
AltEnd:
……
end; {Сюда можно передать управление извне}
Локальные метки объявляются непосредственно в теле ассемблерного оператора. Эти метки обязаны
начинаться символом «@». Поскольку этот символ нельзя использовать в именах Турбо Паскаля, он
позволяет отличить локальную метку от глобальной. Локальная метка не известна нигде вне
ассемблерного оператора, поэтому на нее нельзя передать управление оператором GOTO. По этой же
причине в разных ассемблерных операторах можно использовать одноименные локальные метки.
Префиксы
Встроенный ассемблер поддерживает следующие префиксы команд:
LOCK
Захват шины
REP/REPE/REPME
Повтор строковой команды
REPZ/REPNZ
Синоним REPE/REPNE
SEGCS
Перекрытие CS
SEGSS
Перекрытие DS
SEGES
Перекрытие SS
�Оглавлен ие
SEGDS
Перекрытие ES
Префиксы LOCK/REP/REPE/REPNE описаны выше. Префиксы SEGxx определяют сегментный регистр,
который должен использоваться вместо умалчиваемого, и распространяются только на следующие за
ними ассемблерные команды.
Если префикс указан без кода инструкции, он распространяет свое действие на следующую
ассемблерную команду.
Код инструкции очень редко имеет более одного префикса и никогда – более трех: допускается
следующая последовательность
LOCK SEGxx REPxx
Заметим, что если при обработке строковой команды произошло аппаратное прерывание, МП
8086/8088 «забывает» префиксы LOCK и SEGxx, которые, возможно, определены в той же команде,
так что использовать сложные префиксные конструкции не рекомендуется.
Коды инструкций
Встроенный ассемблер поддерживает мнемонику всех команд, перечисленных выше. Кроме того, в
ассемблерных командах может использоваться мнемоника инструкций процессора 8087, а также
команды процессоров 80286/80287. Заметим, что инструкции 8087 допустимы только при активном
состоянии {$Н+}, 80286 – при {$G+}, a 80287 – в случае {$G+,N+}.
Операнды
Операндами встроенного ассемблера могут быть выражения, состоящие из комбинации регистров,
констант, имен и символов операций.
Регистры
Во встроенном ассемблере используется мнемоника регистров, указанная выше, а также имя ST для
ссылки на регистры арифметического сопроцессора.
Константы
Ассемблер поддерживает строковые и числовые константы. Строковые константы заключаются в
апострофы или кавычки. Если константа объявлена с помощью кавычек, внутри нее символ апостроф
рассматривается наравне с другими символами, т.е. не считается ограничителем константы, точно так
же внутри константы, обрамленной апострофами, не считается ограничителем символ кавычки. Если
внутри константы необходимо указать ограничивающий ее символ, он удваивается. Примеры:
'Строковая константа'
"ЭТО - ТОЖЕ СТРОКОВАЯ КОНСТАНТА"
'Символ '' не считается ограничителем'
'внутри строки, обрамленной кавычками "..." '
Числовые константы могут быть только целыми и их значение не может превосходить емкости
двойного слова, т.е. должно быть внутри диапазона
-2 147 483 648
…
+4 294 967 295.
По умолчанию при записи числовых констант используется десятичная нотация, но ассемблер
поддерживает также двоичные, восьмеричные и шестнадцатеричные константы. Двоичная константа
�Оглавлен ие
составляется как комбинация единиц и нулей, заканчивающаяся символом В (от Binary – двоичный);
при записи восьмеричной константы используются символы 1...7, а в ее конце ставится символ О
(Octal – восьмеричный); шестнадцатеричная константа записывается по правилам Турбо Паскаля
(начинается с символа #) либо по правилам Турбо Ассемблера: начинается с цифры, в конце
ставится символ Н (от Hexadecimal – шестнадцатеричный).
Имена
Локальные метки – это единственные имена, которые разрешается определять внутри ассемблерного
оператора. Имена остальных объектов программы – констант, переменных, подпрограмм – должны
определяться только с помощью средств Турбо Паскаля.
Область определения имен подчиняется тем же правилам, что и в Турбо Паскале – имена должны
быть «видны» в том месте, где они используются, и они локализуются в пределах блока, в котором
описаны. Во встроенном ассемблере могут использоваться три предопределенных имени:
@Code
– текущий сегмент кода
@Data
– начальный сегмент данных
@Result
– ссылка внутри функции на ее результат
Имена @Code и @Data могут использоваться только в сочетании с директивой SEG для ссылки на
нужный сегмент. Например:
asm
mov ax, SEG @Data
mov ds, ax
end;
Имя @Result используется для присвоения результата функции. Например:
Function Min(X,Y: Integer): Integer; {Эта функция сравнивает два целых числа и возвращает
наименьшее из них}
Begin
Asm
mov ах, Х
{Помещаем Х в АХ}
cmp ax, Y
{X<Y ?}
jl @
{Да - на выход}
mov ax, Y
{Нет - помещаем Y в АХ}
@: mov @Result, ax
{AX содержит результат}
End
end;
Для доступа к полям записей разрешается использование составных имен. Например:
Type
Point = record
�Оглавлен ие
X,Y: Integer
end;
Rect = record
A, B: Point
end;
Var
P: Point;
R: Rect;
Begin
Asm
mov ax, P.X
add ax, P.Y
mov R.A.X, ax
End
End.
Идентификаторы типов можно применять к операндам для уточнения данных, о которых идет речь.
Каждая из следующих команд реализует одно и то же действие: загружает в регистр АХ слово по
адресу ES:[DI+4]:
mov ax, (Rect PTR es:[di]).B.X
mov ax, Rect (es: [di]).B.X
mov ax, es:Rect[di].B.X
mov ax, Rect[es:di].B.X
mov ax, es:[di].Rect.B.X
Следующие имена не могут использоваться в операндах встроенного ассемблера:
стандартные процедуры и функции (например, WriteLn, Chr);
предопределенные массивы Mem, MemW, MemL, Port, PortW;
константы с плавающей точкой, строковые и множественного типа;
макросы (процедуры и функции, полностью реализуемые одним InLine – оператором);
символ ©Result вне функции.
Выражения
Встроенный ассемблер использует выражения трех классов: регистровые, ссылки на память и
непосредственные.
Регистровое выражение – это выражение, состоящее из имени регистра. Все следующие команды
содержат только регистровые выражения:
�Оглавлен ие
push ds
pop es
mov ah, bl
add ex,ax
Непосредственные выражения – это нетипизированные константы и имена типов. Примеры
непосредственных выражений:
Const
dec = 10;
……
asm
mov ax, dec
mov bx, 0
add cx, 2*dec+l
sub dh,-5
end;
Все остальные выражения относятся к ссылкам на память. Например
Const
dec: Word = 10;
Step = 12;
Var
X, Y: Byte;
Asm
mov ax, dec
mov ex,[Step]
add ah, X
mov Y, bl
mov ax,[bx]
end;
Важным отличием ассемблерных выражений от выражений Турбо Паскаля является то
обстоятельство, что они должны быть статическими, т.е. разрешены (вычислены) на этапе создания
программы. Если выражение может быть полностью вычислено к моменту его трансляции, т.е. если
оно состоит только из регистровых или непосредственных значений, такое выражение называется
абсолютным, компилятор вычисляет его и использует для создания команды.
В ходе компиляции программы вырабатывается так называемый объектный код, который затем
преобразуется компоновщиком в готовую к работе программу. При создании объектного кода
�Оглавлен ие
компилятор не может вычислить значения выражений типа «ссылка на память», так как не знает
окончательного положения в памяти меток, переменных, подпрограмм. В результате он создает так
называемое перемещаемое выражение, которое затем компоновщиком преобразуется в нужную ссылку
на память.
Встроенный ассемблер разрешает любую операцию над абсолютным значением (см. ниже), но
ограничивает перемещаемые выражения до сложения или вычитания, одним из операндов которого
должна быть константа.
Другое важное отличие ассемблерных выражений от выражений Турбо Паскаля заключается в
способе интерпретации переменных. В выражениях Паскаля любая ссылка на переменную
интерпретируется как текущее содержимое этой переменной. В ассемблерных выражениях это
справедливо только тогда, когда все выражение в целом состоит из имени переменной. Во всех
остальных случаях ссылка на переменную интерпретируется как адрес переменной. Например,
выражение
Х+10
В Паскале означает: «к содержимому переменной Х прибавить 10». В ассемблерной команде это
означает: «к адресу (смещению) переменной Х прибавить 10». Однако команда
mov ах, Х
означает: «поместить в регистр АХ первые два байта переменной X». Если бы нам понадобилось
загрузить в АХ адрес переменной X, мы должны были бы написать
mov ax, OFFSET X
Заметим, что попытка «перехитрить» ассемблер командами типа
mov ах, Х+0
mov ах, Х+1-1
и т.п. не дает желаемого результата: ассемблер просто загружает в АХ содержимое переменной X.
Как и в Паскале, ассемблерные выражения имеют тип, но в отличие от Паскаля этот тип определяет
только размер объекта в памяти и не ограничивает применяемые к нему операции.
Встроенный ассемблер имеет следующие предопределенные типы:
Тип
Длина в памяти
BYTE
1
WORD
2
DWORD
4
QWORD
8
TBYTE
10
NEAR
–
FAR
–
�Оглавлен ие
Имена предопределенных типов можно использовать для приведения типов выражений. Например,
если определены переменные
Var
Flag: Boolean;
X: Word;
то такие ассемблерные выражения недопустимы:
mov Flag, bx
mov ah, X
Для корректного задания последней команды можно использовать следующие варианты:
mov ah, BYTE PTR X
mov ah, Byte(X)
mov ah, X.Byte
Во всех случаях в АН будет загружен первый (младший) байт переменной Х.
Встроенный ассемблер поддерживает операции, перечисленные в следующей таблице (в порядке
убывания приоритета).
Операции встроенного ассемблера
Операция
Комментарий
&
Перекрытие идентификатора
()
Подвыражение
[]
Ссылка на память
. (точка)
Селектор структуры
HIGH LOW
Доступ к байту в слове
+-
Унарные операции задания знака
:
Перекрытие сегмента
OFFSET SEG TYPE PTR *
/ MOD SHL SHR
+-
Бинарные операции
NOT AND OR XOR
Операции над битами
Операция &
Осуществляет перекрытие идентификатора: следующий за знаком & идентификатор считается
определенным в программе, даже если он не совпадает с зарезервированным словом. Например:
�Оглавлен ие
Var
Ch: Byte;
……
mov ch, 0
{Посылаем 0 в регистр CH}
mov &Ch, 0
{Посылаем 0 в переменную Ch}
Операция ( )
Круглые скобки используются обычным для Паскаля образом – для изменения порядка исчисления
выражения (подвыражение, ограниченное скобками, вычисляется в первую очередь). Если перед
скобками стоит имя типа, все выражение приобретает указанный тип. Например:
mov ах, ( (1+2)*3+4)*5
{АХ = 65}
mov bx,1+2*3+4*5
{ВХ = 27}
Операция [ ]
Определяет ссылку на память. Выражение внутри скобок вычисляется в первую очередь. Обычно оно
связывается с регистрами BX, BP, SI, DI и может использовать операции + и – для указания
индексации. Например:
mov ah,100 {АН = 100}
байта по адресу DS:100}
mov ah, [100]
{Загружаем в АН содержимое
Операция . (точка)
Селектор элемента структуры. Результат – сумма выражений до после точки с типом второго
выражения. Например:
Var
R: record
X: Word; Y: Byte
end;
……
mov ax, R.X
mov R.A, ai
Операции HIGH и LOW
HIGH возвращает старший, a LOW – младший байт выражения типа слова, следующего за символами
операции. Выражение должно иметь абсолютное непосредственное значение. Например:
mov al, High $1000
{AL = $10}
Операция : (двоеточие)
Указывает ассемблеру, что выражение после операции должно относиться к сегменту, указанному до
операции. Результат – ссылка на память со значением второго выражения. Например:
�Оглавлен ие
Mov ах, [10]
{AX = слово по адресу DS:10}
Mov ax, BS:[10] {АХ = слово по адресу BS:10}
Операция OFFSET
Возвращает смещение выражения, следующего за операцией. Результат имеет непосредственное
значение. Например:
mov ах, Х
{АХ = слово по адресу переменной X}
mov ax, offset Х
{АХ = смещение адреса X}
Операция SEG
Возвращает сегмент выражения, следующего за операцией. Результат имеет непосредственное
значение.
Операция PTR
Осуществляет приведение типа. Результат – ссылка на память со значением выражения после
операции и типом выражения до операции. Например:
Function SwapfX: Integer): Integer;
{Меняет местами байты в слове X}
begin
asm
mov ax, X
mov BYTE PTR @Result, ah
mov BYTE PTR @Result+l, al
end;
end;
Операции * и /
* – умножение, / – целочисленное деление. Оба выражения должны иметь непосредственные
абсолютные значения, такое же значение имеет и результат операции. Например:
mov ах, 2*2
{АХ = 4}
mov ах, 17/3
{АХ = 5}
Операция MOD
Возвращает остаток от целочисленного деления. Оба выражения должны иметь непосредственные
абсолютные значения, такое же значение имеет и результат операции. Например:
mov ax, 17 mod 3
{AX = 2}
Операции SHL и SHR
Осуществляют логический сдвиг влево (SHL) или вправо (SHR) выражения, стоящего до операции, на
количество разрядов, определяемое выражением после операции. Оба выражения должны иметь
непосредственные абсолютные значения, такое же значение имеет и результат операции. Например:
mov ah, 1 shl 7 {Ah = $80 = 128}
�Оглавлен ие
Бинарная операция +
Осуществляет сложение двух выражений. Выражения могут быть непосредственными значениями или
ссылками на память, но только одно из них может быть перемещаемым. Если одно из выражений –
ссылка на память, результат также определяет ссылку на память, а если одно из выражений –
перемещаемое, результат будет перемещаемым.
Бинарная операция –
Вычитание двух выражений. Первое выражение может быть любого класса, а второе должно быть
абсолютным непосредственным значением. Результат относится к тому же классу, что и первое
выражение.
Побитовые операции NOT, AND, OR, XOR
Имеют такой же смысл, что и одноименные операции Турбо Паскаля над целыми числами. Оба
выражения должны иметь непосредственные с абсолютные значения, такое же значение имеет и
результат операции.
Директивы ассемблера
Встроенный ассемблер не поддерживает никакие директивы, обычно используемые в других
ассемблерах, за исключением DB, DW, DD. Структура директив такова:
Dx <константа> [,<константа>,...,<константа>]
Здесь Dx – DB, DW или DD; <константа> – ассемблерная константа или константное выражение.
DB определяет цепочку байт, DW – слов, DD – двойных слов. Например:
db
'Турбо Паскаль',13,10
dw
0,$ FFFF, NearProc
dd
'ABCD',999999999, FarProc
В качестве константных выражений разрешается использовать любые ассемблерные константы со
значением, не выходящим из диапазона байта (DB), слова (DW) или двойного слова (DD). В любой
директиве можно определять строковую константу, которая приводит к побайтовому заполнению
памяти ASCII – кодами символов. Поскольку слово (двойное слово) размещается в памяти, начиная со
своего младшего байта, старший (старшие) байт в директивах DW и DD при размещении строкой
константы могжет остаться неопределенным и заполняется нулем. Например, два следующих
объявления эквивалентны:
dw
'5'
dw
$35
{$35 - ASCII-код символа '5'}
В директивах DW и DD разрешается также указывать имена, которые в этом случае интерпретируются
как адреса соответствующих объектов, причем для DW это – ближний адрес (смещение), а для DD –
дальний. Например:
dw X
{Размещает смещение переменной X}
dd Proc
{Размещает FAR-адрес процедуры Proc}
Данные, определяемые директивами Dx, всегда размещаются в текущем кодовом сегменте. Разместить
таким образом данные в сегменте данных (т.е. определить константу или типизированную константу)
�Оглавлен ие
невозможно – для этого используются стандартные средства Турбо Паскаля. Более того, директивы
не могут снабжаться именами, а поэтому использовать размещаемые с их помощью данные не так – то
просто. В следующем примере на экран выводится текстовое сообщение. Для этого используется
функция 9 вызова DOS, в соответствии с которой в регистрах DS:DX должен содержаться адрес
текстовой строки, а сама строка должна заканчиваться символом «$»:
asm
jmp @NextCode
{Обходим фрагмент данных}
@:
db 'Текстовая строка,13,10,'$'
@NextCode:
push ds
{Сохраняем DS}
push cs
pop ds
{DS = CS}
mov dx, OFFSET @
{DS:DX - адрес строки}
mov ah, 9
{АН - код функции вывода}
int 21h
{Выводим строку}
pop ds
{Восстанавливаем DS}
end;
Обратите внимание на использование регистра DS. В соответствии с требованиями функции 9, он
должен содержать сегмент выводимой строки. В нашем случае строка располагается в кодовом
сегменте, поэтому мы вынуждены сначала сохранить значение DS в стеке, а затем восстановить его.
Если бы мы этого не сделали, по завершении ассемблерного оператора регистр DS указывал бы на
сегмент кода и была бы потеряна связь программы Турбо Паскаля с глобальными переменными и
константами.
Ассемблерные подпрограммы
Ассемблерные подпрограммы – это процедуры и функции, объявленные с директивой Assembler. В
таких подпрограммах исполняемая часть не содержит begin... end и состоит из единственного
ассемблерного оператора asm... end. Например:
Function LongMul(X,Y:Integer):LongInt; Assembler;
asm
mov ax, X
imul Y
{DX/AX содержат "длинный" результат}
end;
При компиляции ассемблерных подпрограмм выполняется ряд оптимизаций кода, в том числе:
параметры-значения строкового типа, а также длиной в 1, 2 и 4 байта не копируются во временную
память, т.е. внутри подпрограммы они считаются параметрами-переменными;
�Оглавлен ие
компилятор не создает переменную @Result для результата функции, и ссылка на эту переменную
в ассемблерной функции недопустима;
исключением являются функции, возвращающие значения строкового типа, для них разрешается
использовать ссылку на @Result;
генерируются следующие команды на входе в подпрограмму и на ее выходе:
push bp
{Сохраняется ВР}
mov bp, sp
{ВР содержит текущую границу стека}
sub sp, Locals
{Резервируется часть стека для размещения локальных переменных}
……
mov sp, bp
{Восстанавливается граница стека}
pop bp
{Восстанавливается ВР}
ret Params
{Из стека удаляются параметры подпрограммы и осуществляется выход из нее}
Здесь Locals – общая длина в байтах всех объявленных в подпрограмме локальных переменных, а
Params – длина (в байтах) всех формальных параметров. Если Locals и Params равны нулю,
входной код не создается, а выходной содержит единственную инструкцию RET.
Все локальные переменные Турбо Паскаль размещает в стеке. Это относится как к обычным, так и к
ассемблерным подпрограммам. Для ссылки на локальные переменные используется адресация по базе,
задаваемой парой DS:ВР, поэтому при входе в процедуру всегда создается так называемый локальный
стек: в регистр ВР помещается текущая граница стека, а сама эта граница смещается вверх на
суммарную длину всех локальных переменных, чтобы работа со стеком внутри подпрограммы не
разрушила локальные переменные. Например:
Procedure ....; Assembler;
var
X: Word;
Y: Byte;
asm
mov X, ax
{Компилируется в mov [BP-2], ax}
mov ah,Y
{Компилируется в mov ah,[BP-3]}
end;
Ассемблерные функции должны следующим образом возвращать результат своей работы:
длиной 1 байт (Byte, Char и т.п.) – в регистре AL;
длиной 2 байта (Integer, Word) – в регистре АХ;
длиной 4 байта (Pointer, Longint) – в регистрах DX (старшее слово) и АХ (младшее слово);
типа Real – в регистрах DX, BX, АХ (старшее слово – в DX, младшее в АХ);
вещественных типов Single, Double, Extended, Comp – в регистре ST(0) сопроцессора;
�Оглавлен ие
строкового типа – во временной области памяти, на которую ссылается @Result.
Использование языка ассемблера в программах на Turbo Pascal 7.0
Turbo Pascal позволяет писать отдельные части программы (подпрограммы или части
подпрограмм) на языке ассемблера. Здесь возможны четыре варианта.
Во-первых, можно написать подпрограмму на языке ассемблера, скомпилировать ее отдельно
компилятором TASM (Turbo Assembler) с получением объектного файла, а затем скомпоновать его
с основной программой, написанной на Turbo Pascal, используя при этом директиву компилятора
{$L <имя файла>}, где <имя файла> – имя файла с подпрограммой на ассемблере, и директиву
external.
Во-вторых, используя встроенный ассемблер пакета Turbo Pascal, отдельные части текста
программы можно написать непосредственно на языке ассемблера, заключив их в операторные
скобки asm...end.
В-третьих, ту или иную подпрограмму (процедуру или функцию) можно полностью, за исключением
заголовка, написать на языке ассемблера, используя при этом директиву assembler. В этом случае
также используется встроенный ассемблер.
В-четвертых, небольшую подпрограмму можно написать непосредственно в кодах процессора,
используя оператор или директиву inline.
При написании отдельных частей программы на языке ассемблера следует иметь в виду, что
необходимо сохранить содержимое регистров ВР, SP, SS и DS. Если их необходимо изменить, то
исходные значения следует запомнить, а затем восстановить. Остальные регистры можно
безболезненно изменять.
Основным вопросом стыковки программы с подпрограммой, написанной на ассемблере, является
передача параметров в подпрограмму и обратно. Именно этому вопросу и будет здесь уделено
основное внимание.
Ниже будут рассмотрены особенности использования этих вариантов. В качестве примера их
использования будут приведены различные варианты подпрограммы-функции, определяющей
максимальный элемент из массива целых чисел.
Использование компилятора TASM
Как правило, этот вариант применяется, когда та или иная программа имеет большой размер и ее
целесообразно и написать, и скомпилировать отдельно, используя компилятор TASM. В этом случае
можно использовать все возможности языка и компилятора TASM.
Пример. Программа, использующая подпрограмму-функцию, определяющую максимальный элемент из
массива целых чисел и написанную на языке ассемблера.
Основная программа, использующая подпрограмму, написанную на языке ассемблера, содержит
инициализированный массив, в котором будет определяться максимальное число, а сама программа
выводит на экран значение максимального числа из этого массива:
Program EXAMPLE1;
Const N=7;
{Размер массива}
Massiv: Array [1… n] of Integer = (1, 2, 3, 2, 17, 7, 2);
{Исходный массив}
�Оглавлен ие
{$L SUBR}
{Подключение
SUBR.OBJ}
файла
Function Max (var Mas; N: Integer): Integer; External;
Begin
WriteLn('Максимальное число массива равно: ', Max(Massiv, N));
ReadLn
End.
Используя стандартную модель памяти, подпрограмму, определяющую максимальное число из
массива, можно написать следующим образом:
CODE
SEGMENT
BYTE
ASSUME
CS:CODE
PUBLIC
Max
AdrMas
EQU
DWORD
PTR[BP+ ;адрес первого параметра
6]
N
EQU
WORD
PTR[BP+ ;второй параметр
4]
PROC
NEAR
Max
M1:
PUBLIC
;внешний идентификатор
PUSH
ВР
;сохранение регистра ВР
MOV
BP, SP
;указатель стека
LDS
SI, AdrMas
;адрес массива
XOR
AX, AX
;0 - в регистр АХ
MOV
BX, 8001h
;минимальное целое число
MOV
CX, N
;число элементов массива
CMP
CX, AX
;сравнение с 0
JLE
M3
;0 или отрицательное число
LODSW
;загрузка элемента массива
CMP
AX, BX
;сравнение с текущим максимумом
JLE
M2
;не больше
MOV
BX, AX
;новое максимальное число
M2:
LOOP
M1
;цикл
M3:
MOV
AX, BX
;результат функции
POP
ВР
;восстановление регистра
RET
6
;возврат из подпрограммы
ВР
Max
ENDP
�Оглавлен ие
CODE
ENDS
END
По приведенной подпрограмме следует сделать следующие замечания.
Первые две команды – сохранение регистра ВР и загрузка в него указателя стека – являются
типичными командами, с помощью которых можно установить доступ к передаваемым параметрам
через регистр ВР.
Параметры передаются в подпрограмму следующим образом. Параметры-значения размером в один
байт передаются одним 16-разрядным словом, причем информативным является младший байт,
параметры-значения в 2 байта передаются одним 16-разрядным словом, в 4 байта – двумя
16-разрядными словами, параметры-значения типа Real передаются тремя 16-разрядными словами,
все остальные параметры-значения (в том числе и 3-байтовые) передаются своими полными
адресами. Из этого правила есть некоторые исключения: параметры-переменные и
параметры-константы всегда передаются своими полными адресами.
Т.к. в подпрограмме первый параметр является параметром-переменной, то он передается своим
адресом, с помощью которого в дальнейшем и извлекаются элементы массива. Второй параметр
подпрограммы – параметр-значение, и он передается своим значением. Первый параметр находится
по адресу ВР+6, а второй – ВР+4. Указанные смещения определяются наличием в стеке адреса
возврата (при ближней адресации - 2 байта), размещенным в стеке значением регистра ВР (2 байта) и
для первого параметра - размером второго параметра (2 байта).
Если подпрограмма является подпрограммой-функцией, то возвращаемый параметр передается
различным образом в зависимости от своего размера. Параметр размером в байт передается в регистре
AL, параметр размером в 2 байта - в регистре АХ, параметр размером в 4 байта - в регистрах DX
(старшая часть или адрес сегмента) и АХ (младшая часть или смещение), параметры размером в 6
байтов (типа Real) - в регистрах DX (старшая часть), ВХ (средняя часть) и АХ (младшая часть).
Параметры других вещественных типов передаются в нулевом элементе стека сопроцессора ST(0).
Если функция возвращает значение типа string, то при обращении к функции резервируется память
для размещения возвращаемой строки, а адрес этой области размещается в стеке выше всех
передаваемых параметров.
В рассматриваемом примере возвращаемый параметр – типа Integer, и он возвращается в регистре
АХ.
При возвращении из подпрограммы в команде RET записан аргумент 6 для удаления из стека
передаваемых параметров, которые в данном примере имеют именно этот размер.
Turbo Assembler предполагает и другое оформление подпрограмм, используемых затем в
программах, написанных на языке Паскаль. Для этого используется специальная модель памяти
Large (большая), задаваемая в виде:
.MODEL Large, PASCAL.
Она позволяет несколько упростить оформление входа в подпрограмму и выхода из нее.
Подпрограмма дополняется необходимыми командами на этапе компиляции.
Пример. Вариант предыдущей подпрограммы, использующий специальную модель памяти.
.MODEL
.CODE
LARGE, PASCAL
;специальная модель памяти
�MAX
@@1
PUBLIC
MAX
PROC
LDS
SI, MAS
;адрес массива
XOR
AX, AX
;0 - в регистр АХ
MOV
BX,8001H
;минимальное целое число
MOV
CX, N
;число элементов массива
CMP
CX, AX
;сравнение с 0
JLE
@@3
;0 или отрицательное число
LODSW
;внешний идентификатор
NEAR mas:DWORD, N:WORD
;загрузка элементов массива
CMP
AX, BX
;сравнение с текущим максимумом
JLE
@@2
;не больше
MOV
BX, AX
;новое максимальное число
@@2
LOOP
@@1
;цикл
@@3
MOV
AX, BX
;результат функции
RET
MAX
Оглавлен ие
;возврат из подпрограммы
ENDP
END
В этом примере не сохраняется и не восстанавливается регистр ВР – эти операции добавляются к
программе на этапе компиляции. Не указывается также и размер передаваемых параметров – они при
выходе из подпрограммы удаляются автоматически. В строке, где начинается описание подпрограммы
(начинается с имени подпрограммы – Мах), необходимо перечислить все передаваемые параметры в
том же порядке, как они заданы в заголовке, написанном на языке Паскаль с указанием их размеров (о
размерах передаваемых параметров см. выше).
Здесь показана также возможность использования в подпрограммах локальных меток, начинающихся
символами @@.
В подпрограмме, написанной на языке ассемблера, можно использовать подпрограммы, написанные
на языке Паскаль. Несколько модифицированная подпрограмма определения максимального элемента
массива, которая в случае недопустимого числа элементов массива (0 или отрицательное число)
вызывает подпрограмму, написанную на языке Паскаль для выдачи сообщения, приведена в
следующем примере.
Пример. Модифицированный вариант программы, в котором подпрограмма, написанная на языке
ассемблера, в случае недопустимого числа элементов массива (равно 0 или отрицательное) вызывает
подпрограмму, написанную на языке Паскаль, выводящую соответствующее сообщение.
Основная программа, содержащая подпрограмму на языке Паскаль, будет иметь следующий вид:
Program EXAMPLE2;
Сonst N = 7;
{Размер массива}
Massiv: array [1..n] of Integer = (1, 2, 3, 2, 17, 7, 2);
�Оглавлен ие
{Исходный массив}
($L SUBR)
{Подключение файла SUBR.OBJ}
Function Max (var Mas; N: Integer): Integer; External;
Procedure ErrorReport (N: Integer);
begin
WriteLn;
WriteLn('Недопустимое число элементов: ', N);
ReadLn
end;
begin
WriteLn('Максимальное число массива равно: ', Max(Massiv, N));
ReadLn
end.
Подпрограмма, написанная на языке ассемблера, будет в этом случае иметь следующий вид:
.MODEL
Large, PASCAL
;специальная модель памяти
EXTRN
ErrorReport: Near
;внешняя подпрограмма
PUBLIC
Max
;внешний идентификатор
.CODE
Max
PROC NEAR Mas: DWORD, N: Word
;передаваемые параметры
LDS
SI, Mas
;адрес массива
XOR
AX, AX
;0 - в регистр AX
MOV
BX, 8001h
;минимальное целое число
MOV
CX, N
;число элементов массива
CMP
CX, AX
;сравнение с 0
JG
@@1
;допустимое число
PUSH
BX
;сохранение регистра BX
PUSH
CX
;передаваемый параметр
CALL
ErrorReport
;обращение к подпрограмме
POP
BX
;восстановление регистра BX
JMP
@@3
;на завершение
@@1: LODSW
;загрузка элемента массива
�Оглавлен ие
CMP
AX, BX
;сравнение с текущим максимумом
JLE
@@2
;не больше
MOV
BX, AX
;новое максимальное число
@@2: LOOP
@@1
;цикл
@@3: MOV
AX, BX
;результат функции
RET
Max
;возврат из подпрограммы
ENDP
END
Перед обращением к подпрограмме, написанной на языке Паскаль, в стек в соответствующем порядке
следует поместить передаваемые параметры. В данном случае такой параметр один - число элементов
массива.
Т.к. подпрограмма, написанная на языке Паскаль, не гарантирует сохранение регистров AX, BX, CX
и DX, то в случае необходимости сохранения их значений следует перед обращением к подпрограмме,
написанной на языке Паскаль, сохранить в стеке значения соответствующих регистров, а после
возвращения из подпрограммы - восстановить их. В данном примере сохраняется содержимое
регистра BX, в котором записано минимальное целое число.
При написании программ, содержащих отдельные части, написанные на языках ассемблера и
Паскаль, следует обращать внимание на способ адресации (дальний – far или ближний – near).
Здесь существует следующее правило: если подпрограмма объявляется в интерфейсной части
какого-либо модуля, то она должна иметь дальнюю адресацию, в других случаях (подпрограмма
объявляется в файле, содержащем основную программу, или в исполнительной части модуля) следует
использовать ближнюю адресацию.
И еще одно замечание: внешнюю подпрограмму нельзя объявлять внутри другой подпрограммы.
Использование встроенного ассемблера
Начиная с версии 6.0 Turbo Pascal содержит встроенный ассемблер, позволяющий писать
отдельные части программ на языке ассемблера. Встроенный ассемблер обладает многими
возможностями языка Turbo Assembler, но приспособлен к использованию в программах,
написанных на языке Паскаль (позволяет использовать идентификаторы программы, написанные на
языке Паскаль, комментарии, имеющие такой же вид, как в языке Паскаль, позволяет
воспользоваться встроенным отладчиком для пошагового выполнения программы, контроля
содержимого регистров и параметров программы и т.д.).
Так же как и Turbo Аssembler, встроенный ассемблер предполагает использование ряда
предопределенных стандартных идентификаторов, имеющих специальное назначение. Если в
программе будет введен идентификатор с таким же именем, но имеющий другое назначение, в частях
программы, написанных на встроенном ассемблере, будет отдано предпочтение стандартному
назначению этого идентификатора. Перечень стандартных идентификаторов встроенного ассемблера
приведен в приложении В.
Наряду с возможностью использования идентификаторов языка Паскаль встроенный ассемблер
использует три дополнительных идентификатора:
@Code – текущий кодовый сегмент (используется только с оператором SEG);
�Оглавлен ие
@Data – текущий сегмент данных (используется только с оператором SEG);
@Result – результат, полученный функцией (можно использовать только внутри функции).
Со встроенным ассемблером нельзя использовать:
стандартные процедуры и функции;
специальные массивы Men, MemW, MemL, Port и PortW;
константы типа string, вещественных типов и типа-множества;
процедуры и функции, объявленные с директивой inline;
метки, объявленные не в данном блоке.
Часть программы, написанная на языке ассемблера, помещается в операторные скобки asm...end.
В следующем примере приведена программа, выполняющая те же функции, что и предыдущие
программы, но использующая встроенный ассемблер.
Пример. Программа, использующая подпрограмму-функцию, определяющую максимальный элемент из
массива целых чисел и написанную на языке ассемблера, но использующую встроенный ассемблер.
Program EXAMPLE3;
const N=7;
{Размер массива}
Massiv: array [1…n] of Integer = (1, 2, 3, 2, 17, 7, 2);{Исходный массив}
Function Max(var Mas; N:Integer):Integer;
begin
asm
LDS
SI, Mas
{адрес массива}
XOR
AХ, АХ
{(0 - в регистр AX}
MOV
BX, 8001h
{минимальное целое число}
MOV
СХ, N
{число элементов массива}
СMР
СХ, АХ
{сравнение с 0}
JLE
@@3
{0 или отрицательное число}
@@1: LODSW
{загрузка элемента массива}
СМР
АХ, ВХ
{сравнение с текущим максимумом}
JLE
@@2
{не больше}
MOV
ВХ, АХ
{новое максимальное число}
@@2: LOOP
@@1
{цикл}
@@3: MOV
@Result, ВХ
{результат функции}
еnd
�Оглавлен ие
end;
begin
WriteLn('Максимальное число массива равно: ', Max(Massiv, N));
ReadLn
end.
Следует заметить, что при использовании встроенного ассемблера комментарии пишутся таким же
образом, как и в языке Паскаль (в фигурных скобках). Назначение же точки с запятой несколько другое
– этим знаком отделяются друг от друга команды, написанные на одной строке (такая возможность при
использовании встроенного ассемблера существует), например:
LDS
SI, Mas;
XOR
AX, AX;
MOV
BX, 8001h
Как видно из примера, можно использовать идентификаторы, объявленные на языке Паскаль
(параметры Mas, N). Нет необходимости сохранять и восстанавливать регистр ВР, удалять из стека
передаваемые параметры, включая и локальные, и т. д.
Использование директивы ASSEMBLER
Если ту или иную подпрограмму нужно полностью написать на языке ассемблера, используя
встроенный ассемблер, можно вместо операторных скобок asm...end использовать директиву
assembler, которая имеет ряд особенностей.
Во-первых, все передаваемые параметры, размером отличные от 1, 2 или 4 байт, передаются всегда
своим адресом без создания копии в стеке.
Во-вторых, нельзя использовать для передачи результата функции переменную @Result. Результат
передается точно так же, как и при использовании TASM. Исключение составляет результат типа string.
В этом случае в переменной @Result находится адрес строки, в которую следует поместить
полученную информацию.
В-третьих, для процедур и функций, не имеющих формальных и локальных параметров, вообще не
выделяется область стека.
В-четвертых, так же как и в предыдущем случае, автоматически оформляется начало и конец
подпрограммы, связанные с сохранением регистра ВР и освобождением стека от передаваемых
параметров.
Ниже приведен пример использования такой директивы.
Пример. Программа, использующая подпрограмму-функцию, определяющую максимальный элемент из
массива целых чисел и написанную на языке ассемблера, но использующую встроенный ассемблер и
директиву assembler.
Program EXAMPLE4;
const N=7;
{Размер массива}
Massiv: array [1…n] of Integer = (1, 2, 3, 2, 17, 7, 2);
массив}
Function Max(var Mas; N:Integer):Integer; Assembler;
asm
{Исходный
�Оглавлен ие
LDS
SI, Mas
{адрес массива}
XOR
AХ, AX
{(0 - в регистр AX}
MOV
BX, 8001h
{минимальное целое число}
MOV
СХ, N
{число элементов массива}
СMР
СХ, АХ
{сравнение с 0}
JLE
@@3
{0 или отрицательное число}
@@1: LODSW
{загрузка элемента массива)
СМР
АХ, ВХ
{сравнение с текущим максимумом}
JLE
@@2
{не больше}
MOV
ВХ, АХ
{новое максимальное число}
@@2: LOOP
@@1
{цикл}
@@3: MOV
@Result, ВХ
{результат функции}
end;
begin
WriteLn('Максимальное число массива равно: ', Max(Massiv, N));
ReadLn
end.
Использование оператора или директивы INLINE
Для коротких подпрограмм (до десятка операторов) можно использовать непосредственное задание
всей подпрограммы или ее части в кодах процессора, используя оператор или директиву inline.
Отличие оператора от директивы заключается в том, что оператор может быть использован в
подпрограмме совместно с другими операторами, написанными на языках Паскаль или ассемблера, а
директива предполагает, что подпрограмма целиком состоит лишь из нее одной.
Само написание оператора или использование директивы inline практически ничем не отличается
друг от друга. Каждый из них начинается с зарезервированного слова inline, за которым в круглых
скобках через прямой слэш (/) записываются байты или слова кодов команд. При этом каждый
элемент будет либо байтом, либо словом в зависимости от фактического значения (байт, если значение
в пределах 0..255, слово – в остальных случаях). Этот стандартный размер можно изменить, используя
указатель размера <или>. Если используется указатель размера <, информация размещается в одном
байте, причем, если ее размер больше одного байта, используется только младший байт. Указатель
размера > всегда размещает информацию в одном 16-разрядном слове (см. пример ниже). В качестве
элементов оператора или директивы inline можно использовать идентификаторы языка Паскаль (в
директиве нельзя только использовать идентификаторы передаваемых в подпрограмму параметров).
Пример. Программа, использующая подпрограмму-функцию, определяющую максимальный элемент из
массива целых чисел, написанную на языке ассемблера и использующую оператор inline.
Program EXAMPLE5;
const
N=7;
{Размер массива}
�Оглавлен ие
Massiv: array [1…n] of Integer = (1, 2, 3, 2, 17, 7, 2);
{Исходный массив}
Function Max(var Mas; N:Integer):Integer;
Begin
inline(
$C5/$76/6/
{LDS SI, Mas}
$B8/>$0/
{MOV AX, 0}
$BB/$8001/
{MOV ВХ, 8001h}
$8B/$4E/4/
{MOV CX, N}
$3B/$C8/
{CMP CX, AX}
$7E/$09/
{JLE @@3}
$AD/
{@@1:
$3B/$C3/
{CMP AX, BX}
$7E/$02/
{JLE @@2}
$8B/$D8/
{MOV BX, AX}
$E2/$F7);
{@@2: LOOP@@1}
LODSW}
{@@3: MOV AX, BX}
asm
MOV AX, BX
end
end;
Begin
WriteLn('Максимальное число массива равно: ',
Max(Massiv, N));
ReadLn
End.
Несколько иначе используется директива inline. При использовании этой директивы подпрограмма
представляет собой макроопределение ассемблера, и при обращении к ней ее коды помещаются в
место обращения. В этом случае не формируются команды обращения к подпрограмме и выхода из нее.
Если подпрограмме передаются параметры, они, как обычно, передаются через стек, из которого их
можно взять. Такой вариант используется для очень коротких подпрограмм и дает наиболее
эффективный результат. В качестве примера рассмотрим все ту же задачу поиска в массиве
максимального числа, хотя используемая здесь подпрограмма и несколько великовата для данного
варианта.
Пример. Программа, использующая подпрограмму-функцию, определяющую максимальный элемент из
массива целых чисел, написанную на языке ассемблера и использующую директиву inline.
Program EXAMPLE6;
�Оглавлен ие
const
N=7;
{Размер массива}
Massiv: array [1…n] of Integer = (1, 2, 3, 2, 17, 7, 2);
{Исходный массив}
Function Max(var Mas; N:Integer):Integer;
Inline(
$59/
{POP CX
число элементов}
$5E/
{POP SI
смещение массива}
$1F/
{POP DS адрес сегмента}
$33/$C0/
{XOR AX, AX}
$BB/$8001/
{MOV BX, 8001h}
$3B/$C8/
{CMP CX, AX}
$7E/$09/
{JLE @@3
$AD/
{@@1: LODW}
$3B/$C3/
{CMP AX, BX}
$7E/$02/
{JLE @@2}
$8B/$D8/
{MOV BX, AX}
$E2/$F7);
{@@2: LOOP@@1}
$8B/$C3);
Begin
WriteLn('Максимальное
ReadLn
end.
число массива равно: ',
Max(Massiv, N));
�Оглавлен ие
Сообщения и коды ошибок
СООБЩЕНИЯ ОБ ОШИБКАХ ПЕРИОДА КОМПИЛЯЦИИ
Среда Турбо Паскаля дает исчерпывающую информацию о характере и месте обнаруженной
компилятором ошибки. При обнаружении ошибки среда автоматически загружает в окно редактора
исходный файл и помещает курсор около того места, где в исходном тексте обнаружена ошибка. При
этом в верхней строке редактора появляется диагностическое сообщение. После нажатия на любую
клавишу (кроме F1) верхняя строка восстанавливает свой первоначальный вид и среда переходит к
режиму редактирования; Если после появления сообщения об ошибке нажать F1, на экране появится
окно справочной службы с детальной информацией об ошибке и рекомендациями по ее устранению.
Некоторые ошибки в исходном тексте обнаруживаются не сразу, а в ходе продолжающегося
контекстного разбора. Например, несоответствие типов в операторе присваивания не может быть
обнаружено до тех пор, пока не будет вычислено целиком выражение в правой части этого оператора.
В таких случаях ищите ошибку слева от курсора или в предыдущей строке текста.
Ниже приводятся сообщения об ошибках в том виде, в каком они появляются в верхней строке
редактора, а также перевод сообщений справочной службы.
1 Out of memory (Выход за границы памяти).
Компилятору не хватает памяти. Имеется ряд возможных решений этой проблемы:
• если в опции COMPILE/DESTINATION установлено значение MEMORY, замените эту опцию на
DISK;
• если в опции OPTIONS/UNKER/LINK BUFFER установлено значение MEMORY, замените эту
опцию на DISK;
• если Вы используете резидентные обслуживающие программы, такие как SIDEKICK, NORTON,
удалите их из памяти;
• если Вы используете интегрированную среду TURBO.EXE, то попробуйте воспользоваться
компилятором ТРС.ЕХЕ – он занимает меньше памяти.
Если ни одна из рекомендаций не помогает, то, возможно, Ваша программа просто слишком велика,
чтобы компилировать ее в таком объеме памяти. В этом случае Вы должны разбить ее на два или
более модулей.
2 Identifier expected (Не указан идентификатор).
В этом месте должен находиться идентификатор. Возможно, Вы пытаетесь использовать в качестве
идентификатора зарезервированное слово.
3 Unknown identifier (Неизвестный идентификатор).
Этот идентификатор не был описан.
4 Duplicate identifier (Двойной идентификатор).
Попытка дважды описать один и тот же идентификатор.
5 Syntax error (Синтаксическая ошибка).
В исходном тексте найден недопустимый символ. Возможно, Вы забыли заключить в апострофы
строковую константу.
6 Error in real constant (Ошибка в вещественной константе).
7 Error in integer constant (Ошибка в целой константе).
Учтите, что после целых действительных чисел, превышающих диапазон представления целых чисел
�Оглавлен ие
(–2147483648..+2147483647), должны ставиться точка и ноль, например, 12345678912.0.
8 String constant exceeds line (Строковая константа превышает допустимые размеры).
Вероятно, Вы забыли поставить апостроф в конце строковой константы.
9 Too many nested files (Слишком много вложенных файлов).
Компилятор допускает не более пяти уровней вложенности включаемых файлов (т.е. в исходном
файле есть ссылка на включаемый файл, в котором есть ссылка на еще один включаемый файл и т.д.).
10 Unexpected end of file (He найден конец файла).
Вы могли получить это сообщение об ошибке по одной из следующих причин:
• Ваш исходный файл закончился перед последним END основного раздела операторов;
• вероятно, в Вашей программе неодинаковое количество операторов BEGIN и END;
• включаемый файл заканчивается в середине раздела операторов; каждый раздел операторов должен
целиком помещаться в одном файле;
• Вы не закончили комментарий.
11 Line too long (Слишком длинная строка).
Максимальная длина строки, обрабатываемой компилятором, равна 126 символам (обратите
внимание: редактор среды может обрабатывать строки практически неограниченной длины).
12 Type identifier expected (Здесь нужен идентификатор типа).
Не указан тип идентификатора.
13 Too many open files (Слишком много открытых файлов).
Появление этой ошибки означает, что конфигурационный файл CONFIG.SYS операционной системы
не включает параметр FILES=xx или этот параметр указывает слишком мало файлов. Увеличьте число
файлов до нужного значения, например, до 80.
14 Invalid file name (Неверное имя файла).
Имя файла неверно или указан несуществующий путь.
15 File not found (Файл не найден).
Файл не был найден в просмотренных каталогах.
16 Disk full (Диск заполнен).
Удалите некоторые файлы или воспользуйтесь новым диском.
17 Invalid compiler directive (Неправильная директива компилятора).
Неверная буква в директиве компилятора, один из параметров директивы компилятора неверный, или
Вы пользуетесь глобальной директивой компилятора, когда компиляция тела программы уже началась.
18 Too many files (Слишком много файлов).
В компиляции программы или программного модуля участвуют слишком много файлов. Попытайтесь
не использовать так много файлов, например, объединяя включаемые файлы или делая короче имена
файлов.
19 Undefined type in pointer definition (Неопределенный тип в объявлении указателя).
Попытка объявить типизированный указатель, связанный с ранее не объявленным типом данных.
20 Variable identifier expected (Отсутствует идентификатор переменной).
На этом месте должен быть идентификатор переменной.
21 Error in type (Ошибка в объявлении типа).
�Оглавлен ие
Объявление типа не может начинаться с этого символа.
22 Structure too large (Слишком большая структура).
Максимально допустимый размер любого структурного типа составляет 65520 байт.
23 Set base type of range (Базовый тип множества нарушает границы).
Базовый тип множества должен представлять собой тип–диапазон с границами в пределах от 0 до 255
или перечисляемый тип с не более чем 256 значениями.
24 File components may not be files (Компонентами файла не могут быть файлы) .
Конструкции типа file of file (файл файлов) или file of object (файл объектов) не допускаются. Нельзя
объявлять любые структурные типы, которые используют в качестве компонентов объекты или файлы.
25 Invalid string length (Неверная длина строки).
Объявляемая длина строки должна находиться в диапазоне от 1 до 255.
26 Type mismatch (Несоответствие типов).
Это сообщение может быть вызвано следующими причинами:
• несовместимые типы переменной и выражения в операторе присваивания;
• несовместимые типы фактического и формального параметров в обращении к процедуре или
функции;
• тип выражения не совместим с типом индекса при индексировании массива;
• несовместимые типы операндов в выражении.
27 Invalid subrange base type (Неправильный базовый тип для типа-диапазона) .
Допустимыми базовыми типами являются все порядковые типы.
28 Lower bound greater than upper bound (Нижняя граница больше верхней).
Описание типа–диапазона содержит неправильные границы.
29 Ordinal type expected (Нужен порядковый тип).
Вещественные, строковые, структурные, процедурные типы и указатели в данном месте программы не
допускаются.
30 Integer constant expected (Нужна целая константа).
31 Constant expected (Нужна константа).
32 Integer or real constant expected (Нужна целая или вещественная константа) .
33 Type identifier expected (Нужен идентификатор типа).
34 Invalid function result type (Неправильный тип результата функции).
Правильными типами результата функции являются все простые типы, строковые типы и указатели.
35 Label identifier expected (Нужен идентификатор метки).
Метка не обозначена с помощью идентификатора, как это требуется из контекста программы.
36 BEGIN expected (Нужен BEGIN).
37 END expected (Нужен END).
38 Integer expression expected (Нужно выражение типа INTEGER).
39 Ordinal expression expected (Нужно выражение перечисляемого типа).
40 Boolean expression expected (Нужно выражение типа BOOLEAN).
41 Operand types do not match operator (Типы операндов не соответствуют операции).
�Оглавлен ие
Данная операция не может быть применена к указанным операндам, например, 'A' div '2' .
42 Error in expression (Ошибка в выражении).
Данный символ не может участвовать в выражении указанным образом. Возможно, Вы забыли указать
операцию между двумя операндами.
43 Illegal assignment (Неверное присваивание).
Файлам и нетипизированным переменным нельзя присваивать значения. Идентификатору функции
можно присвоить значение только внутри раздела операторов данной функции.
44 Field identifier expected (Нужен идентификатор поля).
Попытка использовать запись целиком в том месте, где требуется ссылка на какое-либо поле записи.
45 Object file too large (Объектный файл слишком большой).
Турбо Паскаль не может компоновать файлы *.OBJ больше 64 Кбайт.
46 Undefined external (Неопределенная внешняя процедура).
Внешняя процедура или функция не имеет соответствующего определения PUBLIC в объектном файле.
Убедитесь, что Вы указали все объектные файлы в директивах {$L <имя .OBJ– файла>} и проверьте
написание идентификаторов процедуры или функции в файле *.ASM.
47 Invalid object file record (Неправильная запись объектного файла).
Файл .OBJ содержит неверную объектную запись. Убедитесь, что данный файл является
действительно файлом *.OBJ.
48 Code segment too large (Сегмент кода слишком большой).
Максимальный размер кода программы или программного модуля равняется 65520 байтам. Разбейте
Вашу программу или модуль на два или более модулей.
49 Data segment too large (Сегмент данных слишком велик).
Максимальный размер сегмента данных программы равен 65520 байтам, включая данные,
используемые программными модулями. Если Вам нужно большее количество глобальных данных,
опишите большие структуры с помощью указателей и выделяйте для них память динамически с
помощью процедуры NEW.
50 DO expected (Нужен оператор DO).
51 Invalid PUBLIC definition (Неверное PUBLIC-определение).
Возможные причины сообщения:
• данный идентификатор получил тип PUBLIC с помощью соответствующей директивы языка
ассемблера, но не соответствует описанию EXTERNAL в программе или программном модуле
Паскаля;
• две или более директивы PUBLIC языка ассемблера определяют один и тот же идентификатор;
• файлы *.OBJ определяют символы PUBLIC, не находящиеся в сегменте CODE.
52 Invalid EXTRN definition (Неправильное EXTRN-определение).
Возможные причины сообщения:
• программа на ассемблере ссылается с помощью директивы EXTRN на идентификатор, который не
описан в программе на Паскале и не был описан в интерфейсных секциях используемых программных
модулей;
• ассемблерная программа ссылается на идентификатор, обозначающий абсолютную переменную (т.е.
определенную словом ABSOLUTE);
�Оглавлен ие
• ассемблерная программа ссылается на идентификатор процедуры или функции типа INLINE.
53 Too many EXTRN definition (Слишком много EXTRN–определений). Турбо Паскаль не может
обрабатывать файлы *.OBJ при более чем 256 определениях EXTRN.
54 OF expected (Требуется OF).
55 INTERFACE expected (Требуется интерфейсная секция).
56 Invalid relocatable reference (Неправильная перемещаемая ссылка).
Возможные причины сообщения.
• файл *.OBJ содержит данные и перемещаемые ссылки в сегментах, отличных от CODE. Например,
Вы пытаетесь описать инициализированные переменные в сегменте DATA;
• файл *.OBJ содержит ссылки с размерами в байтах на перемещаемые символы. Такая ошибка
происходит в случае, если Вы используете операторы HIGH и LOW с перемещаемыми символами или
если Вы ссылаетесь в директивах DB на перемещаемые символы;
• операнд ссылается на перемещаемый символ, который не был определен в сегменте CODE или в
сегменте DATA;
• операнд ссылается на процедуру EXTRN или функцию EXTRN со сдвигом, например, CALL
SortProc+8.
57 THEN expected (Требуется THEN).
58 TO or DOWNTO expected (Требуется ТО или DOWNTO).
59 Undefined forward (Неопределенное опережающее описание).
Возможные причины сообщения:
• была описана процедура или функция в интерфейсной секции программного модуля, но ее
определение отсутствует в секции реализации;
• процедуры или функции были описаны с помощью опережающего описания, но их определение не
найдено.
60 Too many procedures (Слишком много процедур).
Турбо Паскаль допускает не более 512 процедур или функций в одном модуле. Если Вы компилируете
программу, то поместите некоторые процедуры или функции в модули. Если Вы компилируете модуль,
то разбейте его на два или несколько модулей.
61 Invalid typecast (Неверное преобразование типа).
Возможные причины сообщения:
• Вы пытаетесь разместить в памяти, занимаемой некоторой переменной, значение выражения другого
типа в случае, когда размер размещаемого значения не равен размеру переменной;
• Вы пытаетесь осуществить преобразование типа выражения, когда разрешается только ссылка на
переменную; процедуру или функцию.
62 Division by zero (Деление на ноль).
Предшествующая операция пытается выполнить деление на ноль.
63 Invalid file type (Неверный файловый тип).
Данный файловый тип не обслуживается процедурой обработки файлов. Например, процедура
READLN используется для типизированного файла или процедура SEEK – для текстового файла.
64 Cannot Read or Write variables of this type (Нет возможности считать или записать переменные
данного типа).
�Оглавлен ие
Нарушены следующие ограничения:
• процедуры READ и READLN могут считывать переменные символьного, целого, действительного и
строкового типов;
• процедуры WRITE и WRITELN могут выводить переменные символьного, целого, действительного,
булевского и строкового типов.
65 Pointer variable expected (Нужно использовать переменную-указатель).
Предыдущая переменная должна быть указателем.
66 String variable expected (Нужна строковая переменная).
Предшествующая переменная должна иметь строковый тип.
67 String expression expected (Нужно выражение строкового типа).
Предшествующее выражение должно иметь строковый тип.
68 Circular unit reference (Перекрестная ссылка модулей).
Два модуля ссылаются друг на друга:
Unit A; Unit В;
Uses В; Uses A;
69 Unit name mismatch (Несоответствие имен программных модулей).
Имя программного модуля, найденное в файле *.TPU, не соответствует имени, указанному в
предложении USES.
70 Unit version mismatch (Несоответствие версий модулей).
Один или несколько программных модулей, используемых данной программой, были изменены после
их компиляции. Воспользуйтесь опцией COMPILE/MAKE или COMPILE/BUILD в интегрированной
среде или опциями /М или /В в компиляторе ТРС, что позволит автоматически скомпилировать
программные модули, нуждающиеся в перекомпиляции.
71 Duplicate unit name (Повторное имя программного модуля).
Вы уже указали этот программный модуль в операторе USES.
72 Unit file format error (Ошибка формата файла модуля).
Файл *.TPU не соответствует стандарту Турбо Паскаля.
73 IMPLEMENTATION expected (Отсутствует исполняемая часть модуля).
74 Constant and case types do not match (Типы констант и тип выражения оператора CASE не
соответствуют друг другу).
Тип константы оператора CASE не совместим с выражением в операторе варианта.
75 Record variable expected (Нужна переменная типа запись).
Предшествующая переменная должна иметь тип запись.
76 Constant out of range (Константа нарушает границы).
Возможные причины сообщения:
• Вы пытаетесь указать индекс массива, выходящий за его границы;
• Вы пытаетесь присвоить переменной значение, выходящее за границы, допустимые для типа этой
переменной;
• Вы пытаетесь передать в качестве фактического параметра процедуре или функции константу,
выходящую за границы, допустимые для типа соответствующего формального параметра.
�Оглавлен ие
77 File variable expected (Нужна файловая переменная).
Предшествующая переменная должна иметь файловый тип.
78 Pointer expression expected (Нужно выражение типа указатель).
Предшествующее выражение должно иметь тип указателя.
79 Integer or real expression expected (Нужно выражение вещественного или целого типа).
Предшествующее выражение должно иметь тип REAL или INTEGER.
80 Label not within current block (Метка не находится внутри текущего блока).
Оператор GOTO не может ссылаться на метку, находящуюся вне текущего блока.
81 Label already defined (Метка уже определена).
Данная метка уже помечает оператор.
82 Undefined label in processing statement part (Неопределенная метка в предшествующем разделе
операторов) .
Данная метка была описана, и на нее осуществлялась ссылка в предшествующем разделе операторов,
но она не указана в тексте программы.
83 Invalid @ argument (Неправильный аргумент операции @).
Правильными аргументами являются идентификаторы переменных, процедур и функций.
84 Unit expected (Нужно кодовое слово UNIT).
85 «;» expected (Нужно указать «;»).
86 «:» expected (Нужно указать «:»).
87 «,» expected (Нужно указать «,»).
88 «(» expected (Нужно указать «(»).
89 «)» expected (Нужно указать «)»).
90 «=» expected (Нужно указать «=»).
91 «:=» expected (Нужно указать «:=») .
92 «[» or «(.» expected (Нужно указать «[» или «(.»).
93 «]» or «.)» expected (Нужно указать «]» или «.)»).
94 «.» expected (Нужно указать «.»).
95 «..» expected (Нужно указать «..») .
96 Too many variables (Слишком много переменных).
Нарушены следующие ограничения:
• общий размер глобальных переменных, описанных в программе или программном модуле, не может
превышать 64 Кбайт;
• размер локальных переменных, описанных в процедуре или функции, не может превышать 64 Кбайт.
97 Invalid FOR control variable (Неправильный параметр цикла оператора FOR) .
Параметр цикла оператора FOR должен быть переменной порядкового типа, определенной в разделе
описаний текущей подпрограммы.
98 Integer variable expected (Нужна переменная целого типа).
Предшествующая переменная должна иметь целый тип.
99 File and procedure types are not allowed here (Здесь не могут использоваться файлы или
�Оглавлен ие
процедурные типы).
Типизированная константа не может иметь файловый или процедурный тип.
100 String length mismatch (Несоответствие длины строки).
Длина строковой константы не соответствует количеству элементов символьного массива.
101 Invalid ordering of fields (Неверный порядок полей).
Поля в константе типа запись должны записываться в порядке их описания.
102 String constant expected (Нужна константа строкового типа).
103 Integer or real variable expected (Нужна переменная типа INTEGER или REAL).
Предшествующая переменная должна иметь целый или вещественный тип.
104 Ordinal variable expected (Нужна переменная порядкового типа).
Предшествующая переменная должна иметь порядковый тип.
105 INLINE error (Ошибка в операторе INLINE).
Оператор «<» не допускается в сочетании с перемещаемыми ссылками на переменные. Такие ссылки
всегда имеют размер в слово.
106 Character expression expected (Предшествующее выражение должно иметь символьный тип).
107 Too many relocation items (Слишком много перемещаемых элементов).
Размер таблицы перемещения файла *.ЕХЕ превышает 64 Кбайта, что является верхним пределом в
Турбо Паскале. Если Вы обнаружили эту ошибку, то это значит, что программа просто слишком велика
для обработки компоновщиком Турбо Паскаля. Возможно также, что она слишком велика для
выполнения в MS-DOS. В таком случае нужно выделить в программе основной раздел, который
выполнял бы обращение к двум или более вспомогательным разделам с помощью процедуры ЕХЕС из
модуля DOS.
108 Overflow in arithmetic operator (Переполнение при выполнении арифметического оператора).
Результат предыдущей арифметической операции не лежит в диапазоне –2146483648 ...+2147483647.
Исправьте операцию или используйте вещественные типы вместо целочисленных.
109 No enclosing FOR, WHILE or REPEAT statement (Нет операторов, заканчивающих операторы
FOR, WHILE или REPEAT).
Процедуры BREAK и CONTINUE не могут вызываться вне тела оператора цикла.
110 Debug information table overflow (Переполнение информационной таблицы отладки).
Возможно, программа содержит более 65536 имен или 65536 строк. Отключите генерацию таблиц
отладки директивой компилятора {$D–} или исправьте один или более модулей.
111 Ошибка с этим кодом не описана в версии 7.0 системы Турбо Паскаль.
112 CASE constant out of range (Константа CASE нарушает допустимые границы).
Целочисленные константы оператора CASE должны находиться в диапазоне от – 32768 до 32767.
113 Error in statement (Ошибка в операторе).
Данный символ не может быть первым символом в операторе.
114 Cannot call an interrupt procedure (Невозможно вызвать процедуру прерывания).
Вы не можете непосредственно вызвать процедуру обработки прерывания.
115 Ошибка с этим кодом не описана в версии 7.0 системы Турбо Паскаль.
116 Must be in 8087 mode to compile this (Для компиляции необходим режим 8087) .
�Оглавлен ие
Данная программа может быть скомпилирована только в режиме {$N+}. В состоянии {$N–} операции
с типами SINGLE, DOUBLE, EXTENDED и СОМР не допускаются.
117 Target address not found (Указанный адрес не найден).
Команда COMPILE/FIND ERROR в среде Турбо Паскаля (или поиск с помощью опции /F в командной
строке компилятора ТРС.ЕХЕ) не обнаружила оператор, соответствующий заданному адресу.
118 Include files are not allowed here (Здесь не допускаются включаемые файлы).
Раздел операторов должен целиком размещаться в одном файле.
119 No inherited methods are accessible here (В этом месте программы нет унаследованных методов).
Вы используете зарезервированное слово INHERITED вне метода объекта или в методе, который не
унаследован от родительского объекта.
120 Ошибка с этим кодом не описана в версии 7.0 системы Турбо Паскаль.
121 Invalid qualifier (Неверный квалификатор).
Возможные причины сообщения:
• Вы пытаетесь индексировать переменную, которая не является массивом,
• Вы пытаетесь указать поля в переменной, которая не является записью,
• Вы используете в качестве указателя переменную, которая не является указателем.
122 Invalid variable reference (Недействительная ссылка на переменную).
Предыдущая конструкция удовлетворяет синтаксису ссылки на переменную, но она не указывает адрес
памяти. Возможно Вы вызываете функцию-указатель, но забываете сослаться на результат с помощью
знака ^.
123 Too many symbols (Слишком много символов).
Программа или программный модуль содержат более 64 Кбайт символов. Если Вы компилируете
программу с директивой {$D+}, то попробуйте отключить эту директиву или разбейте программу на
несколько модулей.
124 Statement part too large (Слишком большой раздел операторов).
Турбо Паскаль ограничивает размер раздела операторов до величины примерно 24 Кбайта. Если Вы
обнаружили эту ошибку, поместите части раздела операторов в одну или несколько процедур и вообще
сделайте Вашу программу более структурированной.
125 Ошибка с этим кодом не описана в версии 7.0 системы Турбо Паскаль.
126 Files must be var parameters (Файлы должны передаваться как параметры-переменные).
Вы пытаетесь передать процедуре или функции параметр-значение файлового типа. Параметры
файлового типа должны быть параметрами-переменными.
127 Too many conditional symbols (Слишком много условных символов).
Недостаточно памяти для определения условных символов (слов, управляющих командами условной
компиляции). Попытайтесь удалить некоторые символы или уменьшить их длину.
128 Misplaced conditional directive (Пропущена условная директива).
Компилятор обнаружил директиву {$ELSE} или {$ENDIF) без соответствующих директив {$IFDEF},
{$IFNDEF} или {$IFOPT}.
129 ENDIF directive missing (Пропущена директива ENDIF).
Исходный файл закончился внутри конструкции условной компиляции. В исходном файле должно
быть равное количество директив {$IFxxx} и {$ENDIF}.
�Оглавлен ие
130 Error in initial conditional defines (Ошибка в условных определениях).
Исходные условные символы указанные в опции OPTIONS/COMPILER /CONDITIONAL DEFINES
являются недействительными. Турбо Паскаль требует нуля или более идентификаторов, разделенных
пробелами, запятыми или точками с запятой.
131 Header does not match previous definition (Заголовок не соответствует предыдущему определению).
Возможные причины сообщения:
• заголовок процедуры или функции, указанный в интерфейсной секции, не соответствует заголовку в
исполняемой части.
• заголовок процедуры или функции, указанный с помощью опережающего описания FORWARD, не
соответствует заголовку найденной далее одноименной процедуры или функции.
132 Critical disk error (Критическая ошибка диска).
Во время компиляции произошла критическая ошибка диска (например, дисковод находится в
состоянии «не готов»).
133 Cannot evaluate this expression (Нельзя вычислить данное выражение).
В выражении–константе или в отладочном выражении Вы пытаетесь использовать
неподдерживаемые средства, например, в описании константы пытаетесь использовать функцию SIN
или вызвать в отладочном выражении определенную пользователем функцию.
134 Expression incorrectly terminated (Некорректное завершение выражения).
Контекстуально в данном месте программы должен быть конец выражения или оператора.
135 Invalid format specifier (Неверный спецификатор формата).
Используется неверный спецификатор формата или числовой аргумент спецификатора формата
выходит за допустимые границы.
136 Invalid indirect reference (Недопустимая косвенная ссылка).
Оператор пытается осуществить недопустимую косвенную ссылку. Например, Вы используете
абсолютную переменную, базовая переменная которой в текущем модуле неизвестна, или используете
программу типа INLINE, в которой делается ссылка на переменную, неопределенную в текущем
модуле.
137 Structured variable are not allowed here (Здесь нельзя использовать переменную структурного
типа).
Делается попытка выполнить над переменной структурного типа неподдерживаемую операцию.
Например, Вы пытаетесь перемножить две записи.
138 Cannot evaluate without System unit (Нельзя вычислить выражение без модуля SYSTEM).
Чтобы отладчик смог вычислить выражение, в файле TURBO.TPL должен содержаться модуль
SYSTEM.
139 Cannot access this symbol (Нет доступа к данному символу).
Как только Вы скомпилируете программу, все множество ее символов становится доступным. Однако
к отдельным символам (например, к переменным) нельзя получить доступ, пока Вы не запустите
программу.
140 Invalid floating-point operation (Недопустимая операция с плавающей запятой).
При выполнении операции с плавающей запятой произошло переполнение или деление на ноль.
141 Cannot compile overlay to memory (Нельзя выполнить компиляцию оверлейных модулей в память).
�Оглавлен ие
Программа, использующая оверлейные модули, должна компилироваться на диск.
142 Procedure or function variable expected (Должна использоваться переменная процедурного типа).
В этом контексте оператор получения адреса @ может использоваться только с переменной
процедурного типа.
143 Invalid procedure or function reference (Недопустимая ссылка на процедуру или функцию).
Возможные причины сообщения:
• Вы пытаетесь вызвать процедуру в выражении;
• процедура или функция, использующаяся в качестве параметра вызова другой процедуры или
функции, должна компилироваться в состоянии {$F+} и не может описываться с помощью
зарезервированных слов INLINE или INTERRUPT.
144 Cannot overlay this unit (Этот модуль не может использоваться в качестве оверлейного).
Попытка использовать в качестве оверлейного модуль, который не был скомпилирован с директивой
{$О+}.
145 Too many nested scopes (Слишком много вложений). В программе не может быть больше 512
вложений с не более чем 128 вложениями в каждом модуле. Вложениями считаются:
• каждый модуль в предложении USES;
• каждая вложенная запись в типе RECORD;
• каждый вложенный оператор WITH.
146 File access denied (Отказано в доступе к файлу).
Возможные причины:
• Вы пытаетесь использовать файл с атрибутом «только для чтения» в качестве выводного файла;
• Вы используете имя каталога вместо имени выводного файла.
147 Object type expected (Здесь должен быть тип OBJECT).
Этот идентификатор должен принадлежать к типу OBJECT.
148 Local object types are not allowed (Нельзя объявлять локальные объекты).
Нельзя объявить объект в процедуре (функции).
149 VIRTUAL expected (Пропущено слово VIRTUAL).
150 Method identifier expected (Пропущен идентификатор инкапсулированного правила).
151 Virtual constructor are not allowed (Конструктор не может быть виртуальным).
153 Destructor identifier expected (Пропущен идентификатор деструктора).
154 Fail only allowed within constructor (Обращение к стандартной процедуре FAIL может содержаться
только в конструкторе).
155 Invalid combination of opcode and operands (Недопустимая комбинация кода команды и
операндов).
Код ассемблерной команды не может иметь такие операнды. Причины ошибки:
• указано слишком много или слишком мало операндов для данной команды, например,
• INC AX, ВХ ИЛИ MOV АХ;
• количество операндов правильное, но их типы или порядок следования не соответствуют данной
команде, например, DEC 1, MOV AX, CL или MOV 1, AX.
156 Memory reference expected (Отсутствует адрес).
�Оглавлен ие
Операнд ассемблерной команды не содержит адрес. Вероятно, Вы забыли выделить квадратными
скобками индексный регистр, например, MOV AX, BX+SI вместо MOV AX, [BX+SI].
157 Cannot add or subtract relocatable symbols (Нельзя складывать или вычитать перемещаемые
символы).
В ассемблерных выражениях обоими операндами в операциях сложения или вычитания могут быть
только ссылки на константу. Идентификаторы переменных, процедур, функций и меток являются
перемещаемыми символами, и не могут использоваться в качестве двух операндов одновременно в
таких операциях. Если VAR – идентификатор переменной, a CONSТ – константы, то предложения
MOV AX, CONST+CONST и MOVE AX, VAR+CONST будут правильными, в то время как выражение
MOV AX, VAR+VAR недопустимо.
158 Invalid register combination (Недопустимая комбинация регистров).
Допустимыми комбинациями индексных регистров являются [ВХ], [ВР], [SI], [DI], [BX+SI], [BX+DI],
[BP+SI] и [BP+DI]. Другие комбинации (например, [АХ], [ВР+ВХ], [SI+DX]) недопустимы. Заметим,
что локальные переменные размещаются в стеке и доступ к ним организуется через регистр ВР.
Ассемблер автоматически добавляет [ВР] в ссылках на такие переменные, поэтому в операндах типа
LOCAL [ВХ], где LOCAL – локальная переменная, образуется недопустимая ссылка LOCAL [ВР+ВХ] .
159 286/287 instructions are not enabled (Недоступен набор команд микропроцессоров 286/287).
Используйте директиву {$G+}, но учтите, что такую программу можно исполнять только на ПК,
оснащенных микропроцессором Intel 80286/80287 или более поздним.
160 Invalid symbol reference (Недопустимая ссылка на символ).
К указанному символу нельзя обратиться в ассемблерной программе. Это может быть следствием
таких причин:
• Вы пытаетесь использовать ссылки на стандартные процедуры (функции) или специальные массивы
MEM, MEMW, MEML, PORT и PORTW в ассемблерных операндах;
• Вы обращаетесь к строковой, вещественной константе или константе типа SET в операнде
ассемблерной команды;
• в ассемблерном операнде Вы обращаетесь к процедуре или функции, написанной в режиме INLINE;
• Вы пытаетесь получить с помощью операции ©Result доступ к результату, возвращаемому функцией;
• Вы пытаетесь использовать короткую форму команды JMP для передачи управления в непомеченный
оператор программы.
161 Code generation error (Ошибка генерации кода).
Ошибка возникает, в частности, при компиляции ассемблерных фрагментов, содержащих команды
LOOP, LOOPE, LOOPNE, JCXZ, если команда ссылается на недоступную метку.
162 ASM expected (Отсутствует зарезервированное слово ASM).
ОШИБКИ, ВОЗНИКАЮЩИЕ ВО ВРЕМЯ ВЫПОЛНЕНИЯ ПРОГРАММ
Некоторые ошибки, обнаруженные во время выполнения программы, приводят к появлению на экране
сообщения вида
Runtime error nnn at хххх:уууу
(Ошибка периода исполнения nnn по адресу хххх:уууу)
где nnn – номер ошибки; xxxx:уууу – адрес (сегмент и смещение). После этого сообщения программа
завершает свою работу.
�Оглавлен ие
Ошибки периода исполнения делятся на четыре категории: ошибки, обнаруживаемые ДОС (коды
ошибок с 1 до 99), ошибки ввода–вывода (с 100 по 149), критические ошибки (с 150 по 199) и
фатальные ошибки (коды ошибок с 200 до 255).
Ошибки, обнаруживаемые ДОС
1 Invalid function number (Неверный номер функции).
Вы пытаетесь вызвать несуществующую функцию ДОС.
2 File not found (He найден файл).
Ошибка генерируется процедурами RESET, APPEND, RENAME или ERASE в случае, если имя,
присвоенное файловой переменной, указывает несуществующий файл.
3 Path not found (Путь не найден).
Ошибка генерируется процедурами:
• RESET. REWRITE, APPEND или ERASE в случае, если имя, присвоенное файловой переменной,
является недействительным или указывает на несуществующий подкаталог;
• CHDIR, MKDIR или RMDIR в случае, если путь является недействительным или указывает
несуществующий подкаталог.
4 Too many open files (Слишком много открытых файлов).
Ошибка генерируется процедурами RESET, REWRITE или APPEND в случае, если программа имеет
слишком много открытых файлов. ДОС не позволяет использовать более 15 открытых файлов для
каждого процесса. Если ошибка возникла при наличии менее 15 открытых файлов, то она может
указывать на то, что файл CONFIG.SYS не содержит параметра FILES =ххх или что этот параметр
задает слишком мало файлов. Увеличьте параметр FILES=ххх до какого-либо подходящего значения,
например, до 80.
5 File access defined (Отказано в доступе к файлу).
Данная ошибка генерируется процедурами:
• RESET или APPEND в случае, когда имя, присвоенное файловой переменной, указывает каталог или
файл, доступный только для чтения, в то время как параметр FILEMODE файловой переменной
содержит указание на запись данных;
• REWRITE в случае, когда каталог заполнен, или если имя, присвоенное файловой переменной, задает
каталог или существующий файл, доступный только для чтения;
• RENAME в случае, если имя, присвоенное файловой переменной, указывает каталог или если новое
имя указывает существующий файл;
• ERASE в случае, если имя, присвоенное файловой переменной, указывает каталог или файл,
доступный только для чтения;
• MKDIR в случае, если файл с тем же именем уже существует в порождающем каталоге, если нет места
в порождающем каталоге или если путь к каталогу содержит имя логического устройства;
• RMDIR в случае, если каталог не является пустым, если путь не определяет каталог или если путь
задает корневой каталог;
• READ или BLOCKREAD в случае типизированного или нетипизированного файла, если файл не
открыт для чтения;
• WRITE или BLOCKWR1TE для типизированного или нетипизированного файла в случае, если этот
файл не открыт для записи.
6 Invalid file handle (Недопустимый файловый канал).
�Оглавлен ие
Данная ошибка генерируется в случае, когда системному вызову ДОС передается недопустимый
файловый канал. Эта ошибка не должна возникать в правильно работающей программе. Ее появление
является свидетельством того, что файловая переменная каким-либо образом испорчена.
12 Invalid file access code (Недействительный код доступа к файлам).
Ошибка генерируется процедурами RESET или APPEND, если значение параметра FILEMODE в
файловой переменной не является допустимым.
15 Invalid drive number (Недопустимый номер дисковода).
Ошибка генерируется процедурой GETDIR в случае, если номер дисковода не является допустимым.
16 Cannot remove current directory (Нельзя удалить текущий каталог).
Ошибка генерируется процедурой RMDIR в случае, если путь указывает текущий каталог.
17 Cannot rename across drives (Нельзя при переименовании указывать разные дисководы).
Генерируется процедурой RENAME в случае, если оба файла не находятся на одном и том же диске.
Ошибки ввода-вывода
Если один из операторов компилировался с директивой {$I+}, то ошибка ввода–вывода приводит к
прекращению выполнения программы. В состоянии {$I–} программа продолжает выполняться, а
ошибка возвращается функцией IORESULT.
100 Disk read error (Ошибка чтения с диска).
Генерируется процедурой READ в типизированном файле в случае, если Вы пытаетесь осуществить
считывание из полностью прочитанного файла.
101 Disk write error (Ошибка записи на диск).
Ошибка генерируется процедурами CLOSE, WRITE, WRITELN, FLUSH в случае, если диск заполнен.
102 File not assigned (Файлу не присвоено имя).
Ошибка генерируется процедурами RESET, REWRITE, APPEND, RENAME и ERASE в случае, если
файловой переменной не было присвоено имя файла с помощью обращения к процедуре ASSIGN.
103 File not open (Файл не открыт).
Ошибка генерируется процедурами CLOSE, READ, WRITE, SEEK, EOF, FILEPOS, FILESIZE, FLUSH,
BLOCKREAD, BLOCKWR1TE в случае, если файл не открыт.
104 File not open for input (Файл не открыт для ввода).
Ошибка генерируется процедурами READ, READLN, EOF, EOLN, SEEKEOF или SEEKEOLN в
текстовом файле в случае, если файл не открыт для ввода.
105 File not open foe output (Файл не открыт для вывода).
Ошибка генерируется процедурами WRITE или WRITELN в текстовом файле в случае, если файл не
открыт для вывода.
106 Invalid numeric format (Неверный числовой формат).
Генерируется процедурами READ или READLN в случае, если числовое значение, считанное из
текстового файла, не соответствует правильному числовому формату.
Критические ошибки
150 Disk is write protected (Диск защищен от записи).
151 Unknown unit (Неизвестный модуль).
152 Drive not ready (Дисковод находится в состоянии «не готов»).
�Оглавлен ие
153 Unknown command (Неопознанная команда).
154 CRC error in data (Ошибка в исходных данных).
155 Bad drive requiest structure length (При обращении к диску указана неверная длина структуры).
156 Disk seek error (Ошибка при операции установки головок на диске).
157 Unknown media type (Неизвестный тип носителя).
158 Sector not found (Сектор не найден).
159 Printer out of paper (Кончилась бумага на принтере).
160 Device write fault (Ошибка при записи на устройство).
161 Device read fault (Ошибка при чтении с устройства).
162 Hardware failure (Сбой аппаратуры).
Фатальные ошибки
Эти ошибки всегда приводят к немедленной остановке программы.
200 Division by zero (Деление на ноль).
201 Range check error (Ошибка при проверке границ).
Ошибка генерируется операторами, скомпилированными в состоянии {$R+} при возникновении
одной из следующих ситуаций:
• индексное выражение массива находилось вне допустимого диапазона;
• была осуществлена попытка присвоить переменной значение, находящееся вне диапазона
переменной;
• была осуществлена попытка передать значение, находящееся вне допустимого диапазона, в качестве
параметра процедуре или функции.
202 Stack overflow error (Переполнение стека).
Эта ошибка генерируется на входе в процедуру или функцию, скомпилированную в режиме {$S+}, в
случае, если нет достаточной области для размещения локальных переменных подпрограммы.
Увеличьте размер стека, используя директиву компилятора {$М}.
203 Heap overflow error (Переполнение кучи).
Эта ошибка генерируется процедурами NEW или GЕТМЕМ в случае, если в куче нет свободной памяти
требуемого размера.
204 Invalid pointer operation (Недействительная операция с указателем).
Эта ошибка генерируется процедурами DISPOSE или FREEMEM в случае, когда указатель имеет
значение NIL или указывает на адрес, лежащий за пределами динамически распределяемой области
памяти.
205 Floating point overflow (Переполнение при операции с плавающей запятой).
В результате выполнения операции с плавающей запятой получено слишком большое вещественное
число.
206 Floating point underflow (Исчезновение порядка при операции с плавающей запятой).
Эта ошибка генерируется только в том случае, если используется сопроцессор 8087/80287/80387 с
управляющим словом, которое демаскирует ошибку исчезновения порядка. По умолчанию
исчезновение порядка приводит к возвращению результата, равного нулю.
207 Invalid floating point operation (Недопустимая операция с плавающей запятой).
�Оглавлен ие
Возможные причины сообщения:
• аргумент функций TRUNC или ROUND не может быть преобразован в целое число, находящееся
внутри диапазона типа LONGINT (от –2147483648 до +2147483647);
• отрицательный аргумент функции SORT (извлечение квадратного корня);
• аргумент функции LN (логарифм) равен нулю или имеет отрицательное значение;
• произошло переполнение стека сопроцессора.
208 Overlay manager not installed (Не установлена подсистема управления оверлеем).
Ваша программа вызывает оверлейную процедуру или функцию, а подсистема управления оверлеем не
инициирована. Вероятнее всего, в программе отсутствует обращение к процедуре OVRINIT или
обращение к этой процедуре завершилось с ошибкой. Нужно иметь в виду, что если в каком-либо из
оверлейных модулей содержится раздел инициации, то в программе необходимо создать
дополнительный или использовать имеющийся не оверлейный модуль, вызывающий процедуру
OVRINIT в своем разделе инициализации, и указать этот модуль в предложении USES перед любым
из оверлейных модулей.
209 Overlay file read error (Ошибка чтения оверлейного файла).
Ошибка чтения произошла, когда подсистема управления оверлеем пыталась считать оверлейный
модуль из оверлейного файла.
210 Object not initialized (He инициирован объект).
Вы обращаетесь к виртуальному правилу применительно к неинициированному объекту (до вызова
конструктора).
211 Call to abstract method (Вызов абстрактного правила).
Эта ошибка генерируется правилом ABSTRACT модуля OBJECT при работе в среде Turbo Vision в
случае обращения к абстрактному правилу, т.е. к виртуальному правилу, которое разработано
специально для его замены в объектах–потомках.
212 Stream registration error (Ошибка в регистрируемом потоке).
Эта ошибка генерируется правилом REGISTERTYPE модуля OBJECT при работе в среде Turbo Vision в
случае возникновения одной из следующих ошибок:
• запись регистрируемого потока не содержит сегмента данных;
• поле OBJTYPE записи регистрируемого потока нулевое;
• указанный тип уже был зарегистрирован;
• существует другой тип с таким же полем OBJTYPE.
213 Collection index out of range (Набираемый индекс выходит из границ диапазона).
Индекс, передаваемый объекту TCOLLECTION при работе в среде Turbo Vision, выходит за границы
диапазона.
214 Collection overflow error (Переполнение коллекции).
Эта ошибка генерируется объектом TCOLLECTION при работе в среде Turbo Vision в случае, если
делается попытка добавить элемент к коллекции, которую нельзя расширять.
�Оглавлен ие
Библиографический список
Библиографический список
1. Андреева, Т.А. Программирование на языке Pascal / Т.А. Андреева. – М. : Бином, 2006. – 240 с.
2. Зеленяк, О.П. Современный задачник по Турбо Паскалю / О.П. Зеленяк. – М. : ДМК Пресс, 2010. –
312 с.
3. Златопольский, Д.М. Программирование / Д.М. Златопольский. – М. : Бином. Лаборатория знаний,
2007. – 223 с.
4. Камаев, В.А. Технологии программирования / В.А. Камаев, В.В. Костерин. – М. : Высшая школа,
2005. – 359 с.
5. Кассера, В. Turbo Pascal 7.0 / В. Кассера, Ф. Кассера. – М. : DiaSoft, 2003. – 425 с.
6. Клатте, Р. PASCAL-XSC. Язык численного программирования / Р. Клатте, У. Кулиш, М. Неага и
др. – Изд-во : Журнал «Регулярная и хаотическая динамика», 2006. – 352 с.
7. Климова, Л.М. Pascal 7.0. Практическое программирование. Решение типовых задач /
Л.М. Климова. – М. : КУДИЦ-Образ, 2003. – 528 с.
8. Ковтанюк, Ю. Программирование на Turbo Pascal / Ю. Ковтанюк. – М. : Эксмо, 2008. – 592 с.
9. Культин, Н.Б. Turbo Pascal в задачах и примерах / Н.Б. Культин. – СПб. : BHV-Санкт-Петербург,
2005. – 256 с.
10. Лукин, С.Н. Turbo Pascal 7.0. Самоучитель для начинающих / С.Н. Лукин. – М. : Диалог-МИФИ,
2002. – 384 с.
11. Малыхина, М.П. Программирование на языке высокого уровня Turbo Pascal / М.П. Малыхина. –
СПб. : БХВ-Петербург, 2006. – 544 с.
12. Марченко, А.И. Программирование в среде Turbo Pascal 7.0 / А.И. Марченко, Л.А. Марченко. – М. :
Корона-Век, 2007. – 464 с.
13. Меженный, О.А. Turbo Pascal. Самоучитель / О.А. Меженный. – М. : Диалектика, 2008. – 336 с.
14. Моргун, А.Н. Справочник по Turbo Pascal для студентов / А.Н. Моргун. – М. : Вильямс, 2006. – 608
с.
15. Моргун, А.Н. Программирование на языке Паскаль. Основы обработки структур данных /
А.Н. Моргун, И.А. Кривель. – М. : Вильямс, 2006. – 576 с.
16. Окулов, С.М. Программирование в алгоритмах / С.М. Окулов. – М. : БИНОМ, 2002. – 341 с.
17. Потопахин, В.В. Turbo Pascal. Освой на примерах / В.В. Потопахин. – М. : BHV, 2005. – 240 с.
18. Рапаков, Г.Г. Программирование на языке Pascal / Г.Г. Рапаков, С.Ю. Ржеуцкая. – СПб. : БХВПетербург, 2004. – 480 с.
19. Сухарев, М. Turbo Pascal 7.0. Теория и практика программирования / М. Сухарев. – М. : Наука и
техника, 2007. – 544 с.
20. Тарануха, Н.Л. Обучение программированию. Язык Pascal / Н.Л. Тарануха, Л.С. Гринкруг,
А.Д. Бурменский и др. – М. : Солон-Пресс, 2009. – 384с.
21. Фаронов, В.В. TurboPascal 7.0. Практика программирования / В.В. Фарафонов. – М. : КноРус, 2009.
– 416 с.
22. Фаронов, В.В. Турбо Паскаль / В.В. Фарафонов. – М. : BHV, 2007. – 1056 с.
23. Фаронов, В.В. Турбо Паскаль. Начальный курс / В.В. Фарафонов. – М. : ОМД Групп, 2003. – 578 с.
24. Шелест, В.Д. Программирование / В.Д. Шелест. – СПб. : БХВ-Петербург. – 592 с.
25. Шпак, Ю.А. Программирование в Turbo Pascal. Переход к Delphi (+ CD-ROM) / Ю.А Шпак. – М. :
МК-Пресс, 2006. – 416 с.
26. Элиот, Б. Коффман. Turbo Pascal / Б. Элиот. – М. : Вильямс, 2005.
�
Dublin Core
The Dublin Core metadata element set is common to all Omeka records, including items, files, and collections. For more information see, http://dublincore.org/documents/dces/.
Title
A name given to the resource
Абрамкин Геннадий Петрович
Dublin Core
The Dublin Core metadata element set is common to all Omeka records, including items, files, and collections. For more information see, http://dublincore.org/documents/dces/.
Title
A name given to the resource
Программирование в среде Турбо Паскаль
Subject
The topic of the resource
1. Вычислительная техника. 2. Программирование ЭВМ. Компьютерные программы. Программотехника. 3. Турбо Паскаль.
Description
An account of the resource
Программирование в среде Турбо Паскаль [Электронный ресурс] : учебное пособие / Г. П. Абрамкин, Ю. С. Ефремов, О. В. Токарева ; Алтайский государственный педагогический университет. — 1 компьютерный файл (57.3 MB). — Барнаул : АлтГПУ, 2015. — 378 с.
Учебное пособие содержит систематическое изложение курса «Программирование» с использованием среды Турбо Паскаль. Оно написано в соответствии с требованиями государственного стандарта по специальности 050203.65 (физика с дополнительной специальностью информатика) и специальности 050203 (физика).
Creator
An entity primarily responsible for making the resource
Абрамкин, Геннадий Петрович
Source
A related resource from which the described resource is derived
Алтайский государственный педагогический университет, 2015
Publisher
An entity responsible for making the resource available
Алтайский государственный педагогический университет
Contributor
An entity responsible for making contributions to the resource
Юрий Сергеевич Ефремов
Ольга Викторовна Токарева
Format
The file format, physical medium, or dimensions of the resource
pdf, exe
Language
A language of the resource
русский
Identifier
An unambiguous reference to the resource within a given context
<a href="http://library.altspu.ru/dc/exe/abramkin.exe">http://library.altspu.ru/dc/exe/abramkin.exe</a><br /><a href="http://library.altspu.ru/dc/pdf/abramkin.pdf">http://library.altspu.ru/dc/pdf/abramkin.pdf</a>
Rights
Information about rights held in and over the resource
©Алтайский государственный педагогический университет, 2015
Type
The nature or genre of the resource
Учебное пособие.
Date
A point or period of time associated with an event in the lifecycle of the resource
01.06.2015
Вычислительная техника
Компьютерные программы
Программирование ЭВМ
Программотехника
Турбо Паскаль