Введение в компьютерный инструментарий

advertisement
Курс «Компьютерный практикум»
1. ОСНОВНЫЕ ВИДЫ РАБОТ НА КОМПЬЮТЕРЕ
АННОТАЦИЯ
В лабораторной работе определяются основные виды работ на
компьютере, приводятся начальные сведения о работе в среде MS
Windows и Turbo-Pascal и предлагаются вспомогательные
упражнения и первые задачи по организации диалога с
компьютером.
1.1.
НАЧАЛЬНЫЕ ДЕЙСТВИЯ И РЕКОМЕНДАЦИИ
Самостоятельное изучение программных средств и компьютера в
основном
требует
спокойной
работы
без претензий на
мгновенный успех. Разнообразие технических особенностей и
гибкость пользовательского интерфейса программ вынуждают
участников этого процесса отказаться от буквального запоминания
приемов обработки информации в пользу ориентации в
конкретной среде. Эта среда является сложной конфигурацией из
технических устройств, программных средств и анализируемой
информации, хранимой в памяти компьютера.
Конечно, практикуясь на одной машине, трудно избежать
привыкания к особенностям ее клавиатуры и к принятым в ее
программном обеспечении решениям. Но надо отдавать себе отчет
в том,
что техника,
производимая разными
фирмами,
соответствует различным стандартам, и поэтому на незнакомой
машине
может отличаться расположение и даже назначение
некоторых клавиш. Этот разнобой усугубляется настройкой
программных средств по вкусу владельцев машины. Поэтому
скорость работы
на
компьютере, привычная реакция на
события могут служить причинами потерь информации. Итак, не
спешите! Получится быстрее.
Программные средства
Как правило, пользователям предоставляется компьютер, в
программном обеспечении которого содержится следующее:
□ операционная система MS-WINDOWS
1
□ программная оболочка FAR, частично дублирующая
возможности MS- DOS,
□ сервисные и резидентные программы, способствующие
надежности работы с информацией,
□ пользовательские программные системы, обеспечивающие
набор, хранение и воспроизведение информации в разных формах:
текстовые и графические редакторы, базы данных и экспертные
системы.
□ системы программирования, позволяющие разрабатывать новые
программные средства. (Basic, Turbo-Pascal, Turbo C, MAPLE,
HTML и др.).
Все эти средства хранятся в виде наборов файлов,
организованных в так называемые директории.
С винчестером работать удобнее, чем с дискетой, поэтому обычно
на нем располагают часто используемое программное обеспечение и
директории из файлов с оперативной информацией, например, с
обрабатываемыми данными, разрабатываемыми программами,
подготавливаемыми текстами, параметрами настройки
программных средств и др.
При включении компьютера активизируется встроенный загрузчик,
который после разных проверок загружает (переписывает) в
оперативную память операционную систему и передает
управление специальной программе AUTOEXEC, которая
настраивает систему на особенности конфигурации компьютера и
условий его эксплуатации. В частности, в этой программе могут
быть заданы драйверы работы с устройствами, включая клавиатуру,
экран и принтер, что может существенно влиять на вид и смысл
набираемых символов.
Операционная система WINDOWS. Начальные сведения
Операционная система загружается при включении компьютера.
Операционная система представляет собой комплекс программ,
позволяющий вводить команды с клавиатуры или при помощи
мыши, сохранять в компьютере тексты, рисунки и различную
другую информацию, запускать и исполнять программы с жесткого
диска, дискет и прочих накопителей информации.
Первой функцией операционной системы является обеспечение
других программ единым и стандартным доступом к устройствам
ввода-вывода информации. Следующей функцией операционной
2
системы является обеспечение запуска программ. При работе
программы могут взаимодействовать друг с другом. Обеспечение
управлением одной или несколькими запущенными программами и
обменом между ними является еще одной функцией операционной
системы.
Любая информация, записанная на диске под отдельным именем,
называется файлом. Файлы на дисках объединяются в каталоги или
директории. Каталоги – это записи на дисках, которые содержат
имена файлов и других каталогов.
Рабочий стол
В зависимости от настроек операционной системы
может
возникнуть приглашение для ввода пароля – тогда нужно набрать
ваш пароль. После загрузки вы увидите первоначальное окно
WINDOWS, (рабочий стол), в котором располагаются все другие
окна и значки. Внизу экрана находится панель задач, с кнопкой
пуск. На этой панели отображаются значки всех запущенных
программ.
Запуск программ
Удобнее запускать программы с помощью значков на рабочем
столе. Но пока рассмотрим для запуска программ главное меню
операционной системы.
 Нажмите кнопку пуск на панели задач. На экране появится меню.
 Подведите указатель мыши к пункту Программы. На экране
появится подменю.
 Подведите указатель мыши к желаемой программе (например,
Стандартные). Появится подменю.
 Щелкните мышью на пункте Калькулятор. На экране появится
окно программы Калькулятор.
Завершение работы
Щелкните мышью на кнопке , которая расположена в правом
верхнем углу окна программы. Окно программы будет закрыто.
Пример 1. Знакомство с клавиатурой.
Запустите какой-нибудь текстовый редактор. Это может быть и
3
среда программирования Turbo-Pascal, или блокнот, или любой
другой редактор.
Рассмотрите компьютер и его клавиатуру, найдите на ней основные
клавиши и уясните их примерный смысл. Для начала достаточно
уметь стирать ошибочно набранный символ, для этого служат
символы [Del]|[BS], и завершать набор текста, для этого
используется клавиша [Enter]. Остальное можно освоить по мере
необходимости, но лучше заранее ознакомиться с составом,
расположением
и смыслом большинства кнопок клавиатуры,
выполнив следующие действия:
 Последовательно рассмотрите все кнопки и выясните их
назначение.- Найдите на клавиатуре клавиши [Esc], [Shift], [Ctrl],
[Alt], влияющие на назначение других клавиш.
 Посмотрите, где расположены символы [\], [.], [*], [:],
используемые в записи команд операционной системы.
 Найдите на клавиатуре переключатели [Caps][Lock],
[Insert]|[Ins] и выясните способ переключения с русского на латынь
и обратно. (Он зависит от загружаемого драйвера).
 Найдите управляющие символы [Enter], [Delete]|[Del],
[BS]|[Tab].
 Пронаблюдайте перемещения курсора стрелками и
клавишами [Page Up], [Page Dn].
 Найдите ряд функциональных клавиш [F1] - [F12].
 Попрактикуйтесь в наборе символов на разных регистрах
и с использованием переключателей и управляющих клавиш.
Замечание ________________________________________________
Одновременное нажатие регистра и клавиши лучше
всего получается как зажим одной рукой регистра,
а затем нажатие
клавиши
другой
рукой.
Для удобства
основные
регистры
продублированы.
__________________________________________________________
Пример 2. Манипуляция с информацией
При манипуляциях с файлами, если мы работаем в оболочке FAR,
курсор выделяет один файл, и справочная информация о файле
выводится в нижней строке окна директории. Для некоторых
видов работы удобнее выделять группы файлов.
4
Текущее состояние экрана отражает последний шаг
функционирования некоторого множества программных средств
над иерархией файлов и директорий. Выполнимы разные
маршруты движения по этой иерархии.
До активных действий на компьютере всегда следует посмотреть, не
остались ли в его памяти следы чужой работы, требующие
внимания по их сохранению. Кроме того, следует знать
последовательность действий по выключению машины: нужно ли
выключать экран, рубильник, обесточивать машину на случай
грозы и т.п.
Рассмотрите информацию на экране, чтобы понять, как по виду
экрана выяснить состояние компьютера и
возможные
воздействия на него.
Здесь главное – узнать как включать и выключать компьютер,
видеть, какие возможности
активной
программной
среды
доступны в текущий момент, понимать, как добраться до нужной
информации, и получить представление о составе программного
обеспечения, доступного на данном компьютере. (На другом
компьютере состав обеспечения может существенно отличаться.)
Детальное освоение этих возможностей лучше отложить, уделив
внимание лишь стандартным и наиболее необходимым случаям.
Любой маршрут внимания при работе с программным средством
начинается с взгляда на курсор, отмечающий место действия, и на
надписи в информационных строках, представляющих текущий
состав наиболее легко доступных действий.
1.2. ОСНОВНЫЕ ЭТАПЫ РАБОТЫ
Начальные упражнения
 Рассмотрите все рамки и тексты на экране, если мы
работаем в FAR, выясняя, о чем они сообщают. (Активная система,
правая и левая панели|окна, связанные с ними устройства,
директории, файлы, текущая директория, помеченный файл, дата,
время, "горячие" команды, командная строка, приглашение к
набору команды, информация о файлах, справка о выделенных
файлах).
 Найдите позиции, помеченные курсором. (Светящийся
5
прямоугольник - его легче обнаружить, двигая курсор стрелками.
Мерцающий подчерк.)
 Просмотрите в нижнем меню перечень "горячих"
команд, вызываемых соответствующими функциональными
клавишами. Обратите внимание, что он меняется при нажатии на
регистры.
 Исполните команду подсказки Help [F1]. Просмотрите
состав информации, доступной с помощью этой команды.
Обратите внимание, что при исполнении команд меняется состав
нижнего меню.
Программные оболочки
Программная оболочка FAR позволяет обозревать директории с
файлами через два окна и обрабатывать их,
используя
функциональные клавиши, представленные в нижней строке
экрана.
Любое окно можно выбрать в качестве основного. Переход от окна
к окну осуществляется с помощью клавиши [Tab]. Можно
перейти к внутренней директории или вернуться к внешней вплоть
до корневой директории, служащейся входом в иерархию
файлов, хранимых на данном диске, связанным с основным окном.
Файлы на дисках (A:,B:, C:) в этой системе доступны так же
как в директориях.
Различие лишь в том, что они не сведены в общую иерархию.
Каждый диск хранит свою иерархию файлов, начинающуюся
своей корневой директорией, которую можно связать с любым
из двух окон [Alt+F1]|[ Alt+F2]. Кроме того на жестком диске
могут быть выделены на так называемые логические (виртуальные)
диски (C:, D:, E:, F: и т.д.), работа с которыми аналогична работе с
физическими дисками.
Манипуляции с окнами
 Смените выделенное окно [Tab] и получите справочную
информацию о другом диске. Затем вернитесь в прежнее окно.
 Установите курсор на начало директории [..] и перейдите
на более внешний уровень файловой системы [Enter]. Затем
вернитесь обратно.
 Смените диск, связанный с левым или с правым окном
[Alt+F1]|[ Alt+F2]. Посмотрите справочную информацию о новом
диске. Восстановите состояние экрана.
6
После каждого выполнения файла AUTOEXEC операционная
система выдает на экран приглашение ( - мерцающий подчерк),
сообщающее о готовности исполнить командную строку, которую
следует набрать на клавиатуре. Это приглашение сохраняется и при
вызове FAR, хотя возможно и более простое исполнение
программ, не требующих входных файлов, без набора
командной строки. Это использование клавиши [Enter]. FAR
функционально дублирует возможности операционной системы
лишь с частичным их наследованием. Некоторые важные, но не
часто требующиеся возможности, старые версии FAR не
поддерживает.
Командная строка составляется из имени команды или
непосредственно исполнимой программы т.е. программы с
расширениями COM, EXE, BAT с входными данными или
файлами и указанием о размещении результатов. По умолчанию
входные данные принимаются с клавиатуры, а результат выдается
на экран. Не исключено, что исполнение команды не смогло
нормально завершиться или привело к слишком неожиданным
результатам. В таких случаях может возникнуть необходимость
приостановить или прервать исполнение, чтобы вернуться к ранее
активизированным системам. Возможность приостановки не
всегда предусмотрена в программе. Тогда приходится выполнять
перезагрузку операционной системы, что может сопровождаться
частичной потерей информации, не сохраненной в файлах.
Любая часть программного обеспечения и данных для его работы
может храниться вне компьютера, на дискетах, CD-дисках и
флэшках.
Такое хранение необходимо для восстановления
состояния памяти после сбоев и любой порчи информации
посредством простого копирования файлов. Прежде чем работать
с новой дискетой, необходимо ее отформатировать, т.е.
посредством специальной программы выполнить разметку
магнитной поверхности диска на сектора и дорожки, служащие
координатами при доступе к информации на дискете. (Заметим, что
на
сегодняшний
день
дискеты
продаются
уже
отформатированными). Число секторов и дорожек зависит как от
качества дискеты, так и от характеристик дисковода. Оно может
варьироваться в некоторых пределах, но существует стандарт,
определяемый по умолчанию, если в команде форматирования не
7
заданы параметры. (Хотя на сегодняшний день, использование
обычных дискет уже является архаикой, многие современные
ноутбуки не имеют
даже входа для дискет. Основное
взаимодействие
в компьютерах осуществляется через флэшпамять).
1.3. РАБОТА В СРЕДЕ Тurbo-Pascal
Общая справка
Язык программирования Pascal был создан Никлаусом Виртом в
1970 году, после его участия в работе комитета разработки
стандарта языка Алгол, как язык для обучения процедурному
программированию. Название языку дано в честь выдающегося
французского математика, физика, литератора и философа Блеза
Паскаля.
Особенностями языка являются строгая типизация и наличие
средств структурного (процедурного) программирования. Pascal
был одним из первых таких языков и он должен был, по мнению
Н.Вирта дисциплинировать процесс программирования, поэтому,
наряду со строгой типизацией, в этом языке сведены к минимуму
возможные синтаксические неоднозначности, а сам синтаксис
интуитивно понятен даже при первом знакомстве с языком.
Тем не менее, для целей простоты и понятности в язык не стали
вводиться возможности передачи функциям массивов переменной
длины, определенные возможности работы с динамической
памятью, средства для подключения функций, написанных на
других языках, средства раздельной компиляции и т. п. Но стоит
отметить, что это становится достоинством при обучении
программированию. Достоинства языка заставляли многие
коммерческие и некоммерческие организации разрабатывать
системы программирования на основе языка Паскаль.
Структура программы.
Программа на языке Паскаль состоит из двух частей – раздела
описания данных и и раздела действий над данными.
Описания данных могут включать:
□ описание констант, раздел const
□ описание меток, раздел label
8
□ описание типов, раздел type
□ описание переменных раздел var
□ описание функций, раздел function
□ описание процедур, раздел procedure
Любой из этих разделов, если в нем нет необходимости, может
отсутствовать.
Раздел действий над данными, или раздел операторов состоит
из последовательности операторов, которые разделяются точкой с
запятой. Раздел операторов заключается в служебные скобки begin
и end. Среди операторов могут быть:
□
□
□
□
□
□
□
операторы ввода-вывода
операторы присваивания
условные операторы
операторы выбора
операторы цикла или повторения
операторы вызова процедур
операторы передачи управления
Рассмотрим простую программу.
Program Comp_1;
{первая программа}
begin
writeln(‘Дорогу осилит идущий’); {Печать текста}
readln;
end. {точка после end обязательна в конце программы}
Эта программа состоит из шести строчек. В среде Turbo-Pascal
Первая строка ( Program Comp_1;) не является обязательной, ее
вполне можно опустить.
Но мы всегда рекомендуем писать строчку Program из
дисциплинирующих соображений и соображений понимаемости.
После этой строчки естественно написать комментарий,
раскрывающий назначение программы. Комментарием является
текст, заключенный в фигурные скобки. В нашем случае вторая
строчка является комментарием. В этой программе исполняется
единственный оператор- оператор печати
Writeln(‘Дорогу осилит идущий’);
9
Он выдает текст, заключенный в одинарные кавычки, на экран
монитора.
С точки зрения среды Turbo-Pascal текст выдается в окно вывода.
Доступ к окну вывода в среде Turbo-Pascal осуществляется через
клавиши [ALT] [F5]. Пятая строчка программы – оператор чтения
readln пишется после оператора вывода для того чтобы окно вывода
держалось перед пользователем. Как только, согласно работе
оператора readln , мы нажимаем любую клавишу, мы выходим из
окна вывода, и перед нами на экране появляется окно с текстом
нашей программы - окно редактирования. Текст набранной
программы мы можем сохранить в файле с именем name.pas ,
где name - любое разрешенное имя в среде Turbo-Pascal .
Разрешенным именем является любая последовательность
символов, цифр и знаков подчеркивания, начинающаяся с буквы.
Эту программу, например, мы можем назвать first.pas . Заметим, что
символы в имени могут быть только латинскими. Русский текст
разрешается только в аргументах команд вывода write и writeln,
когда аргументами являются строки.
Для выхода из среды Turbo-Pascal нужно либо выбрать в меню File
пункт [Exit], либо нажать комбинацию клавиш [Alt+X]. Возможно,
при этом появится предложение сохранить программу. Выполните
соответствующие действия по сохранению.
Работа системы Turbo-Pascal нацелена на компиляцию программ,
т.е.
на перевод текста программы
в
непосредственно
исполняемую форму (код). Исполняемый код программы система
сформирует в файле с именем вида name.exe. Полученная таким
образом форма программы может использоваться независимо
от системы Turbo-Pascal.
Не стоит пытаться на первом занятии
решать
нечто
занимательное. Пусть это будет предельно простая, совсем бедная
программа, но зато не требующая затрат на отладку.
Вычисление по формулам. Организация диалога.
Допустим, мы хотим написать программу для решения простой
арифметической задачи. У нас имеется некоторая сумма денег.
Известна стоимость единицы товара. Программа должна ответить,
сколько единиц товара можно купить на заданную сумму и сколько
10
денег останется после покупки.
Program Comp_2;
Var summa, cena, num, ost: integer;
begin
writeln(‘Введите сумму денег’);
readln(summa);
writeln(‘Введите цену товара’);
readln(cena);
{Вычисление количества единиц товара}
num:=summa div cena;
{Вычисление оставшихся денег}
ost:=summa mod cena;
writeln(‘Число единиц товара = ‘, num: 3);
writeln(‘оставшиеся деньги = ‘,ost: 3);
readln;
end.
В этой программе после известных уже для нас действий ввода
данных
readln(summa)
и
readln(cena)
мы
выполняем
основополагающий оператор языков программирования – оператор
присваивания, в данном случае num:=summa div cena.
Оператор присваивания состоит из двух частей, а именно левой и
правой части, разделенных знаком присваивания :=. Это единый
символ, состоящий из двух терминальных знаков, а именно: знака
двоеточия и знака равно. В левой части оператора присваивания
может быть только переменная или переменная с индексами. Правая
часть оператора может быть выражением, причем типы левых и
правых частей
оператора присваивания должны совпадать
(Допускается
единственное
исключение.
Переменной
вещественного типа можно присвоить выражение целого типа).
Выражение в языке Паскаль формируется обычным образом из
переменных, чисел,
констант,
арифметических операций
умножения,
деления, сложения, вычитания, деления нацело,
получения остатка от деления двух целых чисел, стандартных
функций, скобок для указания приоритета операций и функций
пользователя. В языке Паскаль отсутствует операция возведения в
степень, для этих целей имеет смысл написать свою собственную
11
функцию, или явно формировать выражение при помощи операции
умножения и стандартной функции возведения величины в квадрат.
В операторе num:=summa div cena; мы вычисляем величину num
как результат деления нацело двух величин summa и cena. В
операторе ost:=summa mod cena; вычисляется величина остатка,
получаемая при помощи операции mod.
Теперь после того, как программа Comp_2 сохранена, необходимо
провести ее компиляцию. Нажмите для этого клавишу [F9] или
[Alt+F9]. Специальная программа – компилятор – преобразует текст
вашей программы в исполняемые коды и сохранит их в
исполняемом файле с расширением exe. Если в тексте программы
есть ошибки, то компиляция не сможет быть завершена и
компилятор укажет на строчку в программе, где находится ошибка.
На экране появится красная полоса, в которой будет указан характер
ошибки. После исправления ошибки следует повторить нажатие
горячей клавиши [F9]. Если в программе ошибок нет, то на экране
появится диалоговое окно, в котором будет написано: «Compile
successful. Press any key». Нажмите после этого любую клавишу.
Наиболее часто встречающаяся у начинающих ошибка – «Unknown
identifier» (неизвестный идентификатор). Обычно, она возникает по
двум причинам: либо переменная не представлена в списке
переменных после слова var, либо просто неправильно написан
какой-нибудь оператор. Могут быть и другие ошибки. Если вам
непонятен смысл сообщения в красной полосе, нажмите клавишу
[F1]. Вы получите развернутую подсказку.
Использование Help.
При пользовании справочной системой
следующие значение клавиш и их сочетаний.
[ctrl] [F1]
[Alt] [F1]
[F1]
Help
нужно знать
Показывает информацию о конструкции, на которой
стоит курсор
Показывает предыдущее
окно подсказки
Показывает алфавитный перечень конструкций,
доступный в Паскале.
Копирование примеров
12
На языке Паскаль написано очень много программ. Ряд значимо
полезных программ собраны в библиотеки, и эти библиотеки
можно подключить к разрабатываемой Вами программе.
Подключение нужной библиотеки осуществляется при помощи
предложения uses.
Например, рассмотрим программу Comp_3, которая является
модификацией программы Comp_1.
Program Comp_3;
Uses Crt;
{измененная первая программа}
begin
Clrscr; {очистка экрана в текстовом режиме}
Writeln(‘Дорогу осилит идущий’); {Печать текста}
readkey; {запрос любого символа с клавиатуры}
end.
Программа Comp_3 отличается от программы Comp_1 , во-первых,
присутствием предложения Uses Crt;, включение которого в
программу разрешает использовать процедуры и функции модуля
Crt. В этой программе, в частности, используется процедура Clrscr,
которая очищает экран в текстовом режиме, и процедура readkey,
которая ожидает нажатия любой клавиши.
Если мы только начали изучать язык программирования, то без
помощи справочной системы Help нам трудно обойтись. Система
содержит помимо текстовой объясняющей информации, большое
количество примеров, являющимися программами на языке
Паскаль, которые объясняют конкретную конструкцию языка. Вы
можете эти программы скопировать в свое рабочее окно, исполнить
программу и убедиться, как она работает.
Допустим, у Вас в окне подсказки находится пример, который вы
бы хотели перенести в свое окно. Для этого нужно выполнить
следующие действия:
 Выделите требуемый текст.
(Выделение выполняется путем одновременного нажатия
клавиш [Shift], и какой-нибудь из стрелок ).
 Запомните выделенный текст в буфере.
( При помощи одновременного нажатия клавиш [ctrl] [ins]).
13
 Выйдете из окна подсказки (При помощи клавиши [Esc] ).
 Вставьте запомненный текст из буфера
(При помощи одновременного нажатия клавиш [Shift]
[ins]).
и
Если Вам требуется перенести определенный фрагмент текста, то
алгоритм в этом случае изменится так:
 выделяем фрагмент текста, подлежащий переносу;
 переносим выделенный фрагмент в буфер, воспользовавшись
клавишами [Сtrl]+[Insert]
 размещаем курсор в том месте, где нужно расположить
фрагмент;
 извлекаем из буфера копию фрагмента, воспользовавшись
клавишами [Shift]+[Insert].
Если Вам нужно удалить определенный фрагмент текста, то в этом
случае выполняем следующее:
 выделяем фрагмент текста, подлежащий удалению;
 удаляем выделенный фрагмент, воспользовавшись клавишами
[Ctrl]+[Delete].
Имеется возможность отменить последнее выполненное действие.
Для этой цели служит пункт меню Edit|Undo [Alt+Backspace]. Для
возврата последнего действия используется пункт меню Edit|Redo.
Буфер является общим для всех окон. Поэтому можно осуществлять
копирование и перенос фрагментов текста между различными
окнами. В этом случае нам нужно:
 выделить фрагмент текста, подлежащий копированию в
исходном окне;
 запомнить выделенный фрагмент в буфере, воспользовавшись
клавишами [Ctrl]+[Insert];
 переключиться в окно, где нужно разместить исходный
фрагмент (клавиши Alt+"номер окна") или создать новое окно
[пункт меню File|New];
 разместить курсор в том месте, где нужно расположить копию
фрагмента;
14
 извлечь из буфера копию фрагмента, воспользовавшись
клавишами [Shift]+[Insert].
1.4. ПЕРВЫЕ
УПРАЖНЕНИЯ
Упражнение 1. Осмотр компьютера.
1. Выясните правила начала и завершения работы.
2. Рассмотрите компьютер, ознакомьтесь с его
клавиатурой, штатным программным обеспечением и
требованиями по доступу к встроенным средствам.
Упражнение 2. Выделение информации.
1. Пометьте группу файлов [Insert], посмотрите изменение
справки о выделенных файлах, затем отмените пометку
[Insert], восстановив информацию.
2. Пометить сразу все файлы текущей директории. [Gray+]
-серая кнопка + справа от цифровой клавиатуры. Отменить
пометку сразу всех помеченных файлов. [Gray-]
3. Выделить курсором имя файла AUTOEXEC.BAT и с
помощью команды просмотра текста View [F3] посмотреть
содержимое файла.(Обратите внимание, что при исполнении
команд меняется состав нижнего меню.)
4.* Выдать на экран справочную информацию о текущем
диске директории [Сtrl+L]. Затем ее отмените. Обратите
внимание на текстовый комментарий. Он хранится в файле
DIRINFO. Его можно посмотреть независимо.
5.* Посмотреть комментарии к файлам (Команда F1.
Комментарии ко всем файлам директории хранятся в
файле FILEINFO.F1.).
Упражнение 3. Доступ к файлам
1.* Завести свою директорию [F7], расположив ее в
отдельном окне.
15
2.* Набрать текст в файл DIRINFO c помощью редактора
Edit.[Shift+F4]
3.* Скопировать в свою директорию из прежнего окна файл
вида _.PAS.
4.* Оставить одно окно. [Сtrl+O]
Упражнение 4. Исполнение готовых программ:a
1. Исполнить программу, хранящуюся в файле с именем
вида NAME.EXE. (Выделить это имя курсором и нажать
[Enter].)
2.* Исполнить эту же программу посредством набора ее
имени (можно без .EXE) в командной строке.
3.* Скопировать текст имени файла в командную строку
[Сtrl+Enter].
4.* В файле C.EXE хранится зацикливающаяся программа.
Запустить ее, а затем прервать [Ctrl+Break].
Упражнение 5. Знакомство со средой Turbo-Pascal .
1. Обратиться к системе Turbo-Pascal с заранее
подготовленным текстом программы:
2.* Исполнить эту же программу посредством набора ее
имени (можно без .EXE) в командной строке.
3. Посмотреть информацию о файлах [F1], затем [File].
4. Скомпилировать и исполнить программу [F10], затем
[Run].
5. Убедиться, что появился файл _.EXE.
6. Выйти из Turbo-Pascal и исполнить результат
компиляции независимо.
7. Выйти из Turbo-Pascal и исполнить результат
компиляции независимо.
8. Выйти из Turbo-Pascal и исполнить результат
компиляции независимо.
Упражнение 6. Перепись файлов с дискеты на винчестер и
обратно:
1. Дискету вставить в щель дисковода наклейкой вверх,
16
прорезью вперед. (Устройство "А:" или "В:".)
2. Связать одно из окон с устройством, в котором дискета
3. Установить курсор в окно с копируемыми файлами
4. Отметить нужные файлы .
5. Скопировать выделенные файлы на устройство, связанное
с другим окном, не меняя их имена [F5].
6. Просмотреть информацию о скопированных файлах.
Упражнение 7. Диалоговая программа
1. Придумать текст, который сообщит о том, что программа
начала работать.
2. Придумать текст, сообщающий о завершении работы
программы.
3. Подобрать тексты, подсказывающие, какие данные
программа требует набрать на клавиатуре.
4. Подготовив программу, разместить в ней вывод
подготовленных текстов с помощью writeln для
удобочитаемости сообщений на экране.
5. Спланировать свою реакцию на сообщения программы
при исполнении.
6. Набрать, скомпилировать и исполнить программу,
сверяя результаты с планом.
1.5. ЗАДАЧИ
Задача 1. Набрать и исполнить программу, печатающую
приветствие на экране.
Задача 2. Проверить принадлежность числа заданному диапазону
чисел.
Задача 3. Принадлежит ли символ алфавиту?
Задача 4. Совпадают ли два последовательно введенных числа?
Задача 5. Четное или нечетное число введено?
Задача 6. Начинается ли введенное слово с заданной буквы?
Задача 7. Вывести сумму (произведение, разность, частное)
двух вводимых чисел.
Задача 8. Правильно ли введено изображенное на экране число?
Задача 9. Запрограммировать проверку умения складывать
(умножать, делить и т.п.) числа.
Задача 10. Принять анкетные данные (Ф.И.О. и дата рождения),
для контроля вывести их на экран и спросить подтверждение.
Задача 11. Введено два числа. Какое из них них больше?
17
Задача 12. Запрограммировать подсчет значения полинома.
Задача 13. Подготовить программу организации счета по заданной
формуле с диалогом по приему исходных данных (x+y, sin x и т.п.)
Программа запрашивает параметры, затем сообщает результат счета.
Задача 14. Подготовить программу приема анкетных данных
пользователя ПК. (Например, программа задает вопрос: " Кто сейчас
должен работать на машине?" Ответ: "Иванов, студент группы 311"
распадается на два данных: текст "Иванов" и число "311").
Задача 15 * "Угадайка" Запрограммировать компьютерную
игру. (Угадай задуманное число, букву, цвет, чет-нечет и т.п.):
Задача 16 Компьютер фиксирует число в заданном диапазоне.
При попытках угадать, сообщает "да" или "нет".
Задача 17. То же, но сообщает "меньше" или "больше".
Задача 18. Машина "задумывает" число и предлагает его угадать в
две-три попытки.
Задача 19. **Человек загадывает число, а машина угадывает
методом деления отрезка пополам.
1.6. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
Целью вопросов является овладение техническим минимумом по
исполнению программ на компьютере.
ВОПРОСЫ
 Правила работы на технике общего пользования.
 Маршрут внимания при работе на незнакомой машине.
 Стандартное завершение работы на чужой машине.
 Симптомы ошибок в ходе работы.
 Действия при ошибках, непонятных реакциях компьютера,
неожиданных эффектах.
 Технологический маршрут по подготовке и исполнению
программы.
 Вынужденное прерывание работы.
 Продолжение прерванной работы.
 Подготовка к работе на компьютере.
 Маршрут внимания при печати на принтере.
2. ПОДГОТОВКА ТЕКСТОВ ПРОГРАММ
18
АННОТАЦИЯ
В лабораторной работе рассматривается возможности набора и
редактирования текстов - самого массового использования
компьютеров
в настоящее время. Рассматриваются основные приемы такой
работы,
осваиваются представления о возможностях текстовых
редакторов
и их возможностях, с тем чтобы приобрести навыки выполнения
типовых воздействий на символы, строки и блоки текста, работы
со
вспомогательными текстами и восстановления исходного текста
при
неудачном редактировании. Рассматривается редактирование
текстов и решение задач в среде Turbo-Pascal.
2.1. НАБОР И РЕДАКТИРОВАНИЕ ТЕКСТОВ
Набор и редактирование текстов - самое массовое применение
компьютеров в настоящее время. Имеет смысл сразу ознакомиться
с основными приемами такой работы, получить представление
о возможностях текстовых редакторов и приобрести навыки
выполнения типовых воздействий на символы, строки и блоки
текста, работы со вспомогательными текстами и восстановления
исходного текста при неудачном редактировании.
Набирать и редактировать тексты можно при помощи самых разных
редакторов.
Файлы, созданные разными редакторами, зачастую имеют
уникальные расширения, позволяющие, не заглядывая внутрь
документа, догадаться о способах разметки текста. Так файлы,
созданные редакторами подготовки простого текста (plain-text),
часто имеют расширение .txt, а подготовленные в редакторе MS
Word - расширение .doc. Текстовый процессор Word поддерживает
и другие форматы, например RTF (расширение .rtf). Документы,
содержащие команды разметки языка HTML, имеют расширение
.html или .htm.
Текстовые файлы являются наиболее распространенными типами
данных.
19
Имеются определенные сложности, связанные с текстовыми
файлами. Во-первых, для поддержки различных языков требуется
чрезвычайно большое количество символов. Известный
американский стандартный код для обмена информацией для
работы со 128 символами называется US ASCII (американский
стандартный код для обмена информацией). Для поддержки других
языков зачастую не хватает и 256 символов, поэтому сейчас
осуществляется постепенный переход к кодировке UNICODE, в
которой для хранения одного символа отводится уже два байта. Вовторых, при использовании текстовых файлов люди хотят, чтобы
распечатываемые документы содержали графики, диаграммы,
примечания, заголовки и чтобы при этом использовались различные
шрифты. Документы, распространяемые в Интернет, могут
содержать мультипликацию, ссылки на различные сетевые ресурсы
и звуковое сопровождение.
Простые
и
удобные
в
использовании
редакторы
неформатированного текста постоянно требуются программистам
при написании текстов программ, создателям Web-документов,
которых по ряду причин не устраивают Web-редакторы, людям,
использующим TeX или LaTeX, и многим другим. Принципы
создания, сохранения и редактирования документов в них очень
схожи и не требуют от пользователя кропотливой работы по их
освоению. Познакомимся с программой NotePad, входящей в состав
MS Windows.
NotePad (Блокнот)
Редактор NotePad является одним из самых распространенных
средств подготовки неформатированного текста в среде MS
Windows. Окно редактора содержит строку меню, включающую три
пункта: Файл, Правка и Поиск.
Меню Файл служит для работы с файлами. Оно позволяет
создавать, сохранять и открывать существующий файл. Команды
редактирования документа (копирование, вставка, удаление
фрагмента текста) осуществляются при помощи меню Правка. Для
поиска фрагмента текста используется меню Поиск.
NotePad допускает еще один способ вызова команд редактирования
документа - контекстное меню. Для вызова контекстного меню
нужно выделить некоторый элемент документа, а затем щелкнуть
правой кнопкой мыши. Для закрытия контекстного меню без
20
выбора команды достаточно щелкнуть по кнопке мыши, поместив
ее курсор за пределами меню, или нажать клавишу Esc.
Для выделения частей текста и перемещения используются
различные комбинации клавиш, представленные в таблице.
Shift+стрелка
вправо
Shift+стрелка влево
Shift+стрелка вверх
Shift+стрелка вниз
Shift+Home
Выделение символа слева от курсора
Выделение символа справа от курсора
Выделение предыдущей строки
Выделение последующей строки
Выделение текста от начала строки до
курсора
Выделение текста от курсора до конца строки
Shift+End
Перемещение на страницу вверх/вниз
PgUp/PgDn
Перемещение в начало/конец строки
Home/End
Ctrl+стрелка вправо Перемещение на слово вперед
Ctrl+стрелка влево Перемещение на слово назад
Перемещение в начало текста
Ctrl+Home
Перемещение в конец текста
Ctrl+End
Для установки курсора в определенное место можно использовать
мышь: надо передвинуть курсор и сделать щелчок левой кнопкой.
Перед выполнением команд редактирования фрагмента текста его
нужно выделить, для чего можно использовать два способа: при
помощи мыши, или с использованием комбинации клавиш. Для того
чтобы выделить текст с помощью мыши, нужно установить курсор
мыши в начало фрагмента текста, который нужно выделить, и
переместить курсор при нажатой левой кнопке мыши до конца
фрагмента. Фрагмент остается выделенным до тех пор, пока не
будет выделен другой фрагмент.
Редактор NotePad использует в своей работе так называемый буфер
обмена. В буфер обмена временно помещают фрагменты текста
произвольной длины. Фрагмент с прежней позиции копируется или
удаляется, при этом он автоматически помещается в буфер обмена и
затем может быть вставлен в какое-либо место текста. Фрагмент
сохраняется в буфере до тех пор, пока в него не будет внесен новый
текст.
21
2.2. РЕДАКТИРОВАНИЕ ПРОГРАММ В СРЕДЕ
ПРОГРАММИРОВАНИЯ TURBO PASCAL 7.0
Любая среда программирования имеет своей обязательной
компонентой текстовый редактор. Такой редактор имеется и в
среде Тurbo-Pascal .
Текстовый редактор, встроенный в среду Turbo-Pascal,
обрабатывает расположенный в текущем окне текст. Кроме
посимвольного набора он поддерживает редактирование в более
крупных единицах. Он поддерживает те же функции
редактирования, что и NotePad и еще ряд дополнительных
фукций, ориентированных на то, что редактируемым текстом
является программа на языке Pascal.
Основные клавиши, используемые при работе с редактором
приведены в таблицах 1-4:
Таблица 1. "Горячие" клавиши редактирования
Клавиши
Элемент
меню
Ctrl+Delete
Edit/Clear
Удаляет выбранный текст из окна и не помещает его в
буфер.
Ctrl+Insert
Edit/Copy
Копирует выбранный текст в буфер.
Shift+Delet
e
Edit/Cut
Shift+Insert
Edit/Paste
Помещает текст из буфера в активное окно.
F2
File/Save
Сохраняет файл, находящийся в активном окне
редактора.
F3
File/Open
Открывает файл.
Функция
Помещает выбранный текст в буфер и удаляет его.
Помимо клавиш управления курсором можно использовать
следующие клавиши для перемещения по тексту программы
(табл.2):
Таблица 2. Клавиши управления движением курсора
Клавиши
Назначение
Home
Перемещение курсора в начало текущей строки.
End
Перемещение курсора в конец текущей строки.
PageUp
Перемещение курсора на страницу вверх.
PageDown Перемещение курсора на страницу вниз.
Ctrl+End Перемещение курсора в левый верхний угол экрана.
22
Ctrl+Hom
Перемещение курсора на первую строку программы.
e
Ctrl+End Перемещение курсора на последнюю строку программы.
Таблица 3. Команды вставки и удаления текста
Клавиши
Назначение
Insert
Включение/выключение режима вставки.
Delete
Удаление символа, стоящего в позиции курсора.
Backspac
Удаление символа, стоящего слева от курсора.
e
Ctrl+N
Вставка пустой строки над строкой, в которой находится курсор.
Ctrl+Y
Удаление строки, в которой находится курсор.
Замечание. Если отключен режим вставки (включен режим замены), то невозможно
вставить новую строку по нажатию клавиши Enter. Для исправления положения
нужно нажать клавишу Insert.
Подготовленные Вами тексты оформляются как файлы.
Под файлом понимается либо именованная область внешней памяти
ПК (жесткого диска, гибкой дискеты, электронного «виртуального»
диска), либо логическое устройство - потенциальный источник или
приемник информации.
Любой файл имеет три характерные особенности. Во-первых, у него
есть имя, что дает возможность программе работать одновременно с
несколькими файлами. Во-вторых, он содержит компоненты одного
типа. Типом компонентов может быть любой тип Turbo-Pascal,
кроме файлов. Иными словами, нельзя создать «файл файлов». Втретьих, длина вновь создаваемого файла никак не оговаривается
при его объявлении и ограничивается только емкостью устройств
внешней памяти.
Файловый тип или переменную файлового типа можно задать одним
из трех способов:
<имя> = file of <тип>;
<имя> = text;
<имя> = file;
Здесь <имя>
идентификатор);
-
имя
файлового
типа
(правильный
23
file, of - зарезервированные слова (файл, из);
text - имя стандартного типа текстовых файлов;
<тип> - любой тип Turbo-Pascal, кроме файлов.
Любой программе доступны два предварительно объявленных
файла со стандартными файловыми переменными: input - для
чтения данных с клавиатуры и output - для вывода на экран.
Стандартный Паскаль требовал обязательного упоминания этих
файлов в заголовке программы, например, так: PROGRAM
NameOfProgram(input,output). В Turbo-Pascal это необязательно, и
поэтому заголовок программы можно опускать.
Любые другие файлы, а также логические устройства становятся
доступны программе только после выполнения особой процедуры
открытия файла (логического устройства). Эта процедура
заключается в связывании ранее объявленной файловой переменной
с именем существующего или вновь создаваемого файла, а также в
указании направления обмена информацией: чтение из файла или
запись в него.
Файловая переменная связывается с именем файла в результате
обращения к стандартной процедуре ASSIGN:
ASSIGN (<ф.п.>, <имя файла или л.у.>); .
Здесь <ф.п.> - файловая переменная (правильный идентификатор,
объявленный в программе как переменная файлового типа);
<имя файла или л.у.> - текстовое выражение, содержащее имя файла
или логическое устройство.
Если имя файла задается в виде пустой строки, например, ASSIGN(f,
' '), то в зависимости от направления обмена данными файловая
переменная связывается со стандартным файлом input или output.
Инициировать файл означает указать для этого файла направление
передачи данных. В Turbo-Pascal можно открыть файл для чтения,
для записи информации, а также для чтения и записи одновременно.
Для чтения файл инициируется с помощью стандартной процедуры
RESET:
RESET (<ф.п.>);
24
Здесь <ф.п.> - файловая переменная, связанная ранее процедурой
ASSIGN с уже существующим файлом или логическим
устройством-приемником информации.
Текстовые файлы связываются с файловыми переменными,
принадлежащими стандартному типу TEXT. Текстовые файлы
предназначены для хранения текстовой информации. Именно в
такого типа файлах хранятся, например, исходные тексты программ.
Компоненты (записи) текстового файла могут иметь переменную
длину, что существенно влияет на характер работы с ними.
Текстовый файл трактуется в Turbo-Pascal как совокупность строк
переменной длины. Доступ к каждой строке возможен лишь
последовательно, начиная с первой. При создании текстового файла
в конце каждой записи (строки) ставится специальный признак
EOLN (End OfLiNe - конец строки), а в конце всего файла - признак
EOF (End Of File - конец файла). Эти признаки можно
протестировать одноименными логическими функциями (см. ниже).
При формировании текстовых файлов используются следующие
системные соглашения:
EOLN- последовательность кодов ASCII #13 (CR) и #10 (LF);
EOF - код #26 стандарта ASCII.
Для доступа к записям применяются процедуры read, readln, write,
writeln. Они отличаются возможностью обращения к ним с
переменным числом фактических параметров, в качестве которых
могут использоваться символы, строки и числа. Первым параметром
в любой из перечисленных процедур может стоять файловая
переменная. В этом случае осуществляется обращение к дисковому
файлу или логическому устройству, связанному с переменной
процедурой ASSIGN. Если файловая переменная не указана,
происходит обращение к стандартным файлам input или output.
2.3. РАБОТА В СРЕДЕ Тurbo- Pascal
Условный оператор
Условный оператор на языке Паскаль выглядит следующим
образом:
25
If <условие> then <оператор> [else <оператор>];
Здесь квадратные скобки используются для задания
необязательности вхождения конструкции, заключенной в
квадратные скобки.
То есть, языке Pascal разрешается два вида условных операторов,
а именно:
If <условие> then <оператор>;
If <условие> then <оператор> else <оператор>;
Оператор трактуется следующим образом.
Если выполнено некоторое условия, тогда выполняем некоторые
действия оператора, иначе (если условие не выполнено)
выполняем действия, которые находятся в предложении else.
Поясним работу оператора if на примере следующей программы.
Мы вводим три целых числа и распечатываем большее из трех
чисел.
Program Comp_4;{ нахождение максимума из трех целых чисел}
Var a,b,c,max: integer;
begin
writeln(‘Введите три числа’);
readln(a,b,c);
max:=a;
if b>max then
max:=b;
if c>max then
max:=c;
writeln(‘наибольшее из чисел = ‘, max);
readln;
end.
Эта программа предназначена для нахождения наибольшего числа
среди трех целых чисел. Основываясь на ней, имеет смысл
обсудить алгоритм нахождения максимума среди любого, наперед
заданного числа целых чисел.
26
Как мы ищем максимум в этой программе?
Мы заводим
вспомогательную переменную, которую мы считаем текущим
максимумом (переменная max). На первом шаге, текущий максимум
становится равным первому
введенному числу.
Далее, мы
сравниваем текущий максимум со вторым введенным числом. Если
второе число превышает текущий максимум, то текущий максимум
становится равным второму числу. Далее выполняем сравнение
текущего максимума с третьим числом.
Если третье число
превышает текущий максимум, то текущий максимум становится
равным третьему числу. Алгоритм закончился.
Если у нас имеется наперед заданное количество целых чисел, то
нахождение максимума будет состоять из
действий
последовательного сравнения очередного целого числа с текущим
максимумом. После исчерпания всех чисел, текущий максимум
будет иметь значение наибольшего члена последовательности.
Приведем еще один пример использования условного оператора.
Пусть нам дан круг радиуса R с центром в начале координат.
Нужно определить, принадлежит ли точка, координаты которой
вводятся с клавиатуры, данному кругу.
Условием принадлежности точки кругу является соотношение R2
 x2 + y2, где x,y – координаты точки, R –радиус круга. Программа,
использующая это условие, может выглядеть следующим
образом:
Program Comp_5; {Определение принадлежности точки кругу}
Var
r.x,y:real;
{r – радиус круга, х,y –координаты точки}
begin
writeln(‘Введите радиус’);
readln(r);
writeln(‘Введите координаты точки’);
readln(x,y);
if sqr(r) <= (sqr(x) + sqr(y))
then
writeln(‘точка принадлежит кругу’)
else
writeln(‘точка не принадлежит кругу’);
27
readln;
end.
Усложним теперь задачу. Выясним, принадлежит ли точка
верхней половине этого круга. В этом случае необходимо
одновременное выполнение двух условий: R2  x2 + y2 и y >= 0.
В этом случае нам необходимо использовать логическое
выражение, которое соединяет два этих условия. В логическом
выражении используется операция and - логическое «и».
Программа будет выглядеть так:
Program Comp_6; {Определение принадлежности точки верхней
половине круга}
Var
R,x,y:real;
begin
writeln(‘Введите радиус’);
readln(r);
writeln(‘Введите координаты точки’);
readln(x,y);
if (sqr(r) <= sqr(x) + sqr(y)) and (y>=0) {оба
условиянеобходимо взять в скобки}
then
writeln(‘точка принадлежит области’)
else
writeln(‘точка не принадлежит области’);
readln;
end.
Усложним задачу. Попробуем выяснить, попадает ли точка в
верхний правый или в нижний левый квадранты круга. В этом
случае должно быть выполнено одно из двух условий: (sqr(r) <=
sqr(x) + sqr(y)) и (((y>=0) and (x>=0)) или ((y<=0) and (x<=0))).
Здесь нам понадобится операция or – логическое или. В
результате получим:
Program Comp_7;
28
Var
R,x,y:real;
begin
writeln(‘Введите радиус’);
readln(r);
writeln(‘Введите координаты точки’);
readln(x,y);
if( (sqr(r) <= sqr(x) + sqr(y)) and ((y>=0) and (x>=0)) or
((y<=0) and (x<=0))
then
writeln(‘точка принадлежит области’)
else
writeln(‘точка не принадлежит области’);
readln;
end.
ОПЕРАТОРЫ ЦИКЛА
При реализации алгоритмов нам необходимо выполнять
повторяющиеся действия. Например, в алгоритме нахождения
максимального элемента последовательности таким
повторяющимся действием будет действие сравнения текущего
максимума с очередным элементом последовательности.
В языке Pascal имеются операторы цикла трех типов, а именно:
циклы с параметром, циклы с предусловием (цикл while), циклы
с постусловием (цикл repeat).
Цикл с параметром используется, когда мы заранее знаем,
сколько раз нам нужно совершить то или иное действие. Цикл с
предусловием используется, когда повторения нужно делать в
зависимости от истинности сформулированного условия. Цикл с
постусловием используется для организации повторения
действий, где условие является условием окончания повторений.
Следовательно, цикл repeat выполнится хотя бы один раз, прежде
чем мы проверим условие завершения цикла.
ЦИКЛ С ПАРАМЕТРОМ
Синтаксис этого оператора следующий:
29
For <параметр цикла>=<начальное значение> To <конечное
значение>
do <оператор)>.
For <параметр цикла>=<начальное значение> downTo
<конечное значение>
do <оператор)>.
Первом случае параметр цикла при очередном шаге цикла, будет
увеличиваться на единицу, во втором случае, параметр цикла
будет уменьшаться на единицу.
Рассмотрим пример. Предположим, нам нужно подсчитать сумму
чисел натурального ряда от 1 до 100. Используя цикл с
параметром (далее мы будем называть его просто «цикл for») эта
задача может быть решена следующим образом.
Program Comp_8;
Var
Summa,i:integer
Begin
Summa:=0;
For i:=1 to 100 do
Summa:=summa+i;
Writeln(‘Сумма = ‘,summa);
Readln;
End.
Следующий пример использует графические возможности TurboPascal. И ясно показывает поможет вам понять принцип действия
оператора for. Программа строит концентрические окружности,
центр которых совпадает с центром экрана. Расстояние между
окружностями (шаг по радиусу) равно 10 пикселям. Программа
использует графические процедуры и функции, которые собраны
30
в модуле Graph. Это процедура Initgraph , которая инициирует
графический режим, это процедуры getmaxx и getmaxy , которые
определяют максимальные размеры экрана по оси x и оси y , и
процедура Circle, рисующая окружность с центром в точках x ,
y и заданным радиусом.
Program Comp_9;
Uses Graph;
Var
gd,gm:integer;
x,y, i:integer;
begin
Gd:=detect;
Initgraph (gd,gm,’C:\bp\bgi’);
x:= getmaxx div 2;
y:=getmaxy div 2;
For i:=1 to 10 do Circle(x,y,i*10);
Readln;
end.
В операторе цикла с параметром внутри цикла запрещается
изменять параметр цикла.
Рассмотрим программу, которая для двух заданных чисел
определяет
общие цифры чисел.
program Comp_10;
uses Crt;
var a,b:integer;
m1,m2,m3:SET OF '0'..'9';
s1,s2:string;
c:char;i:integer;
begin
writeln('vvedi dva chisla');
31
readln(a,b);
str(a,s1); m1:=[];
str(b,s2); m2:=[];
for i:=1 to length(s1) do
m1:=m1+[s1[i]];
for i:=1 to length(s1) do
m2:=m2+[s2[i]];
m3:=m1*m2;
for c:='0' to '9' do
if c in m3 then write(c:3);
readkey;
end.
Рассмотрим эту программу.
2.4. УПРАЖНЕНИЯ
2.5. .ЗАДАЧИ
Задача 1. Подсчитать, сколько символов набрано во входном
файле.
(Файл принимается с клавиатуры или накоплен заранее.)
Задача 2. Подсчитать число слов во входном файле, считая
словом
любую последовательность символов, разделенных пробелами.
Задача 3. Каков номер последнего пробела, набранного с
клавиатуры?
Задача 4. Сколько слов начинается с заданной буквы?
Задача 5. Вывести номер первого слова, начинающегося с
заданной буквы.
Задача 6. Принадлежат ли введенные числа заданному диапазону?
Задача 7. Сколько введенных чисел заданному диапазону не
принадлежат?
Задача 8. Вводились ли в данный файл однобуквенные слова?
Задача 9. Сколько вопросительных предложений в данном файле?
Задача 10. Представлена ли во введенном тексте прямая речь с
помощью
кавычек?
Задача 11. Стоит ли точка в конце введенного предложения?
Задача 12 *. Сколько строк понадобится для вывода чисел из файла
32
на экран
по 8 в колонку?
Задача 13. Сколько экранов займет введенный текст, если
выводить каждое
предложение на отдельной строке?
Задача 14. Войдет ли введенное предложение на строку?
Задача 15. Возрастает ли введенная последовательность чисел?
Задача 16. Найти максимальное среди чисел из данного файла.
Задача 17* Подсчитать сумму вводимых чисел.
Задача 18.. Какова наибольшая дистанция между вводимыми
числами?
Задача 19. Однократно ли вхождение наибольшего числа в
данный файл?
Задача 20. Организовать прием монотонной последовательности
чисел
(с сообщением о нарушении монотонности).
Задача 21. Запрограммировать прием слов, начинающихся с
заданной буквы.
Задача 22* Написать программу приема данных с контролем
принадлежности
заданному интервалу.
Задача 23. При приеме текста проверить, одно ли предложение
введено?
Задача 24. Четное ли число кавычек в тексте?
2.6. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
 Какой набор средств достаточен для первичного набора
текста?
 Каким образом программа осуществляет обмен данными
между
оперативной памятью и памятью на дисках, организованной в
файлы?
 Как выяснить объем памяти и характеристики встроенных
типов
данных в системе Turbo-Pascal?
 Доступ к информации о структуре дисковой памяти,
директорий, файлов.
 Управление потоком данных, задание программе входных и
выходных файлов.
 Назначение устройств файлами (унификация устройств и
33
файлов):
клавиатуры - входным файлом, экрана - выходным.
 Организация удобочитаемого вывода файла на экран.
 Связывание имен файлов с файловыми переменными.
 Имена файлов, обрабатываемых и порождаемых системой
Turbo-Pascal.
 Что дает пошаговое исполнение на начальном этапе отладки
программ?
 Каким образом копируются примеры из встроенных подсказок
в
программу?
 Что можно предпринять при появлении диагностических
сообщений?
 Зачем нужны трансляторы? Что такое компилятор, чем он
отличается от интерпретатора?
 Как загрузить интегрированную среду Turbo-Pascal?
 Как откомпилировать файл программы?
 Как скопировать уже существующую строку в программе в
другое место?
 Как перенести строку в другое место текста программы?
 Как сохранить текст программы под другим именем?
 Как удалить строку их текста программы?
 Как скопировать несколько строк в другое место программы?
 Как выйти из интегрированной среды Turbo-Pascal?
 Как войти в главное меню?
 Как загрузить в окно редактора уже существующий файл
программы?
 Зачем нужен комментарий?
 Из каких разделов состоит программа на Turbo-Pascal?
 В чем различие и сходство данных типа Char и String?
 В чем различие и сходство данных типа ShortInt и Byte?
3. ГРАФИКА В СРЕДЕ ТУРБО-ПАСКАЛЬ
34
АННОТАЦИЯ
В лабораторной работе рассматривается основные возможности
работы
в графическом режиме в среде Turbo-Pascal. Обычно на мониторе
может появляться и текстовая информация и графическая.
Хранение
и воспроизведение этих видов информации зависят от того в каком
режиме работает дисплей, а именно: в текстовом или
графическом. Стандартным состоянием является текстовый
режим. В лабораторной работе рассматриваются возможности
графической библиотеки GRAPH и организация движения
графических объектов.
3.1. ТЕКСТОВАЯ И ГРАФИЧЕСКАЯ ИНФОРМАЦИЯ
На экране видеодисплея может появляться текстовая информация и
графическая. Хранение и воспроизведение этих видов информации
зависят от того в каком режиме работает дисплей, а именно: в
текстовом или графическом. Стандартным состоянием является
текстовый режим. При работе в нем символ выводится размером
8*8=64 пикселей и место на экране определяется номером строки и
номером символа в строке.
В графическом режиме на экран выводится информация,
хранящаяся в видеопамяти: рисунки, чертежи, графики. Для того
чтобы перевести компьютер в графический режим работы
необходимо выполнить две операции.
Во-первых, нужно подключить графическую библиотеку Graph.
Она содержит процедуры и функции, с помощью которых мы
будем создавать на экране графические образы. Подключение
этой и других библиотек выполняется командой Uses Graph;
При подключении библиотеки используются две целочисленных
переменные: gd,gm:integer;
Первая переменная определяет тип графического драйвера, вторая
- режим работы графического адаптера. Обычно, мы будем
задавать тип и режим автоматически с помощью команды
Gd:=detect;
35
Информация в гpафическом режиме представляется совокупностью
светящихся точек. Светящиеся точки - пиксели определяются
цветом и координатами относительно верхнего левого угла, чьи
координаты (0,0). Процедуры работы с модулями графической
библиотеки становятся
доступными
после
объявления в
программе предложения USES
GRAPH
и
инициирования
графического режима работы. Оно выполняется с помощью
процедуры INITGRAPH. Процедура
Initgraph (gd,gm,’C:\bp\bgi’).
имеет три параметра. Первые два параметра – это уже описанные
переменные gd,gm:integer;, последний параметр - выражение в
апострофах – это путь к файлу драйвера egavga.bgi. Закрытие
графического режима выполняется с помощью процедуры
CLOSEGRAPH.
Эта процедура стирает
экран,
закрывает
графический режим работы и переходит в текстовый режим.
3.2. ИНИЦИАЛИЗАЦИЯ ГРАФИЧЕСКОГО РЕЖИМА
Любая информация при работе в графическом режиме на экране
монитора представлена совокупностью светящихся точек —
пикселей, которые определяются цветом и координатами —
положением относительно левого верхнего угла экрана с
координатами (0,0).
Дисплей может работать в нескольких графических режимах,
каждому из которых может соответствовать свой формат
изображения, т. е. разрешающая способность (количество пикселей
по горизонтали и вертикали) экрана и набор используемых цветов.
Формат изображения определяется техническими характеристиками
дисплея, а также используемыми в текущий момент адаптером и
драйвером. Адаптер (device adapter) — устройство сопряжения
ЭВМ и внешнего устройства. Драйвер (device driver) — программа,
обеспечивающая взаимодействие операционной системы с
физическим устройством, обычно это файл с расширением *.BGI.
Распространены дисплеи типа CGA, EGA, VGA. Приведем
характеристики некоторых драйверов:
Драйвер
Режим
Разрешение
Файл
36
CGA
EGA
VGA
(CGACO,
CGAHi)
320х200
(640х200)
(EGALo,
EGAHii)
640х200
(640х350)
GI
(VGALo,
VGAHi)
320х200
(640х480)
GI
CGA.BGI
EGAVGA.B
EGAVGA.B
При работе в графическом режиме программист может задавать
яркость и цвет любого пикселя или группы пикселей, что позволяет
формировать на экране любые изображения, в том числе рисунки,
графики, чертежи, символы, осуществлять движение графических
объектов. Процедуры и функции управления графическим экраном
включены в стандартный модуль GRAPH.TPU, входящий в
комплект поставки Турбо-Паскаля, и становятся доступны после
объявления в программе предложения USES GRAPH. Для
использования графических функций и процедур модуля
GRAPH.TPU необходимо инициировать графический режим работы
экрана, используя процедуру INITGRAPH. Формат обращения:
INITGRAPH (< драйвер >, < режим >, <путь>);
Здесь
<драйвер> — переменная типа INTEGER, определяющая тип
графического драйвера. Этот параметр может задаваться как по
имени, так и цифрой,
<режим> — переменная типа INTEGER, определяющая режим
работы графического адаптера;
<путь> — выражение типа STRING, содержащее путь к файлу
драйвера *.BGI. Если он расположен в активной директории (в той
где находится ваша программа), то вместо маршрута ставятся два
апострофа.
Если тип адаптера ЭВМ неизвестен или если программа
рассчитана на работу с любым адаптером, используется обращение
к процедуре с требованием автоматического определения типа
адаптера:
Driver= Detect;
37
lnitgraph(Driver, Regim, 'C:\TP\BGI');
После такого обращения установится графический режим
работы экрана, а переменные Driver и Regim будут содержать
константы, определяющие тип драйвера и режим его работы.
{ Пример для InitGraph }
uses Graph;
var
grDriver : Integer; grMode : Integer; ErrCode : Integer;
begin
grDriver := Detect;
драйвера экрана}
{Автоматическое
определение
типа
lnitGraph(grDriver,grMode,"); {два апострофа}
ErrCode := GraphResult; (Анализ инициализации графического
режима}
if ErrCode<>о grOk then {Проверка правильности установки
графического режима}
begin
WriteLn('Graphics
error:',GraphErrorMsg(ErrCode));
{Печатается текстовое сообщение по коду ошибки переменной
ErrCode}
Exit; {Аварийный выход из программы }
end;
{ Выполняем графику }
Line(0, 0, GetMaxX, GetMaxY);
ReadLn;
CloseGraph;
end.
В результате работы данной программы устанавливается
графический режим и рисуется линия максимального размера из
левого верхнего в правый нижний угол. READLN используется для
задержки сформированного изображения. Процедура Exit
38
осуществляет немедленный выход из исполняемой процедуры или
функции в вызывающую программу. Вызов Exit в основной
программе ведет к останову программы. Иногда целесообразно
использовать процедуру Halt, которая осуществляет аварийный
выход и прекращение работы программы из любой ее части.
Процедура
CLOSEGRAPH
очищает
экран,
закрывает
графический режим работы экрана и возвращает текстовый режим.
Для анализа ситуации и выдачи сообщений используется
функция GRAPHRESULT и GRAPHERRORMSG.
Функция GRAPHRESULT возвращает значение типа INTEGER,
в котором закодирован результат последнего обращения к
графическим процедурам. Если ошибка не обнаружена, значением
функции будет ноль, в противном случае — отрицательное число,
указывающее номер ошибки. При анализе ошибок можно
использовать мнемонические константы, определенные в модуле
GRAPH, например CONST
grОk = 0; {Нет ошибок}
grInitGraph = -1; {Не инициирован графический режим}
grЕrrоr = -11; {Общая ошибка}
Функция GRAPHERRORMSG возвращает значение типа
STRING, в котором по указанному коду ошибки дается
соответствующее текстовое сообщение.
Чаще всего причиной возникновения ошибки при обращении к
процедуре
INITGRAPH
является
неправильное
указание
местоположения файла GRAPH.TPU, содержащего библиотеку
графических процедур, или файла с драйвером графического
адаптера (например, EGAVGA.BGI для адаптеров EGA и VGA).
Чтобы компилятор Турбо-Паскаля мог отыскать файл GRAPH.TPU,
необходимо соответствующим образом настроить среду ТурбоПаскаля. Для этого в режиме OPTIONS среды в опции
DIRECTORIES, в подопции UNIT DIRECTORIES необходимо
указать каталог, в котором размещен этот файл. Настройка на
местоположение драйвера осуществляется указанием пути к
нужному файлу в качестве фактического параметра вызова
процедуры INITGRAPH.
39
К моменту обращения к процедуре InitGraph на одном из
дисковых носителей информации должен находиться файл,
содержащий нужный графический драйвер. Процедура загружает
этот драйвер в оперативную память и переводит адаптер в
графический режим работы. Тип драйвера должен соответствовать
типу графического адаптера.
3.3. РАБОТА В ГРАФИЧЕСКОЙ ОБСТАНОВКЕ В ТУРБОПАСКАЛЕ
Основные Графические Примитивы
Функции GETMAXX, GETMAXY возвращают значения типа
INTEGER, содержащие максимальные координаты экрана в
текущем режиме работы соответственно по горизонтали и
вертикали.
Процедура PUTPIXEL выводит заданным цветом пиксель по
указанным координатам; формат обращения:
PUTPIXEL (X, Y, <цвет>);
где X, Y — выражения типа INTEGER, определяющие
координаты;
<цвет> — выражения типа WORD , определяющее цвет.
Координаты задаются относительно левого верхнего угла окна
или, если окно не установлено, относительно левого верхнего угла
экрана.
Процедура SETCOLOR устанавливает текущий цвет для
выводимых линий и символов. Формат обращения:
SETCOLOR(<цвет>);
где <цвет> — выражение типа WORD, задающее текущий цвет.
Процедура SETLINESTYLE устанавливается новый
вычерчиваемых линий. Формат обращения:
стиль
SETLINESTYLE(<вид>, <образец>, <толщина>)„
где <вид> — переменная типа WORD, задающая вид линии;
<образец> — переменная типа WORD, указывающая образец
линии;
40
<толщина> — переменная типа WORD, задающая толщину
линии.
Вид линии определяется константами. (см. Приложение ).
Образец учитывается только для линий, вид которых определяется
пользователем. Параметр <толщина> может принимать одно из двух
значений.
Процедура LINE вычерчивает линию с
координатами начала и конца. Формат обращения:
указанными
LINE (X1, Y1, X2, Y2);
где X1,Y1, X2,Y2 — выражения типа INTEGER, определяющие
координаты начала и конца линии. Линия вычерчивается текущим
стилем и текущим цветом.
Процедура
обращения:
CIRCLE
вычерчивает
окружность.
Формат
CIRCLE (X, Y, <радиус>);
где X,Y — выражения типа INTEGER, означающие координаты
центра;
<радиус> — выражения типа WORD, указывающее радиус в
пикселях.
Окружность выводится текущим цветом. Толщина линии
устанавливается текущим стилем, вид линии всегда SOLIDLN
(сплошная). Процедура вычерчивает правильную окружность (с
учетом изменения линейного размера радиуса в зависимости от его
направления относительно сторон графического экрана).
Процедура RECTANGLE вычерчивает прямоугольник
указанными координатами углов. Формат обращения:
с
RECTANGLE (X1, Y1, X2, Y2 );
где X1, Yl, X2,Y2 — выражения типа INTEGER, определяющие
координаты левого верхнего и правого нижнего углов
прямоугольника.
Прямоугольник вычерчивается с использованием текущего
цвета и текущего стиля линий (устанавливаются процедурой
SETLINESTYLE).
41
Процедура SETFILLSTYLE устанавливает стиль (тип и цвет)
штриховки. Формат обращения:
SETFILLSTYLE(<штриховка>,<цвет>);
где <штриховка> — переменная типа WORD, задающая тип
штриховки;
<цвет> — переменная типа WORD, цвет штриховки.
С помощью штриховки можно покрывать какие-либо
фрагменты изображения периодически повторяющимся узором. Для
указания типа штриховки используются определенные константы
(см. в Приложении ).
Процедура FLOODFILL закрашивает произвольную замкнутую
фигуру, формат обращения:
FLOODFILL (X, Y, <цвет границы>);
где X.,Y — выражения типа INTEGER, означающие координаты
любой точки внутри замкнутой фигуры;
<цвет границы> — выражения типа WORD, цвет граничной
линии.
Процедура закрашивает замкнутую фигуру текущим образцом
штриховки и текущим цветом (устанавливаются процедурой
SETFILLSTYLE). Если штрихуемая фигура не замкнута, штриховка
“разольется по всему экрану”.
Процедура BAR закрашивает прямоугольную область экрана.
Формат обращения:
BAR (X1, Y1, X2, Y2 );
где X1,Yl, X2,Y2 — выражения типа INTEGER, определяющие
координаты левого верхнего и правого нижнего углов
закрашиваемой области.
Процедура закрашивает, но не обводит, прямоугольник текущим
образцом штриховки и текущим цветом (устанавливаются
процедурой SETFILLSTYLE).
Процедура SETTEXTSTYLE устанавливает стиль текстового
вывода на графический экран. Формат обращения:
42
SETTEXTSTYLE (<шрифт>,<направление>,<размер>);
где <шрифт>,<направление>,<размер> — выражения типа
WORD, означающие код (номер) соответственно шрифта,
направления и размера шрифта.
Для указания кода шрифта можно использовать предварительно
определенные константы (см. Приложение).
Для задания направления выдачи текста имеются константы:
CONST
HorizDir = 0; {слева направо!
VertDir =10; {снизу вверх}
Каждый шрифт способен десятикратно изменять свои размеры.
Размер выводимых символов кодируется параметром <размер>,
который может иметь значение в диапазоне от 1 до 10.
Процедура OUTTEXT выводит текст, начиная с текущего
положения указателя; формат обращения
OUTTEXT (<текст>);
где <текст> — выражение типа STRING или CHAR.
При горизонтальном направлении вывода указатель смещается в
конец выведенного текста, при вертикальном — не меняет своего
положения. Текст выводится в соответствии с установленными
стилем и выравниванием. Если текст выходит за границы экрана, то
при использовании штриховых шрифтов он отсекается, а в случае
стандартного шрифта не выводится.
Процедура OUTTEXTXY выводит текст, начиная с текущего
положения указателя; формат обращения:
OUTTEXTXY (X, Y, <текст>)„
где X, Y — выражения типа INTEGER, определяющие
координаты точки вывода;
<текст> — выражение типа STRING или CHAR.
Отличается от процедуры OUTTEXT только координатами
вывода.
43
Очень часто необходимо вывести на экран значения некоторых
числовых переменных в графическом режиме. Для этого
необходимо преобразовать значение числовой переменной в
последовательность символов (строку), используя процедуру STR, и
вывести сформированную строку процедурой OUTTEXT или
OUTTEXTXY,
Процедура STR(X :[ :Width [:Decimals] ], ST) преобразует число
Х типа Real или Integer в строку символов ST так, как это делает
процедура Writeln перед выводом. Параметры Width и Decimals,
если они присутствуют, задают формат преобразования: Width
определяет общую ширину поля, выделенного под соответствующее
символьное представление вещественного и целого числа Х, a
Decimals — количество символов в дробной части (параметр
decimals допускается использовать только в том случае, когда Х —
вещественное число).
Примеры работы графической программы
{Программа управляемого и неуправляемого движения}
Uses graph, crt;
Const
Left=#75;
Right=#77;
Up=#72;
Down=#80;
Esc=#27;
Var gd,gm:integer;
,x1,y1,hx1,hy1,r1,c1:integer;
,x2,y2,h,c2:integer;
ch:char;
{---------------- Процедура рисования круга---------------------}
Procedure Krug(x,y,r,c:integer);
Begin
Setcolor(c);
Circle(x,y,r);
Setfillstyle(1,c);
Floodfill(x,y,c);
End;
{--------------Рисование ракетки----------------------}
Procedure racetca (x,y,dlina,shirina,c:integer);
Begin
Setfillstyle(1,c);
Bar(x,y,x+dlina,y+shirina);
End;
{----------------Писк---------------------------------------------}
Procedure pisk;
Begin
44
Sound(1000);
Delay(300);
Nosound;
End;
{-----------------------Неуправляемое движение------------------}
Procedure neupr(var x,y.hx,hy:integer;r,c:integer);
Begin
Krug(x,y,r,0);
{Стирание круга в старом положении}
X:=x+hx;
{Изменение координаты X}
Y:=y+hy;
{Изменение координаты Y}
If (x<= r) or (x>=getmaxx-r) then hx:=-hx
;{Отскок}
If (y<= r) or (y>=getmaxy-r) then hy:=-hy
;{Отскок}
Krug(x,y,r,c);
{Рисование круга в новом положении}
End;
{-----------------------Управляемое движение------------------}
Procedure upr(var x,y:integer; h,c:integer);
Begin
Ch:=readkey; {Читаем код клавиши}
{Если это управляющая клавиша, читаем код еще раз и осуществляем
движение}
If ch=#0 then
begin
ch:=readkey;
racetca (x,y,50,10,0); {Стираем ракетку}
case ch of
{Анализ клавиш и изменение координат}
Left: if x>h then x:=x-h else pisk;
Right: if x<getmaxx-50 then x:=x+h else pisk;
Up: if y>h then y:=y-h else pisk;
Down: if y<getmaxy-10 then y:=y+h else pisk;
End;
racetca (x,y,50,10,c); {Рисуем ракетку в новом месте}
end;
End;
{-----------------------Главная программа--------------------------}
begin
Gd:=detect;
Initgraph (gd,gm,’C:\bp\bgi’);
С1:=12; r1:= 30; hx1:=2; hy1:=2;
X1:=40; y1:= getmaxy div 2;
С2:=6; h2:=5;
X2:=40; y2:= 400;
Krug(x,y,r,c);
{Рисование круга в начальном положении}
racetca (x2,y2,50,10,c2);
{Рисование
ракетки
в
начальном
положении}
repeat
neupr(x1,y1,hx1,hy1,r1,c1);
{Неуправляемое движение}
If keypressed then upr(x2,y2,h2,c2);
{Если нажата клавиша, то происходит управляемое движение}.
Until ch=esc;
Closegraph;
End.
45
3.4. ЗАДАНИЯ
Задача 1. Нарисовать звездное небо (подобно заставке NC).
Задача 2. Заполнить экран произвольными кругами (квадратами,
треугольниками, дугами, секторами, эллипсами и др.).
Задача 3. Заполнить экран произвольными кругами (квадратами,
треугольниками, дугами, секторами, эллипсами и др.)
разного цвета.
Задача 4. То же, но закрашивая фигуры.
Задача 5. То же, но меняя шаблон заполнения фигуры.
Задача 6. То же, но цвет контура фигур отличен от них и от фона.
Задача 7.. Выдать на экран разные фигур по очереди.
Задача 8. Зачеркать экран ломаной линией (полосами, кривыми из
дуг).
Задача 9. То же, но отдельными линиями (отрезками, лучами и др.).
Задача 10. То же, но меняя стиль прорисовки линий.
Задача 11. Выдать на экран серию кругов (квадратов,
треугольников,
дуг, секторов, эллипсов и др.). с регулярным изменением
их координат.
Задача 12. Выдать на экран серию кругов (квадратов,
треугольников,
дуг, секторов, эллипсов и др.). с регулярным изменением
их размеров.
Задача 13. Выдать на экран серию кругов (квадратов,
треугольников,
дуг, секторов, эллипсов и др.). с регулярным изменением
их координат, размеров и цвета.
Задача 14. * Выдавать на экран разные серии фигур, прерываемые
46
по
сигналу с клавиатуры.
Задача 15. Запрограммировать вращение отрезка (луча, линии,
прямоугольника,
круга и др.)
Задача 16. Запрограммировать отражение отрезка (прямоугольника,
треугольника,
эллипса, сектора, сегмента и др.) от заданной линии.
Задача 17. Запрограммировать отражение отрезка (прямоугольника,
треугольника,
эллипса, сектора, сегмента и др.) относительно заданной точки.
Задача 18. Запрограммировать "калейдоскоп" с одной фигурой
внутри.
Задача 19. Запрограммировать "калейдоскоп" с разными фигурами
внутри.
Задача 20.. Написать программу поворота (переноса) системы
линий (фигур)
на заданный угол (заданное расстояние).
Задача 21.. Подготовить набор процедур для графического вывода
схем
программ (блок-схем, диаграмм, чертежей, и т.п.).
Задача 22. Подготовить набор процедур для изображения плоских
графов.
Задача 23. Запрограммировать раскраску строк текста по указанию
с клавиатуры. (Можно указывать диапазон строк и номер их цвета.)
Задача 24. Запрограммировать раскраску строк текста программы в
зависимости
от языковой конструкции, распознаваемой по первому символу
(слову).
Задача 25. Запрограммировать размещение надписей на экране (без
47
наложения).
Систему текстов на экране обвести рамочками.
Задача 26. Разместить тексты внутри заданной системы рамок (не
учитывая
правил переноса текстов).
Задача 27. Подготовить набор процедур для заключения текстов в
рамочки
разного вида (с тенями, именами, индикаторами, меню и др.).
Задача 28. Запрограммировать размещение рамок для текста,
допускающее
перекрытие (часть одной рамки закрыта другой).
Задача 29. Организовать учебный диалог по геометрической
терминологии
(картинка с вопросом, прием ответа в форме меню и реакция на
ответ
48
4. РАБОТА СО СЛОЖНЫМИ СТРУКТУРАМИ ДАННЫХ
АННОТАЦИЯ
В лабораторной работе рассматривается основные возможности
работы
с файлами и сложными структурами данных в среде Turbo-Pascal.
Рассматриваются программы, накапливающие в файле результаты
работы.
Рассматриваются задачи, использующие сложные структуры
данных.
4.1.КОМБИНИРОВАННЫЙ ТИП ДАННЫХ. ЗАПИСЬ.
Довольно часто вполне оправданным является представление
некоторых элементов в качестве составных частей другой, более
крупной логической единицы. Представляется естественным
сгруппировать информацию о номере дома, названии улицы и
городе в единое целое и назвать адресом, а объединенную
информацию о дне, месяце и годе рождения - датой. В языке
Паскаль для представления совокупности разнородных данных
служит комбинированный тип запись.
Запись и массив схожи в том, что обе эти структуры составлены
из ряда отдельных компонент. В то же время, если компоненты
массива должны быть одного типа, записи могут содержать
компоненты разных типов.
ЗАПИСИ
Запись представляет собой совокупность ограниченного числа
логически связанных компонент, принадлежащих к разным типам.
Компоненты записи называются полями, каждое из которых
определяется именем.
Поле записи содержит имя поля, вслед за которым через
двоеточие указывается тип этого поля. Поля записи могут
относиться к любому типу, допустимому в языке Паскаль, за
исключением файлового типа.
Структура объявления типа записи такова:
<имя_ типа> = RECORD <список полей> END
Здесь <имя типа> – правильный идентификатор; RECORD,
49
END – зарезервированные слова (запись, конец); <список полей> –
список полей; представляет собой последовательность разделов
записи, между которыми ставится точка с запятой.
Описание записи в языке Паскаль осуществляется с помощью
служебного слова RECORD, вслед за которым описываются
компоненты записи. Завершается описание записи служебным
словом END.
Например, записная книжка содержит фамилии, инициалы и
номера телефона, поэтому отдельную строку в записной книжке
удобно представить в виде следующей записи:
type Row=Record FIO: String[20]; TEL: String[7] end;
var t: Row;
Описание записей возможно и без использования имени типа,
например:
var t: Record FIO: String[20]; TEL: String[7] end;
Обращение к записи в целом допускается только в операторах
присваивания, где слева и справа от знака присваивания
используются имена записей одинакового типа. Во всех остальных
случаях оперируют отдельными полями записей. Чтобы обратиться
к отдельной компоненте записи, необходимо задать имя записи и
через точку указать имя нужного поля, например:
t.FIO, t.TEL
Такое имя называется составным. Компонентой записи может
быть также запись, в таком случае составное имя будет содержать не
два, а большее количество имен.
Обращение к компонентам записей можно упростить, если
воспользоваться оператором присоединения with.
Он позволяет заменить составные имена, характеризующие
каждое поле, просто на имена полей, а имя записи определить в
операторе присоединения:
with M do OP;
Здесь М – имя записи, ОР – оператор, простой или составной.
Оператор ОР представляет собой область действия оператора
50
присоединения, в пределах которой можно не использовать
составные имена.
Иногда содержимое отдельной записи зависит от значения
одного из ее полей. В языке Паскаль допускается описание записи,
состоящей из общей и вариантной частей. Вариантная часть
задается с помощью конструкции
case P of,
где Р – имя поля из общей части записи. Возможные значения,
принимаемые этим полем, перечисляются так же как и в операторе
варианта. Однако вместо указания выполняемого действия, как это
делается в операторе варианта, указываются поля варианта,
заключенные в круглые скобки. Описание вариантной части
завершается служебным словом end.
Инициализация записей
типизированных констант:
осуществляется
с
помощью
type RecType= Record x,y: Word; ch: Char; dim: Array[1..3] of Byte
end;
Приведем пример описания переменной, имеющей структуру
записи:
var
Address : Record
HouseNumber : Integer;
StreetName : String[20];
CityName : String[20];
PeopleName : String;
End;
Отметим, что поля StreetName и CityName имеют одинаковый
тип: String[20]. Поскольку в описании эти поля могут располагаться
в любом порядке, то можно сократить описание записи с полями
одинакового типа. Сокращенное описание записи Address выглядит
следующим образом:
Var
Address : Record
HouseNumber : Integer;
StreetName, CityName : String[20];
PeopleName : String;
51
End;
Каждая компонента записи называется полем. В переменной
записи Address поле с именем HouseNumber само является
переменной типа Integer, поле StreetName - двадцатисимвольной
строкой и т.д.
Для того чтобы обратиться к некоторому полю записи, следует
написать имя переменной и имя поля. Эти два идентификатора
должны разделяться точкой.
Оператор, который присваивает полю HouseNumber значение
45, выглядит так:
Address.HouseNumber := 45;
Таким же образом присваиваются значения другим полям
записи Address :
Address.StreetName := 'Профсоюзная';
Address.CityName := 'Сургут';
Address.PeopleName := 'Петрова Алла Ивановна';
Каждое поле записи Address можно рассматривать как обычную
переменную, которую можно напечатать или использовать в
расчетах. Вместе с тем запись может использоваться как единое
целое. В этом случае надо ввести тип записи.
Предположим, имеется следующее описание:
Type
Date = Record
Day : 1..31;
Month : (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Year : Integer;
End;
Var
HisBirth, MyBirth : Date;
После приведенного описания переменные HisBirth и MyBirth
имеют тип записи Date. Помимо действий над отдельными полями
записей HisBirth и MyBirth можно выполнять операции над всей
записью. Следующий оператор присваивания устанавливает
равенство значений записей HisBirth и MyBirth :
52
HisBirth := MyBirth;
Это присваивание эквивалентно следующей последовательности
операторов:
HisBirth.Day := MyBirth.Day;
HisBirth.Month := MyBirth.Month;
HisBirth.Year := MyBirth.Year;
Так как на тип компонент массива не накладывается
ограничений, то можно использовать массив, компонентами
которого являются записи. Посмотрите описание такого массива:
Var
Birthdays : Array [1..Persons] of Date;
Чтобы обратиться к некоторому полю определенной записи
массива, следует определить имя массива, индекс интересующей
записи и имя необходимого поля.
Например, следующий оператор печатает содержимое поля Year
записи Birthdays[3]:
Write(Birthdays[3].Year);
Каждая компонента записи называется полем. В переменной
записи Address поле с именем HouseNumber само является
переменной типа Integer, поле StreetName - двадцатисимвольной
строкой и т.д.
Для того чтобы обратиться к некоторому полю записи, следует
написать имя переменной и имя поля. Эти два идентификатора
должны разделяться точкой.
Оператор, который присваивает полю HouseNumber значение
45, выглядит так:
Address.HouseNumber := 45;
Таким же образом присваиваются значения другим полям
записи Address :
Address.StreetName := 'Профсоюзная';
Address.CityName := 'Сургут';
Address.PeopleName := 'Петрова Алла Ивановна';
53
Каждое поле записи Address можно рассматривать как обычную
переменную, которую можно напечатать или использовать в
расчетах. Вместе с тем запись может использоваться как единое
целое. В этом случае надо ввести тип записи.
Предположим, имеется следующее описание:
Type
Date = Record
Day : 1..31;
Month : (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Year : Integer;
End;
Var
HisBirth, MyBirth : Date;
После приведенного описания переменные HisBirth и MyBirth
имеют тип записи Date. Помимо действий над отдельными полями
записей HisBirth и MyBirth можно выполнять операции над всей
записью. Следующий оператор присваивания устанавливает
равенство значений записей HisBirth и MyBirth :
HisBirth := MyBirth;
Это присваивание эквивалентно следующей последовательности
операторов:
HisBirth.Day := MyBirth.Day;
HisBirth.Month := MyBirth.Month;
HisBirth.Year := MyBirth.Year;
Для переменных одного типа можно проверить выполнение
отношения равенства или неравенства ("=", "<>"). После
выполнения приведенных выше присваиваний следующее булево
выражение будет иметь значение True:
HisBirth = MyBirth;
Рассмотрите пример описания процедуры, которая получает
запись в качестве параметра-значения и печатает дату в
сокращенной стандартной форме, используя формат (MM-DDYYYY).
Procedure WriteDate(OneDate : Date);
Begin
54
Write(Ord(OneDate.Month)+1);
Write('-');
Write(OneDate.Day:2);
Write('-');
Write(OneDate.Year:4);
End;
Так как на тип компонент массива не накладывается
ограничений, то можно использовать массив, компонентами
которого являются записи. Посмотрите описание такого массива:
Var
Birthdays : Array [1..Persons] of Date;
Чтобы обратиться к некоторому полю определенной записи
массива, следует определить имя массива, индекс интересующей
записи и имя необходимого поля.
Например, следующий оператор печатает содержимое поля Year
записи Birthdays[3]:
Write(Birthdays[3].Year);
Примечание. Поля записи в свою очередь тоже могут быть
массивами, множествами, записями.
Задание. Рассмотрите следующие описания:
Type
Date = Record
Day : 1..31;
Month :1..12;
Year : 1..9999
End;
Reminder = Record
Message : Array [1..5] of String;
Event : Date
End;
Var
Today : Date;
Memos : Array [1..100] of Reminder;
Calendar : Array [1..365] of Date;
Задание. Составьте программу, организующую ввод наиболее
55
полной информации о людях и вывод интересующей информации
на экран.
Приведем описание массива, компоненты которого являются
записями:
Var
Payroll : array [1..Workers] of
record
FirstName, LastName : string;
Residence : record
HouseNumber : real;
StreetName, CityName : string;
StateName : Array [1..2] char;
ZipCode : integer;
end;
Phone : record
AreaCode, Exchenge : 1..999;
Line : 1..9999;
rnd;
PayScale : 'A' ..'G';
end;
Отметим, что два поля Residence и Phone являются записями.
Как выполнить обращение к полям этих записей? Как распечатать
условный шифр рабочего № 7? Поскольку это поле располагается во
вложенной записи, то следует указать как имя самой записи, так и
имя записи, в которую данная запись входит.
write (Payroll[7].Residence.ZipCode);
Аналогично приведенное присваивание корректирует шифр
рабочего № 23:
Payroll[23].Phone.AreaCode :=804;
Оператор if, представленный ниже, выполняет проверку
инициала рабочего № 58:
if Payroll[58].LastName[1] in ['T'..'Z'] Then ...
Соблюдение всех правил перечисления индексов и имен полей
при составлении ссылок является довольно утомительным занятием,
часто приводящим к ошибкам. В некоторых программах,
содержащих большое количество обращений к одному и тому же
56
полю, такое положение приводит к однообразному повторению.
Чтобы облегчить выполнение многократных ссылок для описанных
структур вводится оператор With (в переводе с английского предлог "с").
Общая форма записи:
with <имя переменной> do <оператор>
В рамках оператора, определяемого внутри оператора With, к
полям определяемой переменной можно обращаться просто по
имени. Например,
with Payroll[7].Residence do
ZipCode := 2345;
for i := 1 to Workers do
with Payroll[i] do
if PayScale < 'G'
then
PayScale := Succ(PayScale);
Оператор with позволяет более компактно представлять часто
используемые переменные. Посмотрите это на примере фрагмента
программы, печатающего адрес рабочего № 14:
with Payroll[14].Residence do
begin
writeln(HouseNumber,' ',StreetName);
writeln(CityName,',',StateName,',' ,ZipCode);
end;
В рамках составного оператора, следующего за with, каждое
обращение к имени поля автоматически связывается с записью
Payroll[14].Residence. Печать адресов всех рабочих выполняется при
помощи следующего оператора цикла:
for i := 1 to Workers do
with Payroll[i].Residence do
begin
writeln(HouseNumber,' ',StreetName);
writeln(CityName,',',StateName,',' ,ZipCode);
end;
Операторы with могут быть вложенными. Приведенные ниже
три оператора эквивалентны друг другу:
57
1. Payroll[i].Residence.HouseNumber := 50;
2. with Payroll[i].Residence do
HouseNumber := 50;
3. with Payroll[i] do
with Residence do
HouseNumber := 50;
Однако недопустимым является использование вложенных
операторов With, в которых указываются поля одного типа,
поскольку возникает неоднозначность конструкции. По этой
причине приведенное использование вложенных операторов With
является неверным:
with Payroll[5] do
with Payroll[17]do
PayScale :='A';
Следует очень внимательно подходить к использованию
вложенных операторов With, применение которых не только может
привести к ошибкам, но также к потере наглядности структуры
программы. Хотя оператор With является стандартным средством
сокращения, его полезность должна еще проявиться. Конечной
целью всякого хорошего программиста является написание не
только короткой, но и понятной программы.
Пример. В массиве хранятся данные об учениках класса: школа,
фамилия, класс. Вывести список учеников, которые учатся в
восьмом классе.
Program LipovsevM;
Uses
Crt;
Type
Uchenik=record
Shkola : integer;
Fam : string[15];
Klass : integer;
end;
Var
I,n,a,j : integer;
Massiv : array[1..100] of Uchenik;
58
Рrocedure Poisk;
Begin
for i:=1 to n do
if massiv[i].klass=8
then
with massiv[i] do
writeln(Shkola:4,' ',Fam:15,' ',klass);
End;
Begin
ClrScr;
writeln('Введите число учеников ');
write('->');
read(n);
for i:=1 to n do
begin
writeln('Введите через пробел номер школы и фамилию ученика
');
write('->');
with massiv[i] do
begin
readln(Shkola,Fam);
write('Введите класс ученика (только число) ->');
read(Klass);
end;
end;
writeln('Ученики 8-ых классов:');
writeln('Школа Фамилия Класс');
writeln('---------------------------------');
Poisk;
ReadKey;
End.
4.2. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
59
 Как формируются записи из разнородных значений и доступ к
ним.
 Организация ветвлений в программе с помощью Case.
 Как осуществляется ввод и вывод элементов записи?
 Чем обеспечивается сохранение записей в файлах?
4.3. ЗАДАНИЯ
Рассмотрите следующие описания:
Type
Date = Record
Day : 1..31;
Month :1..12;
Year : 1..9999
End;
Reminder = Record
Message : Array [1..5] of String;
Event : Date
End;
Var
Today : Date;
Memos : Array [1..100] of Reminder;
Calendar : Array [1..365] of Date;
Какой
тип,
идентификаторов?
если
он
определен,
у
следующих
а) Today.Year
б) Memos [2]
в) Memos [4].Month
г) Calendar [200]
д) Memos [16].Message[2]
е) Memos [16].Message[1],[2]
ж) Calendar[1].Date
з) Memos [10].Event
4.4.ЗАДАЧИ
Задача 1. Введено несколько анкет (карточек, паспортов и др.) в
виде текста или таблицы. Сохранить их в файле записей.
60
Задача 2. Организовать прием анкет с клавиатуры и их накопление
в файле.
Задача 3. Анкеты накоплены в файле записей. Вывести их в виде
текста.
Задача 4. Найти в файле записей запись с заданным значением
поля.
Задача 5. Сколько записей в файле обладают заданным значением
данного поля?
Задача 6. Вывести постранично все записи с заданным значением
поля.
Задача 7. Вывести записи с заданными одновременно значениями
нескольких
полей.
Задача 8. Вывести записи, в которых найдено хотя бы одно
заданное значение
поля.
Задача 9. Вывести записи, значение поля которых принадлежит
заданному
диапазону (множеству, вектору).
Задача 10. Вывести записи, значение поля которых удовлетворяет
условию,
заданному предикатом.
Задача 11. Вывести записи, содержащие поле с заданным
значением.
Задача 12. Сколько найдено записей, удовлетворяющих заданному
условию?
НАКОПЛЕНИЕ И АНАЛИЗ ОДНОРОДНОЙ ИНФОРМАЦИИ
4.4.1. Проверить совпадение букв в двух введенных словах
4.4.2. Принадлежат ли вводимые целые числа заданному
множеству?
4.4.3. Найти новые слова (не принадлежащие заданному словарю)
во введенном предложении.
61
4.4.4. Пополнить словарь новыми словами из введенного
предложения.
4.4.5. Найти в тексте программы "чужие" символы, т.е. не
принадлежащие
алфавиту.
4.4.6. Из введенной последовательности чисел убрать повторения.
*4.4.7. Раскрасить в слове гласные и согласные буквы в разные
цвета.
*4.8. Разделить (разметить) в предложении односложные и
составные
слова.
4.9. Сколько введенных чисел принадлежит заданному множеству?
4.10. Построить множество простых чисел до заданного числа.
4.11. Сколько простых чисел до заданного числа?
4.12. Было ли найдено заданное простое число? (Найденные - в
файле.)
*4.4.13 Организовать пополнение файла простых чисел по мере
их вычисления разными запусками программы.
4.4.14. Подсчитать число простых чисел во введенной
последовательности.
4.4.15. Подсчитать число гласных и согласных букв в тексте.
4.4.16. Подсчитать число различных чисел во введенной
последовательности.
4.4.17. Найти число неоднократно введенных чисел.
4.4.18. Найти максимальное однократно введенное число.
*4.4.19. Сколько совершенных чисел можно найти используя
систему
Turbo Pascal 6.0 ?
4.4.20. Используя файл с простыми числами разложить заданное
число
на множители.
4.4.21. Проверить, не испорчена ли информация в файле простых
чисел.
4.4.22. Все ли простые числа до заданного числа занесены в файл?
4.4.23. Какие буква алфавита не встречаются в заданной фразе?
4.4.24. Какая буква алфавита чаще всего встречается в заданном
тексте?
*4.4.25. Организовать учебную программу по освоению набора
заданных
слов (чисел, текстов и т.п.). Набор освоен, если выполнены
безошибочно две попытки.
62
5. РАБОТА СО ДИНАМИЧЕСКИМИ СТРУКТУРАМИ
ДАННЫХ
АННОТАЦИЯ
В лабораторной работе рассматривается основные возможности
работы
с динамическими структурами данных в среде Turbo-Pascal.
Рассматриваются программы, создающие списки, рисующие
эти списки в графическом режиме и процедуры добавления
элемента в список
и исключения элемента из списка.
Безопасность и эффективность информационных процессов
Указатели
Динамические структуры данных. Статические и
динамические переменные. Адреса. Указатели и их
объявление. Присвоение значений указателю.
Оператор @ с переменной. Оператор @ с параметром
процедуры, переданным по значению. Оператор @ с
параметром процедуры, переданным по ссылке.
Примеры решения задач.
5.1. СПИСКИ
Статической
переменной
(статически
размещенной)
называется описанная явным образом в программе переменная,
обращение к которой осуществляется по имени. Место в памяти для
размещения статических переменных определяется при компиляции
программы.
В отличие от таких статических переменных в программах,
написанных на языке Паскаль, могут быть созданы динамические
переменные. Основное свойство динамических переменных
заключается в том, что они создаются и память для них выделяется
во время выполнения программы. Размещаются динамические
переменные в динамической области памяти (heap – области).
Динамическая переменная не указывается явно в описаниях
переменных и к ней нельзя обратиться по имени. Доступ к таким
переменным осуществляется с помощью указателей и ссылок.
63
Работа с динамической областью памяти в Турбо Паскале
реализуется с помощью процедур и функций New, Dispose, GetMem,
FreeMem, Mark, Release, MaxAvail, MemAvail, SizeOf.
Процедура New (var p: Pointer) выделяет место в динамической
области памяти для размещения динамической переменной p^ и ее
адрес присваивает указателю p.
Процедура Dispose (var p: Pointer) освобождает участок
памяти, выделенный для размещения динамической переменной
процедурой New, и значение указателя p становится
неопределенным.
Процедура GetMem (var p: Pointer; size: Word) выделяет
участок памяти в heap-области, присваивает адрес его начала
указателю p, размер участка в байтах задается параметром size.
Процедура FreeMem (var p: Pointer; size: Word) освобождает
участок памяти, адрес начала которого определен указателем p, а
размер параметром size. Значение указателя p становится
неопределенным.
Процедура Mark (var p: Pointer) записывает в указатель p адрес
начала участка свободной динамической памяти на момент ее
вызова.
Процедура Release (var p: Pointer) освобождает участок
динамической памяти, начиная с адреса, записанного в указатель p
процедурой Mark, то есть, очищает ту динамическую память,
которая была занята после вызова процедуры Mark.
Функция MaxAvail: Longint возвращает длину в байтах самого
длинного свободного участка динамической памяти.
Функция MemAvail: Longint
динамической памяти в байтах.
полный
объем
свободной
Вспомогательная функция SizeOf (X): Word возвращает объем в
байтах, занимаемый X, причем X может быть либо именем
переменной любого типа, либо именем типа.
Рассмотрим некоторые примеры работы с указателями.
var
p1, p2: ^Integer;
64
Здесь p1 и p2 – указатели или переменные ссылочного типа.
p1:=NIL; p2:=NIL;
После выполнения этих операторов присваивания указатели p1
и p2 не будут ссылаться ни на какой конкретный объект.
New(p1); New(p2);
Процедура New(p1) выполняет следующие действия:
– в памяти ЭВМ выделяется участок для размещения величины
целого типа;
– адрес этого участка присваивается переменной p1:
Аналогично, процедура New(p2) обеспечит выделение участка
памяти, адрес которого будет записан в p2:
После выполнения операторов присваивания
p1^:=2; p2^:=4;
в выделенные участки памяти будут записаны значения 2 и 4
соответственно:
В результате выполнения оператора присваивания
p1^:=p2^;
в участок памяти, на который ссылается указатель p1, будет
записано значение 4:
65
После выполнения оператора присваивания
p2:=p1;
оба указателя будут содержать адрес первого участка памяти:
Переменные p1^, p2^ являются динамическими, так как память
для них выделяется в процессе выполнения программы с помощью
процедуры New.
Динамические переменные могут входить в состав выражений,
например:
p1^:=p1^+8; Write('p1^=',p1^:3);
Пример. В результате выполнения программы:
Program DemoPointer;
Var p1,p2,p3:^Integer;
Begin
p1:=NIL; p2:=NIL; p3:=NIL;
New(p1); New(p2); New(p3);
p1^:=2; p2^:=4;
p3^:=p1^+Sqr(p2^);
writeln('p1^=',p1^:3,' p2^=',p2^:3,' p3^=',p3^:3);
p1:=p2;
writeln('p1^=',p1^:3,' p2^=',p2^:3)
End.
на экран дисплея будут выведены результаты:
p1^= 2 p2^= 4 p3^= 18
p1^= 4 p2^= 4
66
СПИСОК. СОЗДАНИЕ СПИСКА ПУТЕМ ДОБАВЛЕНИЯ
ЭЛЕМЕНТОВ В КОНЕЦ СПИСКА. ПРОСМОТР СПИСКА.
Определение. Списком называется структура данных, каждый
элемент которой посредством указателя связывается со следующим
элементом.
Из определения следует, что каждый элемент списка содержит
поле данных (Data) (оно может иметь сложную структуру) и поле
ссылки на следующий элемент (Next). Поле ссылки последнего
элемента должно содержать пустой указатель (Nil).
Схематически это выглядит так:
Попробуем вместе сформировать небольшой список путем
добавления элементов в конец списка.
Задача. Сформировать список, содержащий целые числа 3, 5, 1,
9.
Для этого сначала определим запись типа S с двумя полями. В
одном поле будут содержаться некоторые данные (в нашем случае
числа 3, 5 , 1 и 9), а в другом поле будет находится адрес
следующего за ним элемента.
Примечание. Нужно понимать, что поле данных вообще говоря
может содержать в себе сколько угодно полей; это зависит от
конкретно поставленной задачи.
Type
Ukazatel = ^S;
S = Record
Data : integer;
Next : Ukazatel ;
End;
Таким образом, мы описали ссылочный тип, с помощью
67
которого можно создать наш связанный однонаправленный список.
Заметим, что все элементы списка взаимосвязаны, т. е. где
находится следующий элемент, "знает" только предыдущий.
Поэтому самое главное в программе, это не потерять, где находится
начало списка. Поэтому на начало списка будем ставить указатель с
именем Head и следить за тем, чтобы на протяжении выполнения
программы значение этого указателя не менялось.
А теперь опишем переменные для решения нашей задачи:
Var
Head, {указатель на начало списка}
x {вспомогательный указатель для создания очередного элемента
списка}
: Ukazatel ;
Создадим первый элемент:
New(x); {выделим место в памяти для переменной типа S}
x^.Data := 3; {заполним поле Data первого элемента}
x^.Next := Nil; {заполним поле Next первого элемента: указатель в
Nil}
Head := x; {поставим на наш первый элемент указатель головы
списка}
Таким образом, к выделенной области памяти можно обратиться
через два указателя.
Продолжим формирование списка, для этого нужно добавить
элемент в конец списка. Поэтому вспомогательная переменная
указательного типа х будет хранить адрес последнего элемента
списка. Сейчас последний элемент списка совпадает с его началом.
Поэтому можно записать равенства:
Head^.Next = x^.Next;
Head^.Data = x^.Data;
Head = x;
68
Выделим область памяти для следующего элемента списка.
New(x^.Next);
Присвоим переменной х значение адреса выделенной области
памяти, иначе, переставим указатель на вновь выделенную область
памяти:
x := x^.Next;
Определим значение этого элемента списка, иначе, заполним
поля:
x^.Data := 5;
x^.Next := Nil;
Итак, теперь у нас список содержит два элемента. Понятно,
чтобы создать третий и четвертый элементы, нужно проделать те же
самые операции.
Теперь попробуем подытожить наши рассуждения. Оформим
создание списка в виде процедуры, в которой его элементы вводятся
с клавиатуры.
Procedure Init(Var u : Ukazatel);
Var
x : Ukazatel;
Digit : integer; {Значение информационной части элемента списка}
Begin
69
Writeln('Введите список ');
Head := Nil; {Список пуст}
Writeln ('Введите элементы списка. Конец ввода 0');
Read (Digit);
if Digit <> 0
then {Формируем и вставляем первый элемент списка}
Begin
New(x);
x^.Next := Nil;
x^.Data := Digit;
Head := x
Read (Digit);
while Digit<>0 do
Begin
New(x^.Next); {Формируем и вставляем элемент в конец
списка}
x := x^.Next;
x^.Next := Nil;
x^.Data := Digit;
Read(Digit);
End;
Writeln;
End;
Рассмотрите формирование списка несколько другим способом.
Procedure Init(Var u : Ukazatel);
Var
x, y : Ukazatel;
Digit : integer;
Begin
Writeln('Введите список ');
Head := Nil;
Writeln ('Введите элементы списка. Конец ввода 0');
Read (Digit);
while Digit<>0 do
Begin
New(y);
y^.Next := Nil;
y^.Data := Digit;
if u=Nil
then
70
u := y
else
x^.Next := y;
x := y;
Read(Digit);
End;
Writeln;
End;
Просмотр списка
Просмотр элементов списка осуществляется последовательно,
начиная с его начала. Указатель р последовательно ссылается на
первый, второй, и т.д. элементы списка до тех пор, пока весь список
не будет пройден. При этом с каждым элементом списка
выполняется операция вывода на экран. Начальное значение р –
адрес первого элемента списка p^. Если р указывает на конец
списка, то его значение равно Nil, то есть
while p<>Nil do
Begin
Write(p^.Data, ' ');
p := p^.Next;
End;
Задание. Составьте программу, содержащую
создания списка путем вставки элементов в конец
процедуру просмотра списка и вывода на экран его
Процедуры должны содержать параметр, в который
начало списка.
процедуру
списка и
элементов.
передается
СОЗДАНИЕ СПИСКА ПУТЕМ ВСТАВЛЕНИЯ
ЭЛЕМЕНТОВ В НАЧАЛО.
Задание. Путем добавления элемента в начало списка
получить список, изображенный на рисунке:
Рассмотрим как добавить в этот список некоторый элемент,
71
например 2. То есть получить такой список:
Выполним следующие действия:
New(x); {Создание новой динамической переменной}
x^.Data := 2; {Информационное поле созданного элемента}
x^.Next := Head; {Присоединим элементы списка и к созданному
элементу}
u := x; {Изменим значение указателя начала списка}
Итак, нужный элемент вставлен. Теперь
сформировать весь данный список полностью.
Вы
можете
УДАЛЕНИЕ ЭЛЕМЕНТА ИЗ СПИСКА.
В результате решения задач предыдущих занятий, Вы научились
создавать различными способами список, анализировать его
информационную часть, формировать на базе данного списка
другой список и т. д.
72
Поэтому для решения поставленной перед нами задачи удаления
некоторого элемента из списка, нам нужно найти по какому-либо
признаку этот элемент, что, надеюсь не составит для Вас труда.
Уточним поставленную перед нами задачу: удалить из списка
элемент с заданной информационной частью.
Обозначим Head – исходный список, Digit – значение
информационной части удаляемого элемента.
При исследовании списка на наличие в нем заданного элемента
может встретиться три различных случая. Рассмотрим их.
Удаление элемента из начала списка
Изобразим удаление графически:
Напишем фрагмент программы:
x := Head; {Запомним адрес первого элемента списка}
Head := Head^.Next; {Теперь Head указывает на второй элемент
списка}
Dispose(x); {Освободим память, занятую переменной x^}
Удаление элемента из середины списка
Для этого нужно знать адреса удаляемого элемента и элемента,
находящегося в списке перед ним.
Изобразим удаление графически:
73
x := Head; {Переменная х для хранения адреса удаляемого
элемента}
{Найдем адреса нужных элементов списка}
while (x<>Nil) and (x^.Data<>Digit) do
Begin
dx := x;
x := x^.Next
End;
dx^.Next := x^.Next;
Dispose(x);
Удаление элемента из конца списка
Удаление элемента из конца списка производится, когда
указатель dx показывает на предпоследний элемент списка, а х – на
последний.
Изобразим удаление графически:
{Найдем предпоследний элемент}
x := Head;
dx :=Head;
while x^.Next<>Nil do
Begin
74
dx := x;
x := x^.Next;
End;
{Удаляем элемент x^ из списка и освобождаем занимаемую им
память}
dx^.Next := Nil;
Dispose(x);
Теперь опишем процедуру удаления элементов из списка в
общем случае:
Procedure Del(Gigit : integer; Var u : Ukazatel );
Var
x, dx : UKAZATEL ;
Begin
x := Head;
while x<>Nil do
if x^.Data=Digit
then
Begin
if x=y
then
Begin
Head := Head^.Next;
Dispose(x);
x := Head;
End;
else
Begin
dx^.Next := x^.Next;
Dispose(x);
x := dx^.Next;
End;
End;
else
Begin
dx := x;
x := x^.Next;
End;
End;
5.2. ЗАДАЧИ
75
Задача 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. Написать программу, содержащую процедуру, которая
удаляет из списка М N-ый элемент, если такой есть. N задает
пользователь.
Задача 27. Написать программу, содержащую процедуру удаления
из заданного списка все вхождения элемента с заданным значением
информационной части.
Задача 28. Написать программу, содержащую процедуру, которая
76
удаляет из списка М за каждым вхождением элемента Е один
элемент, если такой есть и он отличен от Е.
Задача 29. Написать программу, содержащую процедуру, которая
удаляет из списка М первый отрицательный элемент, если такой
есть.
Задача 30.. Написать программу, содержащую процедуру, которая
удаляет из списка М все отрицательные элементы.
Задача 31. Написать программу, содержащую процедуру, которая
формируетсписок М, включив в него по одному разу элементы,
которые входят хотя бы в один из списков М1 и М2.
Задача 32. Написать программу, содержащую процедуру, которая
формирует список М, включив в него по одному разу элементы,
которые входят одновременно в оба списка М1 и М2.
Задача 33. Написать программу, содержащую процедуру, которая
формирует список М, включив в него по одному разу элементы,
которые входят в список М1, но не входят в список М2.
77
6. ОТЛАДКА И ДЕМОНСТРАЦИЯ ПРОГРАММ
АННОТАЦИЯ
В лабораторной работе рассматривается основные возможности
работы
с отдачиком в среде Turbo-Pascal.
Рассматриваются действия по открытию окна отладки,
расстановки и снятия контрольных точек.
6.1.
СРЕДСТВА ОТЛАДКИ ПРОГРАММ
Современные
системы
программирования
обычно
предоставляют пользователям мощные и удобные средства
разработки программ. В них входят:

компилятор или интерпретатор;

интегрированная среда разработки;

средства создания и редактирования текстов программ;

обширные
функций;

отладочные программы, т.е. программы, помогающие
находить и устранять ошибки в программе;

"дружественная" к пользователю диалоговая среда;

многооконный режим работы;

мощные графические библиотеки; утилиты для работы с
библиотеками

встроенный ассемблер;

встроенная справочная служба;

другие специфические особенности.
библиотеки
стандартных
программ
и
Интегрированная интерактивная среда разработки программ
Borland Pascal (IDE) включает в себя ряд средств, облегчающих
разработку программ, в частности, инструментальные средства для
отладки программ. Мы рассмотрим: типичные ошибки и методы
отладки, управление выполнением программы, проверка значений
и остановки выполнения программы.
78
Что такое отладка? Отладка - это процесс поиска и
исправления ошибок в программе, которые мешают корректной
работе программы.
Какие существуют виды ошибок? Существует три основных
типа ошибок: ошибки этапа компиляции, ошибки этапа выполнения
и логические ошибки.
Ошибки этапа компиляции Ошибки этапа компиляции или
синтаксические ошибки происходят, когда ваш исходный код
нарушает правила синтаксиса. Borland Pascal на может
скомпилировать вашу программу, пока она не будет синтаксически
правильна.
Наиболее общей причиной ошибок этапа компиляции являются
ошибки набора (опечатки), пропущенные точки с запятой, ссылки
на неописанные переменные, передача неверного числа (или типа)
параметров процедуры или функции и присваивание переменной
значений неверного типа.
После исправления ошибки можно выполнить компиляцию
заново. После устранения в программе всех синтаксических ошибок
и ее успешной компиляции программа будет готова к выполнению и
поиску ошибок этапа выполнения.
Ошибки этапа выполнения. Ошибки этапа выполнения или
семантические ошибки происходят, когда вы компилируете полную
программу, которая при ее
выполнении делает что-то
недопустимое. Например, ваша программа может пытаться открыть
для ввода несуществующий файл или выполнить деление на ноль.
Когда программа Borland Pascal обнаруживает такую ошибку, она
завершает выполнение и выводит сообщение об ошибке.
Логические ошибки Логические ошибки - это ошибки
проектирования и реализации программы. Эти ошибки часто
трудно отследить, поскольку IDE не может найти их автоматически,
как синтаксические и семантические ошибки. К счастью, IDE
включает в себя средства отладки, помогающие вам найти
логические ошибки. Логические ошибки приводят к некорректному
или непредвиденному значению переменных, неправильному виду
графических изображений или невыполнению кода, когда это
ожидается.
Методы отладки
79
Иногда, когда программа делает что-то непредвиденная,
причина достаточно очевидна, и вы можете быстро исправить код
программы. Но другие ошибки более трудноуловимы и вызываются
взаимодействие различных частей программы. В этих случаях
лучше всего остановить вашу программу в заданной точке, пройти
ее шаг за шагом и просмотреть состояние переменных и выражений.
Такое управляемое выполнение - ключевой элемент отладки.
Выполнение по шагам и трассировка
Команды выполнения по шагам и трассировки
в меню
выполнения Run дают вам возможность построчного выполнения
программы. Единственное отличие выполнения по шагам и
трассировки состоит в том, как они работают с вызовами процедур и
функций. Выполнение по шагам вызова процедуры или функции
интерпретирует вызов как простой оператор и после завершения
подпрограммы возвращает управление на следующую строку.
Трассировка подпрограммы загружает код этой подпрограммы и
продолжает ее построчное выполнение.
Остановка выполнения
Существует два способа сообщить IDE, что программу нужно
выполнить до определенной точки, а затем остановить. Первый и
простейший способ состоит в том, чтобы найти позицию в
программе, где вы хотите остановиться, затем выбрать в меню Run
команду Go to Cursor (Выполнение до позиции курсора). Ваша
программа выполняется как обычно, пока не достигнет оператора,
где она должна остановиться. В этой точке вы можете проверить
значения и продолжать выполнение непрерывно или по шагам.
Второй способ состоит в том, чтобы остановить в определенной
заданной точке вашу программу. Эта точка называется точкой
останова. Когда вы выполняете программу, она останавливается
перед выполнением оператора в точке останова. Точки останова это более гибкий механизм, чем использование метода выполнения
до позиции курсора (Go to Cursor), поскольку в программе вы
можете установить несколько точек останова.
Отслеживание и модификация
При выполнении программы по шагам вы можете наблюдать ее
вывод несколькими способами. Первый состоит в переключении в
случае необходимости экранов. При втором способе используется
80
второй монитор. В-третьих, для вывода программы вы можете
открыть окно в IDE для DOS.
Кроме того, чтобы показать вывод программы, встроенный
отладчик позволяет вам просматривать значения переменных,
выражений и структур данных. С помощью команды Wathes в меню
Debug в окне просмотра Watches вы можете добавлять или удалять
отслеживаемые элементы. В этом диалоговом окне вы можете
проверять переменные и выражения и изменять значения любых
переменных, включая строки, указатели, элементы массива и поля
записей, что позволяет вам проверять реакцию программы на
различные условия.
Поиск
Если вам нужно найти в программе описания процедуры или
функции, либо определения объекта, это легко можно сделать с
помощью средства просмотра объектов Object Browser. С помощью
меню seach и выбора команд Objects, Globals, Units или Symbols
выберите соответствующее окно просмотра.
Генерация отладочной информации
Перед отладкой программы вам нужно указать компьютеру, что
нужно сообщить компилятору на необходимость генерации
некоторой дополнительной информации, благодаря которой он
сможет отслеживать, какие строки исходного кода соответствуют
отдельным частям выполняемой программы. Эта дополнительная
информация называется отладочной информацией. Вы можете
включить эту информации, выбрав соответствующий параметр
(кнопку с независимой фиксацией) диалогового окна Compiler
Options интегрированной среды (команда Options|Compiler) или
включив в код программы соответствующую директиву
компилятора.
Когда вы компилируете программу Borland Pascal, компилятор
всегда сохраняет список используемых идентификаторов, который
называется
таблицей
идентификаторов.
В
этом
списке
отслеживаются имена всех переменных, констант, типов, процедур
и функций. Для целей отладки там сохраняются также номера строк
исходных файлов, где встречаются все эти идентификаторы. Выбрав
в диалоговом окне Compiler Options параметр Debug Information
(Отладочная информация) или задав директиву компилятора $D+,
81
вы указываете компилятору, что в таблицу идентификаторов нужно
добавить информацию о номерах строк.
Управление выполнением
Основной смысл использования встроенного отладчика состоит
в управляемом выполнении. Отслеживая выполнение каждой
инструкции, вы можете легко определить, какая часть вашей
программы вызывает проблемы. В отладчике предусмотрено пять
основных механизмов управления выполнением программы,
которые позволяют вам:
- выполнять инструкции по шагам;- трассировать инструкции;выполнять программу до заданной точки;- находить определенную
точку;- выполнять сброс программы.
Само по себе выполнение программы по шагам может быть
недостаточно полезным, разве что поможет найти то место, где чтото происходит совершенно неверно. Но управляемое выполнение
дает вам возможность проверять состояние программы и ее данных,
например, отслеживать вывод программы и ее переменные, как
описывается в данной главе.
Что такое шаг?
Когда вы отлаживаете программу, наименьшим выполняемым
элементом является строка. Этот означает, что вы можете управлять
отладкой до уровня отдельной строки исходного кода программы.
Поэтому, если на одной строке программы содержится несколько
операторов Паскаля, вы не сможете отладить эти операторы
индивидуально. С другой стороны, с целью отладки вы можете
разбить оператор на несколько строк, которые будут выполняться за
один шаг.
Все выполнение в отладчике, включая выполнение по шагам,
трассировку и останов, основывается на строках. Подсвечивая
строку, встроенный отладчик всегда сообщает вам, какую строку вы
выполняете следующей (строка выполнения). Строка выполнения
выводится цветом, отличным от нормального цвета. Благодаря
этому вы можете легко видеть, где находитесь.
Выполнение программы по шагам
Выполнение по шагам - это простейший способ выполнения
программы по элементарным фрагментам. Выбор команды
82
Run|Step Over или нажатие клавиши [F8] вызывает выполнение
отладчиком всего кода в операторе, указанном строкой выполнения,
включая любые вызываемые на ней процедуры или функции, пока
управление не вернется обратно к вам. После этого строка
выполнения указывает следующий выполняемый оператор.
Возьмем, например, следующий пример программы:
program StepTest;
function Negate(X: Integer): Integer;begin Negate := -X;end;
varI: Integer;
begin
for I := 1 to 10 do Writeln(Negate(I))
;end.
Пример 6.1 Простая программа, выполняемая по шагам.
Если в окне редактирования вы выведите StepTest и нажмете
клавишу [F8], то строка выполнения перемещается на оператор
begin вначале основного цикла, поскольку это первое, что
выполняется в программе. Второе нажатие клавиши [F8] выполняет
begin и перемещает строку выполнения вниз до оператора for на
следующей строке. После этого нажатие [F8] вызывает выполнение
всего цикла for; на экран пользователя выводятся числа от -1 до -10,
а строка выполнения перемещается к end.
Хотя функция Negate вызывается 10 раз, строка выполнения
никогда на нее не перемещается. Выполнение по шагам позволяет
отладчику не показывать детали любых вызовов для отдельной
строки. Выполнение по шагам вызывает выполнение всего цикла for
сразу, поэтому вы не сможете видеть изменения в ходе выполнения
цикла. Если вы хотите видеть подробности цикла, внесите в пример
следующее простое изменение.
Begin for I := 1 to 10 do Writeln(Negate(I));end.
Пример 6.2 Изменение формата кода для лучшего выполнения
по шагам.
Поскольку оператор Паскаля может занимать несколько строк,
такая программа будет в точности эквивалентна предыдущей
83
версии, а генерируемый код будет идентичен. Но поскольку
оператор Writeln теперь находится на отдельной строке, отладчик
может интерпретировать его отдельно. Если теперь вы будете
нажимать клавишу [F8], то увидите, что строка выполнения будет
при выполнении цикла 10 раз возвращаться на Writeln.
Трассировка программы
Трассировка программы во многом аналогичная ее выполнению
по шагам. Единственное исключение состоит в том, что когда
встречается оператор вызова процедуры или функции, при
трассировке эти процедуры и функции также выполняются по
шагам, а при простом выполнении по шагам управление
возвращается вам после завершения выполнения подпрограммы.
Например, чтобы выполнить трассировку кода в Примере 6.1,
загрузите файл, затем выберите команду Run|Trace Into или нажмите
клавишу [F7]. Когда вы в первый раз делаете это, управление
перемещается на оператор begin основной программы. Повторное
нажатие [F7]снова перемещает строку управления на оператор for.
После этого нажатие клавиши [F7] трассирует вызов функции
Negate - строка выполнения перемещается на оператор begin в блоке
функции. Если вы продолжаете нажимать [F7], строка выполнения
перемещается по функции, а затем, когда вы дойдете до оператора
end, возвращается к оператору вызова.
Формат вашей программы влияет на поведение строки
выполнения при трассировке, хотя и не в такой степени как при
пошаговом выполнении. Если код сформатирован как в Примере
6.1, то трассировка оператора for приводит к выполнению 10 раз
функции Negate. Если вы разобъете оператор for на две строки, как в
Примере 6.2, то трассировка оператора end функции возвращает
строку выполнения ту строку основной программы, которая будет
выполняться следующей.Первые девять раз это снова будет вызов
функции. В десятый раз строка выполнения перемещается на
оператор end программы.
Выполнение больших фрагментов
Иногда, конечно, нежелательно выполнять по шагам всю
программу только для того, чтобы добраться до того места, где
возникает проблема. Отладчик дает вам возможность выполнять
сразу большой фрагмент программы до той точки, где вы хотите
начать выполнение по шагам.
84
Чтобы задать в программе точку, до которой вы хотите ее
выполнить, а затем остановиться, используйте команду Run|Go
ToCursor (Выполнение|Выполнение до курсора) или клавишу F4.
(Этим вы сообщите отладчику, что не хотите выполнять программу
по шагам, пока не достигнете заданной точки.) Позиционируйте
курсор на той строке, где вы хотите возобновить управление
отладкой, затем нажмите клавишу [F4]. Заметим, что вы можете
сделать это как в начале сеанса отладки, так и когда уже выполните
часть программы по шагам или протрассируете.
Поиск нужного места
IDE предусматривает два способа поиска в программе заданного
места. Простейший способ предоставляет команда Find Procedure
меню Search. Команда Find Procedure (Поиск процедуры)
запрашивает у вас имя процедуры или функции, затем находит
соответствующую строку в файле, где определяется эта
подпрограмма. Этот подход
полезно использовать при
редактировании, но его можно комбинировать с возможностью
выполнения программы до определенной точки, чтобы пройти
программу до той части кода, которую вы хотите отладить.
Возврат
Иногда в ходе отладки полезно узнать, как вы попали в данную
часть кода. Окно Call Stack (Стек вызова) показывает вам
последовательность вызовов процедур или функций, которые
привели к текущему состоянию (глубиной до 128 уровней). Для
вывода окна CallStack используйте команду Debug |Call Stack.
Окно Call Stack особенно полезно использовать, если вы
случайно начали трассировку кода, который хотели бы выполнить
за один шаг. В стеке вызовов вы можете найти тот вызов, который
начали трассировать по ошибке, затем выбрать команду Run to
Cursor, чтобы выполнить за один шаг остальную часть вызова.
Повторное выполнение
В ходе сеанса отладки иногда желательно начать все сначала.
Выберите команду Run|Reset Program или нажмите клавиши
Ctrl+F2.Это приведет к полному сбросу, так что выполнение по
шагам, или трассировка начнется в начале основной программы.
Отслеживание вывода программы
85
При выполнении программы по шагам часто полезно
просмотреть вывод программы, называемый экраном пользователя.
В прикладной программе Windows это достаточно просто, так как
программа уже выполняется в отдельном окне. Однако в DOS это не
так легко. К счастью, Borland Pascal предоставляет вам несколько
способов просмотра экрана пользователя.
Переключение экранов
В любой момент сеанса отладки вы можете выполнять
переключение экрана IDE и экрана пользователя. Чтобы вывести
экран пользователя, нажмите клавиши Alt+F5. Чтобы вернуться в
IDE, нажмите любую клавишу или щелкните "мышью".
При выполнении программы отладчик также может
переключать экраны автоматически. Управлять характером
переключения экранов вы можете с помощью параметров Display
Swapping (Переключение экрана) диалогового окна Debugger. По
умолчанию задано эффективное переключение. Это означает, что
экран пользователя выводится только в том случае, если
выполняемый оператор выводит информацию на экран или
вызывает процедуру (даже если эта процедура ничего на экран не
выводит). После завершения вывода экран переключается обратно в
IDE.
Вы можете также сообщить отладчику, что переключать экран
нужно на каждой строке, независимо от вывода, или не переключать
их вовсе. Переключение экранов для каждой строки полезно
использовать, если ваша программа посылает информацию
непосредственно на экран, что может затереть содержимое экрана
ID.
Окно Output
IDE для DOS предусматривает для экрана пользователя окно,
которое называется окном вывода. Выбрав команду меню
Debug|Output, вы можете открыть (вывести на переднем плане)
активное окно, содержащее вывод программы. Настроить размер
этого окна можно аналогично окну редактирования.
Что такое выражение?
Оба средства вычисление и просмотра работают на уровне
выражений, поэтому важно определить, что считается выражением.
Выражение состоит из констант, переменных и структур данных,
86
скомбинированных с помощью операций и большинства
встроенных функций. Почти все, что вы можете использовать в
правой части оператора присваивания, может также использоваться
в качестве отладочного выражения.
Просмотр выражений
Если вы хотите отслеживать значение переменной или
выражения при выполнении программы по шагам, то можете
открыть окно просмотра Watches. Это окно IDE показывает
переменные и их значения в каждый конкретный момент.
Чтобы открыть окно Watches,
выберите команду
Window|Watch.IDE открывает активное окно Watches без активных
записей. Если вы выберите переменную для просмотра, IDE
автоматически открывает окно Watches (если вы этого еще не
сделали).
Добавление просматриваемого выражения
Чтобы добавить в окно Watches переменную, выберите команду
Debug|Watch|Add Watch или нажмите клавиши [Ctrl]+[F7]. Если
окно Watches является активным окном, вы можете добавить
выражение просмотра, нажав клавишу [Ins]. Отладчик открывает
диалоговое окно, запрашивающее у вас тип просматриваемого
выражения. По умолчанию выражением считается слово в позиции
курсора в текущем окне редактирования. Просматриваемые
выражения, которые вы отслеживали ранее, сохраняются в списке
протокола.
Отслеживание текущего просматриваемого выражения
Последнее
добавленное
или
модифицированное
просматриваемое выражение является текущим просматриваемым
выражением, которое указывается выводимым слева от него
символом жирной левой точки. Если окно Watches активно, вы
можете также удалить текущее выражение, нажав клавишу Del или
Ctrl+Y. Чтобы удалить все просматриваемые выражения, выберите
команду Debug|Watch|Remove AllWatches.
Использование точек останова
Borland Pascal дает вам возможность устанавливать в своей
программе для целей отладки точки останова. Точка останова – это
обозначенная в коде программы позиция, в которой вы хотите
87
прекратить выполнение программы и вернуть выполнение
отладчику. В этом смысле точка останова работает аналогично
команде Go toCursor,
при которой программа выполняется
обычным путем до достижения определенной точки. Основное
различие состоит в том, что вы можете задать несколько точке
останова и точки останова, которые будут срабатывать не при
каждом их достижении.
Задание точек останова
Чтобы установить в своем в своем коде точку останова,
переместите курсор на ту строку, где вы хотите остановиться.
Строка должна содержать выполняемый код и не может быть
комментарием, описанием или пустой строкой. Выбор команды
Toggle Breakpoint в локальном меню окна редактирования или
нажатие клавиш [Ctrl]+[F8] устанавливает на строке точку останова,
которая обозначается подсветкой всей строки.
Теперь при выполнении программы из IDE она будет
останавливаться при достижении данной строки, но перед ее
выполнением. Строка, содержащая точку останова, выводится при
этом в окне редактирования как строка выполнения. В этот момент
вы можете выполнить любые другие действия по отладке
(выполнение программы по шагам, трассировку, просмотр и
вычисление).
Отмена точке останова
Чтобы отменить точку останова,
поместите курсор на
содержащую ее строку и выберите в локальном меню окна
редактирования команду Toggle Breakpoint или нажмите клавиши
[Ctrl]+[F8].
Модификация точек останова
В процессе сеанса отладки IDE отслеживает все точки останова.
Вместо того, чтобы шарить по исходному коду в поиске точек
останова, она обслуживать точки останова в одном диалоговом окне
Breakpoints. Для вывода диалогового окна Breakpoints выберите
команду View|Breakpoints. В этом диалоговом окне вы можете
устанавливать, удалять, редактировать и просматривать свои точки
останова.
Проверка условий
88
В качестве условия для точки останова можно также задать
выражение типа Boolean.
Например, вы можете проверить,
попадает ли переменная в заданный диапазон, или установлен ли
некоторый флаг. В таких условиях для точек останова вы можете
задавать практически любые булевские выражения.
Прерывание программы без точек останова
Даже если вы не установите точек останова, то все равно
сможете выйти в отладчик при выполнении программы из IDE. В
любой момент работа программы нажмите клавиши [Ctrl]+[Break].
Отладчик находит позицию в исходном коде, где вы прервали
программу. Как и в случае обычной точки останова вы можете
затем выполнить программу по шагам, трассировать ее, отследить
или вычислить выражения.
6.4. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
 Как осуществляется доступ к средствам отладки программ в
системе Turbo-Pascal?
 Какие имеются возможности наблюдения за промежуточными
значениями переменных?
 Как осуществляется управление исполнением программ при
отладке.
(шаги, контрольные точки)?
6.5. ЗАДАЧИ
Задача 1. Выделить в отдельный файл записи, удовлетворяющих
условию.
Задача 2. По заданному файлу записей сформировать файл с
другим числом
полей.
Задача 3. Пополнить записи файла новым полем, значение которого
принимается с клавиатуры.
Задача 4. * Имеется два синхронных файла, входные (ключевые)
поля которых
совпадают. Проверить, одинаковая ли в них информация.
Задача 5. * Пометить различия в двух файлах одинаковой
структуры.
Задача 6. * Слить информацию из двух разных файлов в один
общий,
89
проверяя совпадение общей информации (относящейся к одному
ключу).
Задача 7. * Имеются два файла разных записей с общим
множеством значений
входного поля. Сформировать суммарный файл, хранящий всю
информацию
из исходных файлов.
Задача 8. ) Организовать вывод разных геометрических фигур по
запросу с
клавиатуры.
Задача 9. Организовать вывод серии произвольных фигур.
Задача 10. * Подготовить набор процедур для информационного
обслуживания
библиотеки картинок для школьных обучающих игр (наглядных
пособий,
развивающих упражнений и др.).
Задача 11. * Запрограммировать модель библиотечной
информационно-поисковой системы.
90
7. ОРГАНИЗАЦИЯ ТЕКСТОВОЙ ОБРАБОТКИ ПРОГРАММ
(РАБОТА В WORD)
АННОТАЦИЯ
В лабораторной работе рассматривается основные работы
в среде MS WORD для подготовки отчета о работе программы.
Рассматриваются действия по вставке файла, картинок и
гиперссылок.
Организация текстовой обработки
7.1. ТЕКСТОВЫЕ РЕДАКТОРЫ
Текстовый редактор, - чаще всего, - это программа, которая
превращает компьютер в пишущую машинку, только более
удобную.
Но, помимо этого, текстовый редактор может:

автоматически делать переносы со строки на строку по
правилам русского языка;

автоматически выравнивать текст по правому краю;

переделать любой фрагмент текста по заданной Вами ширине;

разбивать текст на страницы с автоматической нумерацией
страниц и формировать оглавление;

просматривать одновременно несколько текстов и копировать
фрагменты из одного в другой;

автоматически заменять по всему тексту одно слово на другое
(например, sibir на siberian);

менять шрифты;

проверять текст на предмет наличия грамматических ошибок;

и много других преобразований.
Текстовых редакторов, написанных для компьютеров - тысячи.
Да, именно тысячи, без всякого преувеличения. Они различаются по
степени удобства работы, по своим возможностям.
На одном конце спектра простенькие текстовые редакторы с
91
минимальным набором возможностей:
возможностью создать
текстовый файл, запомнить его на диске, вызвать с диска и провести
минимальную коррекцию (вставка/удаление символов и строк).
На другом конце спектра мощные издательские системы,
которые позволяют готовить и хранить в компьютере целые газеты
или книги с иллюстрациями, графиками и диаграммами и т.д.
Для простых целей использования
текстовый редактор:
нам необходимо, чтобы

был русским или русифицированным.

был управляем с помощью системы меню или мышью (это
немного дольше, чем нажатием комбинаций клавиш, но зато
не нужно все эти комбинации помнить);

был бы достаточно распространенным (а значит, Вы без труда
найдете документацию по нему и получите консультации
специалистов);

позволял бы кроме "джентльменского набора", как минимум,
работу хотя бы с двумя текстами одновременно,
выравнивание текста по правой границе, с переносом,
переформатирование по любой ширине, разбиение на
страницы, смену шрифтов, выделение, удаление и
копирование фрагмента текста.
На современных компьютерах лучше использовать Word for
Windows 7.0. Простые вещи в нем делаются просто, плюс к тому
существуют неограниченные возможности роста. В этом редакторе
можно делать все - от простейших документов до газетных полос.
Сейчас мы рассмотрим только главные, основные возможности
Word . Освоить новый редактор текстов - это дело нескольких часов.
Трудности могут возникнуть только что с освоением первого
редактора текстов. Поэтому обращайте внимание не столько на
конкретные клавиши, сколько на открывающиеся перед Вами
возможности, на то, как можно повысить качество и
производительность труда при подготовке текстов. Конечно, все это
Вы будете осваивать не сразу. Для начала Вы научитесь только:

запускать текстовый редактор Word;

вводить текст (а заодно и познакомитесь с основными
клавишами);
92

минимально корректировать текст (заменять и удалять буквы);

запоминать текст на диске;

вызывать текст с диска;

распечатывать текст на бумагу.
Все эти действия весьма просты (и Вы в этом убедитесь), но
нужно проделать их несколько раз, чтобы набить руку.
7.2. КАК ЗАПУСТИТЬ WORD
Нужно просто подвести мышку к иконке Word в группе
Microsoft Office и дважды нажать левую клавишу мышки.
Что видно на экране?
Вверху видна панель управления.
А над ними еще и меню:
Действительно, кнопок много, но далеко не все сразу нам
понадобятся.
Итак, вместо листа бумаги перед Вами пустой экран. В левом
верхнем углу мигающая вертикальная палочка. Это курсор: он
указывает, где появится символ, когда Вы нажмете клавишу.
Установите русский шрифт: нажмите правую клавишу [Ctrl] (либо
[Ctrl-Shift], либо попробуйте другие сочетания клавиш.

Левый и правый [Shift] одновременно;

[Alt] и [Shift] одновременно (можно попробовать это на левой и
правой клавиатуре);

[Ctrl] и [Shift] одновременно (можно попробовать это на левой и
правой клавиатуре);
На разных компьютерах клавиши русификации настраивают поразному. Конечно, самая удобная клавиша - правый [Ctrl], её-то
обычно и используют.
93
Буквы большие и маленькие
Наберите слово "проба". Конечно, оно набралось маленькими
буквами. А как набрать большие? Имеется клавиша переключения
регистров. На ней написано Shift (шифт) или ничего не написано, а
просто нарисована толстая стрелка вверх. Таких клавиш обычно две,
и они находятся в нижней части клавиатуры, слева и справа.
Нажмите [Shift] и, не отпуская ее, клавишу [А]. Так: на экране
большая буква. Отпустите [Shift] и снова нажмите [А].
Сотрите все, что Вы написали и поупражняйтесь.
Как исправить текст
А теперь посмотрите на ту часть клавиатуры, которая справа от
Вас. Вы видите там клавиши с нарисованными стрелками.
Чтобы исправить текст, нужно просто подвести курсор
нужное место,
на
убрать ненужные символы и вставить нужные.
Клавиша [BackSрace] стирает символ, который стоит слева от
курсора. Есть еще одна клавиша, которая удаляет символ справа от
курсора: это клавиша [Delete].
Как напечатать текст
Очень просто. Щёлкните по кнопке
. Да, кстати: а не забыли
ли Вы включить принтер, вставить в него бумагу и привести его в
состояние "готово"? Если забыли, сделайте все это. Текст должен
печататься.
Как сохранить текст на диске
Щёлкните по кнопке . Напомню: тексты, как и любая другая
информация, хранятся в файлах. Значит, сейчас Вы создадите новый
файл!
Да, но под каким именем текст сохранится? Имя дал ему Word:
doc1. А если Вы хотите дать свое имя? Тогда подведите маркер
мышки к слову Файл в меню и щелкните левой клавишей. В
появившемся меню выберите
Сохранить как... и снова щелкните. Теперь просто наберите
94
имя, например рroba и нажмите [Enter].
Разница между Word 6.0 и Word 7.0 при сохранении файла
такая: имя файла в Word 6 должно быть обязательно английским и
не может быть длиннее 8 символов. А в Word 7.0 Вы можете
называть файлы длинными и к тому же русскими именами.
Конечно, длинные русские имена - это гораздо удобнее, поэтом,
лучше использовать Word 7.0
Нужно периодически сохранять текст на диске. Кстати, есть
очень короткий способ запоминания. Не нужно лазить по меню, не
нужно щёлкать по кнопке . Достаточно нажать клавишу [Shift] и,
не отпуская её - клавишу [F12].
Как вызвать текст с диска
Допустим, у Вас есть два файла: рroba.doc и рroba1.doc.
Для того чтобы вызвать необходимый файл нужно щёлкнуть
по кнопке
, в появившемся списке выбрать нужный файл и
щелкнуть сначала по нему, а потом по кнопке ОК.
Есть и другой способ. Нужно щелкнуть по слову Файл в меню,
и в появившемся меню щелкнуть по слову Открыть. Word спросит,
какой файл необходимо загрузить. Если необходимый
файл
находится в окне, щелкните по его имени, а потом по кнопке "ОК".
Как работать с блоками текста
Фрагмент, или блок - это некая выделенная часть текста. Блок
можно удалить, скопировать, перенести в другое место. Можно
копировать блоки из одного файла в другой.
Как взять блок в карман
Выделите какой-нибудь фрагмент текста и нажмите правую
кнопку мышки. Появится меню:
Это - инспектор объектов. Он помогает изменить свойства
95
объекта или проделать с ним нужные действия.
Как вставить блок текста из кармана
Щелкните опять правой кнопкой. В появившемся меню
щелкните по кнопке Вставить. Блок можно вставить из кармана
сколько угодно раз и в любом месте текста.
Как удалить блок
Нужно просто щелкнуть по кнопке Вырезать в инспекторе
объектов.
Как переместить блок
Переместить - это значит, что блок исчезает в одном месте и
появляется в другом. Необходимо выделить блок, вырезать его,
затем передвинуть курсор на нужное место и вставить его там.
7.3. ОФОРМЛЕНИЕ ТЕКСТА
Как изменить размер и начертание шрифта
Рассмотрим следующую часть панели:
Цифра 11 означает размер текущего шрифт. Чтобы изменить
его, щелкните по стрелке рядом.
Word использует все шрифты, имеющиеся в Windows. Их
достаточно много.
Как изменить размер, шрифт и начертание в готовом
тексте
Достаточно выделить изменяемый текст как блок и установить
нужный шрифт или размер.
Как выровнять абзац
Удобно отслеживать абзацы, если щелкнуть по
. Тогда
невидимые до той поры знаки конца абзаца покажутся на экране.
Чтобы выровнять абзац, достаточно установить в нём курсор, а
потом - щелкнуть по одной из клавиш:
96
Что они сделают - ясно по их виду. Самая левая прижмёт текст
абзаца к левому краю, следующая - выровняет по центру,
следующая - прижмёт к правому краю, а последняя - выровняет по
двум краям.
Как изменить отступ
Отступ - это пробелы в начале красной строки. Когда вы
нажимаете клавишу [Enter], Word считает, что начинается абзац. Он
переходит на следующую строку и пропускает нужное расстояние
от края - отступ.
Обычно отступ равен 0,5 см. Но если необходим другой отступ,
это можно сделать это, щёлкнув правой кнопкой мыши и выбрав
Абзац (или выполнив Формат|Абзац).
Как установить режим переноса слов
Чтобы установить
Сервис|Переносы.
режим
переноса
слов,
выполните
Если "Автоматический перенос слов в документе" не помечен
крестиком, то Word не будет переносить слова по слогам. Не
забудьте указать ограничение числа переносов иначе Word Вас не
поймёт.
Как сделать заливку и обрамление текста
Текст можно взять в красивую рамочку и сделать фон не белым.
Делается это чрезвычайно просто. Выделите любой блок текста
(лучше - целый абзац или несколько абзацев), а потом выполните
Формат|Обрамление и заливка.
Если Вы щёлкнете по окошку "Рамка" (а потом, конечно, по
ОК), текст оформится вот так. Конечно, можно еще выбрать
толщину обрамляющей линии в окошке "Тип".
Во многих текстовых редакторах существуют так называемые
стили. Они позволяют очень быстро, а главное, стандартно, менять
оформление фрагментов текста.
Как указать стиль
В Word имеется некоторое количество готовых стилей.
97
Щелкните указателем мышки по любому абзацу в Вашем тексте, а
потом найдите на панели окно стилей. Скорее всего, оно будет в
левом верхнем углу экрана, и, скорее всего, в нем будет указан стиль
"Нормальный".
Как создать свой стиль
Выполните Формат | Стиль.
Это список всех стилей, доступных в этом документе. Добавьте
новый: щелкните по кнопке "Создать". Теперь просто нужно
заменить имя стиля в окошке с названием "Имя" на какое-нибудь
свое. После этого можно настраивать стиль. Щёлкните по кнопке
"Формат". Дальнейшее понятно: если Вы хотите задать для стиля
шрифт, то заходите в пункт меню "Шрифт", если абзац (расстояние
от полей, выравнивание и так далее), то в "Абзац", и т.д.
Как работать с таблицами
Первое, что нужно сделать - создать таблицу. Посчитаем. В ней
пять строк и пять столбцов. (Имеются в виду не строки текста, а
строки таблицы!)
Как создать таблицу
Для этого существует кнопка
или позиция меню Таблица |
Вставить таблицу (кому что больше нравится). Вы выполняете
вставку. Далее нужно поставить указатель мыши в верхний левый
угол картинки и переместить его вниз и вправо, чтобы получилось
нужное число строк и нужное число столбцов столбцов.
Как провести разделительные линии
98
Заполните остальные ячейки. Теперь начнем рисование. Сначала
проведём все линии, а потом избавимся от лишних. Для этого нужно
сначала выделить всю таблицу (Таблица| Выделить таблицу), а
потом воспользоваться уже знакомыми кнопками
Как сделать заливку ячеек
Чтобы сделать заливку ячеек, нужно их сначала выделить.
Потом можно заливать ячейки нужным цветом.
Как вставить в текст готовый рисунок
Сначала мы попытаемся поместить в наш текст один из
рисунков, которые входят в комплект поставки Word.. Но точно
таким же образом Вы можете вставить любой другой рисунок.
Каждый рисунок находится в файле. Чтобы вставить рисунок в
текст необходимо нажать
Вставка|Рисунок . В Word 7.0 Вы увидите окно:
Слева идут названия файлов, а справа - сами рисунки. Нужно
иметь в виду вот что: этот рисунок Word понимает как отдельный
символ, только очень большой. Он работает с этим рисунком так же,
как с буквой.
Как работать с кадрами
Сначала поместим наш рисунок в кадр. Для этого нужно
щёлкнуть по нему, чтобы высветились "размеры", а потом
выполнить Вставка|Кадр.
99
Вокруг рисунка появился "ободок". Это - граница кадра. Теперь
Вы можете захватить кадр за эту границу и переместить куда
угодно!
Как работать с диаграммами
Для создания диаграмм существуют мощные средства в совсем
другой программе, в Microsoft Excel. Обычно в этой программе
проводятся сложные расчеты и создаются диаграммы, а потом они
включаются в текст, созданный в Word. Непосредственно в Word
выполняется это следующим образом.
Выполните Вставка|Объект.
Следует отметить несколько полезных сведений.

Если необходимо изменить содержание или вид диаграммы,
то щелкните по ней правой клавишей и выберите "Изменить
Chart".

Если необходимо, чтобы диаграмма могла размещаться где
угодно, щелкните по ней и выполните Вставка|Кадр.

Если необходимо поместить диаграмму несколько раз, меняя
её содержание и вид, то можете щёлкнуть по ней правой
кнопкой и выполнить "Копировать".
Как работать с документами
Конечно, неплохо было бы делать одни документы на основе
других, например, написать образец текста договора и сохранить его
в файле example.doc. Далее, если необходимо сделать какой-нибудь
договор, просто открыть example, исправить его и сохранить под
другим именем.
Word позволяет упростить процедуру. Он различает файлы двух
типов: документ и шаблон (образец) документа. Вы можете создать
образец договора, записать его особым образом - а потом
использовать тоже особым образом.
Как работать с несколькими документами
Окно - это та часть экрана, в которой Вы видите текст. Свой
текст Вы как бы двигаете через это окно: вверх, вниз, влево, вправо.
Следует научиться:
100

открывать несколько окон

переходить из окна в окно;

изменять размеры и положение окон;

загружать в каждое окно свой файл;

переписывать блок текста из одного окна в другое.
Как быстро двигаться по тексту
[Home] - в начало строки
[End] - в конец строки
[РgUр] - на экран вверх
[РgDn] - на экран вниз
Как найти или заменить слово
Для этого необходимо:
1. Выполнить Правка|Заменить, и в диалоговом окне щелкнуть
по окошку "Что" и набрать слово, которое нужно заменить;
1. Щелкнуть по окошку "Чем" и набрать слово, которым нужно
заменить;
1. Щелкнуть по кнопке "Заменить все"
Как маркировать абзацы
Зачем это нужно
Это нужно для того, чтобы:

очень просто выделять перечни;

нумеровать пункты и подпункты текста;

делать автоматическую нумерацию глав;

и многое другое.
7.3.
ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
 Как сохраняется документ под новым именем?
 Просмотр внешнего вида текста.
101
 Настройка принтера для черновой печати.
 Работа в режиме Обычный.
 Работа в режиме Структура.
 Перемещение по документу.
 Вставка символа в документ.
 Отмена и повторение выполненных действий.
 Задание параметров шрифтов
 Заполнение формы.
 Исследуйте имеющиеся у Вас шрифты, чтобы узнать,
которые из них русифицированы.
 Как найти или заменить слово
102
8. ОСНОВНЫЕ ВОЗМОЖНОСТИ КОМПЬЮТЕРНОЙ
АЛГЕБРЫ
АННОТАЦИЯ
В лабораторной работе рассматриваются основные возможности
систем
компьютерной алгебры, рассматриваются языковые возможности
и архитектура системы MAPLE. Анализируются простейшие
применения
системы для выполнения преобразований алгебраических
выражений,
постановок, рисования графиков, дифференцирования и решения
уравнений.
8.1
ОСНОВНЫЕ
В О З М ОЖ Н О С ТИ
КО М П Ь ЮТЕ Р Н О Й АЛ Г Е Б Р Ы .
И
П Р О БЛ Е М Ы
РАЗ РАБО ТК И
С И С ТЕ М
Начнем знакомиться с языками и основными возможностями
систем компьютерной алгебры. Что это за термин «компьютерная
алгебра»? На сегодняшний день это уже твердо устоявшийся
термин. Область деятельности, охватываемую этим понятием,
называли «аналитическими выкладками на ЭВМ», «аналитическими
преобразованиями на
ЭВМ», и, наконец, « компьютерной
алгеброй». Широко распространено определение этого термина
как «область информатики, которая занимается разработкой,
анализом, реализацией и применением алгебраических алгоритмов».
Наряду с этим термином также мы будем использовать термин
«аналитические вычисления на ЭВМ».
Алгебраическое вычисление выражения можно рассматривать
как последовательное преобразование выражения согласно
некоторому
множеству правил до тех пор, пока к выражению нельзя будет
применить ни одного правила. Аналитическое вычисление не
сталкивается
с
такими
проблемами
численного
программирования как ошибки округления, проблемы
сходимости и проблемы устойчивости. Основными проблемами
самого
процесса
вычисления
является
чаще
всего
экспоненциальное время работы алгоритмов, промежуточное
103
разрастание выражения во время вычислений и проблема объема
выходного выражения. В системах компьютерной алгебры
алгебраические вычисления выполняются точно.
Главная забота пользователей системы компьютерной алгебры это промежуточное разбухание выражений. Часто бывает, что
промежуточными результатами
алгебраических вычислений
являются чрезвычайно большие выражения,
в то время как
окончательный результат может быть очень мал. Поскольку
большинство систем компьютерной алгебры хранят эти выражения
в основной памяти, имеется вероятность выйти из границ
отведенной памяти и тем самым прекратить вычисления.
Экспоненциальная природа алгебраических алгоритмов тоже
представляет трудность для разработчиков систем, но с другой
стороны является стимулом для ревизии существующих и
разработки новых алгебраических алгоритмов.
Какими же
возможностями
обладает алгебраическая система?
Чем она
отличается от обычных систем численного программирования,
таких например, как ПАСКАЛЬ, СИ? Можно сказать, что система
компьютерной
алгебры
является
развитой
системой
программирования, но в качестве базовых типов данных
практически всегда рассматриваются формулы и формула является
объектом преобразования. Формулы можно дифференцировать и
интегрировать, в формулы можно подставлять вместо переменных
новые формулы и выполнять много различных преобразований.
Существует достаточное количество систем компьютерной
алгебры, которые с легкостью выполняют
трудоемкие
алгебраические
преобразования.
При
обучении
дифференцированию или интегрированию у
учащихся часто
возникает желание поручить выполнение этой работы компьютеру,
а не выполнять эти действий «вручную». При привлечении СКА
для вычислений нужно помнить, что использовать вычислительную
систему не всегда просто. Для одних и тех же заданий система
может предлагать несколько вариантов исполнения, и тот, что
применяет систему, должен уметь выбрать наиболее эффективный
вариант. Далее, любая система компьютерной алгебры не свободна
от локальных ошибок, и пользователь должен помнить о способах
контроля проведенных вычислений. То есть нужно, в определенном
смысле владеть системой контроля за работой компьютера.
104
РАС С М О ТР И М Н Е КО ТО Р Ы Е В О З М ОЖ Н О С ТИ С К А И О С Н О В Н ЫЕ ТРУД Н О С ТИ ,
С ВЯ З АН Н Ы Е С Р Е АЛ И З АЦ И Е Й Э ТИ Х В О З М ОЖ Н О С ТЕ Й Н А П Р И М Е Р Е С И С ТЕ М Ы
MA P L E .
MAPLE - СИСТЕМА СИМВОЛЬНЫХ ВЫЧИСЛЕНИЙ
ЗАНИМАЕТ В НАСТОЯЩЕЕ ВРЕМЯ В ЭТОЙ ОТРАСЛИ
НАРЯДУ С СИСТЕМОЙ MATHEMATICA ФИРМЫ WOLFRAM
RESEARCH ВЕДУЩИЕ ПОЗИЦИИ. ОНА БЫЛА СОЗДАНА
КАНАДСКОЙ ГРУППОЙ СИМВОЛЬНЫХ ВЫЧИСЛЕНИЙ. В
НЕЙ ИМЕЕТСЯ КОМПАКТНОЕ ЯДРО, НАПИСАННОЕ НА
ЯЗЫКЕ СИ, КОТОРОЕ РЕАЛИЗУЕТ ИНТЕРПРЕТИРУЕМЫЙ
ЯЗЫК, УДОБНЫЙ ДЛЯ НАПИСАНИЯ АЛГОРИТМОВ
КОМПЬЮТЕРНОЙ АЛГЕБРЫ. ОСНОВНАЯ ЧАСТЬ
СИСТЕМЫ ПРЕДСТАВЛЯЕТ ЗНАНИЯ, КОТОРЫЕ
СОДЕРЖАТСЯ В БИБЛИОТЕКЕ, НАПИСАННОЙ НА ЭТОМ
ЯЗЫКЕ. СИСТЕМА ОБЛАДАЕТ ГРОМАДНЫМ (СВЫШЕ
2500) НАБОРОМ САМЫХ РАЗЛИЧНЫХ ФУНКЦИЙ ДЛЯ
ВЫПОЛНЕНИЯ АНАЛИТИЧЕСКИХ И ЧИСЛЕННЫХ
ВЫЧИСЛЕНИЙ, РЕШЕНИЯ АЛГЕБРАИЧЕСКИХ И ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ, ГРАФИЧЕСКОГО
ВЫВОДА РЕЗУЛЬТАТОВ И МНОГИХ ДРУГИХ ДЕЙСТВИЙ.
MAPLE РАБОТАЕТ НА ШИРОКОМ КРУГЕ ПЛАТФОРМ.
В примерах - знак > - предложения пользователя, а
предложения с отступом - ответ системы.
С И С ТЕ М А К А М ОЖ Е Т:
1.
Определять численное значение выражения.
> 785+25;
810
>
7/8+9/10;
105
71
-40
> 100!;
9332621544394415268169923885626670049071596826438162146859
29638952\
1759999322991560894146397615651828625369792082722375825118
5210\
916864000000000000000000000000
Мы рассмотрели несколько примеров, связанных с вычислением
численных значений. Рассмотрим проблемы, связанные с
получением численного значения формулы. Как мы уже отмечали,
вычисления в СКА выполняются точно. Но аппаратной поддержки
точные вычисления в СКА не имеют: следовательно, они должны
иметь в своем составе подсистемы точных вычислений. Стоит
заметить, что манипулирование формулами часто выполняется для
того, чтобы получить их численные значения. Для этого
необходимо вместо переменных подставить в формулу численное
значение и вычислить формулу, состоящую из чисел. Каким
способом это возможно выполнить? Можно выделить следующие
способы:
 интерпретация

 создание собственных вычисляющих программ



 разработка гибридных систем.
генерация операторов для системы численного
программирования
Каждый из этих способов имеет свои области применения.
Способ интерпретации заключается в процессе подстановки в
вычисляемое выражение вместо переменных их численных
106
значений и последовательной интерпретации операций, входящих в
это выражение. Его удобно использовать, когда интерпретирующее
выражение невелико.
Способ построения программ для численного вычисления
внутри СКА имеет смысл применять, если СКА реализуется на
достаточно богатом языке численного или системного
программирования и в рамках этого подхода естественно
реализовывать процедуру вычисления численного значения
выражения.
Способ генерации оператора присваивания некоторого языка
программирования наиболее предпочтителен в развитых СКА. Но
реализация этого способа имеет собственные проблемы, связанные с
оптимизацией генерируемого оператора присваивания.
Гибридный
подход позволяет для организации решения
определенной проблемы использовать в качестве равноправных
партнеров как численные системы так и СКА. Это весьма
трудоемкий подход и как его характерный пример
можно
рассматривать систему ANS, в которой объединяются возможности
системы
численного
программирования
Си
и
системы
компьютерной алгебры Reduce.
Все эти подходы характеризуются как способом получения
численных значений так и используемой арифметикой. Поскольку
СКА пред назначены для выполнения вычислений над формулами,
исторически большая часть из этих систем работала с точной
арифметикой или так называемой арифметикой произвольной
точности. Те СКА, в чьи функции не входило выполнение
вычислений
наибольших общих делителей (НОД) над
выражениями, сохраняли исходную арифметику входных
выражений, чаще всего арифметику языков реализации. Но как
только возникла необходимость использования результатов
аналитических преобразований для численных расчетов, а затем
передавать их далее, то встала проблема преобразования
вычислений из одной арифметики в другую. Диапазон используемой
в СКА арифметики включает машинную арифметику, арифметику
произвольной точности, плавающую арифметику с произвольной
точностью, интервальную арифметику и ряд других.
Далее, система КА может
107
2. Упрощать алгебраическое выражение.
Например,
> (5*x+8*x-12*(x+1)/(x+1)*x);
x
> (x+1)^50/(x+1);
49
(x + 1)
Проблема упрощения алгебраических выражений является одной из
важных проблем разработки систем компьютерной алгебры.
Важность этой проблемы осознавалась всеми разработчиками СКА
поскольку проблема упрощения для общего вида выражений
алгоритмически неразрешима. В свое время одним из известных
разработчиков СКА - Мосисом была предложена классификация
систем в зависимости от подхода к решению проблемы упрощения.
Критерием классификации являлась мера изменения исходного
выражения для преобразования. Согласно этой классификации
системы рассматривались как радикальные, новые левые,
либеральные, консервативные и католические.
Радикальные системы - радикально изменяют вид исходного
выражения. Они работают с одним, явно выделенным классом
выражений ( полиномы, рациональные функции, урезанные
степенные ряды, урезанные ряды Пуассона). Такие системы
радикально изменяют вид преобразуемого выражения для
108
получения внутреннего (канонического) представления
выражения. Для ограниченного класса выражений такая
каноническая форма существует, алгоритмы преобразования
являются хорошо определенными и эффективными.
Новые левые системы были вызваны к жизни трудностями,
связанные с необходимостью обязательного раскрытия скобок для
канонического представления выражений типа (x+y)^1000.
Радикальные системы для внутреннего представления полиномов
использовали либо раскрытую форму представления полиномов, где
полином представлялся суммой мономов, либо рекурсивную
форму, где полином от n- переменных представлялся как полином
от одной переменной с коэффициентам - полиномами от n-1
переменной. И в том и в другом случае представления полиномов
выполнение такого, например, вычисления , как
(x+1)^1000/(x+1)^999 требовало раскрытия числителя, раскрытия
знаменателя, выполнение операции получения наибольшего общего
делителя и сокращения числителя и знаменателя на наибольший
общий делитель. Из этого примера видно, что пользователь
системы должен иметь возможность управлять раскрытием скобок.
В новых левых системах такие упрощения выполняются под
управлением пользователя.
Либеральные системы при выполнении процедуры упрощения
стремятся, чтобы ее выполнение по духу было близко к тому, что
мы называем выполнение «вручную». Они автоматически
выполняют преобразования, для определения которых используется
термин «естественные» - преобразования связанные с упрощением
нулевых слагаемых и единичных сомножителей, нулевых и
единичных аргументов функций, остальные преобразования
оставляют на усмотрение пользователя, предоставляя для этого
развитые средства проведения подстановок. Либеральные системы
проигрывают радикальным и новым левым системам в
эффективности, но естественный и наглядный путь проведения
преобразований является их преимуществом.
Консервативные системы практически не выполняют сами
никаких упрощений и перекладывают эту деятельность на плечи
пользователя. Разработчики таких систем полагают, что структура
упрощения должна определяться спецификой решаемой задачи, и
все упрощения должны проводить пользователи при помощи
средств подстановки, которые обеспечивает система.
Католические системы видят заслугу каждого из подходов для
определенных контекстов. Католическая система предоставляет
109
пользователю набор нескольких подсистем упрощения,
использующих различные механизмы упрощения для разных
классов задач, и позволяющих пользователю переключаться по
своему желанию на ту или иную подсистему.
При другой классификации католические системы выступают в
роли универсальных систем.
3. Раскрывать скобки
expand((x-1)^5*(x+1));
6 5 4 2
x -4x +5x -5x +4x–1
>
expand((x-a)^2*(x+2*a)^4);
>
>
6 5
4 2 3 3
2 4
6
x + 6 x a + 9 x a - 8 x a - 24 x a + 16 a
4. Разлагать выражения на множители.
factors( x^4-4 );
2
2
[1, [[x - 2, 1], [x + 2, 1]]]
>
5. Решать уравнение относительно неизвестного x.
110
> eq := x^4-5*x^2+6*x=2;
4
2
eq := x - 5 x + 6 x = 2
> solve(eq,x);
1/2
1/2
-1 + 3 , -1 - 3 , 1, 1
> sols := [solve(eq,x)];
1/2
1/2
sols := [-1 + 3 , -1 - 3 , 1, 1]
> sols[1];
1/2
-1 + 3
6. Выполнять многие другие преобразования.
> diff(x*sin(cos(x)),x);
111
sin(cos(x)) - x cos(cos(x)) sin(x)
> int( x/(x^3-1), x );
2
1/3 ln(-1 + x) - 1/6 ln(x + x + 1)
1/2
1/2
+ 1/3 3 arctan(1/3 (2 x + 1) 3 )
> limit(sin(x)/x, x=0);
1
и многие другие преобразования.
Можно считать, что практически почти каждая система
компьютерной
алгебры
является
объединением
сопротивляющейся технологии и неопределенности
алгоритмов. При этом можно отметить, что персональные
компьютеры образуют хорошую основу для объединения
символьных, численных и графических методов в рамках
СКА.
Сегодняшнее направление развития систем КА определяется
повышением интеллектуальности систем. Оно поддерживается
работами по абстрактным типам данных и искусственному
112
интеллекту. Системы,
реализующие
абстрактные
типы
данных в дополнении к формулам и выражениям вводят
понятия
"математического объекта" и при работе с ним
учитывают его свойства.
При проектировании чисто интеллектуальной системы КА
применяется несколько другой подход, отличный от метода
расширения уже существующих возможностей системы.
Применяемый подход предполагает манипулирование знаниями в
концептуальном смысле, а не только манипулирования
формулами. Предполагается, что такая система должна
основываться на знаниях и использовать методы искусственного
интеллекта, методы хранения и поиска знаний.
8.2. ПРЕОБРАЗОВАНИЯ И УПРОЩЕНИЕ
Упрощение выражений в системе Maple выполняется с помощью
команды simplify, аргументом которой является упрощаемое
выражение, или имя упрощаемого выражения и некоторых опций
упрощения. В качестве опций можно задавать соотношения в виде
равенств, тогда упрощения будет производиться с учетом этих
соотношений.
> simplify(4^(1/2)+3);
5
> simplify((x^a)^b+4^(1/2), power);
b
( xa ) 2
> simplify(exp(a+ln(b*exp(c))));
be
( ac )
> simplify(sin(x)^2+cos(x)^2, trig);
1
> e := cos(x)^5 + sin(x)^4 + 2*cos(x)^2 - 2*sin(x)^2 cos(2*x):
simplify(e);
113
cos( x )5cos( x )4
> f := -1/3*x^5*y + x^4*y^2 + 1/3*x*y^3 + 1:
simplify(f, {x^3 = x*y, y^2 = x+1});
1y5y42 y3y2y
> g:=sqrt(x^2);
g := x2
> simplify(g);
csgn( x ) x
> simplify(g,assume=real);
x
> simplify(g,assume=positive);
x
> simplify(g,symbolic);
x
8.3. ДИФФЕРЕНЦИРОВАНИЕ И ИНТЕГРИРОВАНИЕ
Вычисление производной выражения exp по переменной
x
выполняется при помощи команд diff (exp,x) или Diff (exp,x).
Эти команды могут использоваться для вычислений частных
производных функций многих переменных, в этом случае
используется такой формат:
diff (exp,x1$n1, x2$n2…), где exp - выражение, зависящее от
переменных x1, x2,… , а n1, n2,… - порядки дифференцирования
по соответствующим переменным. Для команды Diff – параметры
аналогичны.
> diff(sin(x),x);
114
cos( x)
> diff(sin(x),y);
0
> diff(sin(x),x$3);
cos( x )
> diff(x*sin(cos(x)),x);
sin( cos( x) )x cos( cos( x) ) sin( x)
> diff(tan(x),x);
1tan( x )2
> Diff(tan(x),x);

tan( x )
x
> Diff(tan(x),x) = diff(tan(x),x);

tan( x )1tan( x )2
x
> diff(f(x),x);

f( x )
x
> diff(f(x,y),x,y);
2
f( x, y )
y x
> diff(f(x,y),x,y) - diff(f(x,y),y,x);
0
> diff(g(x,y,z),x,z,z);
3
g( x, y, z )
z2 x
115
> diff(g(x,y,z),[x,z,z]);
3
g( x, y, z )
z2 x
Для целей интегрирования в Maple предусмотрено несколько
команд, находящихся в различных библиотеках. В стандартной
библиотеке находятся процедуры int(expr, par) и Int(expr, par),
которые в зависимости от параметров par могут использоваться
для поиска неопределенных интегралов, аналитического и
численного вычисления определенных, собственных и
несобственных интегралов. Рассмотрим несколько примеров.
> int( sin(x), x );
cos( x )
> int( sin(x), x=0..Pi );
2
> int( x/(x^3-1), x );
1
1
1
1
ln( x1 ) ln( x2x1 ) 3 arctan ( 2 x1 ) 3 
3
6
3
3

> int( exp(-x^2), x );
1
 erf( x )
2
> int( exp(-x^2)*ln(x), x=0..infinity );

1
1
   ln( 2 )
4
2
> int( exp(-x^2)*ln(x), x );
( x2 )


e
ln( x ) dx



116
8.4. РИСОВАНИЕ ГРАФИКОВ
Одним из самых впечатляющих применений систем компьютерной
алгебры
является использование их графических возможностей для решения
различных задач, включая визуализацию результатов, графическую
интерпретацию данных, рисование графиков и т. п. Исходными
данными для построения графических образов могут быть как
результаты вычислений, полученные при помощи других программ,
и записанных в текстовом файле, так и конструкции Maple
(массивы, функции, графические объекты). В качестве параметров
при вызове графических команд указывается выводимый объект,
интервалы изменения переменных и опции вывода.
Наиболее универсальные и часто используемые
командвграфической библиотеки plots доступны пользователю по
умолчанию. Перед обращением к другим командам нужно
подключить всю библиотеку с помощью
with(plots).
> plot(cos(x) + sin(x), x=0..Pi);
> plot(tan(x), x=-Pi..Pi);
117
> plot([sin(t), cos(t), t=-Pi..Pi]);
>plot(sin(t),t);
118
)
> plot(sin);
> plot3d(sin(x+y),x=-1..1,y=-1..1);
119
8.5. РЕШЕНИЕ УРАВНЕНИЙ
Для аналитического решения алгебраических уравнений
используется команда solve(eqns,vars), где eqn – уравнение или
система уравнений, а vars - переменная или группа переменных в
фигурных скобках. Система уравнений задается в виде множества.
Здесь и далее множеством является совокупность объектов,
разделенных запятыми и взятая в фигурные скобки.
> solve( f=m*a, a );
f
m
> solve( {f=m*a}, {a} );
f
{ a }
m
> f := proc(x) x-cos(x) end proc:
solve( f(x),x);
RootOf( _Zcos( _Z) )
120
> eq := x^4-5*x^2+6*x=2;
eq := x45 x26 x2
> solve(eq,x);
1, 1, 3 1, 1 3
> sols := [solve(eq,x)];
sols := [ 1, 1, 3 1, 1 3 ]
> sols[1];
1
> evalf(sols);
[ 1., 1., .732050808, -2.732050808]
> sols := {solve(eq,x)};
sols := { 1, 3 1, 1 3 }
> sols[1];
1
> subs( x=sols[1], eq );
22
> solve(x^4+x+1,x);
RootOf( _Z4_Z1, index1 ), RootOf( _Z4_Z1, index2 ),
RootOf( _Z4_Z1, index3 ), RootOf( _Z4_Z1, index4 )
> evalf({%});
{ .7271360845.9340992895 I, -.7271360845.4300142883 I,
-.7271360845.4300142883 I, .7271360845.9340992895 I }
> solve( cos(x)+y = 9, x );
arccos( y9 )
> solve( x^2+x>5, x );
121
1 1
1 1
RealRange , Open   21  , RealRange Open   21 ,  
2
2




 2 2
 
> solve( x^6-2*x^2+2*x, x );
0, RootOf( _Z52 _Z2, index1 ), RootOf( _Z52 _Z2, index2 ),
RootOf( _Z52 _Z2, index3 ), RootOf( _Z52 _Z2, index4 ),
RootOf( _Z52 _Z2, index5 )
> solve( {x^2*y^2=0, x-y=1} );
{x1, y0 }, {x1, y0 }, {x0, y-1}, {x0, y-1}
> solve( {x^2*y^2=0, x-y=1, x<>0} );
{ x1, y0 }, { x1, y0 }
8.6. ЯЗЫКОВЫЕ СОСТАВЛЯЮЩИЕ
Автоматизация исследований во многих научных и инженерных
областях требует полнокровного сочетания как численных так и
формульных или аналитических методов вычислений. Достаточно
много систем КА ориентировано на выполнение формульных
преобразований, но их затруднительно использовать, когда
возникает необходимость выполнения аналитических
преобразований в рамках какого-либо вычислительного или
инженерного проекта. При проектировании СКА построении
системы КА как системы формируемой в виде банка
преобразований, следует обеспечивать:
122
определение математических объектов с заданными свойствами;
средства выполнения подстановок с учетом свойств
математических объектов;
средства выполнения подстановок по различным стратегиям;
средства символьного дифференцирования;
средства полиномиальных преобразований, как для упрощения
входных выражений как и для специальных полиномиальных
преобразований;
средства вывода формульных выражений в так называемой
понимаемой форме;
проблемно-ориентированную среду, способствующую генерации
пакетов требуемых аналитических и символьных преобразований
и предусматривающую возможности, позволяющие
интегрировать в них графические средства и средства численного
программирования.
Обязательными языковыми составляющими должны быть как
стандартные понятия обычного языка программирования, так и
понятия, свойственные чисто языкам КА, например, подстановка,
условия применения подстановок и многое другое. Все эти и многие
другие языковые возможности для программирования обеспечивает
система Maple.
Пользователь системы Maple может писать свои собственные
программы, процедуры, создавать свои библиотеки. Для этого в
языке имеется
достаточно большое множество команд и
управляющих конструкций. К ним относится условные операторы,
операторы цикла, процедуры, процедуры-функции, команды вводавывода и создание собственных библиотек или пакетов.
8.7. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
 Каковы основные возможности систем компьютерной
алгебры?
 Как выполняется дифференцирование выражений?
 Как выполняется аналитическое решение уравнений?
 Какие имеются команды рисования графиков?
123
9. РАБОТА В ИНТЕРНЕТЕ
АННОТАЦИЯ
В лабораторной работе рассматриваются принципы работы сети
Интернет,
затрагиваются вопросы эффективности использования
информационных ресурсов
и средства представления информации на примере языка HTML.
9.1. ЭЛЕКТРОННАЯ ПОЧТА
Интернет на сегодняшний день представляет миллионы
компьютеров и сотни миллионов пользователей, связанных друг с
другом и телефонными проводами, и оптоволоконными кабелями, и
спутниковыми каналами. Интернет представляет собой всемирную,
кооперативно управляемую совокупность компьютерных сетей,
обменивающих информацией с помощью протоколов, которые
можно рассматривать как некоторую четкую систему
договоренностей о правилах обмена.
Первоначально большинство почтовых серверов работало под
управлением операционной системы UNIX. Для передачи почтовых
сообщений между UNIX – машинами использовался протокол
UUCP (UNIX –to- UNIX Copy). Однако с бурным развитием
Интернет росла популярность новых стандартов.
Это протоколы SMTP, POP3, IMAP4, LDAP, которые определяют
вместе базовый набор протоколов, необходимый для
взаимодействия почтовых систем в смешанной среде.
Работа электронной почты основана на передаче информации по
сети либо напрямую, либо от одного почтового сервера к другому,
пока сообщение не достигнет адресата. Адреса абонентов в
системе электронной почты Интернет представляются в виде
user@ dN. … .d2.d1 ,
где user - имя пользователя, @ - специальный символ, отделяющий
левую часть от правой, dN. … .d2.d1 - адрес почтового сервера домен. Домен состоит из нескольких поддоменов, разделенными
точками.
Электронное письмо, будучи доставленным почти мгновенно,
может быть прочитано адресатом в любое удобное для него время.
На сегодняшний день активно разрабатываются технологии
передачи звука и изображения по сети в реальном времени, а
124
сегодняшние возможности позвонить кому-нибудь, используя
Интернет, ни в чем не уступают телефонным, а по цене часто их
превосходят.
9.2. СИСТЕМА ПРОТОКОЛОВ
Интернет имеет достаточно простую систему адресов. Каждый
входящий в него компьютер имеет уникальный адрес – 32 битное
двоичное число. Для удобства этот адрес принято записывать в
виде последовательности четырех обычных десятичных цифр
(цифры в диапазоне от 0 до 255), разделенных точками. Такой адрес
называется IP –адресом компьютера (Internet Protocol).
Переход на новые скоростные каналы передачи данных требует
создания новых протоколов маршрутизации. Сейчас ясно, что
адреса, определяемые протоколом IP скоро могут «закончиться»,
предпринимаются усилия по созданию новых протоколов с
большим числом цифр в IP-адресе.
Можно считать что в основе Интернета лежит связка протоколов
TCP/IP.
TCP (Transmission Control Protocol – протокол управления передачи
сообщений) делит на фрагменты слишком большие сообщения.
Каждому фрагменту присваивается свой заголовок. А при передаче
перемежаются пакеты, содержащие фрагменты различных файлов.
Работа протоколов TCP/IP спрятана от пользователя, поэтому в
ходе работы с Интернет можно оперировать привычными
понятиями «файл», «документ», «каталог».
Старейшим ресурсом Интернет, в котором была предпринята
попытка систематизации доступной информации, являются
глобальные каталоги. В них представлены тематически
систематизированные коллекции ссылок на различные ресурсы, в
первую очередь на документы сети. Каталоги обычно имеют
древовидную структуру. Ссылки в каталоги заносятся
администраторами каталогов. Каталоги являются удобным
средством для поиска данных, если известно точное знание о
предмете поиска.
Поисковые серверы – это выделенные компьютеры, которые
автоматически просматривают все ресурсы Интернет и
индексируют их содержание. Для обеспечения полноты поиска
индексами являются все слова, встречающимися в данном ресурсе.
125
9.3. ЧТО ТАКОЕ HTML?
Термин HTML (HyperText Markup Language) означает "язык
разметки гипертекстов". Первую версию HTML разработал
сотрудник Европейской лаборатории физики элементарных частиц
Тим Бернерс-Ли.
Со времени создания первой версии HTML претерпел некоторые
изменения.
Документ, который написан на языке HTML представляет из
себя простой текст, в который вставлены флаги разметки (или
метки)- или «тэги» (markup tags). Флаги разметки объясняют как
должен текст располагаться на экране, в каком месте должны
находиться рисунки. При помощи тэгов формируются связи с
другими web-сайтами и ресурсами. Просмотреть файл, написанный
на языке HTML, можно в программе просмотра (Micrisoft Internet
Explorer, Netscape Navigator). Флаги разметки это заданные
последовательности символов, заключенные между знаками <
(больше) и
> (меньше). Флаги бывают парные и непарные,
открывающие и закрывающие. Признаком закрывающего флага
является символ /.
Прописные и строчные буквы в написании флагов значения не
имеют.
Для освоения HTML необходимо:
1. Любой браузер, т.е., программа, пригодная для просмотра
HTML-файлов.
2. Любой редактор текстовых файлов, поддерживающий русский
язык в выбранной Вами кодировке. Если на Вашем
компьютере установлен Windows, вполне подойдет Notepad.
ТИПЫ РЕДАКТОРОВ HTML
В настоящее время широко используются два типа редакторов
HTML:
1. Редакторы типа "что видишь, то и получишь" (Netscape
Navigator Gold, Microsoft Front Page). Пользователь не видит
"внутренностей" документа, с которым он работает, точно так
же, как при работе с текстовым процессором типа Microsoft
Word или Word erfect
126
2. Редакторы собственно HTML-текстов (HotDog, Ken Nesbitt
Web Editor и многие другие). В процессе работы пользователь
видит внутреннее содержание HTML-файла и может изменять
его либо вручную, либо вызывая команды меню для вставки
определенных элементов HTML. Для удобства чтения
вводятся дополнительные отступы, однако в HTML это совсем
не обязательно. Более того, браузеры игнорируют символы
конца строки и множественные пробелы в HTML-файлах.
Поэтому первый пример вполне мог бы выглядеть следующим
образом:
<HTML>
<HEAD>
<TITLE>Первый пример</TITLE>
</HEAD>
<BODY>
Здравствуйте!
Флаги бывают парные и непарные, открывающие и
закрывающие.
</BODY>
</HTML>
Сохраните этот файл с расширением .htm , например, в директории
HTML.
Затем откройте программу просмотра, например(Micrisoft Internet
Explorer).
Многие метки, помимо имени, могут содержать атрибуты элементы, дающие дополнительную информацию о том, как браузер
должен обработать текущую метку.
Обязательные метки
<html> ... </html>
Метка <html> должна открывать HTML-документ. Аналогично,
метка </html> должна завершать HTML-документ.
<head> ... </head>
Эта пара меток указывает на начало и конец заголовка документа.
<title> ... </title>
Все, что находится между метками <title> и </title>, толкуется
127
браузером как название документа.
<body> ... </body>
Эта пара меток указывает на начало и конец тела HTML-документа,
которое является содержанием документа.
<H1> ... </H1> - <H6> ... </H6>
Метки вида <Hi> (где i - цифра от 1 до 6) описывают заголовки
шести различных уровней. Заголовок первого уровня - самый
крупный, шестого уровня, естественно - самый мелкий.
<P> ... </P>
Такая пара меток описывает абзац. Все, что заключено между <P> и
</P>, воспринимается как один абзац.
Метки <P> ... </P> используются для разбиения текста на
параграфы.Когда программа просмотра обнаруживает этот флаг.
Она вставляет перед началом параграфа пустую строку.
Метки <Hi> и <P> могут содержать дополнительный атрибут
ALIGN
<H1 ALIGN=CENTER>Выравнивание заголовка по
центру</H1>
или
<P ALIGN=RIGHT>Образец абзаца с выравниванием по
правому краю</P>
Непарные метки
Рассмотрим метки, которые не подчиняются двум основным
правилам HTML: все они непарные, а некоторые (так называемые
&-последовательности) к тому же должны вводиться только
маленькими буквами.
<BR>
Эта метка используется, если необходимо перейти на новую
строку, не прерывая абзаца. Очень удобно при публикации стихов.
<html>
<head>
<TITLE>стихи</TITLE>
</HEAD>
128
<BODY>
<H1>Из « Евгения Онегина»</H1>
<H2>А.П.ПУШКИН</H2>
<P>В тот год осенняя погода<BR>
Стояла долго на дворе.<BR>
Зимы ждала - ждала природа<BR>
Снег выпал только в январе.</P>
<P>НА третье в ночь. Проснувшись рано,<BR>
В окно увидела Татьяна,<BR>
Поутру побелевший двор,<BR>
Куртины, кровлю и забор.</P>
</BODY> </HTML>
<HR>
Метка <HR> описывает вот такую горизонтальную линию:
Метка может дополнительно включать атрибуты SIZE
(определяет толщину линии в пикселах) и/или WIDTH (определяет
размах линии в процентах от ширины экрана). В следующем
примере приведена небольшая коллекция горизонтальных линий.
<html>
<head>
<title>Линии</title>
</head>
<body>
<H1>Коллекция горизонтальных линий</H1>
<HR SIZE=2 WIDTH=100%><BR>
<HR SIZE=4 WIDTH=50%><BR>
<HR SIZE=8 WIDTH=25%><BR>
<HR SIZE=16 WIDTH=12%><BR>
</body>
</html>
&-ПОСЛЕДОВАТЕЛЬНОСТИ
Поскольку символы "<" и ">" воспринимаются браузерами как
начало и конец HTML-меток, возникает вопрос: а как показать эти
символы на экране? В HTML это делается с помощью &последовательностей (их еще называют символьными объектами
или эскейп-последовательностями). Браузер показывает на экране
129
символ "<", когда встречает в тексте последовательность < (по
первым буквам английских слов less than - меньше, чем). Знак ">"
кодируется последовательностью > (по первым буквам
английских слов greater than - больше, чем).
Символ "&" (амперсанд) кодируется последовательностью
&
Двойные кавычки (") кодируются последовательностью "
Помните: точка с запятой - обязательный элемент &последовательности. Кроме того, все буквы, составляющие
последовательность, должны быть в нижнем регистре (т.е.,
маленькие).
Вообще говоря, &-последовательности определены для всех
символов из второй половины ASCII-таблицы (куда, естественно,
входят и русские буквы).
КОММЕНТАРИИ
Браузеры игнорируют любой текст, помещенный между <!-- и
-->. Это удобно для размещения комментариев.
<!-- Это комментарий -->
ФОРМАТИРОВАНИЕ ШРИФТА
HTML допускает два подхода к шрифтовому выделению
фрагментов текста. С одной стороны, можно прямо указать, что
шрифт на некотором участке текста должен быть жирным или
наклонным, то есть изменить физический стиль текста. С другой
стороны, можно пометить некоторый фрагмент текста как имеющий
некоторый отличный от нормального логический стиль, оставив
интерпретацию этого стиля браузеру.
ФИЗИЧЕСКИЕ СТИЛИ
Под физическом стилем принято понимать прямое указание
браузеру на модификацию текущего шрифта. Например, все, что
находится между метками <B> и </B>, будет написано жирным
шрифтом. Текст между метками <I> и </I> будет написан
наклонным шрифтом.
Несколько особняком стоит пара меток <TT> и </TT>. Текст,
130
размещенный между этими метками, будет написан шрифтом,
имитирующим
пишущую
машинку, то есть имеющим
фиксированную ширину символа.
ЛОГИЧЕСКИЕ СТИЛИ
При использовании логических стилей автор документа не
может знать заранее, что увидит на экране читатель. Разные
браузеры толкуют одни и те же метки логических стилей поразному. Некоторые браузеры игнорируют некоторые метки вообще
и показывают нормальный текст вместо выделенного логическим
стилем. Вот самые распространенные логические стили.
<EM> ... </EM>
От английского emphasis - акцент.
<STRONG> ... </STRONG>
От английского strong emphasis - сильный акцент.
<CODE> ... </CODE>
Рекомендуется использовать для фрагментов исходных текстов.
<SAMP> ... </SAMP>
От английского sample - образец. Рекомендуется использовать
для демонстрации образцов сообщений, выводимых на экран
программами.
<KBD> ... </KBD>
От английского keyboard - клавиатура. Рекомендуется
использовать для указания того, что нужно ввести с клавиатуры.
<VAR> ... </VAR>
Рекомендуется использовать для написания имен переменных.
Организация текста внутри документа
131
HTML позволяет определять внешний вид целых абзацев текста.
Абзацы можно организовывать в списки, выводить их на экран в
отформатированном виде, или увеличивать левое поле. Разберем все
по порядку.
НЕНУМЕРОВАННЫЕ СПИСКИ: <UL> ... </UL>
Текст, расположенный между метками <UL> и </UL>,
воспринимается как ненумерованный список. Каждый новый
элемент списка следует начинать с метки <LI>. Например, чтобы
создать вот такой список:

Мой город;

Мои друзья;

Мои увлечения
необходим вот такой HTML-текст:
<UL>
<LI> Мой город;
<LI> Мои друзья;
<LI> Мои увлечения
</UL>
Обратите внимание: у метки <LI> нет парной закрывающей
метки.
НУМЕРОВАННЫЕ СПИСКИ: <OL> ... </OL>
Нумерованные списки устроены точно так же, как
ненумерованные, только вместо символов, выделяющих новый
элемент, используются цифры. Если слегка модифицировать наш
предыдущий пример:
<OL>
<LI> Мой город;
<LI> Мои друзья;
<LI> Мои увлечения
</OL>
получится вот такой список:
132
1. Мой город;
2. Мои друзья;
3. Мои увлечения
СПИСКИ ОПРЕДЕЛЕНИЙ: <DL> ... </DL>
Список определений несколько отличается от других видов
списков. Вместо меток <LI> в списках определений используются
метки <DT> (от английского definition term - определяемый термин)
и <DD> (от английского definition definition - определение
определения). Разберем это на примере. Допустим, у нас имеется
следующий фрагмент HTML-текста:
<DL>
<DT>HTML
<DD>Термин HTML (HyperText Markup Language) означает
'язык
маркировки гипертекстов'. Первую версию HTML разработал
сотрудник
Европейской лаборатории физики элементарных частиц Тим
Бернерс-Ли.
<DT>HTML-документ
<DD>Текстовый файл с расширением *.htm (Unix-системы
могут
содержать файлы с расширением *.html).
</DL>
Этот фрагмент будет выведен на экран следующим образом:
HTML
Термин HTML (HyperText Markup Language) означает 'язык
маркировки гипертекстов'. Первую версию HTML разработал
сотрудник Европейской лаборатории физики элементарных
частиц Тим Бернерс-Ли.
HTML-документ
Текстовый файл с расширением *.htm (Unix-системы могут
содержать файлы с расширением *.html).
Обратите внимание: точно так же, как метки <LI>, метки <DT>
и <DD> не имеют парных закрывающих меток.
Если определяемые термины достаточно коротки, можно
использовать модифицированную открывающую метку <DL
133
COMPACT>. Например, вот такой фрагмент HTML-текста:
<DL COMPACT>
<DT>А
<DD>Первая буква алфавита
<DT>Б
<DD>Вторая буква алфавита
<DT>В
<DD>Третья буква алфавита
</DL>
будет выведен на экран примерно так:
А
Первая буква алфавита
Б
Вторая буква алфавита
В
Третья буква алфавита
ВЛОЖЕННЫЕ СПИСКИ
Элемент любого списка может содержать в себе целый список
любого вида. Число уровней вложенности в принципе не
ограничено, однако злоупотреблять вложенными списками все же
не следует.
Вложенные списки очень удобны при подготовке разного рода
планов и оглавлений.
Наши знания о списках можно вкратце свести в пример 6:
<html>
<head>
<title>Пример 6</title>
</head>
<body>
<H1>HTML поддерживает несколько видов списков </H1>
<DL>
<DT>Ненумерованные списки
<DD>Элементы ненумерованного списка выделяются
специальным
символом и отступом слева:
<UL>
<LI>Элемент 1
134
<LI>Элемент 2
<LI>Элемент 3
</UL>
<DT>Нумерованные списки
<DD>Элементы нумерованного списка выделяются отступом
слева, а
также нумерацией:
<OL>
<LI>Элемент 1
<LI>Элемент 2
<LI>Элемент 3
</OL>
<DT>Списки определений
<DD>Этот вид списков чуть сложнее, чем два предыдущих, но и
выглядит более эффектно.
<P>Помните, что списки можно встраивать один в другой, но не
следует закладывать слишком много уровней вложенности. </P>
<P>Обратите внимание, что внутри элемента списка может
находиться
несколько абзацев. Все абзацы при этом будут иметь одинаковое
левое поле. </P>
</DL>
</body>
</html>
ФОРМАТИРОВАННЫЙ ТЕКСТ: <PRE> ... </PRE>
В самом начале мы говорили о том, что браузеры игнорируют
множественные пробелы и символы конца строки. Из этого правила,
однако, есть исключение.
Текст, заключенный между метками <PRE> и </PRE> (от
английского preformatted - предварительно форматированный),
выводится браузером на экран как есть - со всеми пробелами,
символами табуляции и конца строки. Это очень удобно при
создании простых таблиц.
ТЕКСТ С ОТСТУПОМ: <BLOCKQUOTE> ... </BLOCKQUOTE>
Текст, заключенный между метками <BLOCKQUOTE> и
</BLOCKQUOTE>, выводится браузером на экран с увеличенным
левым полем.
135
СВЯЗЫВАНИЕ
Как уже упоминалось в самом начале, сокращение HTML
означает "язык маркировки гипертекстов". Про маркировку мы уже
поговорили достаточно. Не пора ли перейти к гипертексту?
Прежде всего, что же такое гипертекст? В отличие от
обыкновенного текста, который можно читать только от начала к
концу, гипертекст позволяет осуществлять мгновенный переход от
одного фрагмента текста к другому. Системы помощи многих
популярных программных продуктов устроены именно по
гипертекстовому принципу. При нажатии левой кнопкой мыши на
некоторый выделенный фрагмент текущего документа происходит
переход к некоторому заранее назначенному документу или
фрагменту документа.
В HTML переход от одного фрагмента текста к другому задается
с помощью метки вида:
<A HREF="[адрес перехода]">выделенный фрагмент
текста</A>
В качестве параметра [адрес
перехода] может
использоваться несколько типов аргументов. Самое простое - это
задать имя другого HTML-документа, к которому нужно перейти.
Например:
<A HREF="pr.htm">Перейти к оглавлению</A>
Такой фрагмент HTML-текста приведет к появлению в
документе выделенного фрагмента Перейти к оглавлению, при
нажатии на который в текущее окно будет загружен документ
pr.htm.
Обратите внимание: если в адресе перехода не указан каталог,
переход будет выполнен внутри текущего каталога. Если в адресе
перехода не указан сервер, переход будет выполнен на текущем
сервере.
При необходимости можно задать переход не просто к
некоторому документу, но и к определенному месту внутри этого
документа. Для этого необходимо создать в документе, к которому
будет задан переход, некоторую опорную точку, или анкер.
Разберем это на примере.
Допустим, что необходимо осуществить переход из файла
136
1.htm к словам "Переход закончен" в файле 2.htm (файлы
находятся в одном каталоге). Прежде всего, необходимо создать вот
такой анкер в файле 2.htm:
<A NAME="AAA">Переход закончен</A>
Слова "Переход закончен" при этом никак не будут выделены в
тексте документа.
Затем в файле 1.htm (или в любом другом) можно определить
переход на этот анкер:
<A HREF="2.htm#AAA">Переход к анкеру AAA</A>
Кстати говоря, переход к этому анкеру можно определить и
внутри самого документа 2.htm - достаточно только включить в
него вот такой фрагмент:
<A HREF="#AAA">Переход к анкеру AAA</A>
На практике это очень удобно при создании больших
документов. В начале документа можно поместить оглавление,
состоящее из ссылок на анкеры, расположенные в заголовках
разделов документа.
Во избежание недоразумений рекомендуется задавать имена
анкеров латинскими буквами. Пока что мы обсуждали только
ссылки на HTML-документы. Однако возможны ссылки и на другие
виды ресурсов:
<A HREF="ftp://server/directory/file.ext">Выгрузить файл</A>
Такая ссылка, если ей воспользоваться, запустит протокол
передачи файлов и начнет выгрузку файла, находящегося в каталоге
directory на сервере server, на локальный диск пользователя.
<A HREF="mailto:user@mail.box">Послать письмо</A>
Если пользователь совершит переход по такой ссылке, у него на
экране откроется окно ввода исходящего сообщения его почтовой
программы. В строке To: ("Куда") окна почтовой программы будет
указано user@mail.box.
ИЗОБРАЖЕНИЯ В HTML-ДОКУМЕНТЕ
Встроить изображение в HTML-документ очень просто. Для
этого нужно только иметь это самое изображение в формате GIF
(файл с расширением *.gif) или JPEG (файл с расширением
*.jpg или *.jpeg) и одну строчку в HTML-тексте.
137
Допустим, нам нужно включить в документ изображение,
записанное в файл picture.gif, находящийся в одном каталоге с
HTML-документом. Тогда строчка будет вот такая:
<IMG SRC="picture.gif">
Метка <IMG SRC="[имя файла]"> может также включать
атрибут ALT="[текст]", например:
<IMG SRC="picture.gif" ALT="Картинка">
Встретив такую метку, браузер покажет на экране текст.
Картинка и начнет загружать на его место картинку из файла
picture.gif. Атрибут ALT может оказаться необходимым для
старых браузеров, которые не поддерживают изображений, а также
на случай, если у браузера отключена автоматическая загрузка
изображений (при медленном подключении к Интернет это делается
для экономии времени).
Файл, содержащий изображение, может находиться в другом
каталоге или даже на другом сервере. В этом случае стоит указать
его полное имя. Разберем все, что мы знаем об изображениях, с
помощью примера .
<HTML>
<HEAD>
<TITLE>Пример изображения</TITLE>
</HEAD>
<BODY>
<H1>Изображения </H1>
<P>Изображение можно встроить очень просто: </P>
<P><IMG SRC="picture.gif"></P>
<P>Кроме того, изображение можно сделать "горячим", то есть
осуществлять переход при нажатии на изображение:</P>
<P><A HREF="pr.htm"><IMG SRC="picture.gif"></A></P>
</BODY>
</HTML>
Обратите внимание на вторую часть примера. Если ссылка на
изображение находится между метками <A HREF="..."> и </A>,
изображение фактически становится кнопкой, при нажатии на
которую происходит переход по ссылке (в примере 8 переход
происходит на оглавление Руководства).
ЦВЕТОВАЯ ГАММА HTML-ДОКУМЕНТА
138
Цветовая гамма HTML-документа определяется атрибутами,
размещенными внутри метки <BODY>. Вот список этих атрибутов:
bgcolor
Определяет цвет фона документа.
text
Определяет цвет текста документа.
link
Определяет цвет выделенного элемента текста, при нажатии
на который происходит переход по гипертекстовой ссылке.
vlink
Определяет цвет ссылки на документ, который уже был
просмотрен ранее.
alink
Определяет цвет ссылки в момент, когда на нее указывает
курсор мыши и нажата ее правая кнопка, то есть
непосредственно перед переходом по ссылке.
Цвет кодируется последовательностью из трех пар символов.
Каждая пара представляет собой шестнадцатиричное значение
насыщенности заданного цвета одним из трех основных цветов
(красным, зеленым и синим) в диапазоне от нуля (00) до 255 (FF).
Разберем несколько примеров.
bgcolor=#FFFFFF
Цвет фона. Насыщенность красным, зеленым и синим
одинакова - FF (это шестнадцатиричное представление числа
255). Результат - белый цвет.
text=#000000
Цвет текста. Насыщенность красным, зеленым и синим
одинакова - 00 (ноль). Результат - черный цвет.
link=#FF0000
139
Цвет гипертекстовой ссылки. Насыщенность красным - FF
(255), зеленым и синим - 00 (ноль). Результат - красный цвет.
Кроме того, метка
<BODY>
может включать атрибут
background="[имя файла]"
, который задает изображение, служащее фоном для текста и других
изображений. Как и любое другое изображение, фон должен быть
представлен в формате GIF (файл с расширением *.gif) или JPEG
(файл с расширением *.jpg или *.jpeg).
Браузеры заполняют множественными копиями изображенияфона все пространство окна, в котором открыт документ, подобно
тому, как при строительстве большие пространства стен покрывают
маленькими (и одинаковыми) плитками.
Важно отметить, что цвет фона и изображение-фон никак не
отображаются на бумаге при выводе HTML-документа на печать.
ЗАГОЛОВОК HTML-ДОКУМЕНТА
Заголовок HTML-документа, вообще говоря, не виден
пользователю при просмотре. Однако в нем есть некоторые
интересные особенности. Заголовок HTML-документа может
включать неограниченное количество так называемых METAинструкций. META-инструкция - это просто способ определить
некоторую переменную путем указания ее имени (атрибут NAME) и
значения (атрибут CONTENT).
ТАБЛИЦЫ
На этот вопрос есть очевидный ответ: таблицы нужны для
представления информации в табличном виде. Есть, однако, и менее
очевидные ответы.
До настоящего времени мы имели дело с документами, в
которых существовал только один "поток" текста. На практике
иногда очень хочется расположить текст в несколько колонок.
Таблица может в этом помочь.
140
Кроме того, таблица, состоящая из одной ячейки, может очень
эффектно выделить фрагмент текста, на который Вы хотите
обратить внимание читателя.
Таблица начинается с метки <TABLE> и заканчивается меткой
</TABLE>. Метка <TABLE> может включать несколько атрибутов:
ALIGN
Устанавливает расположение таблицы по отношению к полям
документа. Допустимые значения: ALIGN=LEFT
(выравнивание влево),
ALIGN=CENTER
(выравнивание по центру), ALIGN=RIGHT (выравнивание
вправо).
WIDTH
Ширина таблицы. Ее можно задать в пикселях (например,
WIDTH=400) или в процентах от ширины страницы
(например, WIDTH=80%).
BORDER
Устанавливает ширину внешней рамки таблицы и ячеек в
пикселах (например, BORDER=4). Если атрибут не установлен,
таблица показывается без рамки.
CELLSPACING
Устанавливает расстояние между рамками ячеек таблицы в
пикселах (например, CELLSPACING=2).
CELLPADDING
Устанавливает расстояние между рамкой ячейки и текстом в
пикселах (например, CELLPADDING=10).
Таблица может иметь заголовок (<CAPTION>
...
</CAPTION>), хотя заголовок не является обязательным. Метка
<CAPTION> может включать атрибут ALIGN. Допустимые
значения: <CAPTION ALIGN=TOP> (заголовок помещается над
таблицей) и <CAPTION ALIGN=BOTTOM> (заголовок помещается
141
под таблицей).
Каждая строка таблицы начинается с метки <TR> и
заканчивается меткой </TR>. Метка <TR> может включать
следующие атрибуты:
ALIGN
Устанавливает выравнивание текста в ячейках строки.
Допустимые значения: ALIGN=LEFT (выравнивание влево),
ALIGN=CENTER (выравнивание по центру), ALIGN=RIGHT
(выравнивание вправо).
VALIGN
Устанавливает вертикальное выравнивание текста в ячейках
строки. Допустимые значения: VALIGN=TOP (выравнивание
по верхнему краю),
VALIGN=MIDDLE
(выравнивание по центру), VALIGN=BOTTOM (выравнивание
по нижнему краю).
Каждая ячейка таблицы начинается с метки <TD> и
заканчивается меткой </TD>. Метка <TD> может включать
следующие атрибуты:
NOWRAP
Присутствие этого атрибута означает, что содержимое ячейки
должно быть показано в одну строку.
COLSPAN
Устанавливает "размах" ячейки по горизонтали. Например,
COLSPAN=3 означает, что ячейка простирается на три
колонки.
ROWSPAN
Устанавливает "размах" ячейки по вертикали. Например,
ROWSPAN=2 означает, что ячейка занимает две строки.
142
ALIGN
Устанавливает выравнивание текста в ячейке. Допустимые
значения: ALIGN=LEFT (выравнивание влево),
ALIGN=CENTER (выравнивание по центру), ALIGN=RIGHT
(выравнивание вправо).
VALIGN
Устанавливает вертикальное выравнивание текста в ячейке.
Допустимые значения: VALIGN=TOP (выравнивание по
верхнему краю), VALIGN=MIDDLE (выравнивание по центру),
VALIGN=BOTTOM (выравнивание по нижнему краю).
WIDTH
Устанавливает ширину ячейки в пикселях (например,
WIDTH=200).
HEIGHT
Устанавливает высоту ячейки в пикселях (например,
HEIGHT=40).
9.5. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
1. Что такое тэг?
2. Имеют ли значение написание прописных и строчных букв в
написании флагов разметки?
3. Общая классификация флагов.
4. Какой признак закрывающего флага?
5. Какой флаг закрывает параграф?
6. Разрешены ли переносы в заголовках?
143
Download