umniki-sm.ucoz.ru  · web viewБелорусский техникум бизнеса и...

229
Научно-образовательное ООО "БИП-С" Белорусский техникум бизнеса и права Языки программирования высокого уровня Язык программирования Паскаль Методические указания и задания к лабораторным работам для учащихся ССУЗ специальности Т1002 «Программное обеспечение информационных технологий »

Upload: others

Post on 16-Oct-2020

22 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Научно-образовательное ООО "БИП-С"Белорусский техникум бизнеса и права

Языки программирования высокого уровня

Язык программирования Паскаль

Методические указания и заданияк лабораторным работам

для учащихся ССУЗ специальности Т1002 «Программное обеспечение информационных технологий »

Минск -2002

Page 2: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Составитель: Коропа Екатерина Николаевна, преподаватель Белорусского техникума бизнеса и права

Рецензент: Альхимович Светлана Леонидовна, ассистент кафедры информатики Минского государственного высшего радиотехнического колледжа.

Методическое указания рекомендованы к изданию цикловой комиссией информатики Белорусского техникума бизнеса и права для учащихся специальности Т1002 «Программное обеспечение информационных технологий».

Научно-образовательное ООО "БИП-С", 2002 Белорусский техникум бизнеса и права, 2002

Указания

по выполнения практических и лабораторных работ

2

Page 3: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Для выполнения лабораторных работ по предмету «Языки программирования высокого уровня» необходим персональный компьютер с установленной средой программирования Pascal 7.0

Перед выполнением практической работы учащиеся должны изучить краткие теоретические сведения, необходимые для успешного выполнения конкретной работы, освоить навыки работы с интерфейсом интегрированной среды, выполнить работу согласно предложенному порядку, ответить на контрольные вопросы.

По каждой лабораторной работе учащиеся должны получить у преподавателя индивидуальное задание и выполнить его. Текст программы поместить в отчет. Отчет должен одержать:

Название темы Цель работы Ответы на контрольные вопросы Тексты программ по данной теме.Отчет оформляется в тетради и представляется преподавателю на

проверку по завершению изучения темы.

3

Page 4: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Лабораторная работа № 1Блок-схемы как графическое представление алгоритмов. Основные блоки, используемые в блок- схемах алгоритмов

Цель работы: формирование знаний и умений по работе с блок-схемами алгоритмов.

Краткие теоретические сведения

Основные этапы решения задач на компьютереПроцесс решения задач на компьютере - это совместная деятельность

человека и ЭВМ. Этот процесс можно представить в виде нескольких последовательных этапов. На долю человека приходятся этапы, связанные с творческой деятельностью — постановкой, алгоритмизацией, программированием задач и анализом результатов, а на долю компьютера — этапы обработки информации в соответствии с разработанным алгоритмом.

Рассмотрим эти этапы на следующем примере: пусть требуется вычислить сумму двух целых чисел и вывести на экран результат.

Первый этап - постановка задачи. На этом этапе участвует человек, хорошо представляющий предметную область задачи. Он должен четко определить цель задачи, дать словесное описание содержания задачи и предложить общий подход к ее решению. Для задачи вычисления суммы двух целых чисел человек, знающий, как складываются числа, может описать задачу следующим образом: ввести два целых числа, сложить их и вывести сумму в качестве результата решения задачи.

Второй этап - математическое или информационное моделирование. Цель этого этапа - создать такую математическую модель решаемой задачи, которая может быть реализована в компьютере. Существует целый ряд задач, где математическая постановка сводится к простому перечислению формул и логических условий. Для вышеописанной задачи данный этап сведется к следующему: введенные в компьютер числа запомним в памяти под именами А и В, затем вычислим значение суммы этих чисел по формуле А+В, и результат запомним в памяти под именем Summa.

Третий этап - алгоритмизация задачи. На основе математического описания необходимо разработать алгоритм решения.

Алгоритмом называется точное предписание, определяющее последовательность действий исполнителя, направленных на решение поставленной задачи. В роли исполнителей алгоритмов могут выступать люди, роботы, компьютеры.

Используются различные способы записи алгоритмов. Широко распространен словесный способ записи: это записи рецептов приготовления различных блюд в кулинарной книге, инструкции по использованию технических устройств, правила правописания и многие другие. Наглядно представляется алгоритм языком блок-схем.

4

Page 5: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Например, алгоритм решения задачи вычисления суммы двух целых чисел на языке блок-схем будет записан, как показано на рисунке 1.

Рисунок 1 Блок-схема алгоритма

Четвертый этап — программирование. Программой называется план действий, подлежащих выполнению некоторым исполнителем, в качестве которого может выступать компьютер. Составление программы обеспечивает возможность выполнения алгоритма и соответственно поставленной задачи исполнителем-компьютером. Во многих задачах при программировании на алгоритмическом языке часто пользуются заменой блока алгоритма на один или несколько операторов, введением новых блоков, заменой одних блоков другими.

Пятый этап - ввод программы и исходных данных в ЭВМ. Программа и исходные данные вводятся в ЭВМ с клавиатуры с помощью редактора текстов, и для постоянного хранения осуществляется их запись на гибкий или жесткий магнитный диск.

Шестой этап - тестирование и отладка программы. На этом этапе происходят исполнение алгоритма с помощью ЭВМ, поиск и исключение ошибок. При этом программисту приходится выполнять работу по проверке работы программы, поиску и исключению ошибок, и поэтому для сложных программ этот этап часто требует гораздо больше времени и сил, чем написание первоначального текста программы. Отладка программы - сложный и нестандартный процесс. Исходный план отладки заключается в том, чтобы оттестировать программу на контрольных примерах.

Контрольные примеры стремятся выбрать так, чтобы при работе с ними программа прошла все основные пути блок-схемы алгоритма, поскольку на каждом из путей могут быть свои ошибки, а детализация плана зависит от того, как поведет себя программа на этих примерах: на одном она может зациклиться

5

Page 6: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

(т. е. бесконечно повторять одно и то же действие); на другом - дать явно неверный или бессмысленный результат и т. д. Сложные программы отлаживают отдельными фрагментами.

Седьмой этап - исполнение отлаженной программы и анализ результатов. На этом этапе программист запускает программу и задает исходные данные, требуемые по условию задачи.

Полученные в результате решения выходные данные анализируются постановщиком задачи, и на основании этого анализа вырабатываются соответствующие решения, рекомендации, выводы. Например, если при решении задачи на компьютере результат сложения двух чисел 2 и 3 будет 4, то следует сделать вывод о том, что надо изменить алгоритм и программу.

Возможно, что по итогам анализа результатов потребуются пересмотр самого подхода к решению задачи и возврат к первому этапу для повторного выполнения всех этапов с учетом приобретенного опыта. Таким образом, в процессе создания программы некоторые этапы будут повторяться до тех пор, пока мы получим алгоритм и программу, удовлетворяющие показанным выше свойствам.

Языки программированияЧтобы компьютер выполнил решение какой-либо задачи, ему необходимо

получить от человека инструкции, как ее решать. Набор таких инструкций для компьютера, направленный на решение конкретной задачи, называется компьютерной программой.

Современные компьютеры не настолько совершенны, чтобы понимать программы, записанные на каком-либо употребляемом человеком языке — русском, английском, японском. Команды, предназначенные для ЭВМ, необходимо записывать в понятной ей форме. С этой целью применяются языки программирования - искусственные языки, алфавит, словарный запас и структура которых удобны человеку и понятны компьютеру.

В самом общем смысле языком программирования называется фиксированная система обозначений и правил для описания алгоритмов и структур данных. Все языки программирования делятся на языки низкого, высокого и сверхвысокого уровня.

Язык программирования низкого уровня - это средство записи инструкций компьютеру простыми командами на аппаратном уровне. Такой язык отражает структуру данного класса ЭВМ и поэтому иногда называется машинно-ориентированным языком. Пользуясь системой команд, понятной компьютеру, можно описать алгоритм любой сложности. Запись программы на этом языке представляет собой последовательность нулей и единиц.

Существенной особенностью языков программирования низкого уровня является жесткая ориентация на определенный тип аппаратуры (систему команд процессора). В стремлении приспособить язык программирования низкого уровня к человеку разработан язык символического кодирования (автокод или язык ассемблера), структура команд которого определяется

6

Page 7: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

форматами команд и данными машинного языка. Программа на таком языке ближе человеку, потому что операторы этого языка — те же команды, но они имеют мнемонические названия, а в качестве операндов используются не конкретные адреса в оперативной памяти, а их символические имена.

Более многочисленную группу составляют языки программирования высокого уровня, средства которых допускают описание задачи в наглядном, легко воспринимаемом виде. Отличительной особенностью этих языков является их ориентация не на систему команд той или иной ЭВМ, а на систему операторов, характерных для записи определенного класса алгоритмов. К языкам программирования этого типа относятся: Бейсик, Фортран, Алгол, Паскаль, Си. Программа на языках высокого уровня записывается системой обозначений, близкой человеку (например, фиксированным набором слов английского языка, имеющих строго определенное назначение). Программу на языке высокого уровня проще понять и значительно легче отладить.

К языкам программирования сверхвысокого уровня можно отнести Алгол, при разработке которого сделана попытка формализовать описание языка, приведшая к появлению абстрактной и конкретной программ. Абстрактная программа создается программистом, конкретная - выводится из первой. Предполагается, что при таком подходе принципиально невозможно породить неверную синтаксически (а в идеале и семантически) конкретную программу. Язык APL относят к языкам сверхвысокого уровня за счет введения сверхмощных операций и операторов. Запись программ на таком языке получается компактной.

Все вышеперечисленные языки - вычислительные. Более молодые - декларативные (непроцедурные) языки, отличительная черта которых - задание связей и отношений между объектами и величинами и отсутствие определения последовательности выполнения действий (Пролог). Такие языки сыграли важную роль в программировании, так как они дали толчок к разработке специализированных языков искусственного интеллекта и языков представления знаний.

ТрансляторыТак как текст записанной на Паскале программы не понятен компьютеру,

то требуется перевести его на машинный язык. Такой перевод программы с языка программирования на язык машинных кодов называется трансляцией (translation — перевод), а выполняется он специальными программами - трансляторами.

Существует три вида трансляторов: интерпретаторы, компиляторы и ассемблеры.

Интерпретатором называется транслятор, производящий пооператорную (покомандную) обработку и выполнение исходной программы.

Компилятор преобразует (транслирует) всю программу в модуль на машинном языке, после этого программа записывается в память компьютера и лишь потом исполняется.

7

Page 8: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Ассемблеры переводят программу, записанную на языке ассемблера (автокода), в программу на машинном языке.

Любой транслятор решает следующие основные задачи:• анализирует транслируемую программу, в частности определяет,

содержит ли она синтаксические ошибки;• генерирует выходную программу (ее часто называют объектной или

рабочей) на языке команд ЭВМ (в некоторых случаях транслятор генерирует выходную программу на промежуточном языке, например, на языке ассемблера);

• распределяет память для выходной программы (в простейшем случае это заключается в назначении каждому фрагменту программы, переменным, константам, массивам и другим объектам своих адресов участков памяти).

Язык программирования ПаскальЯзык программирования Паскаль (назван в честь выдающегося

французского математика и философа Блеза Паскаля (1623 — 1662)), разработан в 1968 — 1971 гг. Н.Виртом. Язык Паскаль, созданный первоначально для обучения программированию как систематической дисциплине, скоро стал широко использоваться для разработки программных средств в профессиональном программировании.

Благодаря своей компактности, удачному первоначальному описанию Паскаль оказался достаточно легким для изучения. Язык программирования Паскаль отражает фундаментальные и наиболее важные концепции (идеи) алгоритмов в очевидной и легко воспринимаемой форме, что предоставляет программисту средства, помогающие проектировать программы. Язык Паскаль позволяет четко реализовать идеи структурного программирования и структурной организации данных. Язык Паскаль сыграл большую роль в развитии методов аналитического доказательства правильности программ и позволил реально перейти от методов отладки программ к системам автоматической проверки правильности программ.

Применение языка Паскаль значительно подняло "планку" надежности разрабатываемых программ за счет требований Паскаля к описанию используемых в программе переменных, проверки согласованности программы при компиляции без ее выполнения.

Использование среды программирования ТУРБО ПАСКАЛЬ

Разработка программ на Паскале включает в себя следующие действия (этапы разработки программы): ввод и редактирование текста программы на языке программирования Паскаль, ее трансляцию, отладку.

Для выполнения каждого этапа применяются специальные средства: для ввода и редактирования текста используется редактор текстов, для трансляции программы - компилятор, для построения исполняемого компьютером программного модуля с объединением разрозненных откомпилированных модулей и библиотекой стандартных процедур Паскаля -

8

Page 9: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

компоновщик (linker), для отладки программ с анализом ее поведения, поиском ошибок, просмотром и изменением содержимого ячеек памяти компьютера - отладчик (debugger).

Систему программирования Турбо Паскаль называют интегрированной (integration — объединение отдельных элементов в единое целое) средой программирования, так как она объединяет в себе возможности ранее разрозненных средств, используемых при разработке программ: редактора текстов, компилятора, компоновщика, отладчика, и при этом обеспечивает программисту великолепные сервисные возможности. Часто ее кратко называют IDE (Integrated Development Environment - интегрированная среда разработки).

Порядок выполнения работы1. Изучить теоретические сведения по теме ” Блок-схемы как графическое

представление алгоритмов. Основные блоки, используемые в блок- схемах алгоритмов”.

2. Получить у преподавателя индивидуальные вопросы согласно заданному варианту.

3. Ответить на контрольные вопросы.Контрольные вопросы

1. Основные этапы решения задач на компьютере.2. Языки программирования. Краткое описание каждого.3. Трансляторы, компиляторы, отладчики, интерпретаторы.4. Язык программирования Паскаль. Этапы разработки программ на

Паскале. Интегрированная среда разработки.

Лабораторная работа № 2Построение блок-схем алгоритмов

Цель работы: формирование знаний и умений по работе с блок-схемами алгоритмов.

Краткие теоретические сведенияПонятие алгоритма в программировании является фундаментальным. Для

алгоритма важен не только набор определенных действий, но и то, как они организованы, т.е. в каком порядке они выполняются. Это одно из общих свойств алгоритма. Другое общее свойство алгоритма состоит в том, что каждое последующее действие выполняется лишь после завершения предшествующего.

Свойства алгоритмаПри составлении и записи алгоритма необходимо обеспечить, чтобы он

обладал рядом свойств. Рассмотрим эти свойства на следующем примере: пусть требуется вычислить сумму двух целых чисел и вывести на экран результат.

9

Page 10: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Однозначность алгоритма, под которой понимается единственность толкования исполнителем правил выполнения действий и порядка их выполнения. Чтобы алгоритм обладал этим свойством, он должен быть записан командами из системы команд исполнителя.Для нашего примера исполнитель алгоритма должен понимать такую запись действий, как сложить числа А и В.

Конечность алгоритма - обязательность завершения каждого из действий, составляющих алгоритм, и завершимость выполнения алгоритма в целом, т.е. алгоритм должен заканчиваться после конечного числа шагов.

Результативность алгоритма, предполагающая, что выполнение алгоритма должно завершиться получением определенных результатов. Алгоритм в нашем примере обладает этим свойством, так как для целых чисел А и В всегда будет вычислена сумма.

Массовость, т. е. возможность применения данного алгоритма для решения целого класса задач, отвечающих общей постановке задачи. Для того чтобы алгоритм обладал свойством массовости, следует составлять алгоритм, используя обозначения величин и избегая конкретных значений.

Правильность алгоритма, под которой понимается способность алгоритма давать правильные результаты решения поставленных задач. Представленный в примере алгоритм обладает свойством правильности, так как в нем использована правильная формула сложения целых чисел, и для любой пары целых чисел результат выполнения алгоритма будет равен их сумме.

Определенность алгоритма. Каждый шаг алгоритма должен быть определен.

Входные данные алгоритма. Алгоритм должен иметь некоторое (может быть равное 0) число входных данных.

Выходные данные алгоритма. Результатом выполнения алгоритма должна быть одна или несколько выходных величин, зависящих от исходных данных.

Эффективность алгоритма. Алгоритм должен быть эффективным, т.е. результат должен быть получен наименьшим числом наиболее простых операций.

Типы вычислительных процессовВычислительные процессы могут быть: линейные, разветвляющиеся и

циклические.Линейные алгоритмы - это алгоритм, в котором все его действия

выполняются одно за другим, т.е. последовательно. Однако в большинстве вычислительных процессов мы сталкиваемся с тем, что выбор хода дальнейших действий определяется результатом предыдущих. Такие алгоритмы называются разветвляющимися.

Разветвляющиеся алгоритмы - это алгоритмы, в которых в зависимости от выполнения или не выполнения некоторого условия совершается одна или другая последовательность действий.

10

Page 11: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Циклические алгоритмы- алгоритмы, в которых одна и та же последовательность действий совершается несколько раз до тех пор, пока выполняются некоторые условия. На рисунке представлено графическое представление вычислительных процессов

Рисунок 2 Типы вычислительных процессов

Блок-схемы алгоритмовБлок схема – это графическое представление алгоритма при помощи

стандартных обозначений. Блок схемы составляются в соответствии с ГОСТами. ГОСТы алгоритмов: ГОСТ 19.002-80, ГОСТ 19.003-80. На схемах алгоритмов выполняемые действия изображаются в виде отдельных блоков, которые соединяются между собой линиями связи в порядке выполнения действий. На линиях связи могут ставиться стрелки, причем, если направление связи слева направо или сверху вниз, то стрелки не ставятся. Блоки нумеруются. Внутри блока дается информация о выполняемых действиях.

11

Page 12: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Таблица 1 – Основные блоки, используемые при составлении алгоритмовНазвание Обозначение Назначение

Пуск, Останов Начало-конец алгоритма

Процесс Любое вычислительное действие

Решение Проверка условия

Модификатор Цикл

Ввод-вывод Ввод-вывод данных

Документ Вывод на печатающее устройство

Соединитель Используется на линиях разрыва

Комментарий Комментарий

Примеры составления блок-схемы алгоритмаПример 1. Составить схему алгоритма вычисления значения :

Для начала для построения блок –схемы алгоритма опишем последовательность действий, необходимых для решения данной задачи: начало ввод чисел a,b вычисление х вычисление z вывод результата конец

Исходя из этого составляем блок-схему алгоритма согласно ГОСТ, используя соответствующие блоки.

12

Page 13: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Пример 2. Составить схему алгоритма вычисления значения: x=a+b при a>b, x=a*b, при a<=b.

13

Page 14: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Пример 3. Составить схему алгоритма вычисления значения:

Для начала для построения блок –схемы алгоритма опишем последовательность действий, необходимых для решения данной задачи:

Исходя из этого составляем блок-схему алгоритма согласно ГОСТ, используя соответствующие блоки.

Порядок выполнения работы1. Изучить теоретические сведения по теме ”Построение блок-схем

алгоритмов”.2. Получить у преподавателя индивидуальное задание и нарисовать блок-схему

алгоритма согласно заданному варианту.3. Ответить на контрольные вопросы.

Контрольные вопросы1. Свойства алгоритма. Типы вычислительных процессов.

14

Page 15: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

2. Блок схемы. Понятие и правила построения.3. Примеры построения блок-схем алгоритмов.

Лабораторная работа № 3Вызов интегрированной среды (ИС) языка программирования

Паскаль. Структура основного экрана. Изучение меню

Цель работы: формирование знаний и умений по работе с интегрированной средой ЯП Паскаль. Приобретение навыков работы с меню ИС ЯП Паскаль.

Краткие теоретические сведения

Интегрированная среда языка программирования ТУРБО ПАСКАЛЬ

Разработка программ на Паскале включает в себя следующие действия (этапы разработки программы): ввод и редактирование текста программы на языке программирования Паскаль, ее трансляцию, отладку.

Для выполнения каждого этапа применяются специальные средства: для ввода и редактирования текста используется редактор текстов, для трансляции программы - компилятор, для построения исполняемого компьютером программного модуля с объединением разрозненных откомпилированных модулей и библиотекой стандартных процедур Паскаля - компоновщик (linker), для отладки программ с анализом ее поведения, поиском ошибок, просмотром и изменением содержимого ячеек памяти компьютера- отладчик (debugger).

Для повышения качества и скорости разработки программ в середине 80-х гг. была создана система программирования Турбо Паскаль. Слово Турбо в названии системы программирования — это отражение торговой марки фирмы-разработчика Borland International, Inc. (США).

Систему программирования Турбо Паскаль называют интегрированной (integration - объединение отдельных элементов в единое целое) средой программирования, так как она объединяет в себе возможности ранее разрозненных средств, используемых при разработке программ: редактора текстов, компилятора, компоновщика, отладчика, и при этом обеспечивает программисту великолепные сервисные возможности. Часто ее кратко называют IDE (Integrated Development Environment - интегрированная среда разработки).

Интегрированная среда программирования Турбо Паскаль версий 6.0 и 7.0 имеет следующие возможности:

• множество накладывающихся окон;• поддержка мыши, меню, диалоговых окон;

15

Page 16: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

• многофайловый редактор, который может редактировать файлы до 1 Мбайта;

• расширенные возможности отладки;• полное сохранение и восстановление среды разработки.К ее существенным отличиям от среды программирования Турбо Паскаль

более ранних версий относятся: • объектно-ориентированная среда разработки прикладных программ Turbo

Vision;• полные возможности встроенного ассемблера;• личные поля и методы в объявлении объектов;• директива расширенного синтаксиса $Х, которая позволяет вам интерпретировать функции как процедуры (и игнорировать результаты функций);• директивы ближних и дальних процедур;• расширенные возможности встроенной справочной системы с использованием вырезки и вставки кода примеров для каждой библиотечной процедуры и функции.

Основные файлы пакета Турбо ПаскальДопустим, что система программирования Турбо Паскаль установлена на

диске D: в каталоге D:\BORLAND\BP, то в каталоге ..\ВР находятся следующие основные файлы Турбо Паскаля:

TURBO.EXE — интегрированная среда программирования;TURBO.HLP — файл, содержащий данные для оперативной подсказки;TURBO.TP — файл конфигурации системы;TURBO.TPL — библиотека стандартных модулей Турбо Паскаля.В каталоге D:\BORLAND\BP\BGI находятся файлы, необходимые для

работы в графическом режиме: GRAPH.TPU — модуль с графическими процедурами и функциями Турбо Паскаля, несколько файлов с расширением .BGI — драйверы различных типов видеосистем компьютеров, несколько файлов с расширением .CHR, содержащих векторные шрифты.

Запуск интегрированной среды программирования Турбо Паскаль

Для запуска интегрированной среды программирования нужно установить текущим каталог с Турбо Паскалем и (или) ввести команду: turbo.ехе. После запуска программы экран компьютера будет иметь вид, показанный на рисунке 3

16

Page 17: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Рисунок 3 Окно интегрированной среды Турбо Паскаль

На экране отображаются три видимых компонента интегрированной среды программирования: полоса меню в верхней части, область окна в центре и строка статуса внизу.Полоса меню и подменю. Полоса меню является основным доступом ко всем командам меню. Она становится невидимой только в то время, когда вы просматриваете вывод своей программы. Если полоса меню активна, то заголовок меню будет высвечен; это текущее выбранное меню. Если за командой меню следует знак многоточия (...), выбор команды приведет к выводу диалогового окна. Если за командой следует стрелка (>), то команда ведет в другое меню. Команда без знака многоточия или без стрелки указывает, что как только вы ее выберете, произойдет какое-то действие.Строка статуса. Строка статуса отображается в нижней строке экрана и вы-полняет следующие функции:

• напоминает основные строки ключей и сокращений (или горячих клавиш), допустимых в этот момент в активном окне;• предоставляет самый быстрый вариант выполнения действий, отмечая горячие клавиши в строке статуса мышью вместо выбора команд из меню или нажатия последовательности клавишей;• содержит информацию о том, какая функция выполняется. Например, когда сохраняется редактируемый файл, в строке статуса выводится сообщение: "Saving filename...";• предлагает краткие советы по выбранной команде меню и элементам

диалогового окна.При смене окна или изменении характера деятельности информация в

строке статуса сразу же меняется. Одна из наиболее характерных строк статуса

17

Page 18: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

- та, которую вы видите во время написания и редактирования программ в окне редактора.

Работа с меню ИСПосле запуска среды программирования Турбо Паскаль 7.0 в верхней

части экрана выводится меню:File Edit Search Run Compile Debug Tools Options Window Help

Пункт меню File (файлы) выбирается нажатием F10 - File или Alt+F.Меню FileМеню File позволяет открывать и создавать файлы с программами в окнах

редактора, а также сохранять изменения, выполнять другие файловые функции, осуществлять временный выход в DOS и выходить совсем из среды программирования. После выбора этого пункта меню на экран выводится выпадающее меню.

Команда New (новый) открывает новое редакционное окно с именем по умолчанию NONAMEXX.PAS (вместо XX устанавливаются числа от 0 до 99) и автоматически делает его активным.

Команда Open (открыть) - F3 показывает диалоговое окно с выбором программных файлов для их открытия в окне редактора. Это диалоговое окно содержит окно ввода, список файлов, кнопки, помеченные как Open (Открыть), Replace (Заменить), Cancel (Отказ) и Help (Справочная информация), и информационную панель, описывающую выбранный файл.

Команда Save (сохранить)- F2 сохраняет файл, находящийся в активном окне редактора, на диск.

Команда Save As (сохранить как) позволяет сохранить файл, находящийся в активном окне редактора, под другим именем, в другом каталоге, на другом устройстве.

Команда Save all (сохранить все) работает точно так же, как команда Save, за исключением того, что она сохраняет содержание всех модифицированных файлов, а не только файл, находящийся в активном окне редактора. Эта команда недоступна, если ни одно окно редактора не открыто.

Команда Change dir (изменить справочник) позволяет с помощью диалогового окна Change Directory задать устройство и каталог как текущий. Текущий каталог-это каталог, который Турбо Паскаль использует для сохранения файлов и их поиска. (При использовании относительных путей в Options/Directories они относятся только к текущему каталогу).

Меню SearchМеню Search (поиск) выбирается нажатием Alt+S. Оно позволяет

осуществлять поиск текста, объявления процедур и месторасположение ошибок в ваших файлах. После выбора этого пункта меню на экран выводится выпадающее меню.

Команда Find (найти) - Alt+S+F (или Ctrl+Q+F) показывает диалоговое окно Find, позволяющее набрать текст, который вы хотите найти, и установить опции, влияющие на поиск.

18

Page 19: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Диалоговое окно поиска содержит несколько кнопок:• Options (опции);• Case sensitive - различение прописных и строчных букв;•Whole words only-только целые слова;• Regular expression — регулярное выражение. Включайте эту кнопку в том

случае, если хотите, чтобы Турбо Паскаль распознавал спецификаторы ^ , $,., *, +, [], \ в строке поиска.

Команда Replace (заменить)- Alt+S+R (или Ctrl+Q+A) выводит диалоговое окно, позволяющее набирать образец текста для поиска и образец текста, на который его надо заменить. Дополнительная кнопка Prompt on replace (подсказка для замены) управляет подсказкой для каждой замены.

Команда Search Again (поиск вновь) - Ctrl+L повторяет последнюю команду Find или Replace.

Команда Go to line number (идти к строке номер) выдает подсказку номера строки, которую вы хотите найти.

Команда Show last compiler error показывает последнюю ошибку компилятора в верхней части экрана и позиционирует курсор возле ошибки. Если последняя компиляция удачна, то сообщение не высвечивается.

Команда Find error (поиск ошибки)- Alt+F8 находит местоположение ошибки времени выполнения.

Команда Find procedure (поиск процедуры) выводит диалоговое окно, позволяющее ввести имя процедуры для поиска. Эта команда доступна только во время сеанса отладки.

Меню RunМеню Run (выполнение) выбирается нажатием Alt+R. Команды меню

запуска запускают вашу программу, а также начинают и заканчивают сеансы отладки. После выбора этого пункта меню на экран выводится выпадающее меню.

Команда Run (выполнение) - Ctrl+F9 запускает вашу программу, используя параметры, которые вы передали в нее с помощью команды Run/Parameters. Если со времени последней компиляции исходный код был модифицирован, то встроенный менеджер проекта автоматически перекомпилирует и отредактирует вашу программу.

Команда Program reset (сброс программы)- Ctrl+F2 прекращает текущий сеанс отладки, освобождает память, размещенную под вашу программу и закрывает все открытые файлы, используемые программой.

Команда Go to cursor (перейти на курсор) - F4 выполняет программу до строки, на которой стоит курсор в текущем окне редактора. Если курсор стоит на строке, которая не содержит выполнимое утверждение, команда выдаст предупреждение.

Команда Trace into (пошаговая трассировка) - F7 выполняет вашу программу утверждение за утверждением. Когда она достигает вызова процедуры, то выполняет каждое утверждение внутри процедуры, вместо выполнения процедуры как одного. Если утверждение не содержит вызова

19

Page 20: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

процедур, доступных отладчику, Trace into остановится на следующем выполнимом утверждении.

Команда Step over (шаг через) - F8 выполняет следующие утверждения в текущей процедуре. Она не выполняет трассировку внутрь вызовов процедур нижнего уровня, даже если они доступны отладчику.

Меню CompileМеню Compile (компиляция) выбирается нажатием Alt+C. Используется

для того, чтобы сделать compile, make или build программы в активном окне. После выбора этого пункта меню на экран выводится выпадающее меню.

Команда Compile (компиляция) - Alt+F9 компилирует активный файл редактора. При этом на экран выводится окно статуса, показывающее результаты компиляции. Когда компиляция завершается, нажмите любую клавишу, чтобы удалить это окно. Если происходит какая-нибудь ошибка или предупреждение, окно редактора, содержащее исходный код с ошибкой, становится активным, появляется сообщение об ошибке, а курсор устанавливается на местоположении первой ошибки.

Команда Make (сборка)- F9 вызывает встроенный менеджер проекта для создания .ЕХЕ -файла.

Команда Build (полная сборка) перекомпилирует все файлы независимо от их даты. Эта команда подобна команде Compile/ Make за исключением того, что она не имеет условий.

Команда Destination (назначение) позволяет определить, будет ли выполняемый код храниться на диске (как файл .ЕХЕ) или он будет храниться в памяти (и, таким образом, теряться при выходе из Турбо Паскаль).

Команда Information открывает окно, в котором выдается информация о последней скомпилированной программе, текущем состоянии памяти и окружения.

Меню DebugМеню Debug (отладка) выбирается нажатием Alt+D. Команды меню

отладки управляют всеми свойствами интегрированного отладчика. После выбора этого пункта меню на экран выводится выпадающее меню.

Команда Breakpoints (точки прерывания) открывает диалоговое окно, позволяющее управлять использованием безусловных точек прерывания. Оно показывает все установленные точки прерывания, номера их строк и условия. Условие имеет архивный список, позволяющий выбрать условие точки прерывания, использованное ранее.

Команда Call stack - Ctrl+F3 открывает окно, в котором показана последовательность процедур, вызываемых исполняемой программой. В окне содержатся имена процедур и значения передаваемых им параметров.

Команда Register открывает окно, показывающее регистры CPU (центрального процессора), используемые обычно при отладке модулей на ассемблере. Верхняя половина окна показывает содержимое регистров, а нижняя- содержимое восьми флагов.

20

Page 21: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Команда Watch открывает окно, в котором содержатся выражения и их изменяющиеся значения. Элементы окна добавляются или убираются командой Add Watch.

Команда Add watch (добавить выражение для просмотра) - Ctrl+F7 вставляет выражение просмотра в окно Watch. При выборе этой команды отладчик открывает диалоговое окно и выдает подсказку для ввода выражения просмотра. Выражением по умолчанию является слово, на котором стоит курсор в текущем окне редактора. Имеется также архивный список, который можно применить для быстрого ввода выражения, использованного ранее. Если окно Watch является активным, можно вставить новое выражение для просмотра посредством нажатия Ins.

Команда Add breakpoint открывает диалоговое окно, в котором задаются параметры новой точки прерывания. В поле Condition вводится условие, по выполнении которого происходит прерывание. В поле Pass Count устанавливается число проходов контрольной точки, после выполнения которых произойдет останов. В поле File Name записывается полное путевое имя исходного файла, содержащего текущую контрольную точку. В поле Line Number показывается номер строки, содержащей текущую точку прерывания. Можно ввести новое значение номера.

Меню ToolsМеню Tools (сервисные средства) выбирается нажатием Alt+T. Данное

меню обеспечивает различные отладочные команды сообщения, следуемые за списком по умолчанию программ и любых программ, установленных пользователем с помощью команды Options/Tools/Transfer.

Команда Messages открывает окно, в котором отображается информация из программы, выдаваемая посредством фильтра DOS (типа GREP).

Команда Go to next - Alt+F8 позволяет перейти к следующему элементу списка. Список содержит имена программ, которые можно запускать, не выходя из Турбо Паскаля. Такие программы называются трансферными. По окончании такой программы выполняется возврат в среду программирования.

Команда Go to previous- Alt+F7 осуществляет переход к предыдущему элементу списка.

Меню OptionsМеню Options (опции) выбирается нажатием Alt+0. Оно содержит

команды, позволяющие посмотреть и изменить различные установки по умолчанию в Турбо Паскале. Большинство команд меню приводит к появлению диалогового окна. После выбора этого пункта меню на экран выводится выпадающее меню.

Команда Compiler... (компилятор) выводит меню, которое предоставляет несколько опций для установки, влияющих на компиляцию кода.

Команда Memory sizes (размеры памяти) позволяет определить потребности памяти по умолчанию для программы. Все три установки можно задать в своем исходном коде, используя директиву компилятора $М. В поле Stack Size задается размер (в байтах) сегмента стека. Размер по умолчанию 16,384, максимальный размер—65,520.В окне Low Heap Limit задается

21

Page 22: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

минимальный требуемый размер кучи (в байтах). По умолчанию минимальный размер равен 0 Кбайт. В окне High Heap Limit задается максимальный требуемый размер кучи (в байтах). По умолчанию максимальный размер равен 655,360, который (в большинстве систем) распределит всю доступную память в кучу. Это значение должно быть больше или равно наименьшему размеру кучи.

Команда Linker (редактор связей) позволяет сделать несколько установок, влияющих на редактирование.

Команда Debugger (отладчик) открывает диалоговое окно, чтобы сделать несколько установок, влияющих на интегрированный отладчик.

Команда Directories (каталоги) определяет в Турбо Паскале, где искать файлы, необходимые для компиляции, редактирования связей и файлы вывода.

Назначение каждого окна ввода:• ЕХЕ and TPU Directory задает каталог вывода для файлов .ЕХЕ

или .TPU. Если ввода в этом окне не было, файлы будут храниться в каталоге, где находятся исходные файлы.

• Include Directories задает каталог, содержащий стандартные включаемые файлы.

• Unit Directories задает каталоги, содержащие ваши файлы модулей Турбо Паскаля.

• Object Directory используется для задания каталогов, содержащих файлы .OBJ (подпрограммы ассемблерного языка).

Команда Tools открывает диалоговое окно, с помощью которого можно добавлять новые или убирать программы из меню Tools. Поле Program titles содержит список для обзора, добавления или изъятия трансферных программ.

Команда Environment (среда) дает возможность сделать установки для среды. Эта команда открывает меню, позволяющее выбрать установки из опций Preferences, Editor и Mouse.

Меню WindowМеню Window(окна) выбирается нажатием Alt+W. Оно содержит команды

управления окном. Большинство из окон, которые вы откроете из этого меню, имеют все стандартные элементы окна скроллинг, закрывающую кнопку и кнопки масштабирования, позволяющие посмотреть и изменить различные установки по умолчанию в Турбо Паскале. Первые девять окон пронумерованы. Для выбора окна по номеру задать Alt+N окна. После выбора этого пункта меню на экран выводится меню.

Расположение открытых окон определяют команды Tile (черепица - неперекрывающееся расположение окон) и Cascade (каскад- расположение окон одно за другим с просмотром только активного окна, а для других окон видны только имена файлов и номера окон).

Команда Close all закрывает все окна.Команда Refresh display восстанавливает экран, если программа его

случайно испортила.Команда Size/Move - Ctrl+F5 позволяет задать размер и позицию окна на

экране.

22

Page 23: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Команда Zoom - F5 раскрывает активное окно во весь экран. Если окно уже расширено, то команда восстанавливает его текущий размер.

Команда Next - F6 активизирует следующее окно.Команда Previous- Shift+F6 активизирует предыдущее окно, т. е. окно,

бывшее активным перед текущим.Команда Close - Alt+F3 закрывает текущее окно.Команда List - Alt+0 используется для получения списка всех открытых

окон.Меню HelpМеню Help (помощь) выбирается нажатием Alt+H. Оно дает доступ к

встроенной справочной информации в специальном окне. Справочная информация имеется по всем аспектам интегрированной среды Турбо Паскаль. (Также в строке статуса появляются подсказки для меню в одну строку и диалоговых окон, когда бы ни была выбрана команда.) После выбора этого пункта меню на экран выводится выпадающее меню.

Вы можете нажать Ctrl+F 1 на любом слове для получения справочной информации. Если слово не найдено, выполняется поиск вперед по оглавлению и показывается ближайший соответствующий текст.

Команда Contents (содержание) открывает окно Help с основной таблицей содержания. Из этого окна можно перейти к любой другой части системы справочной информации.

Команда Index (оглавление)- Shift+Fl открывает диалоговое окно, показывающее полный список ключевых слов справочной информации (специально высвеченный текст на экране справочной информации, позволяющий быстро передвигаться к соответствующему экрану).

Команда Topic search (поиск раздела) - Ctrl+Fl показывает справочную информацию по языку и по текущему выбранному элементу.

Порядок выполнения работы1. Изучить теоретические сведения по теме: “Вызов интегрированной среды

(ИС) языка программирования Паскаль. Структура основного экрана. Изучение меню”.

2. Откройте интегрированную среду Турбо Паскаль и найдите все элементы экрана, описанные в данной лабораторной работе. Изучите пункты меню ИС. Наиболее часто используемые пункты меню законспектируйте.

3. Ответить на контрольные вопросы.Контрольные вопросы

1. Интегрированная среда (ИС) Турбо Паскаль. Возможности.2. Структура экрана. Основные элементы.3. Меню ИС. Основные пункты.

23

Page 24: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Лабораторная работа № 4Написание программы на Паскале с использованием операторов

ввода-вывода данных

Цель работы: формирование знаний и умений по работе с простейшими операторами языка. Приобретение навыков написания программ с использованием операторов ввода-вывода данных.

Краткие теоретические сведенияРешение самой простой задачи на ЭВМ не обходится без операций ввода-

вывода информации. Ввод данных - это передача информации от внешнего носителя (например, экрана) в оперативную память для обработки. Вывод информации - обратный процесс, когда данные передаются после обработки из оперативной памяти на экран (внешний носитель).

В языке Паскаль стандартным средством общения пользователя и ЭВМ являются предопределенные файлы Input и Output, которые по умолчанию являются параметрами программы. Программа получает входные данные из файла Input и помещает результат обработки в файл Output. Стандартно файлу Input назначена клавиатура, а файлу Output-экран.

Процедуры ввода-выводаДля выполнения операций ввода-вывода служат четыре процедуры: Read,

Readln, Write, WriteLn. Процедура чтения ReadПроцедура чтения Read обеспечивает ввод числовых данных, символов,

строк и т.д. для последующей их обработки программой.Формат процедуры Read:Read (x1, x2, …, xn);

илиRead (fv, x1, x2, …, xn);где x1, x2, …, xn- переменные допустимых типов данных; fv- переменная,

связанная с файлом, откуда будет выполняться чтение. Значения x1, x2, …, xn набираются минимум через один пробел на

клавиатуре и высвечиваются на экране. После набора данных для одной процедуры Read нажимается клавиша ввода Enter.

Значения переменных должны вводится в строгом соответствии с синтаксисом языка Паскаль. Если соответствие нарушено (например, х1 имеет тип Integer, а при вводе набирается значение типа Char), то возникают ошибки ввода-вывода. Сообщение об ошибке имеет вид: I/O error XX, где ХХ - код ошибки.

. . .Var

I:Real;J:Integer;K:Char;

24

Page 25: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

BeginRead(I,J,K);

. . .Первый вариант ввода данных: 21,5 23 ’B’ Второй вариант ввода данных: 34 ’A’ 12 ,4 Первый вариант обеспечивает правильный ввод данных, так как

набираемые значения 21,5 23 ’B’ соответствуют типам переменных I, J, K в процедуре Read. Второй вариант ввода вызовет ошибку, так как для переменной I типа Real вводится значение типа Char.

Если в программе имеется несколько процедур Read, данные для них вводятся потоком, т.е. после считывания значений переменных для одной процедуры Read данные для следующей процедуры Read набираются в той же строке, что и для предыдущей, до окончания строки, затем происходит переход на следующую строку.

. . .Var

A, B, Sum1: Integer;C, D, Sum2: Real;. . .

BeginRead (A, B);Sum1:=A+B;Read (C, D);Sum2:=C+D;

. . .End.В результате на экране появятся те данные, которые пользователь вводит с

клавиатуры. Например:12 34 12,5 34,5Процедура чтения ReadLnПроцедура чтения ReadLn аналогична процедуре Read, единственное

отличие заключается в том, что после считывания последнего в списке значения для одной процедуры ReadLn данные для следующей процедуры ReadLn будут считываться с начала новой строки.

. . . ReadLn (A, B);Sum1:=A+B;ReadLn (C, D);Sum2:=C+D;

. . .После набора на клавиатуре значений для A и B курсор автоматически

перейдет на новую строку, где будут набираться данные для C и D.Например:12 34 12,5 34,5

25

Page 26: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Процедуры записи Write, WriteLnПроцедура записи Write производит вывод числовых данных, символов,

строк, булевских значений. Формат процедуры Write:Write (y1,y2, . . . yn);илиWrite (fv,y1,y2, . . . ,yn);где y1, y2, …, yn- переменные допустимых типов данных; fv- имя файла,

куда производится вывод.Для вывода на принтер fv равно Lst. Чтобы устройство Lst стало

доступным, необходимо подключить модуль Printer с помощью зарезервированного слова Uses:

Uses Printer;Var

. . .Begin

Write (234); {выражение представлено значением}Write(A+B-2);{выводится результат выражения}Write(Lst, ’Результат вычислений = ’, Result);{данные выводятся на

принтер}End.Процедура записи WriteLn аналогична процедуре Write, единственное

отличие заключается в том, что после вывода последнего в списке значения для одной процедуры WriteLn данные для следующей процедуры WriteLn будут выводиться с начала новой строки.

Порядок выполнения работы1. Изучить теоретические сведения по теме “Операторы ввода-вывода

данных”.2. Получить индивидуальное задание у преподавателя и разработать

программу в соответствии с поставленной задачей.3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Общие сведения о вводе-выводе данных.2. Процедуры ввода данных. Read. Формат, примеры.3. Процедура ReadLn. Формат, примеры. 4. Процедуры вывода данных. Write, WriteLn. Форматы, примеры.

26

Page 27: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Лабораторная работа № 5Написание программы на Паскале

с использованием операторов ввода-вывода данных с различными форматами выводимых данных

Цель работы: формирование знаний и умений по работе с простейшими операторами языка. Приобретение навыков написания программ с использованием различных форматов вывода данных.

Краткие теоретические сведенияВ процедурах вывода Write и WriteLn имеется возможность записи

выражения, определяющего ширину поля вывода. В приведенных ниже форматах используются следующие обозначения:

I, p, q – целочисленное выражение;R –выражение вещественного типа;B – выражение булевского типа;Ch –выражение символьного типа;S –выражение строкового типа;# -цифра;* - знак “+” или “-“;_-пробел.

I-выводится десятичное представление величины I, начиная с позиции расположения курсора.

Значение I Выражение Результат 134 Write (I); 134 287 Write (I,I,I); 287287287

I:p -выводится десятичное представление величины I в крайние правые позиции поля шириной p.

Значение I Выражение Результат 134 Write (I: 6); _ _ _134 1 Write (I: 1); _ _ _ _ _ _ _ _ _ 1 312 Write (I+I:7) _ _ _ _624

R- в поле шириной 18 символов выводится десятичное представление величины R в формате с плавающей точкой. Если R>=0.0, используется формат _#.##########E*##.Если R<0.0, формат имеет вид: -#.##########E*##.

Значение R Выражение Результат 715.432 Write (R); _ _ 7.1543200000E+02 -1.919E+01 Write (R); _ -1.9190000000E+01 567.986 Write (R/2); _ _ 2.8399300000E+02

R:p –в крайние правые позиции поля шириной p символов выводится десятичное представление значения R в формате с плавающей точкой. Если

27

Page 28: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

R>=0.0, используется формат _ _…_##..#E*##, причем минимальная длина поля вывода составляет 7 символов. Если R<0.0, формат имеет вид: _ _ …_--#.##..#E*##. Минимальная длина поля вывода 8 символов. После десятичной точки выводится, по крайней мере, одна цифра.

Значение R Выражение Результат 511.04 Write (R:15); 5.110400000E+02 -511.04 Write (R:15); -5.11040000E+02 46.78 Write (-R:12); -4.67800E+01

R:p:q –в крайние правые позиции поля шириной p символов выводится десятичное представление значения R в формате с фиксированной точкой, причем после десятичной точки выводится q цифр (0<=q<=24), представляющих дробную часть числа. Если q=0, ни дробная часть, ни десятичная точка не выводится. Если q>24, то при выводе используется формат с плавающей точкой.

Значение R Выражение Результат 511.04 Write (R:8:4); 511.0400 -46.78 Write (R:15); _-46.78 -46.78 Write (R:9:4); _-46.7800

Ch-начиная с позиции курсора выводится значение Ch.Значение Ch Выражение Результат ’X’ Write (Ch); X ‘Y’ Write (Ch); Y ’!’ Write (Ch, Ch, Ch); !!!

Ch:p-в крайнюю правую позицию поля шириной p выводится значение Ch.Значение Ch Выражение Результат ’X’ Write (Ch:3); _ _X ‘Y’ Write (Ch:5); _ _ _ _Y ’!’ Write (Ch:2, Ch:4); _!_ _ _!

S- начиная с позиции курсора, выводится значение S (строка или массив символов, если его длина соответствует длине строки).

Значение S Выражение Результат’Day N’ Write (S); Day N ‘Ведомость 11’ Write (S); Ведомость 11’RRRDDD’ Write (S, S); RRRDDDRRRDDD

S:p- значение S выводится в крайние правые позиции поля шириной p символов.

Значение S Выражение Результат’Day N’ Write (S:10); _ _ _ _ _ Day N ‘Ведомость 11’ Write (S:13); _Ведомость 11’RRRDDD’ Write (S:7, S:7); _RRRDDD_RRRDDD

B- выводится результат выражения B True или False, начиная с текущей позиции курсора.

Значение B Выражение Результат True Write (B); True False Write (B, not B); False True

28

Page 29: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

B:p- в крайние правые позиции поля шириной p символов выводится результат булевского выражения B True или False.

Значение B Выражение Результат True Write (B:6); _ _ True

False Write (B:10); _ _ _ _ _False True Write (B:5,not B:7); _True_ _False Оператор записи WriteLn аналогичен процедуре Write, но после вывода

последнего в списке значения для текущей процедуры WriteLn происходит перевод курсора к началу следующей строки.

Процедура WriteLn, записанная без параметров, вызывает перевод строки. Пример программы с использованием процедур ввода-вывода данных

с различными форматами выводимых данныхProgram Demo;Var

A,B,S:Integer;Begin

Writeln(‘Введите сторону А = ’);Readln(A);Writeln(‘Введите сторону B = ’);Readln(B);S:=A*B;Writeln(‘--------------------------------------------‘);Writeln(‘ | Сторона А | | Сторона B | | Площадь | ‘);Writeln(‘---------------------------------------------‘);Writeln(‘|‘,А:7,B:11,S:11, ‘|‘ :5);Writeln(‘---------------------------------------------‘);

End.В результате работы данной программы на экране будет изображена

следующая таблица:--------------------------------------------------| Сторона А | | Сторона B | | Площадь | --------------------------------------------------| 8 4 32 | --------------------------------------------------

каждая строка которой будет печататься с первой позиции новой строки экрана. Порядок выполнения работы

1. Изучить теоретические сведения по теме “Операторы ввода-вывода данных. Различные форматы выводимых данных”.

2. Получить индивидуальное задание у преподавателя и разработать программу в соответствии с поставленной задачей.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

29

Page 30: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Контрольные вопросы1. Общие сведения о форматах выводимых данных.2. Форматы I, I:p. Примеры.3. Форматы R, R:p, R:p:q. Примеры.4. Форматы Ch, Ch:p. Примеры.5. Форматы S, S:p. Примеры.6. Форматы B, B:p. Примеры

Лабораторная работа № 6Написание программы на Паскале с использованием операторов

присваивания и безусловного перехода

Цель работы: формирование знаний и умений по работе с операторами языка. Приобретение навыков написания программ с использованием операторов присваивания и безусловного перехода.

Краткие теоретические сведения

Основные понятия и определенияБольшинство программ создаются для решения какой-либо задачи. В

процессе решения задачи на компьютере пользователю нужно ввести обрабатываемые данные, указать, как их обрабатывать, задать способ вывода полученных результатов. Поэтому программист должен знать:

• как ввести информацию в память (ввод);• как хранить информацию в памяти (данные);• как указать правильные команды для обработки данных (операции);• как передать обратно данные из программы пользователю (вывод). Команды должны быть упорядочены таким образом, чтобы:• некоторые из них выполнялись только в том случае, если соблюдается

некоторое условие или ряд условий (условное выполнение);• другие выполнялись повторно некоторое число раз (циклы);• третьи выделялись в отдельные части, которые могут быть неоднократно

выполнены в разных местах программы (подпрограммы).Таким образом, программист должен уметь использовать семь основных

элементов программирования: ввод, данные, операции, вывод, условное выполнение, циклы и подпрограммы.

Ввод означает считывание значений, поступающих с клавиатуры, с диска или из порта ввода-вывода.

Данные - это константы, переменные и структуры, содержащие числа (целые и вещественные), текст (символы и строки) или адреса (переменных и структур).

Операции осуществляют присваивание значений, их комбинирование (сложение, деление и т. д.) и сравнение значений (равные, неравные и т. д. ).

30

Page 31: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Вывод означает запись информации на экран, на диск или в порт ввода-вывода.

Условное выполнение предполагает выполнение набора команд в случае, если удовлетворяется (является истинным) некоторое условие (если это условие не удовлетворяется, то эти команды пропускаются или же выполняется другой набор команд) или если некоторый элемент данных имеет некоторое специальное значение или значение из некоторого спектра.

Благодаря циклам некоторый набор команд выполняется повторно или фиксированное число раз, или пока является истинным некоторое условие, или пока некоторое условие не стало истинным.

Подпрограмма представляет собой набор команд, который имеет имя и может быть неоднократно вызван из любого места программы по его имени.

Языком называется совокупность символов, соглашений и правил, используемых для общения. При записи алгоритма решения задачи на языке программирования необходимо четко знать правила написания и использования элементарных информационных и языковых единиц. Основой Паскаля, как и любого языка, является алфавит - конечный набор знаков, состоящий из букв, десятичных и шестнадцатеричных цифр, специальных символов.

Программа реализует алгоритм решения задачи. В ней программист записывает последовательность действий, выполняемых над определенными данными с помощью определенных операций для реализации заданной цели.

Основные характеристики программы: точность полученного результата, время выполнения и объем требуемой памяти. О соответствии этих показателей решаемой задаче и возможностям компьютера должен позаботиться сам программист. В большинстве случаев определяющим требованием является точность. Ограничения по объему памяти и времени выполнения носят менее жесткий характер.

Программа на языке Паскаль состоит из строк. Набор текста программы осуществляется с помощью встроенного редактора текстов системы программирования Турбо Паскаль или любого другого редактора формата DOS.

Максимальный размер программы ограничен. Компилятор позволяет обрабатывать программы и библиотечные модули, в которых объем данных и генерируемый машинный код не превышают 64 Кбайт каждый. Если программа требует меньшего количества памяти, следует использовать библиотечные модули (.TPU-файлы) или оверлейные структуры.

Оверлеи - части машинной программы, которые совместно используют общую область оперативной памяти. В один и тот же момент времени в памяти может находиться тот или иной оверлей в зависимости от выполняемой функции. В процессе выполнения программы эти части могут замещать друг друга в памяти.

Синтаксически программа состоит из необязательного заголовка и блока. Блок может содержать в себе другие блоки. Блок состоит из двух частей:

31

Page 32: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

описательной и исполнительной. Первая часть может отсутствовать, без второй блок не имеет смысла. Блок, который не входит ни в какой другой блок, называется глобальным. Если в глобальном блоке находятся другие блоки, они называются локальными. Глобальный блок - это основная программа, он должен присутствовать в любом случае. Локальные блоки - это процедуры и функции, их присутствие необязательно. Объекты программы (типы, переменные, константы и т.д.) соответственно называются глобальными и локальными. Область действия объектов - блок, где они описаны, и все вложенные в него блоки.

Операторы языка ПаскальОператором называется предложение языка программирования, задающее

полное описание некоторого действия, которое необходимо выполнить. Основная часть программы на языке Турбо Паскаль представляет собой последовательность операторов. Разделителем операторов служит точка с запятой. Все операторы языка Турбо Паскаль можно разделить на две группы: простые и структурные.

Операторы, не содержащие никаких других операторов, называются простыми. К ним относятся операторы присваивания, безусловного перехода, вызова процедуры и пустой оператор.

Оператор присваиванияОператор присваивания (:=) предписывает выполнить выражение,

заданное в его правой части, и присвоить результат переменной, идентификатор которой расположен в левой части. Переменная и выражение должны быть совместимы по типу.

Оператор присваивания выполняется следующим образом: сначала вычисляется выражение в правой части присваивания, а затем его значение присваивается переменной, указанной в левой части оператора.

Например, для оператора Rezult:=A div В;сначала выполняется целочисленное деление значения переменной А на

значение переменной В, а затем результат присваивается переменной Rezult.Примеры применения оператора присваивания:А:= 8;S:= A * В;Ostatok := A mod B;Ratio := A / B;Оператор безусловного перехода (go to)Оператор безусловного перехода (go to) означает "перейти к" и

применяется в случаях, когда после выполнения некоторого оператора надо выполнить не следующий по порядку, а какой-либо другой, отмеченный меткой оператор.

Напомним, что метка объявляется в разделе описания меток и может содержать как цифровые, так и буквенные символы.

32

Page 33: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

При использовании оператора go to необходимо помнить, что областью действия метки является только тот блок, в котором она описана. Передача управления в другой блок запрещена.

Правила использования оператора безусловного перехода. Использование безусловных передач управления в программе считается теоретически избыточным и подвергается серьезной критике, так как способствует созданию малопонятных и трудно модифицируемых программ, которые вызывают большие сложности при отладке и сопровождении. Поэтому рекомендуется минимальное использование оператора go to с соблюдением следующих правил:

• следует стремиться применять операторы перехода (если кажется невозможным обойтись без них) для передачи управления только вниз (вперед) по тексту программы; при необходимости передачи управления назад следует использовать операторы цикла;

• расстояние между меткой и оператором перехода на нее не должно превышать одной страницы текста (или высоты экрана дисплея).

Пример применения оператора безусловного перехода:…label Metka; {в раздале описания меток описали метку с именем Metka}…begin {основная программа}{операторы основной программы}…go to Metka;Metka: {операторы основной программы помеченные меткой}end.

Порядок выполнения работы1. Изучить теоретические сведения по теме: “ Написание программы на

Паскале с использованием операторов присваивания и безусловного перехода ”.

2. Получить индивидуальное задание у преподавателя и разработать программу в соответствии с поставленной задачей.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Основные элементы программирования.2. Основные характеристики программы. Понятия языка, оверлеев,

глобальных и локальных блоков.3. Операторы языка программирования Паскаль. Оператор

присваивания. Формат, примеры.

33

Page 34: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

4. Оператор безусловного перехода. Формат, примеры. Основные правила использования

Лабораторная работа № 7Написание программы на Паскале с использованием условных

операторов и оператора выбора Case

Цель работы: формирование знаний и умений по работе с операторами языка. Приобретение навыков написания программ с использованием операторов присваивания и безусловного перехода.

Краткие теоретические сведения

Условные операторыУсловные операторы предназначены для выбора к исполнению одного из

возможных действий (операторов) в зависимости от некоторого условия (при этом одно из действий может быть пустым, т. е. отсутствовать). В качестве условий выбора используется значение логического выражения.

В Турбо Паскале имеются два условных оператора: if и case.Оператор условия if Оператор условия if является одним из самых популярных средств,

изменяющих естественный порядок выполнения операторов программы. Он может принимать одну из следующих форм: if <условие> then <оператор1>

else <оператор2>; if <условие> then <оператор>; В переводе с английского языка данные форматы можно определить как: ЕСЛИ<условие>ТО<оператор1>ИНАЧЕ<оператор2> ЕСЛИ<условие>ТО<оператор>Оператор условия if выполняется следующим образом. Сначала

вычисляется выражение, записанное в условии. В результате его вычисления получается значение булевского типа.

В первом случае, если значение выражения есть True (истина), выполняется <оператор1>, указанный после слова then (в переводе –“то”). Если результат вычисления выражения в условии есть False (ложь), то выполняется <оператор2>.

Во втором случае, если результат выражения True, выполняется <оператор>, если False - оператор, следующий сразу за оператором if. Операторы if могут быть вложенными.

Пример фрагмента программы с оператором условия if:…Read(Ch) ;if Ch='N' then Parol:= True

34

Page 35: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

else Parol:= False;Read(X) ;if Parol = True then

if X = 100 then Write('Пароль и код правильные')else begin

Writeln('Ошибка в коде');Halt(1)

end;…

В данном примере с клавиатуры считывается значение переменной символьного типа Ch. Затем проверяется условие Сh='N'. Если оно выполняется, то переменной Parol булевского типа присваивается значение True, если условие не выполняется, False. Затем с клавиатуры считывается значение кода X. Далее оператор if проверяет условие Parol = True. Если оно имеет значение True, то выполняется проверка введенного пароля оператором if X=100. Если условие Х=100 имеет значение True, то выводится сообщение "Пароль и код правильные", и управление в программе передается на оператор, следующий за словом end, если оно имеет значение False, выполняется составной оператор, стоящий после, слова else, который выводит на экран видеомонитора сообщение "Ошибка в коде", и вызывает стандартную процедуру Halt(1) для остановки программы.

Особенность применения оператора if. При использовании вложенных условных операторов может возникнуть синтаксическая неоднозначность, например:

if условие1 then if условие2 then <оператор1> else <оператор2>Возникающая двусмысленность, к какому оператору if принадлежит часть

else <оператор2>, разрешается тем, что служебное слово else всегда ассоциируется (связывается) с ближайшим по тексту служебным словом if, которое еще не связано со служебным словом else.

В связи с этим следует проявлять аккуратность при записи вложенных операторов условия.

Пример 1. Составить программу, которая вычисляет частное двух целых чисел. В связи с тем, что делить на нуль нельзя, организовать контроль ввода данных.

Для контроля вводимых значений делителя используем оператор условного перехода if ... then ... else.

Текст программы может выглядеть следующим образом:program Primer1;varА, В : integer;Rezult: real;Begin

35

Page 36: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Write('Введите значение делимого А: ');Read(A) ;Write('Введите значение делителя В: ');Read(В) ;if B=0 {Контроль ввода числа B}

then Writeln('Ha нуль делить нельзя') {Условие выполнено} else {Условие не выполнено}

begin Rezult := А / В;

Writeln('Частное чисел ',А,' и ' ,В, ' = ', Rezult);end;

end.Оператор выбора caseЕсли один оператор if может обеспечить выбор из двух альтернатив, то

оператор выбора case позволяет сделать выбор из произвольного числа имеющихся вариантов. Он состоит из выражения, называемого селектором (selection — выбор альтернативы), и списка параметров, каждому из которых предшествует список констант выбора (список может состоять и из одной константы).

Формат записи оператора case:case <выражение-селектор> of

<список1>: <оператор1; ><список2>: <оператор2; >…<списокN>: <onepaторN>

else <оператор> end;Оператор case работает следующим образом. Сначала вычисляется

значение выражения-селектора, затем обеспечивается реализация того оператора, константа выбора которого равна текущему значению селектора. Если ни одна из констант не равна текущему значению селектора, выполняется оператор, стоящий за словом else. Если слово else отсутствует, активизируется оператор, находящийся за словом end, т. е. первый оператор за границей case.

Селектор должен относиться к одному из целочисленных типов (находящихся в диапазоне — 32768..32767): булевскому, литерному или пользовательскому. Список констант выбора состоит из произвольного количества значений, или диапазонов, отделенных друг от друга запятыми. Границы диапазона записываются двумя константами через разграничитель "..". Тип констант в любом случае должен совпадать с типом селектора. В синтаксическом описании, приведенном выше, предполагается использование одного оператора для каждой альтернативы, но при необходимости можно задать несколько операторов, сгруппировав их в составной оператор. В то же

36

Page 37: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

время ветвь else допускает использование последовательности операторов, разделенных символом ";".

Правила использования оператора сase. При использовании оператора выбора case должны выполняться следующие правила:

1. Значения выражения "переключателя", записанного после служебного слова case, должны принадлежать дискретному типу (лат. discretus — прерывистый, дробный, состоящий из отдельных частей); для целого типа они должны лежать в диапазоне integer.

2. Все константы, предшествующие операторам альтернатив, должны иметь тип, совместимый с типом выражения.

3. Все константы в альтернативах должны быть уникальны в пределах оператора варианта (т. е. повторения констант в альтернативах не допускаются); диапазоны не должны пересекаться и не должны содержать констант, указанных в данной или других альтернативах.

Формы записи оператора case. Селектор интервального типа:

case I of 1..10 : Writeln ('число ', I: 4, ' в диапазоне 1- 10');11.. 20 : Writeln ('число ', I:4, ' в диапазоне 11-20');21.. 30 : Writein ('число', I:4, ' в диапазоне 21-30')else Writeln ('число ', I:4, ' вне пределов контроля'); end;

Селектор целочисленного типа:case I of

1 : Z := I + 10;2 : Z := I + 100;3 : Z := I + 1000;

end;Селектор перечисляемого пользовательского типа:var Season: (Winter, Spring, Summer, Autumn) ;

begincase Season of

Winter: Writeln('Winter');Spring: Writeln('Spring');Suauner: Writeln (' Summer') ;Autumn: Writeln('Autumn')end; {конец case}

end;

Пример 2. Составить программу, которая по введенному пользователем номеру дня недели выводит на экран его название.

program Day_Week; var Day : byte;

37

Page 38: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

beginWrite ('Введите номер дня недели: ');Readln(Day) ;case Day of {Вычисление значения селектора и выбор}1: Writeln('Понедельник') ;2: Writeln('Вторник') ;3: Writeln('Среда');4: Writeln('Четверг');5: Writeln<'Пятница');6: Writeln('Суббота' ) ;else

Writeln('Воскресенье');end;

end.В данном примере на экран выводится приглашение: 'Введите номер дня

недели:', с клавиатуры считывается целочисленное значение дня недели и присваивается переменной Day. Затем в зависимости от значения селектора DAY обеспечивается реализация того оператора, константа выбора которого равна текущему значению селектора. Например, если значение Day равно 3, то реализуется оператор Writeln('Cpeдa'). Если значение Day равно 7, а ни одна из констант не равна этому значению селектора, то выполняется оператор, стоящий за словом else (на экран выводится текст 'Воскресенье'). Если слово else отсутствует, активизируется оператор, находящийся за словом end, т. е. первый оператор за границей case. Если значение Day не равно значению ни одной из констант выбора (например, Day=8 или Day=0), то активизируется оператор, находящийся за словом end, т. е. первый оператор за границей case - оператор end.

Порядок выполнения работы1. Изучить теоретические сведения по теме: “ Написание программы на

Паскале с использованием условных операторов и оператора выбора case”.

2. Получить индивидуальное задание у преподавателя и разработать программу в соответствии с поставленной задачей.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Условные операторы. Оператор if. Формат, описание. Основные правила

использования. Особенности использования вложенного оператора if.2. Примеры использования оператора if.3. Оператор выбора case. Формат, описание.4. Правила использования оператора сase. Примеры использования.

38

Page 39: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Лабораторная работа № 8Написание программы на Паскале с использованием

операторов повтора (For, Repeat)

Цель работы: формирование знаний и умений по работе с операторами языка. Приобретение навыков написания программ с использованием операторов повтора.

Краткие теоретические сведения

Операторы повтораЕсли в программе возникает необходимость неоднократно выполнить

некоторые операторы, то используются операторы повтора (цикла). В языке Паскаль различают три вида операторов цикла: while, repeat, for. Они используются для организации циклов различных типов. Выражение, управляющее повторениями, должно иметь булевский тип.

Если число повторений оператора (составного оператора) заранее неизвестно, а задано лишь условие его повторения (или окончания), используются операторы while, repeat. Оператор for используется, если число повторений заранее известно.

Оператор повтора forВ случаях, когда число повторений может быть заранее известно, для

организации циклической обработки информации применяется оператор повтора for. Часто этот оператор повтора называют оператором цикла с параметром, так как число повторений задается переменной, называемой параметром цикла, или управляющей переменной. Оператор повтора for состоит из заголовка и тела цикла.

Он может быть представлен в двух форматах:• for <параметр цикла> := <S1> to <S2> do <оператор>;• for <параметр цикла> := <S1> downto <S2> do <оператор>;

где Sl и S2 — выражения, определяющие соответственно начальное и конечное значения параметра цикла;

for ... do — заголовок цикла;<оператор> — тело цикла.Тело цикла может быть простым или составным оператором. Оператор for

обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цикла от начального до конечного.

Заголовок оператора повтора for определяет:• диапазон изменения значений управляющей переменной (параметра

цикла) и одновременно число повторений оператора, содержащегося в теле цикла;

• направление изменения значения параметра цикла (возрастание — to или убывание—downto).

Пример использования оператора for:

39

Page 40: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

for I:= 1 to 100 do Read(M[I]); {Чтение элементов массива}for I:= 100 downto 1 do Write(M[I]); {Вывод элементов массива}При первом обращении к оператору for вначале вычисляются выражения

S1, S2 и осуществляется присваивание <параметр цикла>:=S1.После этого циклически повторяются следующие действия:1. Проверяется условие <параметр цикла>: <=S2.2. Если условие выполнено, то оператор for продолжает работу (выполняется оператор в теле цикла), если условие <параметр цикла>:<=S2 не выполнено, то оператор for завершает работу, и управление в программе передается на оператор, следующий за циклом.3. Значение управляющей переменной изменяется на +1 (в случае to) или –1 (в случае downto).

Шаг изменения управляющей переменной - единица.Ограничения использования параметра цикла в операторе for. На

использование управляющей переменной (параметра цикла) в цикле for налагаются следующие ограничения:

1. В качестве параметра должна использоваться простая переменная, опи-санная в текущем блоке.

2. Управляющая переменная должна иметь дискретный тип.3. Начальные и конечные значения диапазона должны иметь тип,

совместимый с типом управляющей переменной. При этом допустим любой скалярный тип, кроме вещественного.

4. В теле цикла запрещается явное изменение значения управляющей переменной (например, оператором присваивания).

5. После завершения оператора значение управляющей переменной становится неопределенным, если только выполнение оператора не было прервано операторомперехода.

Примеры программ с использованием оператора forПрограмма DemoFor1 выводит на экран таблицу перевода из градусов по

шкале Цельсия(С) в градусы по Фаренгейту(Р) для значений от 15°С до 30°С с шагом 1 градус. Перевод осуществляется по формуле: F = С*1.8+32.program DemoFor1;varI: integer;F: real;begin Writeln (' Температура ') ; for I:= 15 to 30 do {Заголовок цикла с параметром} begin {Начало тела цикла} F:= I*1.8+32; Writeln('no Цельсию= ',I,' по Фаренгейту= ', F:5:2) end; {Конец тела цикла}

end.

40

Page 41: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

В блоке описания переменных описаны параметр цикла I типа integer и переменная F — температура по Фаренгейту типа real. Переменная I, помимо функций управляющей переменной, является переменной, хранящей целочисленные значения температуры по шкале Цельсия. В начале выполнения программы на экран выводится надпись ' Температура ', а затем оператором повтора выводится таблица соотношения температуры в шкалах Цельсия и Фаренгейта. Печать таблицы выполняется оператором Writeln('По Цельсию= ',I,' по Фаренгейту= ' , F: 5:2).

Цикл выполняется следующим образом.При первом обращении к оператору for вычисляются значения начального

(15) конечного (30) параметров цикла, и управляющей переменной I присваивается начальное значение 15.

Затем циклически выполняется следующее:1. Проверяется условие I<=30.2. Если оно соблюдается, то выполняется составной оператор в теле цикла,

т.е. рассчитывается значение выражения I* 1.8+32, затем оно присваивается переменной F, и на экран выводится сообщение: 'По Цельсию= ', I, ' по Фаренгейту= ', F:5:2.

Если условие I<=30 не соблюдается, т. е. как только I станет > 30, оператор тела цикла не выполняется, а управление в программе передается за пределы оператора for, в нашем примере на оператор end. Программа завершает работу.

3. Значение параметра цикла I увеличивается на единицу, и управление передается в заголовок цикла for для проверки условия.

Далее цикл повторяется, начиная с пункта 1.Вторым примером оператора цикла for может служить программа

DemoFor2, которая печатает на экране символы американскою стандартного кода обмена информацией (ASCII) в порядке убывания кода.program DemoFor2;varA: integer;begin

for A:= 255 downto 0 do {Цикл с убыванием параметра} Writeln('код символа = ',А, ' символ == ',Chr(A));end.

В данной программе применяется цикл for с убыванием значения управляющей переменной А (используется указание downto - убывание).

Оператор повтора RepeatОператор повтора repeat имеет две особенности: 1. Условие проверяется после очередного выполнения операторов тела

цикла (очередной итерации) и таким образом гарантируется хотя бы однократное выполнение цикла.

41

Page 42: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

2. Критерием прекращения цикла является равенство выражения константе True.

За это цикл repeat часто называют циклом с постусловием, или циклом "ДО", так как он прекращает выполняться, как только значение выражения условия, записанного после слова until, равно True (истина).

Оператор повтора repeat состоит из заголовка repeat, тела и условия окончания until.

Формат записи:repeat

<оператор;>…<оператор>

until <условие окончания цикла>;Операторы, заключенные между словами repeat и until, являются телом

цикла. Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Именно поэтому цикл, организованный с помощью оператора repeat, в любом случае выполнится хотя бы один раз. Если результат булевского выражения равен False, то тело цикла активизируется еще раз; если результат True, происходит выход из цикла.

При программировании операторов тела цикла следует обеспечить влияние, по крайней мере, одного из операторов тела цикла на значение условия, иначе цикл будет выполняться бесконечно.

Пример программы с использованием оператора repeatПримером действия оператора repeat может служить программа

DemoRepeat, которая вводит и суммирует любое количество целочисленных значений. Если введено значение 999, то на экран выводится результат суммирования.program DemoRepeat;varX: integer;Sum; real;begin Sum:=0; repeat {Повторять} Write('Значение X= '); {Начало тела цикла} Readln(X); {Считать очередное значение Х с клавиатуры} if X <> 999 then

Sum:= Sum+X ; until X = 999; {Условие окончания цикла (пока Х не станет

равным 999)} Writeln('Сумма введенных чисел= ',Sum) ;

end.В данном примере в разделе описания переменных описана переменная Х

целочисленного типа integer и Sum вещественного типа real.

42

Page 43: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

В начале выполнения программы обнуляется значение суммы чисел. Затем зарезервированным словом repeat объявляется цикл, после чего следуют операторы тела цикла, которые выводят на экран запрос 'Значение Х= ', считывают введенное с клавиатуры значение X. Оператор if проверяет его на неравенство числу 999 и, если оно не равно 999, увеличивает значение суммы Sum на значение числа X. В конце цикла оператор until X = 999 проверяет условие окончания цикла. Если значение выражения Х = 999 истинно, то цикл завершится, а управление в программе будет передано на оператор, находящийся за словом until, т. е. первый оператор за границей цикла repeat. Это вызов процедуры Writeln, которая выведет сообщение 'Сумма введенных чисел равна' и напечатает значение переменной Sum.Пример программы с использованием операторов присваивания, повтора

и выбораProgram DemoCalc;var X,Y,Rezult : real;Operation, Ans : char;begin

repeat {Начало цикла с постусловием} Write('X = ') ;Read(X); {Считывание первого операнда} Write('У = ') ;Readln(Y); {Считывание второго операнда} Writeln('операция (+,—,*,/) : ');Readln(Operation); {Считывание знака операции}

case Operation of{Выбор арифметического действия} '+' : Rezult := X+Y; '-' : Rezult := X-Y; '*' : Rezult := X*Y; '/' : Rezult := Х/Y;

elseWriteln('Ошибка ввода');

end;Writeln(X,Operation,Y,' =',Rezult); {Печать арифметического

выражения}Write('Продолжить (Y/N) '); Readln(Ans); {Считывание ответа на вопрос} Until (Ans='N') or (Ans='n'); {Проверка условия окончания цикла}

end. В разделе описания переменных описаны переменные - операнды X, Y и

результат арифметических операций Rezult вещественного типа, а также переменная Operation символьного типа, в которой хранится значение знака арифметической операции, и Ans- переменная символьного типа, которой присваивается значение "Y" или "N".

43

Page 44: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Процесс выполнения арифметических операций калькулятором организован с помощью оператора repeat и продолжается до тех пор, пока переменной Ans не будет присвоено значение 'N' или 'п'.В теле цикла сначала запрашиваются и считываются с клавиатуры значения операндов X и Y, затем запрашивается и считывается знак арифметической операции. Оператор выбора case по значению переменной Operation (селектор) выбирает знак операции и в зависимости от его значения выполняет арифметическую операцию. Например, если значение переменной Operation равно значению константы выбора '-', то выполняется оператор присваивания Rezult := Х-Y и т. д. Если значение переменной Operation не равно ни одному значению константы выбора, то управление передается на оператор, стоящий за словом else, и на экран выводится сообщение 'Ошибка ввода'. После этого на экран выводится запрос 'Продолжить (Y/N)' и с клавиатуры считывается значение переменной символьного типа Ans. Если значение выражения (Ans='N') or (Ans='n') будет False, то цикл повторится вновь, иначе цикл будет завершен и управление в программе будет передано на оператор end.

Порядок выполнения работы1. Изучить теоретические сведения по теме: “ Написание программы на

Паскале с использованием операторов повтора (For, Repeat)”.2. Получить индивидуальное задание у преподавателя и разработать

программу в соответствии с поставленной задачей.3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Операторы повтора. Общая характеристика. 2. Оператор повтора for. Форматы записи, описание работы цикла,

ограничения использования параметра цикла.3. Примеры использования оператора for. Различие to и downto.4. Оператор повтора Repeat. Формат записи, особенности использования.5. Примеры программ с использованием оператора repeat.

Лабораторная работа № 9Написание программы на Паскале

с использованием операторов повтора (While)

Цель работы: формирование знаний и умений по работе с операторами языка. Приобретение навыков написания программ с использованием операторов повтора.

44

Page 45: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Краткие теоретические сведения

Оператор повтора whileОператор while (пока) часто называют оператором цикла с предусловием за

то, что проверка условия выполнения тела цикла производится в самом начале оператора.

Формат записи: while <условие продолжения повторений> do

<тело цикла>;Условие - булевское выражение, тело цикла - простой или составной

оператор.Перед каждым выполнением тела цикла вычисляется значение выражения

условия. Если результат равен True, тело цикла выполняется и снова вычисляется выражение условия. Если результат равен False, происходят выход из цикла и переход к первому после while оператору.

Пример программы с использованием оператора повтора whileПрограмма DemoWhile производит суммирование 10 произвольно

введенных целых чисел.program DemoWhile; constLimit =10; {Ограничение на количество вводимых чисел}var Count, Item, Sum: integer;begin Count:=0; {Счетчик чисел} Sum:= 0; {Сумма чисел}

while (Count < Limit) do {Условие выполнения цикла} begin

Count:= Count+1;Write('Введите ', Count, ' - e целое число: ');Readln(Item);{Ввод очередного числа с клавиатуры}

Sum:= Sum+Item;end;

Writeln('Сумма введенных чисел равна ', Sum) ;end.

В данном примере в разделе описания констант описана константа Limit=10, задающая ограничение на количество вводимых чисел. В разделе описания переменных описаны переменные Count, Item, Sum целочисленного типа. В начале выполнения программы обнуляются значения счетчика введенных чисел Count и их суммы Sum. Затем выполняются цикл ввода 10 чисел и их суммирование. Вначале оператор условия while проверяет условие Count < Limit. Если условие верно, то выполняется составной оператор в теле цикла:

45

Page 46: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

beginCount:= Count+1;Write('Введите ', Count, '-e целое число: ');Readln(Item) ;Sum:= Sum+Item;

End;в котором вводится значение очередного числа, и на это значение

увеличивается значение суммы. После этого управление в программе вновь передается оператору цикла while, опять проверяется условие Count < Limit. Если условие верно, то выполняется составной оператор и т. д., пока значение переменной Count будет меньше 10. Как только значение Count станет равно 10 и условие Count < Limit не будет соблюдено, выполнение цикла завершится, а управление в программе будет передано на оператор, находящийся за словом end, т. e. первый оператор за границей while. Это вызов процедуры Writeln, которая выведет сообщение 'Сумма введенных чисел равна' и напечатает значение переменной Sum.

Порядок выполнения работы1. Изучить теоретические сведения по теме: “ Написание программы на

Паскале с использованием операторов повтора (While)”.2. Получить индивидуальное задание у преподавателя и разработать

программу в соответствии с поставленной задачей.3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Оператор повтора while. Формат записи, описание работы цикла.2. Пример использования оператора while. Описание работы программы.

Лабораторная работа № 10Написание программы на Паскале для решения задач на ввод-

вывод линейных и двумерных массивов

Цель работы: формирование знаний и умений по работе со структурными типами данных. Приобретение навыков написания программ с использованием массивов.

Краткие теоретические сведения

Массивы. Описание массивовРассмотренные ранее простые типы данных определяют различные

множества атомарных (неразделимых) значений. В отличие от них структурные типы данных задают множества сложных значений, каждое из

46

Page 47: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

которых образует совокупность нескольких значений другого типа. В структурных типах выделяют регулярный тип (массивы).

С понятием "массив" приходится сталкиваться при решении научно-технических и экономических задач обработки совокупностей большого количества значений. В общем случае массив - это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.

Название регулярный тип (или ряды) массивы получили за то, что в них объединены однотипные (логически однородные) элементы, упорядоченные по индексам, определяющим положение каждого элемента в массиве.

В качестве элементов массива можно использовать и любой другой ранее описанный тип, поэтому вполне правомерно существование массивов записей, массивов указателей, массивов строк, массивов и т.д. Элементами массива могут быть данные любого типа, включая структурированные. Тип элементов массива называется базовым. Особенностью языка Паскаль является то, что число элементов массива фиксируется при описании и в процессе выполнения программы не меняется.

Элементы, образующие массив, упорядочены таким образом, что каждому элементу соответствует совокупность номеров (индексов), определяющих его местоположение в общей последовательности. Доступ к каждому отдельному элементу осуществляется путем индексирования элементов массива. Индексы представляют собой выражения любого скалярного типа, кроме вещественного. Тип индекса определяет границы изменения значений индекса. Для описания массива предназначено словосочетание: array of (массив из).

Формат записи массивов:Type

<имя типа> = array [тип индекса] of <тип компонента>;Var

<идентификатор,..> : <имя типа>;Массив может быть описан и без представления типа в разделе описания

типов данных:Var

<идентификатор,...> : array [тип индекса] of <тип компонента>;Примеры описания одномерных и двумерных массивов

Если в описании массива задан один индекс, массив называется одномерным, если два индекса - двумерным, если n индексов — n-мерным массивом. Одномерный массив соответствует понятию линейной таблицы (вектора), двумерный - понятию прямоугольной таблицы (матрицы, набору векторов). Размерность ограничена только объемом памяти конкретного компьютера.

Одномерные массивы обычно используются для представления векторов, а двумерные- для представления матриц.

Одномерные массивы:Type

47

Page 48: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Klass = (К1, К2, КЗ, К4) ;Znak = array [1..255] of char;

VarMl: Znak; {Тип Znak предварительно описан в разделе типов} М2: array[1..60] of integer; {Прямое описание массива М2} МЗ: array[1..4] of Klass;Mas: array[1..4] of integer;

Если в качестве базового типа взят другой массив, образуется структура, которую принято называть многомерным массивом.

Двумерные массивы:Type

Vector = array[1..4] of integer;Massiv = array[1..4] of Vector;

VarMatrix : Massiv;

Ту же структуру можно получить, используя другую форму записи:Var

Matrix : array[1..4,1..4] of integer ;Для описания массива можно использовать предварительно определенные

константы:Const

G1 = 4; G2 = 6;Var

MasY: array[1..Gl, l..G2] of real;Элементы массива располагаются в памяти последовательно. Элементы

с меньшими значениями индекса хранятся в более низких адресах памяти. Многомерные массивы располагаются таким образом, что самый правый индекс возрастает самым первым.

Например, если имеется массив:A:array[1..5,1..5] of integer; то в памяти элементы массива будут размещены по возрастанию адресов:А[1,1] А[1,2] … А[1,5] А[2,1] А[2,2] … А[5,5]Контроль правильности значений индексов массива может проводиться с

помощью директивы компилятора R. По умолчанию директива R находится в пассивном состоянии {$R-}. Перевод в активное состояние вызывает проверку всех индексных выражений на соответствие их значений диапазону типа индекса.

Существует различие между регулярными типами в языке Паскаль и массивами в некоторых других языках программирования, заключающееся в том, что в Паскале количество элементов массива всегда должно быть фиксировано, т. е. определяться при трансляции программы. Это считается недостатком языка, так как не во всех программах можно заранее предсказать необходимый размер массива (который может определяться в зависимости от тех или иных условий, возникающих в процессе исполнения). В программах,

48

Page 49: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

обрабатывающих массивы, помимо использования для определения размера массива предварительно определенных констант иногда используется прием, позволяющий имитировать работу с массивами переменной длины, который заключается в следующем: в разделе описания констант предварительно определяют возможное максимальное значение размера массива, а затем в программе запрашивают текущее значение размера и используют это значение далее при заполнении и обработке массива.

Действия над массивамиДля работы с массивом как единым целым используется идентификатор

массива без указания индекса в квадратных скобках. Массив может участвовать только в операциях отношения "равно", "не равно" и в операторе присваивания. Массивы, участвующие в этих действиях, должны быть идентичны по структуре, т. е. иметь одинаковые типы индексов и одинаковые типы компонентов.

Например, если массивы А и В описаны как Var

А, В ; array[1..20] of real;то применение к ним допустимых операций даст следующий результат:

Выражение РезультатА=В True, если значение каждого элемента массива А равно

соответствующему значению элемента массива ВА<>В True, если хотя бы одно значение элемента массива А

не равно значению соответствующего элемента массива В

А:=В Все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В остаются неизменны.

Действия над элементами массиваПосле объявления массива каждый его элемент можно обработать, указав

идентификатор (имя) массива и индекс элемента в квадратных скобках. Например, запись Mas[2], Vector[10] позволяет обратиться ко второму элементу массива Mas и десятому элементу массива Vector. При работе с двумерным массивом указываются два индекса, с n-мерным массивом - n индексов. Например, запись Matr[4,4] делает доступным для обработки значение элемента, находящегося в четвертой строке четвертого столбца массива Matr.

Индексированные элементы массива называются индексированными переменными и могут быть использованы так же, как и простые переменные. Например, они могут находиться в выражениях в качестве операндов, использоваться в операторах for, while, repeat, входить в качестве параметров в операторы Read, Readin, Write, Writeln; им можно присваивать любые значения, соответствующие их типу.

Рассмотрим типичные ситуации, возникающие при работе с данными типа array. Для этого опишем три массива и четыре вспомогательные переменные:

49

Page 50: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Var A,D : array[l.,4] of real;В : array[1..10,1..15] of integer;I, J, К : integer;S : real;

Инициализация (присваивание начальных значений) массива заключается в присваивании каждому элементу массива одного и того же значения, соответствующего базовому типу. Наиболее эффективно эта операция выполняется с помощью оператора for, например:

Инициализация элементов одномерного массива А:for I := 1 to 4 do A[I] := 0;Для инициализации двумерного массива обычно используется вложенный

оператор for, например:Инициализация двумерного массива В:for I := I to 10 dofor J := 1 to 15 do B[I,J]:= 0;

Ввод-вывод элементов массиваПаскаль не имеет средств ввода-вывода элементов массива сразу, поэтому

ввод и вывод значений производится поэлементно. Значения элементам массива можно присвоить с помощью оператора присваивания, как показано в примере инициализации, однако чаще всего они вводятся с экрана с помощью оператора Read или Readln с использованием оператора организации цикла for:

Ввод элементов одномерного массива А:for I:=l to 4 do Readln(A[I]) ;Аналогично значения двумерного массива вводятся с помощью

вложенного оператора for:Ввод элементов двумерного массива В:for I := I to 10 dofor J := 1 to 15 do Readln (B[I,J]) ;В связи с тем, что использовался оператор Readln, каждое значение будет

вводиться с новой строки. Можно ввести и значения отдельных элементов, а не всего массива. Так, операторами:

Read(A[3]); Read(B[6,9]);

вводится значение третьего элемента вектора А и значение элемента, расположенного в шестой строке девятого столбца матрицы В. Оба значения набираются на одной строке экрана, начиная с текущей позиции расположения курсора.

Вывод значений элементов массива выполняется аналогичным образом, но используются операторы Write или Writeln:

Вывод элементов одномерного массива А:

50

Page 51: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

for I := I to 4 doWriteln (A[I]);Вывод элементов двумерного массива В:for I := I to 10 do for J := 1 to 15 doWritein (B[I,J]);Копированием массивов называется присваивание значений всех

элементов одного массива всем соответствующим элементам другого массива. Копирование можно выполнить одним оператором присваивания, например А:=D; или с помощью оператора for:

for I := 1 to 4 do A[I] := D[I];В обоих случаях значение элементов массива D не изменяется, а значения

элементов массива А становятся равными значениям соответствующих элементов массива D. Очевидно, что оба массива должны быть идентичны по структуре.

Иногда требуется осуществить поиск в массиве каких-либо элементов, удовлетворяющих некоторым известным условиям. Пусть, например, надо выяснить, сколько элементов массива А имеют нулевое значение.

К := 0;for I := 1 to 4 do

if A[I] = 0 then К := К + 1;После выполнения цикла переменная К будет содержать количество

элементов массива А с нулевым значением.Перестановка значений элементов массива осуществляется с помощью

дополнительной переменной того же типа, что и базовый тип массива.Например, так запишется фрагмент программы, обменивающий значения

первого и пятого элементов массива А:Vs:= A[5]; {Vs - вспомогательная переменная}А[5]:= А[1];А[1]:= Vs;

Пример программы ввода-вывода одномерного массиваprogram priimer1;uses crt;var

mas:array [1..10] of integer; {Описание одномерного массива с именем mas, состоящего из 10 элементов типа integer}

n,i:integer; {n-количество элементов массива, i-счетчик в цикле for}

BEGINclrscr;writeln('Введите количество элементов массива не больше 10: ');readln(n);

51

Page 52: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

for i:=1 to n do {ввод элементов массива}begin

writeln('Введите ',i,' элемент массива');readln(mas[i]);

end; {конец ввода}writeln('Введенный массив: ');for i:=1 to n do {вывод элементов массива}

beginwrite(' ',mas[i],' ');

end; {конец вывода}readkey;END.

Пример программы ввода-вывода двумерного массиваprogram primer2;uses crt;vari,j,n,m:integer;massiv:array[1..10,1..10] of integer; {описан двумерный массив с именем massiv}BEGiNclrscr;write('Введите количество строк массива (не больше 10): ');read(n); {n-количество строк}write('Введите количество столбцов массива (не больше 10):');read(m); {m-количество столбцов}

for i:=1 to n do {ввод элементов двумерного массива}begin for j:=1 to m do read(massiv[i,j]);end; {конец ввода}

writeln('Введенный массив: '); for i:=1 to n do {вывод элементов двумерного массива}

begin for j:=1 to m do write(massiv[i,j]:5);end; {конец вывода}

readkey;END.

Порядок выполнения работы1. Изучить теоретические сведения по теме: “ Написание программы на

Паскале для решения задач на ввод-вывод линейных и двумерных массивов”.

2. Получить индивидуальное задание у преподавателя и разработать программу в соответствии с поставленной задачей.

3. Показать работающую программу преподавателю.

52

Page 53: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

4. Ответить на контрольные вопросы.Контрольные вопросы

1. Массивы. Основные понятия и определения.2. Формат записи массивов. Описание одномерного и двумерного массивов.3. Действия над массивами. Действия над элементами массивов.4. Примеры описания и ввода-вывода линейного и двумерного массивов.

Лабораторная работа № 11Написание программы на Паскале для решения задач на

обработку линейного массива

Цель работы: формирование знаний и умений по работе со структурными типами данных. Приобретение навыков написания программ с использованием массивов.

Краткие теоретические сведенияПример программы нахождения в одномерном массиве элемента,

заданного пользователем и подсчета количества его вхождений в данный массив

Пусть требуется составить программу, которая формирует одномерный массив вводом с клавиатуры, находит в массиве элементы, заданные пользователем, подсчитывает их количество и выводит номер первого найденного элемента.

В разделе описания констант укажем значение константы Count=10. В программе значение этой константы определяет количество элементов массива. Употребление константы в описании размеров массива предпочтительнее, так как в случае изменения размеров массива не нужно будет вносить изменения во весь текст программы, а достаточно только один раз указать в разделе описания констант новое значение константы Count. Тогда раздел описания констант и переменных в программе будет таким: Сonst Count=10;

В связи с этим описание массива зададим так: М : array [1..Count] of Byte;Введем переменные целого типа: N - значение искомого элемента; А -

номер первого элемента массива, значение которого равно N; В - количество таких элементов в массиве; I - переменная, выполняющая функции параметра цикла и одновременно служащая указателем номера очередного элемента массива.

В связи с тем, что ни один подходящий элемент еще не найден, присвоим переменным A и В значение 0. Затем выведем на экран приглашение на ввод значения искомого элемента считаем это значение с клавиатуры. На Паскале это запишется следующим образом:

Write('Введите значение элемента массива для поиска : ');Readln(N) ;

53

Page 54: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Поиск элемента массива, значение которого равно введенному числу N, выполняется в циклическом сравнении значений всех элементов от первого до последнего со значением числа N, поэтому запишем его в виде цикла с параметром.

Оператор if M[I] = N then …выполняет сравнение значения очередного элемента массива с заданным значением N. Если условие М[I] = N выполняется, то счетчик числа найденных элементов В увеличивается на единицу. Так как требуется найти номер первого элемента, т. е. при первом выполнении условия М[I] = N запомнить номер данного элемента, то можно записать: if В = 0 then А := I.

Тогда блок поиска нужного элемента можно записать так:for I := 1 to Count do

if M[I] = N then begin

if В =0 then A := I;В:= В+1;

end;В заключительной части программа должна вывести на экран сообщение о

том, что в массиве нет искомых элементов, или сообщение о количестве элементов массива, имеющих значение, равное N, и напечатать номер первого такого элемента. Это можно записать следующим образом:

if B=0 then riteln('Нет таких элементов в массиве') else

begin Writeln('Количество элементов массива, имеющих значение ',N,' - ',

B) ,Writeln('Первый элемент, совпадающий с заданным ' , А) ;

end ;В целом текст программы может быть таким:program Find_Elem; {Поиск элемента в массиве} Сonst Count =10;VarМ : array [1..Count] of byte;N, A, B, I : Byte;Begin {Основная программа}

for I:=1 to Count do {ввод элементов массива}beginwriteln('Введите ',i,' элемент массива');readln(M[I]);end; {конец ввода}writeln('Введенный массив: ');for I:=1 to Count do {вывод элементов массива}

54

Page 55: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

beginwrite(' ',M[I],' ');

end; {конец вывода}Writeln;A := 0; {Нет элемента с таким значением}В := 0; {Пока не найдено ни одного элемента}Write('Введите значение элемента массива для поиска: ');Readln(N) ;for I := 1 to Count do {Поиск элемента, значение которого =N}

if M[I] == N then begin

if В = 0 then A := I;{Запомнить номер первого элемента, равного N}

В := В + 1; {Увеличить число найденных элементов на 1} end;

if B=0 then Writeln('Нет таких элементов в массиве') else begin

Writeln('Количество элементов массива, имеющих значение',N,'-',B),

Writeln('Первый элемент, совпадающий с заданным - ', А) ;end;

end.

Пример программы нахождения в одномерном массиве максимального элемента

Пусть требуется составить программу, которая формирует одномерный массив случайных чисел, выполняет поиск максимального элемента массива, а затем выводит на экран его значение и порядковый номер в массиве.

В разделе описания запишем размер массива Count=20, опишем массив целых чисел М следующим образом: М : array [I..Count] of byte . Используем целые переменные для хранения значений максимального элемента массива - Мах, его индекса - Numer_Max.

Перед началом поиска максимального элемента допустим, что его первый элемент и является максимальным элементом, а его индекс указывает позицию максимального элемента в массиве.

Это запишется так:Мах:= М[1]; {Считать 1-й,элемент максимальным} Numer_Max:=1; {Запомнить номер максимального элемента}

Повторяющийся просмотр массива с поиском максимального элемента, начиная со второго, выполняется оператором повтора с параметром, который одновременно указывает индекс очередного элемента. Сравнение очередного

55

Page 56: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

элемента массива с максимальным осуществляется оператором: If M[I] > Max then…

Если очередной элемент массива больше, чем максимальный, то следует считать его значение максимальным и запомнить его индекс.

Данный фрагмент программы запишется таким образом:for I := 2 to Count do {Проверить все элементы, начиная со

второго)begin if M[I] > Max then {Если очередной (I-й) элемент массива больше чем Мах}

begin Max := M[I]; {то считать максимальным 1-й элемент} Numer_Max:=I; {и запомнить его порядковый номер} end;

end;В заключительной части программы запишем вывод результата поиска

максимального элемента массива:Writeln('Максимальный элемент — ', Мах);Writeln('Он расположен на ', Numer_Max, ' месте');Полный текст программы получится таким:program Max_Elem; {Поиск максимального элемента массива}ConstCount =20;VarM : array [I..Count] of byte;Max, I, Numer_Max : byte;Begin {Основная программа}

for I:=1 to Count do {ввод элементов массива}begin

writeln('Введите ',i,' элемент массива');readln(M[I]);

end; {конец ввода}writeln('Введенный массив: ');for I:=1 to Count do {вывод элементов массива}

beginwrite(' ',M[I],' ');

end; {конец вывода}Writeln;Max := M[1] ; {Считать 1-й элемент максимальным}Numer_Max:=1; {Запомнить номер максимального элемента}for I := 2 to Count do {Проверить все элементы, начиная со

второго} begin

56

Page 57: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

if M[I] > Max then {Если очередной (I-й) элемент массива больше чем Мах}

begin Max := M[I]; {то считать максимальным 1-й

элемент} Numer_Max:=I; {и запомнить его порядковый номер}

end;end;

Writeln('Максимальный элемент — ', Max);Writeln('Он расположен на ', Numer_Max, ' месте');еnd.

Порядок выполнения работы1. Изучить теоретические сведения по теме: “Написание программы на

Паскале для решения задач на обработку линейного массива (сложение элементов массива, нахождения наименьшего/наибольшего элемента в заданном массиве)”.

2. Получить индивидуальное задание у преподавателя и разработать программу в соответствии с поставленной задачей.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Алгоритм нахождения элемента в одномерном массиве. Пример программы.2. Алгоритм нахождения максимального элемента одномерного массива.

Пример программы.

Лабораторная работа № 12Написание программы на Паскале для решения задач на

обработку двумерного массива

Цель работы: формирование знаний и умений по работе со структурными типами данных. Приобретение навыков написания программ с использованием массивов.

Краткие теоретические сведенияРассмотренный ранее линейный массив представлял собой вектор, т.е.

линейную последовательность чисел, например: 1 2 3 –5 0 1 3 6 …Для определения такого массива необходимо задать 1 параметр -

количество элементов (например n). Поэтому для обработки одномерного массива достаточно было организовать цикл по одной переменной (например i): for i:=1 to n do mas[i]:=…

Двумерный массив представляют собой матрицу, для определения которой необходимо задать два параметра - количество строк (например n) и

57

Page 58: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

количество столбцов (например m). Если количество строк - 2, количество столбцов - 3, тогда матрица будет выглядеть например так:

1 3 -52 3 4Следовательно, для обработки матрицы (двумерного массива) требуется

организовать цикл по двум переменным (например i и j ):for i:=1 to n dobegin

for j:=1 to m dobeginmas[i,j]:=…

end;end;

Пример программы нахождения суммы элементов двумерного массиваПусть требуется составить программу, которая в двумерном массиве

находит сумму его элементов и выводит ее на экран. Количество элементов массива (строк и столбцов) пользователь вводит с клавиатуры.

В начале программы опишем двумерный массив с именем mas, состоящий из 10 строк и 10 столбцов (максимально) типа integer. Затем опишем переменную S, обозначающую сумму элементов, i, j-индексы соответственно строки и столбца, n,m-количество строк и столбцов.

В основной программе пользователь задает размерность матрицы (количество строк и столбцов). Затем во вложенном цикле (по i и по j) осуществляется ввод с клавиатуры элементов матрицы, а затем вывод на экран введенного пользователем массива.

После того, как массив был введен, с ним можно непосредственно начинать работать. В данном примере необходимо найти сумму элементов двумерного массива.

Любое нахождение суммы начинается с обнуления переменной суммы: s:=0. Затем в цикле по i и по j вычисляется сумма:

for i:=1 to n dobeginfor j:=1 to m do

begins:=s+mas[i,j];

end;end;

В целом текст программы выглядит так:

Program matrix;Uses crt;varmas:array [1..10,1..10] of integer;s:integer;i,j,n,m:integer;

58

Page 59: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

BeginСlrscr;writeln('Введите количество строк n:');readln(n);writeln('Введите количество столбцов m:');readln(m);for i:=1 to n do {ввод элементов двумерного массива}

beginfor j:=1 to m do

beginwriteln('Введите ',i,',',j,'-й элемент матрицы: ');readln(mas[i,j]);

end;end;

writeln('Введенный массив: '); for i:=1 to n do {вывод элементов двумерного массива} begin

for j:=1 to m do write(mas[i,j]:5);

end; {конец вывода}s:=0; {обнуление суммы}for i:=1 to n do

beginfor j:=1 to m do

begins:=s+mas[i,j];{вычисление суммы элементов}

end;end;

write('Summa:');write('S= ',S); {вывод на экран полученной суммы}

End.Пример программы нахождения количества положительных и

отрицательных элементов двумерного массиваПусть требуется составить программу, которая подсчитывала бы

количество положительных и количество отрицательных элементов двумерного массива и записывала бы положительные и отрицательные элементы в два разных массива.

В начале программы опишем двумерный массив с именем mas, состоящий из 10 строк и 10 столбцов (максимально) типа integer, а также массивы B и C для положительных и отрицательных элементов соответственно. Затем опишем переменные k, l-количество положительных и отрицательных элементов соответственно, i, j - индексы соответственно строки и столбца, n,m-количество строк и столбцов.

Проверка на положительность элементов может выглядеть так:for i:=1 to n do

59

Page 60: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

beginfor j:=1 to m dobegin

if mas[i,j]>0 then…Если условие выполняется (i,j –й элемент является положительным), то

количество положительных элементов k увеличивается на 1 и заполняется массив B:

if mas[i,j]>0 then begin k:=k+1; B[k]:=mas[i,j]; end;Аналогично выполняется проверка на отрицательность, количество

отрицательных элементов l увеличивается на 1 и заполняется массив C.В целом текст программы выглядит так:

Program matrix_2;Uses crt;Varmas:array [1..10,1..10] of integer;B:array [1..10] of integer;C:array [1..10] of integer;i,j,k,l,n,m:integer;BeginСlrscr;writeln('Введите количество строк n:');readln(n);writeln('Введите количество столбцов m:');readln(m);

{ввод-вывод элементов матрицы mas}for i:=1 to n do

beginfor j:=1 to m do begin

if mas[i,j]>0 then begin

k:=k+1;B[k]:=mas[i,j];

end; end;

if mas[i,j]<0 then begin

l:=l+1;C[l]:=mas[i,j];

end;end;

60

Page 61: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

{Вывод на экран полученных массивов B и C}write('Массив из положительных : ');for i:=1 to k dowrite(' ',B[i]);writeln;write('Массив из отрицательных : ');for i:=1 to l dowrite(' ',C[i]);readln;

End.Порядок выполнения работы

1. Изучить теоретические сведения по теме: “Написание программы на Паскале для решения задач на обработку двумерного массива (сложение элементов массива, нахождения наименьшего/наибольшего элемента в заданном массиве)”.

2. Получить индивидуальное задание у преподавателя и разработать программу в соответствии с поставленной задачей.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Принципы работы с двумерными массивами.2. Примеры программ для решения задач на обработку двумерных

массивов.

Лабораторная работа № 13Написание программы на Паскале с использованием встроенных

функций

Цель работы: формирование знаний и умений по работе с подпрограммами. Приобретение навыков написания программ с использованием функций.

Краткие теоретические сведения

Понятие структурного программирования. Подпрограммы.

Значительное увеличение сложности задач, решаемых с помощью ЭВМ, приводит к увеличению размеров и сложности программ, что порождает дополнительные трудности при их разработке и отладке. Увеличение продолжительности жизненного цикла программ приводит к тому, что с течением времени из-за изменения условий использования программ возникает необходимость их модификации, повышения их эффективности, удобства пользования ими.

61

Page 62: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Для разрешения возникших при этом проблем в практике программирования выработан ряд приемов и методов, которые принято называть методами структурного программирования.

Под структурным программированием понимают такие методы разработки и записи программы, которые ориентированы на максимальные удобства для восприятия и понимания ее человеком. При прочтении программы в ее следующих друг за другом фрагментах должна четко прослеживаться логика ее работы, т. е. не должно быть "скачков" на фрагменты программы, расположенные где-то в другом месте программы.

Структурное программирование — "программирование без go to", т. е. не используются операторы перехода без особой необходимости. В связи с этим отдельные фрагменты программы представляют собой некоторые логические (управляющие) структуры, которые определяют порядок выполнения содержащихся в них правил обработки данных. Любая программа получается построенной из стандартных логических структур, число типов которых невелико.

Основные логические структуры:Следование — последовательность операторов, групп операторов,

выполняемых друг за другом в порядке их следования в тексте программы.Ветвление — управляющая структура, которая в зависимости от

выполнения заданного условия определяет выбор для исполнения одного из двух или более заданных в этой структуре групп операторов.

Повторение — цикл, в котором группа операторов может выполняться повторно, если соблюдается заданное условие.

Технология нисходящего программирования базируется на методе программирования "сверху вниз". Часто этот метод называют методом пошаговой детализации. Основой такого метода является идея постепенной декомпозиции исходной задачи на ряд подзадач. Сначала формулируется самая грубая модель решения, отдельные детали которой на первом этапе могут быть довольно расплывчатыми. По мере разработки программы, разбивая наиболее неясные части алгоритма и добиваясь все более точных и детализированных формулировок получают более подробное решение, как бы опускаясь с большой высоты ниже и начиная при этом различать более мелкие детали. Решение отдельного фрагмента сложной задачи может представлять собой самостоятельный программный блок, называемый подпрограммой. Такой процесс детализации продолжается до тех пор, пока не станут ясны все детали решения задачи. В этом случае программу решения сложной задачи можно представить как иерархическую совокупность относительно самостоятельных фрагментов — подпрограмм.

Подпрограммой называют обособленную, оформленную в виде отдельной синтаксической конструкции и снабженную именем часть программы. Использование подпрограмм позволяет, сосредоточив в них подробное описание некоторых операций, в остальной программе только указывать имена подпрограмм, чтобы выполнить эти операции. Такие вызовы подпрограммы

62

Page 63: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

возможны неоднократно из разных участков программы, причем при вызове подпрограмме можно передать некоторую информацию (различную в разных вызовах), чтобы одна и та же подпрограмма выполняла решение подзадачи для разных случаев.

Функции в ПаскалеЗа наличие подпрограмм как средства структурирования программ язык

программирования Турбо Паскаль называется процедурно-ориентированным.Подпрограммы в Турбо Паскале реализованы посредством процедур и

функций. Имея один и тот же смысл и аналогичную структуру, процедуры и функции различаются назначением и способом их использования.

Функция — это независимая именованная часть программы, которую можно вызвать по имени для выполнения определенных действий. Структура функции повторяет структуру программы.

Особенности использования функции: • функция передает в точку вызова скалярное значение; • имя функции может входить в выражение как операнд. Например, функция Chr(65) возвратит в точку вызова символ А (код ASCII

— 65), Sqr(X) — возведет в квадрат значения целого или вещественного Х и возвратит в точку вызова вычисленное значение квадрата числа X.

Все процедуры и функции языка Турбо Паскаль делятся на две группы: встроенные (стандартные) и определенные пользователем. Первые входят в состав языка и вызываются для выполнения по строго фиксированному имени. Вторые разрабатываются и именуются самим пользователем. Все стандартные средства расположены в специализированных библиотечных модулях, которые имеют системные имена.

Стандартные библиотечные модулиВ систему Турбо Паскаль версии 6.0 и старше включены восемь модулей:

System, Crt, Dos, Graph, Graph3, Overlay, Printer, ТурбоЗ и специализированная библиотека Турбо Vision. Модуль System подключается по умолчанию, все остальные должен подключать программист с помощью зарезервированного слова uses.

Например: Uses Crt, Dos, Printer;

Назначение каждого модуля:System — содержащиеся в нем подпрограммы обеспечивают работу всех

остальных модулей системы.Crt — содержит средства управления дисплеем и клавиатурой компьютера.Dos — включает средства, позволяющие реализовывать различные

функции DOS.Graph3 — поддерживает использование стандартных графических

подпрограмм версии Турбо Паскаль 3.0.

63

Page 64: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Overlay — содержит средства организации оверлейных программ. Printer — обеспечивает быстрый доступ к печатающему устройству.ТurbоЗ — обеспечивает максимально возможную совместимость с версией

Турбо Паскаль 3.0. Graph — содержит пакет графических средств, обеспечивающих

эффективную работу с адаптерами CGA, EGA, VGA, IBM 3270 и т.д.Турбо Vision— библиотека объектно-ориентированных подпрограмм для

разработки пользовательских интерфейсов.

Встроенные функции и процедурыМодуль System подключается к программе автоматически, поэтому его имя

не указывается в разделе Uses. По этой причине программе становятся доступны его встроенные процедуры и функции.

Арифметические процедуры и функцииAbs(X:real/integer): real/integer — вычисление абсолютной величины X. Тип

результата совпадает с типом параметра.ArcTan(X:real):real — вычисление угла, тангенс которого равен Х радиан.Cos(X:real) : real — вычисление косинуса X, параметр задает значение

угла в радианах.Exp(X:real) : real — вычисление экспоненты X, т.е. значение Е в степени

X. Е является основанием натурального логарифма и равно 2.718282.Frac(X:real):real — вычисление дробной части X.Int(X:real):real — вычисление целой части X.

Ln(X:real):real — вычисление натурального логарифма X, т, е. логарифма по основанию е (е = 2.718282).

Pi:real — возвращает значение числа Пи (3.141592653897932385).Sin(X:real):real — вычисление синуса X. Параметр задает значение угла в

радианах.Sqr(X) — возведение в квадрат значения целого или вещественного

значения X. Тип результата совпадает с типом параметра.Sqrt(X:real):real — вычисление квадратного корня из X.Random:real — генерирует значение случайного числа из диапазона

0..0.99.Random(I:word):word — генерирует значение случайного числа из

диапазона 0..I.Randomize — изменение базы генератора случайных чисел.

Скалярные процедуры и функцииDec(X{,n}) — процедура уменьшает значение целочисленной переменной

Х на величину n. При отсутствии необязательного параметра n значение Х уменьшается на единицу.

64

Page 65: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Inc(X{,n}) — процедура увеличивает значение целочисленной переменной Х на n. При отсутствии необязательного параметра n значение Х увеличивается на единицу.

Pred(S) — функция возвращает элемент, предшествующий S в списке значений типа. Тид результата совпадает с типом параметра. Если предшествующего S элемента не существует, возникает программное прерывание.

Succ(S) — функция возвращает значение, следующее за S в списке значений типа. Тип результата совпадает с типом параметра. Если следующее за S значение отсутствует, возникает программное прерывание.

Odd(I: integer): boolean — возвращает True, если I нечетное, и False, если I четное.

Функции преобразования типовChr(I:byte):char — возвращает символ стандартного кода обмена

информацией с номером, равным значению I. Если значение параметра больше 255, возникает программное прерывание.

Ord(S):longint — возвращает порядковый номер значения S в множестве, определенном типом S.

Round(X:real):longint — возвращает значение X, округленное до ближайшего целого числа.

Trunc(X:real):longint — возвращает ближайшее целое число, меньшее или равное X, если Х >= 0, и большее или равное X, если Х< 0.

Процедуры управления программойDelay(I:word) — задержка выполнения программы на I мс.Exit — выход из выполняемого блока в окружающую среду. Если текущий

блок является процедурой или функцией, выход производится во внешний блок. Если Exit указана в операторной части основной программы, программа прекращает работу, и управление передается системе программирования.

Halt(N:word) — прекращение выполнения программы и передача управления системе программирования (если выполнялся .PAS-файл) или DOS (если выполнялся .ЕХЕ-файл). N — код завершения программы, передаваемый в операционную систему.

RunError(ErrCode:word) — прекращение выполнения программы и генерация ошибки времени выполнения. ErrCode — параметр типа byte, содержащий номер ошибки.

Специальные процедуры и функцииFillChar(P,Dl,Z) — заполняет побайтно область основной памяти

заданным значением (заполнителем). Является одной из самых быстродействующих процедур. Область начинается с первого байта указанной переменной Р и имеет размер, заданный параметром Dl. Р — переменная

65

Page 66: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

любого типа; Dl — целочисленное выражение, указывающее длину; Z — заполнитель, выражение литерного или байтового типа.

Hi(I:integer):byte — выделяет старший байт значения I и помещает его в младший байт результата. Старший байт результата равен 0.

Lo(I: integer): byte — выделяет младший байт значения I и помещает его в младший байт результата. Старший байт результата равен 0.

SizeOf(IT:integer):word — вычисляет объем основной памяти в байтах, которую занимает указанная переменная или тип. IT — идентификатор переменной или типа данных.

Swap(I: integer): integer — обменивает содержимое младшего и старшего байтов целочисленного выражения, заданного параметром I типа integer.

Вызов стандартной процедуры или функции Для использования стандартной процедуры или функции к программе

подключается тот или иной специализированный библиотечный модуль, в котором записана данная стандартная процедура или функция (исключение составляет модуль System, так как он подключается к программе автоматически), для чего имя специализированного библиотечного модуля указывается в разделе uses. Затем в программе записывается вызов процедуры или функции, для чего записывается ее имя и указываются фактические параметры, например: Pi, Sin(X), Chr(125), Inc(X,5). Так как после выполнения функции ее значение присваивается имени, то имя функции используется в выражении.

Порядок выполнения работы1. Изучить теоретические сведения по теме: “Написание программы на

Паскале с использованием встроенных функций ”.2. Разработать программу, в которой реализовать все описанные в работе

стандартные (встроенные) функции и процедуры.3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Понятие структурного программирования. Определение подпрограмм.2. Функции. Особенности использования.3. Стандартные библиотечные модули. Понятие стандартных функций и

процедур.

Лабораторная работа № 14Написание программы на Паскале с использованием функций,

определенных пользователем

Цель работы: формирование знаний и умений по работе с подпрограммами. Приобретение навыков написания программ с использованием функций.

66

Page 67: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Краткие теоретические сведенияФункция, определенная пользователем, состоит из заголовка и тела

функции.Заголовок содержит зарезервированное слово function, идентификатор

(имя) функции, заключенный в круглые скобки, необязательный список формальных параметров и тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе. В целом структура функции, определенной пользователем имеет вид:

function <имя> (Формальные параметры) : <тип результата>;const ... type ... var begin

<операторы> end;

В разделе операторов должен находиться, по крайней мере, один оператор, присваивающий имени функции значение. В точку вызова возвращается результат последнего присваивания.

Обращение к функции осуществляется по имени с необязательным указанием списка аргументов. Каждый аргумент должен соответствовать формальным параметрам, указанным в заголовке, и иметь тот же тип.

Пример программы с использованием функции, определенной пользователем

Пусть требуется разработать программу вычисления выражения:Z=( + )/2* ,

в которой возведение в степень выполняется функцией Step.program DemoFunc;VarМ : integer;А,Z,R : real ;{Функция вычисления степени. N - степень, X – число, возводимое в данную степень. N, X — формальные параметры; результат, возвращаемый функцией в точку вызова, имеет вещественный тип} function Step(N : integer; X : real): real;VarI : integer;Y : real;begin Y:=1;

for I:=1 to N do{Цикл вычисления N—й степени числа X)

67

Page 68: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Y:=Y*X;Step:=Y ; {Присваивание функции результата вычисления

степени} end; {Конец функции}

Begin {Начало основной программы}Write('Введите значение числа А и показатель степени М');Readln(A,M) ;Z:=Step(5,А) ; {Вызов функции с передачей ей фактических параметров

N=5, X=А}Z:=Z+ Step(3,l/A); {Вызов функции с передачей ей фактических

параметров N=3, X=1/А}if M=0 then R:=l {если число возводится в нулевую степень, то результат всегда равен 1}else if M>0 then R:=Step(M,A){Вызов функции Step с передачей ей

фактических параметров М, А}else R:=Step(-M,A); {Вызов функции с передачей ей фактических

параметров: - М, отрицательная степень}Z:=Z/(2*R) ;Writeln(' Для А= ',А,'М= ',М,' Значение выражения= ',Z);

end.В начале программы описываются переменная целого типа М и

переменные вещественного типа А, Z, R, после этого описывается функция вычисления степени числа Step с формальными параметрами N и X, результат, возвращаемый функцией в точку вызова, - вещественного типа.

В описании функции вводятся две локальных (местных) переменных I и Y. Переменная I служит для подсчета числа повторений цикла, а в Y накапливается значение степени как произведения N одинаковых сомножителей. В заключение функции присваивается значение вычисленного произведения.

В начале выполнения основной программы на экран выводится запрос "Введите значение числа А и показатель степени М" и считывается с клавиатуры значение вещественного числа А и целого числа М.

Затем выполняется оператор: Z:=Step(5,A);Осуществляется вызов функции Step с передачей ей фактических

параметров 5, А. Их значения присваиваются формальным параметрам функции N и X. По окончании вычисления степени числа значение функции Step, вычисленное для фактических параметров 5 и А, присваивается переменной Z. Аналогично в операторе:

Z := Z + Step(3,l/A);сначала осуществляется вызов функции Step с передачей ей фактических

параметров 3, 1/A, после чего значение переменной Z увеличивается на

68

Page 69: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

величину возвращенного в основную программу результата вычисления функции Step.

Операторы:if M=0 then R:=1

else if M>0 then R:=Step(M,A) else R:=Step(- M,A);

проверяют условия М=0, М>0 и в зависимости от их соблюдения либо при-сваивает переменной R значение 1 (при М=О), либо выполняет вызов функции Step для фактических значений М, А или -М, А, а после вычисления значения функции Step присваивает его переменной R.

Оператор:Z:=Z/(2*R);выполняет вычисление значения выражения, а затем присваивает

вычисленное значение переменной Z.В заключение программы стандартная процедура Writeln выводит на экран

сообщение о результате вычислений степени М числа А.Порядок выполнения работы

1. Изучить теоретические сведения по теме: “Написание программы на Паскале с использованием функций, определенных пользователем”.

2. Получить индивидуальное задание у преподавателя и разработать программу в соответствии с поставленной задачей.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Структура функции, определенной пользователем.2. Пример программы с использованием функции, определенной

пользователем.

Лабораторная работа № 15Написание программы на Паскале с использованием процедур,

определенных пользователем.

Цель работы: формирование знаний и умений по работе с подпрограммами. Приобретение навыков написания программ с использованием процедур.

Краткие теоретические сведенияОписание процедуры включает заголовок (имя) и тело процедуры.

Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и необязательного, заключенного в круглые скобки, списка формальных параметров с указанием типа каждого параметра. Имя процедуры — идентификатор, уникальный в пределах программы. Тело процедуры представляет собой локальный блок, по структуре аналогичный программе.

69

Page 70: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Описания меток, констант, типов и т. д. действительны только в пределах данной процедуры. В теле процедуры можно использовать любые глобальные константы и переменные. Общая структура описания процедур:

procedure <имя> (Формальные параметры);const ... ;type . . . ;var . . . ;begin

<операторы> end ;

Пример программы с использованием процедуры, определенной пользователем

В качестве примера опишем процедуру, которая прерывает выполнение программы и выдает соответствующее сообщение об ошибке.

procedure Abort(Msg: string);beginWriteln('Ошибка: ', Msg);Halt(1);end ; В данной процедуре пользователя использована переменная Msg типа

string, в которой хранится текст сообщения о характере ошибки, вызвавшей прерывание программы. Для прерывания выполнения программы используется стандартная процедура Halt из стандартного библиотечного модуля System.

Процедура не может выполниться сама, ее необходимо вызвать по имени и указать фактические параметры того же типа, что и формальные. Количество и тип формальных параметров равны количеству и типу фактических параметров.

В качестве примера приведем фрагмент программы, в котором используется описанная выше процедура Abort.

program DemoProc; {Подсчет суммы десяти введенных целых положительных чисел: если будет введено отрицательное число, прервать выполнение}

constLimit= 10; {Ограничение на количество вводимых чисел)

varCount, Item, Sum : integer;

procedure Abort(Msg: string); {описание и реализация процедуры Abort}begin

Writeln('Ошибка: ', Msg);Halt(1);

end ;Begin {основная программа}

70

Page 71: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Count:= 0;Sum: = 0 ;while (Count < Limit) do {Условие выполнение цикла}

beginCount:= Count+1;Write('Введите ', Count, '-e целое число: ');Readln(Item);

if Item < 0 then {Если введено отрицательное число}Abort('Введено отрицательное число! '); {Вызов процедуры} Sum:= Sum+Item;

end;Writeln('Сумма введенных чисел равна ', Sum);end.В разделе описания программы описываются константа Limit,

ограничивающая количество вводимых чисел; в разделе описания переменных описываются переменные Count, Item, Sum типа integer.

В начале программы обнуляются значения количества введенных чисел Count и их сумма Sum. Потом выполняется цикл, пока очередное вводимое число меньше предельного, заданного значением константы Limit. Сначала устанавливается номер очередного числа, затем на экран выводится приглашение "Введите 1-е (2-е и т.п.) число", считывается значение числа с клавиатуры в переменную Item. Затем проверяется условие Item<0.

Если условие выполняется, то вызывается Abort, которой передается фактический параметр-значение типа string: "введено отрицательное число". Это значение присваивается формальному параметру Msg процедуры Abort. Процедура Abort выводит на экран сообщение об ошибке и печатает текст сообщения - значение параметра Msg: "Ошибка: введено отрицательное число", после чего вызывает стандартную процедуру Halt(1), которая прерывает выполнение программы.

Если условие Item<0 не выполняется, то значение суммы Sum увеличивается на значение введенного числа Item, и управление передается в заголовок цикла для проверки условия Count < Limit. Если условие соблюдается, то тело цикла выполняется еще раз, иначе цикл завершается, а управление в программе передается на оператор, следующий за циклом, т. е. за резервированным словом end, обозначающим окончание составного оператора в теле цикла. После этого на экран выводится сообщение: "Сумма введенных чисел равна" и печатается значение переменной Sum. На этом выполнение программы завершается.

Механизм передачи параметровКак было показано в приведенных выше примерах программ с

использованием процедур и функций, в заголовке процедуры или функции может быть задан список параметров, которые называются формальными.

71

Page 72: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Название "формальные" эти параметры получили в связи с тем, что в этом списке заданы только имена для обозначения исходных данных и результатов работы процедуры, а при вызове подпрограммы на их место будут подставлены конкретные значения (выражений) и имен. Этот список указывается после имени подпрограммы и заключается в круглые скобки.

В списке формальных параметров должны быть перечислены имена формальных параметров и их типы. Имя параметра отделяется от типа двоеточием, а параметры друг от друга - точкой с запятой. Имена параметров одного типа можно объединять в подсписки, в которых имена отделяются друг от друга запятой.

Между формальными и фактическими параметрами должно быть полное соответствие:

• формальных и фактических параметров должно быть одинаковое количество

• порядок следования фактических и формальных параметров должен быть один и тот же;

• тип каждого фактического параметра должен совпадать с типом соответствующего формального параметра.

Параметры-значения. Параметры-значения используются только для передачи исходных данных из основной программы в подпрограмму (процедуру или функцию), в списке формальных параметров они перечисляются через запятую с обязательным указанием их типов, как было, например, в выше приведенных примерах:

procedure Abort(Msg: string); function Step(N : integer; X : real): real;Если формальный параметр объявлен как параметр-значение, то

фактическим параметром может быть произвольное выражение. При вызове подпрограммы фактические параметры вычисляются и используются как начальные значения формальных параметров, т. е. осуществляется подстановка значений. Если формальный параметр определен как параметр-значение, то перед вызовом процедуры это значение вычисляется, полученный результат помещается во временную память и передается процедуре. Даже если фактический параметр - простейшее выражение в виде константы или переменной, все равно процедуре будет передана лишь копия этой константы (переменной). В процессе выполнения подпрограммы формальные параметры могут изменяться, но это никак не отразится на соответствующих фактических параметрах-переменных, которые сохранят те значения, которые имели до вызова подпрограммы, так как меняются не они, а их копия. Поэтому параметры-значения нельзя использовать для передачи результатов из подпрограммы в основную программу.

Пример программы с использованием передачи параметров по значению:program Pr1;var

72

Page 73: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

А,В : real;{Процедура вычисления квадратов двух чисел и вывода на экран их суммы}procedure Sum_Square(X, Y : real); {X,Y - формальные параметры}begin

Х:=Х*Х;Y:=Y*Y;Writeln('Cyммa квадратов = ',X+Y);

end; {Конец процедуры}begin {Начало основной программы}А:=1.5;В:=3.4;Sum_Square (А,В) ; {Вызов процедуры Sum_Square с передачей ей значений

фактических параметров А и В}end.

При вызове процедуры Sum_Square с фактическими параметрами А, В значения этих параметров (один раз) копируются в соответствующие формальные параметры X, Y, и дальнейшие преобразования формальных параметров X,Y внутри процедуры Sum_Square уже никак не влияют на значения переменных А, В.

Параметры-переменные. Параметры-переменные используются для определения результатов выполнения процедуры и в списке формальных параметров перечисляются после зарезервированного слова Var с обязательным указанием типа. Каждому формальному параметру, объявленному как параметр-переменная, должен соответствовать фактический параметр в виде переменной соответствующего типа, например:

procedure Example(var M,N : integer; var Y : real) ;Если формальный параметр определен как параметр-переменная, то при

вызове процедуры ей передается сама переменная, а не ее копия, и изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе. Следовательно, исходные данные в процедуру из программы могут передаваться как через параметры-значения, так и через параметры-переменные, а результаты работы процедуры возвращаются в вызывающую программу только через параметры-переменные.

Пример программы, использующей параметры-переменные:program Sum_Sub_Square;var

A,В : real ;SumAB, SubAB : real;

{Процедура с параметрами-переменными Sum, Sub}procedure Sum_Sub(X,Y : real; var Sum, Sub : real);begin

Sum:=X*X+Y*Y;Sub:=X*X-Y*Y;

73

Page 74: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

end; {Конец процедуры} begin {Начало основной программы}

А:=1.5;В:=3.4;Sum_Sub(A,B, SumAB,SubAB); {Вызов процедуры с передачей ей

фактических параметров-значений А, В и параметров-переменных SumAB, SubAB}

Writeln('Сумма квадратов чисел',А,' и ',В,'= ', SumAB);Writeln("Разность квадратов чисел',А,’и',В,'=', SubAB);end.

Порядок выполнения работы1. Изучить теоретические сведения по теме: “Написание программы на

Паскале с использованием процедур, определенных пользователем”.2. Получить индивидуальное задание у преподавателя и разработать

программу в соответствии с поставленной задачей. 3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Описание процедуры. Общая структура.2. Формальные, фактические параметры. 3. Параметры – значения, параметры – переменные.4. Примеры программ с использованием процедур, определенных

пользователем.

Лабораторная работа № 16Написание программы на Паскале с использованием рекурсии

Цель работы: формирование знаний и умений по работе с подпрограммами. Приобретение навыков написания программ с использованием рекурсивных процедур и функций.

Краткие теоретические сведения

РекурсииРекурсия — это такой способ организации вычислительного процесса, при

котором процедура или функция в ходе выполнения составляющих ее операторов обращается сама к себе.

Примером программы с использованием рекурсии может быть программа вычисления факториала числа. (Факториалом натурального числа n называют произведение чисел 1*2*...*n.)

{Вычисление факториала числа п с использованием рекурсивной функции} program Demo_Rekurs;var

74

Page 75: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

N : integer;F : longint;

{Описание функции, N — формальный параметр-значение типа integer, результат выполнения функции типа longint}.function Fakt(N : integer): longint;

begin {Начало вычисления функции}if N=1 then Fakt:=1 {Проверка условия завершения рекурсии}

else Fakt:=N*Fakt(N-1); {Рекурсивное вычисление N!}end;

begin {Начало главной программы}Writeln('Введите число N : ') ;Read(N) ;F:=Fakt(N); {Вызов функции для фактического параметра N} Writeln('Для числа',N,'значение факториала= ', F);

end.После запуска программы на экран выводится запрос: "Введите число N: ",

затем с клавиатуры считывается значение целого числа N и в выражении F:=Fakt(N) вызывается функция Fakt с параметром-значением N. В подпрограмме-функции вычисления факториала проверяется условие N=1. Если оно выполняется, то функции Fakt присваивается значение 1, на этом выполнение подпрограммы-функции завершается. Если условие N=1 не соблюдается, то выполняется вычисление произведения N*Fakt(N-1). Вычисление произведения носит рекурсивный характер, так как при этом осуществляется вызов функции Fakt(N-1), значение которой вычисляется, в свою очередь, через вызов функции Fakt, параметром которой также будет функция Fakt, и т. д., до тех пор, пока значение формального параметра N=1. Так как базовая часть описания рекурсивной функции Fakt определяет значение Fakt для N=1, равным единице, то рекурсивные вызовы функции Fakt больше не выполняются, а наоборот, выполняется вычисление функции Fakt для чисел, возрастающих от 1 до N, причем функция Fakt всякий раз возвращает значение, равное произведению очередного k-гo числа на факториал от k-1-го числа. Последнее возвращение результата вычисления функции Fakt присвоит переменной F значение произведения всех чисел от 1 до N, т. е. факториал числа N.

Вывод. При выполнении рекурсивной подпрограммы осуществляется многократный переход от некоторого текущего уровня организации алгоритма к нижнему уровню последовательно до тех пор, пока, наконец, не будет получено тривиальное решение поставленной задачи. В рассмотренном выше примере решение при N=1 тривиально, т.е. Fakt=l. Затем осуществляется возврат на верхний уровень с последовательным вычислением значения функции Fakt.

Следует учитывать, что использование рекурсивной формы организации алгоритма обычно выглядит изящнее итерационной и дает более компактный

75

Page 76: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

текст программы, но при выполнении, как правило, медленнее и может вызвать переполнение стека. Это объясняется тем, что при каждом входе в подпрограмму ее локальные переменные размещаются в особым образом организованной области памяти, называемой программным стеком.

Нетрадиционное использование подпрограмм. Косвенная рекурсия

В Турбо Паскале есть случаи нетрадиционного объявления подпрограмм, когда в объявлении процедуры содержится директива interrupt (прерывание), external (внешняя) или inline (встроенная) или вместо блока в объявлении процедуры или функции написано forward (опережающая).

Interrupt (прерывание). Объявление процедуры может содержать директиву interrupt перед блоком, и тогда процедура рассматривается как процедура прерывания. Прерыванием называется временное прекращение процесса, вызванное событием, внешним по отношению к этому процессу. Необходимость в процедурах прерывания возникает, когда программист решает определить собственные алгоритмы реакции на прерывание операционной системы, отменив при этом стандартные реакции. Процедуры прерывания нельзя вызывать с помощью операторов процедур и что каждая процедура прерывания должна задавать список параметров так:

procedure MyInt(Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP:Word) ;interrupt;

где CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP — регистры процессора.Внешние объявления (external). Внешние объявления позволяют

связывать отдельно скомпилированные процедуры и функции, написанные на языке ассемблера. С помощью директивы {$L имя файла} внешнюю программу можно связать с программой или модулем, написанным на Паскале. Пример объявления внешней процедуры:

procedure MoveWord(var Source, Dest; Count: Word); external;В тексте программы при объявлении внешних подпрограмм нужно задать

директиву компилятору $L, аргументом которой является имя OBJ-файла, содержащего код подключаемой подпрограммы, например: {$L BLOCK. OBJ}

Inline (встроенная). Директива inline позволяет записывать инструкции в машинном коде, не используя блок операторов. При вызове обычной процедуры компилятор создает код, в котором параметры процедуры помещаются в стек, а затем для вызова процедуры генерируется инструкция call. Когда вызывается внутренняя процедура, компилятор генерирует код из директивы inline вместо call. Таким образом, inline-процедура "расширяется" при каждом обращении к ней аналогично макрокоманде на языке ассемблера. (Макрокоманда- macro- предложение языка программирования, вместо которого компилятор при трансляции записывает несколько машинных команд.)

Опережающие объявления (forward). Помимо прямых рекурсий, рассмотренных ранее, рекурсивный вызов может быть и косвенным, т. е. одна

76

Page 77: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

процедура вызывает другую процедуру, которая, в свою очередь, вызывает первую процедуру. А так как до вызова процедуры она обязательно должна быть описана, то используется опережающее объявление: процедура содержит описание только своего заголовка, вслед за которым ставится зарезервированное слово forward (опережающий), а описание текста процедуры помещается далее в тексте программы гуже без повторения описания списка формальных параметров и называется определяющим объявлением.

Опережающее объявление и определяющее объявление должны находиться в одной и той же части объявления процедур и функций. Между ними могут быть объявлены другие процедуры и функции, и они могут вызывать процедуру с опережающим объявлением. Таким образом, возможна взаимная рекурсия. Определяющее объявление процедуры может быть external или assembler. Однако оно не может быть near-; far-; inline- или другим forward-объявлением. Определяющее объявление также не может содержать директивы interrupt, near или far. Опережающие объявления не допускаются в интерфейсной части модуля.

Примером программы с использованием вложенных подпрограмм-процедур может быть программа Demo_Tower, в которой реализован алгоритм древней игры "Ханойские башни". Имеются три стержня, на одном из них (например, на левом) засажены диски разных размеров, причем диски располагаются так, чтобы стержень с дисками напоминал башню, т. е. внизу располагаются самые большие диски, а вверху маленькие. Цель игры- перенести башню с правого стержня на левый, причем за один раз можно переносить только один диск и при этом можно насаживать только диск с меньшим диаметром на диск с большим диаметром. Средний стержень является вспомогательным для временного хранения дисков.

program Demo_Tower; {Ханойские башни- перенести кольца с правого стержня - 3 на левый - 1}

TypePosition = (Left, Centre, Right) ;

varN : integer;

procedure MoveDisk(From, Tol : Position); {Перемещение диска} procedure WritePos(P : Position); {процедура WritePos внутри

процедуры MoveDisk}begin

case P ofLeft : Write('1') ;Centre : Write('2') ;Right : Write('3');

end;end;

77

Page 78: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

begin {начало процедуры MoveDisk}WritePos(From) ;Write(': ');WritePos(Tol);Writein;

end;procedure MoveTower(Hight:integer;From,Tol,Work:position);

begin if Hight>0 then

begin{Рекурсивный вызов}MoveTower(Hight-1,From,Work,Tol); MoveDisk(From,Tol); {Рекурсивный вызов}MoveTower(Hight-1,Work,Тоl, From);

end ;end;Begin {Основная программа}

Writeln('Введите число колец: ');Readln(N) ;MoveTower(N,Right,Left,Centre); {Вызов процедуры с передачей ей

фактических параметров} end.

Порядок выполнения работы1. Изучить теоретические сведения по теме: “Написание программы на

Паскале с использованием рекурсии”.2. Получить индивидуальное задание у преподавателя и разработать

программу в соответствии с поставленной задачей. 3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Определение рекурсии. Пример программы с использованием рекурсии.2. Директивы объявления процедур. Косвенная рекурсия.3. Пример программы с использованием косвенной рекурсии.

Лабораторная работа № 17Реализация алгоритма бинарного поиска при написании

программы на Паскале

Цель работы: формирование знаний и умений по изучению метода бинарного поиска. Приобретение навыков реализации алгоритма бинарного поиска.

78

Page 79: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Краткие теоретические сведения

Основные понятия и определенияПоиском называется алгоритм, который на входе воспринимает некоторое

значение Х и определяет запись, ключ которой совпадает со значением Х. При этом на выходе такой алгоритм может выдать либо найденную запись, либо указатель на нее. Х называется аргументом поиска.

Если в таблице имеется запись с ключом, равным Х, то поиск называется удачным или результативным. В противном случае поиск называется неудачным (безрезультатным).

В дальнейшем будем рассматривать массив А с элементами А[1], А[2] … А[N], в котором индекс изменяется от 1 до N. Кроме того, считаем, что А[i]- и есть ключ i-того элемента массива.

Линейный поискПрименяется в тех случаях, когда о характере расположения ключей нет

никакой информации. Считается, что ключи не упорядочены. Тогда, единственный способ поиска это сравнение Х с А[1]. Если они не равны, тогда Х сравнивается с А[2]. Если Х=А[i], и ключ первичный (каждое его значение уникально в массиве), то поиск прекращается.

Линейный поиск в упорядоченном массиве данныхПусть для элементов массива А выполняется условие:

A[1]<А[2]<А[3]<…< А[n] (1)Ключи упорядочены по возрастанию. В произвольном массиве в случае

неудачного поиска приходится просматривать массив от начала до конца. В упорядоченном массиве достаточно определить момент выполнения неравенства Х< А[i], после чего поиск следует закончить, т.к. А[i+1] … А[n] будут заведомо больше Х.

Бинарный (двоичный) поиск Данный поиск называется делением пополам (метод дихотомии). Тоже

выполняется в упорядоченных массивах, для элементов которого выполняется условие (1). Х- аргумент поиска.

Определяется m=N/2 - целая часть. Рассматривается А[m]-срединный элемент исходной последовательности. Если А[m]=Х, то поиск закончен, он результативен. Если А[m]<Х, то из поиска исключаются все элементы, от А[1] до А[m], т.к. они заведомо меньше Х. Если А[m]>Х, то из поиска исключаются все элементы, от А[m] до А[n]. Поиск продолжается в оставшейся подпоследовательности (половине): определяется значение m-индекс элемента, и если его ключ не равен Х, то из поиска исключаются одна из половинок и т.д.

Пусть дан упорядоченный массив из 10 элементов (N=10):1 2 3 4 5 6 7 8 9 10 Пусть необходимо в данном массиве найти цифру 6. Определяем

m=10/2=5.

79

Page 80: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Рассматриваем A[5]=5 (А[m]). В данном случае А[m] не равно искомому элементу (5 не равно 6), и проверяем А[m]<Х ? Условие выполняется (5<6) и из поиска исключаются все элементы от 1 до 5. Поиск продолжается в оставшейся половинке.

6 7 8 9 10 (N=5)Определяем m=5/2=2 (целая часть). Рассматриваем А[2]=7. Так как

А[m]>Х (7>6), то из поиска исключаются все элементы от 7 до 10. Поиск продолжается в последовательности элементов, в данном случае состоящей из одного элемента равного 6, который и является аргументом поиска. Поиск закончен.

Описанную процедуру можно представить в виде дерева, в корень которого помещаем срединный элемент всей последовательности, его сыновьями будут срединные элементы половинок. Сыновьями вершин первого уровня будут срединные элементы четвертинок.

Тогда поиск выполняется, начиная с корня. По достижении каждого узла определяется направление дальнейшего поиска. Если аргумент поиска меньше ключа, размещенного в узле, то поиск выполняется в левом поддереве. Если больше , то в правом поддереве. Подобного рода древовидная структура называется деревом поиска.

Пример программы с использованием алгоритма бинарного поискаProgram DemoSearch_2;Uses Crt;Const Maximum=100;{максимальное значение элементов массива}Type DataType=Integer; DataIn=array [1..Maximum] of Integer;{пользовательский тип DataIn, который обозначает массив из элементов типа Integer}Var WorkArray:DataIn;{объявляем массив типа DataIn} i:Byte;{Объявляем функцию Poisk2, у которой 3 формальных параметра:1-массив, 2-количество элементов массива, 3-ключ поиска}Function Poisk2(Vx:DataIn;N:Integer;K1:DataType):Integer;{Poisk2}

80

Page 81: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Var L,U,Middle:Integer; Rez:Boolean; j:Integer;beginL:=1;U:=N;Rez:=False;While (L<=U) and (not Rez) do begin

{Средний элемент массива} Middle:=(L+U)div 2;

{если ключ меньше среднего элемента массива, то поиск происходит в правой оставшейся части массива}

If K1<Vx[Middle] then U:=Middle-1 else

If K1>Vx[Middle] then L:=Middle+1 else Rez:=True; end;

If Rez=True then Poisk2:=MiddleelsePoisk2:=0;

end;{Poisk2}{Основная программа}

BeginClrScr;for i:=1 to 10 dobegin

writeln('Введите ',i,'-й элемент массива'); readln(WorkArray[i]);

end;Case Poisk2(WorkArray,10,6) of0:Writeln('Такого значения нет')elseWriteln('Впервые цифра 6 появилась под номером',Poisk2(WorkArray,10,6));end;repeat until keypressed;End.

Порядок выполнения работы1. Изучить теоретические сведения по теме “Алгоритм бинарного поиска”.2. Получить у преподавателя индивидуальное задание и разработать

программу по заданному варианту.3. Показать работающую программу преподавателю.

81

Page 82: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

4. Ответить на контрольные вопросы.Контрольные вопросы

1. Основные понятия поиска данных.2. Различные методы поиска данных. Краткое описание алгоритмов. 3. Бинарный поиск. Описание алгоритма и пример программы.

Лабораторная работа № 18Реализация алгоритмов сортировок включением и выбором при

написании программы на Паскале

Цель работы: формирование знаний и умений по изучению методов внутренних сортировок. Приобретение навыков реализации алгоритмов сортировки.

Краткие теоретические сведенияПод сортировкой понимают процесс переупорядочивания некоторого

множества объектов с целью их размещения в заданном порядке. Это универсальный вид деятельности с точки зрения обработки данных, которые представляют собой последовательность ключей. С помощью сортировки добиваются такого их размещения, чтобы было выполнено условие:

f(a[1]) f(a[2])f(a[3])… f(a[N]),где символ означает знак предшествования, а f-некоторая функция

упорядочивания. При упорядочивании по возрастанию, после сортировки будет выполнено условие:

a[1] a[2] a[3] . . . a[N]В ходе сортировки элементы последовательности меняются местами.

Сортировка называется устойчивой, если на этапе замены два одинаковых ключа не меняются местами. Сортировка называется внутренней, если все сортируемые ключи размещаются в оперативной памяти. Если некоторая часть ключей размещается на внешнем носителе, то сортировка называется внешней.

Методы внутренней сортировкиВ данных лабораторно-практических работах будут рассмотрены методы, у

которых на входе - вектор с произвольным положением ключей, а на выходе - этот же вектор упорядочен по возрастанию.

Существует три группы методов внутренней сортировки (сортировка включением, сортировка выбором, обменная сортировка). В данной лабораторной работе рассмотрены методы сортировки включением и выбором.

Сортировки включениемСортировка прямым включением. Элементы условно разделяют на

готовую a[1],...,a[i-1] и входную последовательности a[i],...,a[n]. Сначала i=2. На каждом шаге, увеличивая i на единицу, берут i-й элемент входной

82

Page 83: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

последовательности и передают в готовую последовательность, вставляя на подходящее место.

Итак, в начале рассматривается второй элемент (i=2) последовательности ключей. Он сравнивается с первым элементом (a[i-1]) и если он его меньше, то они меняются местами. В противном случае проход заканчивается, i увеличивается на 1 и процесс повторяется. Заметим, что упорядоченная последовательность a[i-1] называется готовой последовательностью и новый элемент вставляется в готовую последовательность на свое место.

На каждом проходе происходит перемещение i-того элемента в готовую последовательность, а некоторое число элементов сдвигается вправо. Данный процесс перемещения называется просачиванием элемента.

Здесь и далее, во всех процедурах сортировки ключи упорядочиваются по возрастанию. На входе процедур - количество элементов массива (n), на выходе - упорядоченный массив элементов(а).Procedure Straight_Insertion(n:integer; Var a:t);Vari,j:word;x:integer; Begin For i:=2 To n Do

begin x:=a[i]; a[0]:=x; j:=i-1;

While x<a[j] Do begin a[j+1]:=a[j]; j:=j-1; end; a[j+1]:=x end;

End;{Straight_Insertion}Процедура упорядочивает элементы массива начиная с первого. Нулевой элемент используется процедурой как вспомогательный.В основной программе массив необходимо объявить следующим образом:

TYPEt=array[0..20] of integer;

VARA:t;N,i:word;

Ввод массива:FOR i:=1 to n do

Read(a[i]);Вывод отсортированного массива:

FOR i:=1 to n doWrire(a[i],’ ‘);

Сортировка бинарными включениями. Алгоритм сортировки прямыми включениями можно легко улучшить, пользуясь тем, что готовая

83

Page 84: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

последовательность a[1],...,a[i-1], в которую нужно включить новый элемент, уже упорядочена. Поэтому место включения можно найти значительно быстрее, применив бинарный поиск, который исследует средний элемент готовой последовательности и продолжает деление пополам, пока не будет найдено место включения. Модифицированный алгоритм сортировки называется сортировкой бинарными включениями.Procedure Binary_Insertion(n:word;Var a:t);Vari,j,k,r,m:word;x:integer;Begin

For i:=2 To n Dobeginx:=a[i]; k:=1; r:=i-1;

While k<=r Dobeginm:=(k+r) div 2;If x<a[m] Then r:=m-1Else k:=m+1end;

For j:=i-1 DownTo l Do a[j+1]:=a[j];a[k]:=xend;

End; {Binary_Insertion}

Сортировка выборомПрямой выбор. Этот метод основан на следующем правиле: выбираем

элемент с наименьшим ключом. Он меняется местами с первым элементом. Эти операции затем повторяются с оставшимися n-1 элементами, затем с n-2 элементами, пока не останется только один элемент - наибольший. Этот метод называемый сортировкой простым выбором, в некотором смысле противоположен сортировке простыми включениями; при сортировке простым выбором рассматриваются все элементы входного массива для нахождения элемента с наименьшим ключом, и этот один очередной элемент отправляется в готовую последовательность. Procedure Straight_Selection(n:word;Var a:t); Var i,j,k:word; x:integer; Begin For i:=1 To n-1 Do begin x:=a[i]; k:=i; For j:=i+1 To n Do If x>a[j] Then

84

Page 85: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

begin k:=j; x:=a[j]; end; a[k]:=a[i]; a[i]:=x; end End;{Straight_Selection}

Порядок выполнения работы1. Изучить теоретические сведения по теме: ”Алгоритмы сортировок

включением и выбором”2. Разработать программу для реализации рассмотренных в данной работе

методов сортировок. Предоставить пользователю возможность выбора метода сортировки.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Понятие сортировки. Виды сортировок.2. Сортировки включением. Описание алгоритмов методов сортировки

прямыми и бинарными включениями.3. Сортировки включением. Описание алгоритмов методов сортировки

прямыми и бинарными включениями.4. Сортировка выбором. Описание алгоритма.5. Фрагменты программ для реализации данных методов сортировок.

Лабораторная работа № 19Реализация алгоритмов обменных сортировок при написании

программы на Паскале

Цель работы: формирование знаний и умений по изучению методов внутренних сортировок. Приобретение навыков реализации алгоритмов сортировки.

Краткие теоретические сведения

Существует три группы методов внутренней сортировки (сортировка включением, сортировка выбором, обменная сортировка). В данной лабораторной работе рассмотрены методы обменных сортировок.

Сортировка прямого обмена (пузырьковая)Метод, в котором обмен двух элементов является основной

характеристикой процесса. Алгоритм сортировки простым обменом основан на принципе сравнения и обмена пары соседних элементов до тех пор, пока не будут рассортированы все элементы. Если мы будем рассматривать массив, расположенный вертикально, а не горизонтально и представим себе элементы пузырьками в резервуаре с водой, обладающими “весами”, соответствующими

85

Page 86: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

их ключам, то каждый проход по массиву приводит к “всплыванию” пузырька на соответствующий его весу уровень. Этот метод широко известен как сортировка методом пузырька.

Начнем последовательность обменов с элементами а[N]. В каждом проходе местами меняются соседние элементы. Самый легкий элемент поднимается за один проход, самый тяжелый опускается вниз за один проход. Если самый большой элемент был первым, то выполняется N проходов. Критерием окончания является отсутствие обменов при очередном проходе.

Здесь и далее, во всех процедурах сортировки ключи упорядочиваются по возрастанию. На входе процедур - количество элементов массива (n), на выходе - упорядоченный массив элементов(а).Procedure Bubble_Sort(n:word;Var a:t); Var i,j:word; x:integer; Begin For i:=2 To n Do begin For j:=n DownTo i Do If a[j-1]>a[j] Then begin x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x end end End;{Bubble_Sort}

Шейкерная сортировкаУлучшение алгоритма - это запоминать, производится ли на данном

проходе какой-либо обмен. Если нет, то это означает, что алгоритм может закончить работу. Этот процесс улучшения можно продолжить, если запомнить не только сам факт обмена, но и место (индекс) последнего обмена. Все пары соседних элементов с индексами, меньшими этого индекса k, уже расположены в нужном порядке. Поэтому следующие проходы можно заканчивать на этом индексе, вместо того чтобы двигаться до установленной заранее нижней границы i.

Однако внимательный программист заметит здесь странную асимметрию: один неправильно расположенный "пузырек" в "тяжелом" конце рассортированного массива всплывет на место за один проход, а неправильно расположенный элемент в "легком" конце будет опускаться на правильное место только на один шаг на каждом проходе. Улучшение: менять направление следующих один за другим проходов. Полученный в результате алгоритм называют шейкерной сортировкой.

Итак, для того, чтобы тяжелые элементы сразу попадали вниз пузырьковую сортировку выполняют так, чтобы направление прохода было снизу вверх, следующий проход - сверху вниз и так далее.

86

Page 87: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Procedure Shaker_Sort(n:word;Var a:t); Var j,k,l,r:word; x:integer; Begin l:=2; r:=n; k:=n; Repeat For j:=r DownTo l Do If a[j-1]>a[j] Then begin x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x; k:=j; end; l:=k+1; For j:=l To r Do If a[j-1]>a[j] Then begin x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x; k:=j; end; r:=k-1; Until l>r End;{Shaker_Sort}

Пирамидальная сортировкаПирамида определяется как последовательность ключей hl, hl+1, ..., hr такая,

что hi<=h2i, hi<=h2i+1 для всякого i=l,...,r/2. Предположим, что дана пирамида с элементами hl+1, ..., hr для некоторых

значений l и r и нужно добавить новый элемент x для того, чтобы сформировать расширенную пирамиду hl, ..., hr. Новый элемент x сначала помещается в вершину дерева, а затем “просеивается” по пути, на котором находятся меньшие по сравнению с ним элементы, которые одновременно поднимаются вверх; таким образом, формируется новая пирамида.

Здесь в процедуре Heap_Sort вызывается процедура Sift, которая реализует алгоритм формирования пирамиды.Procedure Heap_Sort(n:word;Var a:t); Var l,r:word;x:integer; Procedure Sift; Label 13; Var i,j:word; Begin i:=l; j:=2*i; x:=a[i]; While j<=r Do begin If j<r Then If a[j]<a[j+1] Then j:=j+1;

87

Page 88: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

If x>=a[j] Then Goto 13; a[i]:=a[j]; i:=j; j:=2*i; end; 13: a[i]:=x End;{Sift} BEGIN l:=(n div 2)+1; r:=n; While l>1 Do begin l:=l-1; Sift end; While r>1 Do begin x:=a[1]; a[1]:=a[r]; a[r]:=x; r:=r-1; Sift end END;{Heap_Sort}

Обменная сортировка разделениемЭтот метод называется еще быстрой сортировкой. Быстрая сортировка

основана на том факте, что для достижения наибольшей эффективности желательно производить обмены элементов на больших расстояниях. Реализуется она на основе следующего алгоритма.

Выбирается любой произвольный элемент массива, далее массив просматривается слева направо до тех пор пока не будет найден элемент больший выбранного; а затем просмотрим его справа налево, пока не найдем элемент меньший выбранного. Найденные элементы поменяем местами. Затем продолжим процесс “просмотра с обменом”, пока два просмотра не встретятся где-то в середине массива. В результате массив разделится на две части: левую - с ключами меньшими выбранного элемента; и правую - с большими ключами. Описанный алгоритм применяется к обоим этим частям, в результате чего последовательность разбивается на 4 части. Алгоритм применяется к каждой четвертинке и т.д. Разделение заканчивается, когда в каждой части остается 1 элемент.

Здесь в процедуре Quick_Sort вызывается процедура Sort1, которая реализует алгоритм разделения и обмена для одной части массива.Procedure Quick_Sort(n:word;Var a:massiv); Procedure Sort1(l,r:word); Var w,x:integer; i,j:word; Begin i:=l; j:=r; x:=a[(l+r) div 2]; Repeat

88

Page 89: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

While a[i]<x Do i:=i+1; While a[j]>x Do j:=j-1; If i<=j Then begin w:=a[i]; a[i]:=a[j]; a[j]:=w; i:=i+1; j:=j-1 end Until i>j; If l<j Then Sort1(l,j); If i<r Then Sort1(i,r); End;{Sort1} BEGIN Sort1(1,n); END;{Quick_Sort}

Порядок выполнения работы1. Изучить теоретические сведения по теме: ”Алгоритмы обменных

сортировок”.2. Разработать программу для реализации рассмотренных в данной работе

методов сортировок. Предоставить пользователю возможность выбора метода сортировки.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Пузырьковая сортировка. Описание алгоритма и фрагмент программы.2. Шейкерная сортировка. Описание алгоритма и фрагмент программы.3. Пирамидальная сортировка.4. Быстрая сортировка.

Лабораторная работа № 20Реализация алгоритмов внешних сортировок при написании

программы на Паскале

Цель работы: формирование знаний и умений по изучению методов внешних сортировок. Приобретение навыков реализации алгоритмов сортировки.

Краткие теоретические сведенияВнешняя сортировка применяется при сортировке последовательных

файлов, которые называются лентами. Последовательные файлы имеют такую особенность, что для того, чтобы получить доступ к элементу, находящемуся внутри последовательности нужно просмотреть все элементы, расположенные до него. Т.о. в каждый текущий момент мы имеем доступ только к 1 элементу последовательного файла.

89

Page 90: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Метод простого слиянияПусть в последовательном файле (ленте) имеется следующая информация:

31 42 09 29 37 01 12 06Во внешних сортировках каждый проход состоит из фаз. В методе простого

слияния существует 2 фазы: разделения и слияния. Для рассмотренного метода нужны 3 ленты. Исходная последовательность (А) разделяется на 2 ленты (В и С):

A: 31 42 09 29 37 01 12 06 –исходный файлB: 31 42 09 29 C: 37 01 12 06Затем выполняется фаза слияния: анализируются доступные на лентах В и

С элементы и посылаются на ленту А в виде упорядоченных пар: A: 31 37 01 42 09 12 06 29. Теперь содержимое ленты А состоит из упорядоченных пар. Затем снова

разделяется наполовину: В: 31 37 01 42 С: 09 12 06 29. Последовательность сливается в упорядоченные четверки. А: 09 12 31 37 01 06 29 42.

Схематично метод простого слияния выглядит так:

Естественное слияниеПредыдущий метод не учитывает того факта, что в исходной

последовательности уже могут быть упорядоченные подпоследовательности. Они называются сериями. Это последовательности вида:

A[L],A[L+1],…A[k], такая, что:A[L] A[L+1] …A[k], A[L-1]>A[L], A[k+1]<A[k].Метод работает так: сначала первая серия посылается на ленту В, вторая- на

ленту С, третья- на ленту В, четвертая на С и т.д. Первая серия с ленты В сливается с первой серией ленты С. В результате на ленте А куда сливаются эти серии появится 1-ая увеличенная серия.

Затем вторая серия ленты В сливается со второй серией ленты С и т.д. После выполнения всех вариантных слияний количество серий на ленте А

90

Page 91: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

окажется в двое меньше, чем в исходной последовательности. Затем снова разделение серий, снова слияние и т.д.

Многопутевое слияниеВ этом методе исходная лента разделяется не на две, а на m лент (m>2). Схематично метод простого слияния выглядит так (рис1.):

Рисунок 1 Многопутевое слияние

На рисунке 1- B1,B2, …, Bm соответственно 1,2, .., m –тая дополнительные ленты.

Алгоритм метода работает так: первая серия на ленте А при выполнении фазы разделения помещается на ленту В1, вторая серия-на ленту В2 и т.д., m- тая серия на ленту Вm. M+1 серия на ленту В1, M+2- на ленту В2 и т.д.

После выполнения фазы разделения происходит слияние всех первых серий каждой дополнительной ленты. Для организации слияния в ОП может быть организован массив из m элементов.

После выполнения первой фазы разделения на каждой из дополнительных лент будет размещено примерно ]N/m[ серий. После выполнения второй фазы разделения число серий на каждой ленте ]N/m[ /m.

Методы внешней сортировки могут быть использованы для упорядочивания массивов, хранимых в ОП. При этом некоторые наиболее эффективные из них сравнимы или даже превосходят по эффективности самую быстродействующую сортировку – пирамидальную.

Порядок выполнения работы1. Изучить теоретические сведения по теме: ”Алгоритмы внешних

сортировок”2. Получить у преподавателя индивидуальное задание по одному из

рассмотренных методов внешних сортировок. 3. Показать выполненное задание преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Понятие внешней сортировки. Виды сортировок.2. Метод простого слияния. Описание алгоритма.3. Естественное слияние. Описание алгоритма.4. Многопутевое слияние.Описание алгоритма.

91

Page 92: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Лабораторная работа № 21Написание программы на языке Паскаль с использованием

разработанного собственного модуляЦель работы: формирование знаний и умений по работе с модулями. Приобретение навыков создания собственных модулей.

Краткие теоретические сведенияБогатство алгоритмических возможностей Паскаля в значительной степени

достигается благодаря использованию модулей. Модуль представляет собой набор констант, типов данных, переменных,

процедур и функций. Каждый модуль по своей структуре аналогичен отдельной программе.

Модуль - программная единица, текст которой компилируется независимо (автономно).

Вместе с тем, структура модуля позволяет использовать его как своеобразную библиотеку описаний. Модули являются достаточно гибким и удобным инструментальным средством при разработке больших программах комплексов рамках совместной технологии разработки программного обеспечения (структурное программирование и др.).

Кроме того, использование модулей позволяет практически обойти известное для 16-разрядной ПЭВМ ограничение на размер кодового сегмента (как известно, размер кодового сегмента отдельной программы не должен превышать 64 Кбайт). Это достигается благодаря тому, что каждому модулю при выполнении при выполнении программы отводится свой отдельный сегмент оперативной памяти.

Паскаль располагает 8-мью стандартными (встроенными) модулями. Это System, Dos, Overlay, Graph, CRT, Printer, Turbo3, Graph3. Два последних модуля предназначены для поддержки совместимости программ, написанных на Турбо-Паскале версии 3.0.

Все перечисленные стандартные модули (кроме Graph, Graph3, Turbo3) объединены и сохранены в файле TURBO.TPL.

Модуль SYSTEM поддерживает все стандартные процедуры и функции, обеспечивает ввод-вывод данных, обработку строк, динамическое распределение оперативной памяти и ряд других возможностей Турбо-Паскаля. Модуль SYSTEM подключается к любой программе автоматически.

Модель DOS содержит многочисленные процедуры и функции, многие из которых по своему действию эквивалентны командам MS-DOS (GetTime, DiskSize и др.).

Модуль OVERLAY обеспечивает поддержку систем оверлеев.Модуль CRT поддерживает ряд стандартных процедур и функций, которые

обеспечивают работу с экраном дисплея в текстовом режиме, управление звуком и работу с клавиатурой.

92

Page 93: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Модуль PRINTER определяет драйвер печатающего устройства и позволяет организовывать вывод информации на принтер.

Модуль GRAPH обеспечивает работу с экраном дисплея в графическом режиме.

Наряду с использованием стандартных модулей каждый программист имеет возможность организации собственных модулей.

Структура любого следующего модуля имеет вид: ЗАГОЛОВОК МОДУЛЯ

Unit < имя модуля >;

ИНТЕРФЕЙСНАЯ ЧАСТЬInterfaсeUses < список используемых модулей >{ открытые объявления}TypeVarProcedure Function

РЕАЛИЗАЦИОННАЯ ЧАСТЬImplementationUses < список используемых модулей >{ собственные объявления }TypeVar{ процедуры и функции }Procedure Function

ИНИЦИАЛИЗАЦИОННАЯ ЧАСТЬBegin… {Основной блок модуля}End.

Имя модуля записывается за ключевым словом UNIT. При выборе имени модуля необходимо учитывать одну особенность: имя модуля должно совпадать с именем файла, в котором он хранится.

Далее записывается раздел интерфейсной части (за ключевым словом Interfaсe). Эта часть модуля является доступной (“видимой”) для любой программы, использующей этот модуль. То есть объявленные в этом разделе константы, типы данных, переменные, процедуры и функции, могут использоваться в любой другой программе. В свою очередь, в разделе интерфейса могут указываться другие используемые модули (их список следует за ключевым словом Uses). При этом все объекты, объявленные в интерфейсах

93

Page 94: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

этих модулей могут быть использованы в любом объявлении в интерфейсе данного модуля.

Примечание. Для “видимых” процедур и функций в интерфейсном разделе приводится только их заголовки. Полностью эти процедуры и функции записываются в разделе реализации.

Следующим структуре модуля описывается раздел реализации (за ключевым словом Implementation). В этом разделе могут использоваться все объекты, описанные в разделе интерфейса. Вместе с тем, здесь могут объявляться свои константы, типы данных, переменные процедуры и функции. Они могут быть использованы только в данном разделе реализации и в этом смысле являются “не видимыми”. Это же ограничение относится и к интерфейсам других модулей, список которых следует за ключевым словом Uses (в отличие от аналогичного списка в разделе интерфейса данного модуля). Таким образом, различие всех описаний содержащихся в разделе интерфейса и реализации заключается в сфере их использования (первые -доступны извне, вторые -только внутренние).

Раздел реализации модуля начинается ключевым словом Implementation и заканчивается end. Но если между ними появляется ключевое слово begin, то получившийся составной оператор begin…end становится разделом инициализации модуля. Раздел инициализации обычно используется для открытия файлов и для формирования значений структур данных и переменных.

При выполнении программы, использующей модули, их разделы инициализации вызываются раньше загрузки самой программы. Для того чтобы использовать модули в программах их имена следует указать в разделе подключения модулей Uses.

Например, вы разработали программу, которая наряду со стандартным модулей Crt использует ваш разработанный собственный модуль с именем Modul. Тогда, в программе следует указать список используемых модулей в следующем виде:

Program Pr;Uses Crt, Modul;. . .

Модули транслируются отдельно. В отличие от основных программ результатом трансляции которых будут файлы с расширением EXE модули получают расширение TPU. Полученные в результате трансляции TPU - файлы можно подсоединить к стандартному файлу TURBO.TPL с помощью утилиты TPUMOVER.EXE. Если этого не делать, то при трансляции самой программы все используемые модули (TPU - файлы) присоединяться к ней автоматически. Если в каком-либо из используемых модулей были внесены изменения, то при трансляции программы, все модифицируемые модули также будут предварительно перетранслированы (эту функцию реализует интегрированная среда).

Пример разработки собственного модуля Разработку собственного модуля рассмотрим на следующем примере:

94

Page 95: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Пусть дано задание: разработать личную библиотеку, включив в нее процедуры:

ввода элементов числовой матрицы размером N*N; транспонирования матрицы;вывода результирующей матрицы.

В основной программе ввести размер матрицы N.Начнем разработку модуля, который будет носить название Matrix.

Программно это будет выглядеть так:

Unit Matrix; {Зарезервированное слово Unit служит для указания имени библиотеки. Это имя должно совпадать с именем PAS-файла библиотеки (т.е библиотека Matrix должна находиться с файле Matrix.Pas), а иначе компилятор даст ошибку при попытке использования такой библиотеки}

Interface{Секция Interface содержит описания общедоступных типов данных, констант, процедур и функций. Т.е. все, что будет здесь находиться можно будет использовать при подключении данной библиотеки.}

Type TMatrix = array [1..10,1..10] of Integer; { Квадратная матрица } procedure MatrInput (Var m : TMatrix; n : Integer); { ввод матрицы } procedure MatrOutput (Var m : TMatrix; n : Integer); { вывод матрицы } procedure MatrTransp (Var m : TMatrix; n : Integer); { транспонирование }

Implementation{Секция Implementation содержит реализацию тел процедур и функций, описанных в Interface. Также здесь могут содержаться типы данных, константы, процедуры и функции, необходимые для работы, но которые не будут видны программе при подключении библиотеки.}{Процедура обмена местами двух элементов матрицы (x1,y1) и (x2,y2). Эта процедура используется при транспонировании матрицы, но ее нельзя вызвать при подключении библиотеки, т.к. она не объявлена в секции Interface.}procedure Swap (Var m : TMatrix; x1,y1,x2,y2 : Integer); var temp : Integer; begin temp := m[x1,y1];

95

Page 96: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

m[x1,y1] := m[x2,y2]; m[x2,y2] := temp; end;{Ввод матрицы с клавиатуры. Параметры процедуры здесь не указаны, т.к. они есть в секции Interface }procedure MatrInput; var i,j : Integer; begin for i:=1 to n do begin Write(i:3,'-я строка : '); for j:=1 to n do Read(m[i,j]); ReadLn; end; end;{Транспонирование матрицы.}procedure MatrTransp; var i,j : Integer; begin for i:=1 to n-1 do for j:=i+1 to n do Swap (m,i,j,j,i); end;{Вывод матрицы на экран.}procedure MatrOutput; var i,j : Integer; begin for i:=1 to n do begin Write(i:3,'-я строка : '); for j:=1 to n do Write (m[i,j]:4); WriteLn; end; end;{Эта секция может использоваться для инициализации работы библиотеки.}BeginEnd.

Создание модуля закончено. Теперь необходимо создать файл, который будет содержать текст основной программы, в которой будет подключаться разработанный выше модуль.{Это отдельный файл, содержащий основную программу}Uses

96

Page 97: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Crt, { Библиотека стандартных процедур управления экраном и клавиатурой } Matrix; {Наш разработанный модуль-библиотека работы с квадратными матрицами (личная)}Var m : TMatrix; { Объявляем матрицу - максимальный размер 10*10 } n : Integer; { Размер матрицы }Begin { Повторяем ввод размера, пока не будет введено корректное значение} repeat ClrScr; Write('Введите размер матрицы (1..10) : '); ReadLn(n); until (n >= 1) and (n <= 10);WriteLn;WriteLn('Введите матрицу размера',n,'*',n,'по строкам:');MatrInput (m,n); {вызов процедуры ввода матрицы, определенной в модуле Matrix} {Транспонируем ее } MatrTransp (m,n); {вызов процедуры транспонирования матрицы, определенной в модуле Matrix} { Выведем результат на экран } WriteLn; WriteLn('Транспонированная матрица :'); MatrOutput (m,n); {вызов процедуры вывода матрицы, определенной в модуле Matrix}End.

Порядок выполнения работы1. Изучить теоретические сведения по теме “ Модули в Паскале”.2. Получить у преподавателя индивидуальное задание. Разработать личную

библиотеку, включив в нее процедуры, определенные в задании.3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Стандартные модули в Паскале.2. Структура модуля. 3. Ключевые слова Unit, Interface, Implementation. Описание каждого раздела.4. Концепция разработки собственного модуля. Пример программы.

Лабораторная работа № 22Изучение наиболее часто употребляемых универсальных процедур

и оформление их в виде личной библиотеки программиста

97

Page 98: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Цель работы: формирование знаний и умений по работе с модулями. Приобретение навыков создания личных библиотек.

Краткие теоретические сведения

Встроенные функции и процедурыМодуль System подключается к программе автоматически, поэтому его

имя не указывается в разделе Uses. По этой причине программе становятся доступны все его встроенные процедуры и функции.

Арифметические процедуры и функцииAbs(X:real/

integer):real/integerВычисление абсолютной величины Х. Тип результата совпадает с типом параметра.

ArcTan(X:real):real Вычисление угла, тангенс которого равен Х радиан.

Cos(X:real):real Вычисление косинуса Х. Параметр задает значение угла в радианах.

Exp(X:real):realВычисление экспоненты Х, т.е. значение Е в степени Х. Е является основанием натурального логарифма и равно=2,718282.

Int(X:real):real Вычисление целой части Х. Frac (X:real):real Вычисление дробной части Х.

Pi:real Возвращает значение числа Пи (3,14….)

Sin(X:real):real Вычисление синуса Х. Параметр задает значение угла в радианах.

Sqr(X)Возведение в квадрат значения целого или вещественного числа Х. Тип результата совпадает с типом параметра.

Sqrt(X:real):real Вычисление квадратного корня из Х.

Random:real Генерирует значение случайного числа из диапазона 0..0,99.

Random(I:word):word

Генерирует значение случайного числа из диапазона от 0..I.

Randomize Изменение базы генератора случайных чисел.

Скалярные процедуры и функции

Dec(X,{n})

Процедура уменьшает значение целочисленной переменной Х на величину n. При отсутствии необязательного параметра n значение Х уменьшается на 1.

Inc(X,{n})

Процедура увеличивает значение целочисленной переменной Х на величину n. При отсутствии необязательного параметра n значение Х увеличивается на 1.

98

Page 99: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Pred(S)

Функция возвращает элемент, предшествующий S в списке значений типа. Тип результата совпадает с типом параметра. Если предшествующего S элемента не существует, возникает программное прерывание.

Succ(S)

Функция возвращает значение, следующее за S в списке значений типа. Тип результата совпадает с типом параметра. Если следующее за S значение элемента не существует, возникает программное прерывание.

Odd(I:integer):Boolean

Возвращает True, если I нечетное, и False, если I-четное.

Функции преобразования типов

Chr(I:byte):char

Возвращает символ стандартного кода обмена информацией с номером, равным значению I. Если значение параметра больше 255, возникает программное прерывание.

Ord(S):LohgInt Возвращает порядковый номер значения S в множестве, определенном типом S.

Round(X:real):longInt

Возвращает значение Х, округленное до ближайшего целого числа.

Trunc(X:real):longInt

Возвращает ближайшее целое число, меньшее или равное Х, если Х>=0, и большее или равное Х, если Х<0.

Процедуры управления программойDelay(I:word) Задержка выполнения программы на I мс.

Exit

Выход из выполняемого блока. Если текущий блок является процедурой или функцией, то выход производится в основную программу. Если указана в операторной части программы, программа прекращает работу, и управление передается системе программирования.

Halt(N:word)

Прекращение выполнения программы и передача управления системе программирования.N-код завершения программы, передаваемый в операционную систему.

RunError(ErrCode:word)

Прекращение выполнения программы и генерация ошибки времени выполнения. ErrCode-параметр типа Byte, содержащий номер ошибки.

99

Page 100: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Специальные процедуры и функции

Hi(I:integer):byteВыделяет старший байт значения I и помещает его в младший байт результата. Старший байт результата равен 0.

Lo(I:integer):byteВыделяет младший байт значения I и помещает его в младший байт результата. Старший байт результата равен 0.

SizeOf(IT):wordВычисляет объем основной памяти в байтах, которую занимает указанная переменная или тип. IT-идентификатор переменной или типа данных.

Swap(I:integer):integer

Обменивает содержимое младшего и старшего байтов целочисленного выражения, заданного параметром I типа integer.

Вызов стандартной процедуры или функцииДля использования стандартной процедуры или функции к программе

подключается тот или иной специализированный библиотечный модуль, в котором записана данная стандартная процедура или функция, для чего имя библиотечного модуля указывается в разделе uses. Затем в основной программе записывается вызов процедуры или функции, для чего записывается ее имя и указываются фактические параметры. Так как после выполнения функции ее значение присваивается имени, то имя функции может использоваться в выражении.

Также в своем разработанном модуле можно описать и реализовать собственные процедуры и функции, служащие облегчением работы программиста. Данные процедуры и функции могут быть собраны в отдельный собственно разработанный модуль и могут использоваться как личная библиотека программиста.

Пример разработки собственной библиотеки Итак, сначала разрабатывается модуль с любым называнием. В него в

интерфейсной части записываются названия процедур и функций, реализация которых будет представлена в части implementation. Например, создадим функцию max, вычисляющую максимальное значение между двумя целыми числами. Для этого в разделе interface сделаем следующее объявление:function max(a1,b1:integer):integer;

После этого в разделе implementation должна находится реализация данной функции max.

Текст программы модуля может выглядеть так:unit my_modul;interface

function max(a1,b1:integer):integer;

implementationfunction max(a1,b1:integer):integer;

100

Page 101: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

beginmax:=a1; if a1>b1 then max:=a1 else max:=b1;

end;beginend.

Данный модуль сохраняется на диске как файл с тем же названием (my_modul). При компиляции он автоматически получает расширение tpu.

Затем, в основной программе в разделе подключения модулей запишем:uses crt,my_modul;

После этого можно воспользоваться функцией max, определенной и реализованной в модуле my_modul.

Текст основной программы может выглядеть так: program kk;uses crt,my_modul;var

a1,b1,y:integer;begin

writeln('Введите 2 числа');readln(a1,b1);y:=max(a1,b1);writeln('max=',y);

end.Порядок выполнения работы

1. Изучить теоретические сведения по теме “ Изучение наиболее часто употребляемых универсальных процедур и оформление их в виде личной библиотеки программиста”.

2. Получить у преподавателя индивидуальное задание. Разработать личную библиотеку, включив в нее процедуры, определенные в задании.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Стандартные функции и процедуры в Паскале.2. Концепция разработки собственного модуля со стандартными

процедурами и функциями.3. Разработка собственных процедур и функций, включаемых в личную

библиотеку программиста.4. Пример программы.

101

Page 102: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Лабораторная работа № 23Написание программы на языке Паскаль с использованием

стандартных строковых процедур и функций

Цель работы: формирование знаний и умений по работе со строками. Приобретение навыков работы со стандартными строковыми процедурами и функциями.

Краткие теоретические сведенияСтрока — это последовательность символов кодовой таблицы

персонального компьютера. При использовании в выражениях строка заключается в апострофы. Количество символов в строке (длина строки) может динамически изменяться от 0 до 255. Для определения данных строкового типа используется идентификатор String, за которым следует заключенное в квадратные скобки значение максимально допустимой длины строки данного типа. Если это значение не указывается, то по умолчанию длина строки равна 255 байт.

Переменную строкового типа можно определить через описание типа в разделе определения типов или непосредственно в разделе описания переменных. Строковые данные могут использоваться в программе также в качестве констант.

Недопустимо применение строковых переменных в качестве селектора в операторе Case.

Определение строкового типа устанавливает максимальное количество символов, которое может содержать строка.

Формат описания строкового типаType

<имя типа> =String [максимальная длина строки];Var

<идентификатор, . . . > : <имя типа>;Переменную типа String можно задать и без описания типа:Var

<идентификатор, . . . > : String [максимальная длина строки];

Фрагмент описания строковых данныхConst

Address = 'ул. Переверткина, 25'; {Строковая константа} Type

Flot = string[125];Var

Fstr : Flot; {Описание с заданием типа)St1 : String; {По умолчанию длина строки St1= 255}St2, St3 : string[50] ;

102

Page 103: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Nazv : string[280]; (Ошибка, длина строки Nazv превышает 255}

Строка в языке Турбо Паскаль трактуется как цепочка символов. (Для строки из N символов отводится N+1 байт; N байт-для хранения символов строки, а один байт — для значения текущей длины строки).

К любому символу в строке можно обратиться, указав его номер. В самом начале строки (под нулевым номером) расположен байт, содержащий значение текущей длины строки.

0 1 2 3 … N+1 Nтекущая длина строки

Поэтому для определения объема памяти в байтах, требуемой для размещения строки, к значению ее максимальной длины прибавляется 1.

Например, для размещения в памяти переменных Fstr, St1, St2 требуется соответственно 126, 35 и 51 байт (см. приведенный выше пример).

Рассмотрим структуру размещения строки в памяти на следующем примере. Пусть М — максимальная длина строки, L — текущая длина, А — ячейка памяти.

Тогда:А —содержит величину текущей длины;А+1 — первый символ строки;A+L — последний значащий символ;A+L+1… — незанятые ячейки памяти А+М

Стандартные строковые процедуры и функцииDelete (Str,Poz,N) — удаление N символов строки Str, начиная с позиции

Poz. Если значение Poz > 255, возникает программное прерывание.Например:

Значение Str Выражение Результат'абвгде'

'река Волга'

Delete(Str, 4, 2);

Delete(Str, 1, 5);

'абве'

'Волга'Insert (Strl, Str2, Роz) –вставка строки Str1 в строку Str2, начиная с позиции

Poz. Например:Var

Sl, S2 : string[ll] ;…S1 := ' ЕС ';S2 := 'ЭВМ1841';Insert(S1,S2,4) ;

В результате выполнения последнего выражения значение строки S2 станет равным 'ЭВМ ЕС 1841'.

103

Page 104: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Str (IBR,St) — преобразование числового значения величины IBR и помещение результата в строку St. После IBR может записываться формат, аналогичный формату вывода. Если в формате указано недостаточное для вывода количество разрядов, поле вывода расширяется автоматически до нужной длины.

Например:Значение IBR Выражение Результат

1500 4.8Е+0376854

Str(IBR:6,St)Str(IBR:10,St)Str(-IBR:3,St)

'_1500''____4800'

'—76854'Val (St,IBR,Code) — преобразует значение St в величину целочисленного

или вещественного типа и помещает результат в IBR. Значение St не должно содержать незначащих пробелов в начале и в конце. Code — целочисленная переменная. Если во время операции преобразования ошибки не обнаружено, значение Code равно нулю, если ошибка обнаружена (например, литерное значение переводится в цифровое), Code будет содержать номер позиции первого ошибочного символа, а значение IBR не определено.

Например:Значение St Выражение Результат

'1450''14.2Е+02'

'14.2А+02

Val(St,IBR,Cod) Val(St,lBR,Cod) Val(St,IBR,Cod)

Code=0Code=0Code=5

Copy (St,Poz,N) — выделяет из строки St подстроку длиной N символов, начиная с позиции Poz. Если Poz > Length(St), то результатом будет пробел; если Poz > 255, возникнет ошибка при выполнении. Функция Length описана ниже. Poz, N — целочисленные выражения.

Например:Значение St Выражение Результат'ABCDEFG' 'ABCDEFG'

Copy(St, 2, 3) Copy(St, 4, 10)

'BCD' 'DEFG'

Concat (Strl,Str2,...,StrN) — выполняет сцепление строк Strl, Str2,..,StrN в том порядке, в каком они указаны в списке параметров. Сумма символов всех сцепленных строк не должна превышать 255.

Например:Выражение Результат

Concat('AA','XX','Y')Соnсаt('Индекс','394063')

'AAXXY' 'Индекс 394063'

Length (St) — вычисляет текущую длину в символах строки St. Результат имеет целочисленный тип.

Например:Значение St Выражение Результат'123456789' Length(St) 9

104

Page 105: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

'System 370' Length(St) 10

Pos (Strl,Str2) — обнаруживает первое появление в строке Str2 подстроки Strl. Результат имеет целочисленный тип и равен номеру той позиции, где находится первый символ подстроки Strl. Если в Str2 подстроки Strl не найдено, результат равен 0.

Например:Значение Str1 Выражение Результат

'abcdef ''abcdef'

Pos('de',Strl) Pos('r',Strl)

40

UpCase (Ch) — преобразует строчную букву в прописную. Параметр и результат имеют литерный тип. Обрабатывает буквы только латинского алфавита.

Значение Ch Выражение Результат'd' UpCase(Ch) 'D'

В целом, работу со стандартными строковыми процедурами и функциями можно свести в следующую таблицу:

Процедура/Функция Описание

Delete (St,Poz,N) Удаление N символов строки St, начиная с позиции Poz

Insert (Str1,Str2,Poz) Вставка строки Str1 в строку Str2, начиная с позиции Poz

Str (IBR, St) Преобразование числового значения величины IBR и помещение результата в строку St

Val (St,IBR,Cod)

Преобразует значение St в величину целочисленного или вещественного типа и помещает результат в IBR. Значение St не должно содержать незначащих пробелов в начале и в конце. Cod - целочисленная переменная, в которой содержится 0, если ошибки не обнаружено, и номер позиции первого ошибочного символа, если произошла ошибка. Значение IBR в этом случае не определено.

Copy (St,Poz,N)Выделяет из строки St подстроку длиной N символов, начиная с позиции Poz.Poz N-целочисленные выражения

Concat (Str1,Str2,…,StrN)

Выполняет сцепление строк Str1,Str2,…,StrN в том порядке, в каком они указаны в списке параметров.

Length (St) Вычисляет текущую длину в символах строки St.Результат имеет целочисленный тип.

Pos(Str1,Str2) Обнаруживает первое появление в строке Str2 подстроки Str1. Результат имеет целочисленный

105

Page 106: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

тип и равен номеру той позиции, где находится первый символ подстроки Str1.Если в Str2 подстроки Str1 не найдено, то результат равен нулю.

UpCase (Сh) Преобразует строчную букву в прописную. Параметр и результат имеют литерный тип.

Пример программы работы со стандартными строковыми процедурами и функциями

Program DemoString;Uses Crt;Var

Stroka:String[80];Str1,Str2,Str3:String[20];Search_Str:String[20];Poz:byte;

BeginStroka:='ПРИВЕТ';Writeln(Stroka);Str1:=Copy(Stroka,2,3);Writeln(Str1);

Writeln('Слово ПРИВЕТ состоит из',Length(Stroka):3,' букв');Delete(Stroka,2,3);Writeln(Stroka);writeln;Str2:='Строка - ';Stroka:='Это текст!';Writeln('Новая строка: ', Stroka);Insert(Str2,Stroka,1);Writeln(Stroka);Repeat Until KeyPressed;

End.

Порядок выполнения работы1. Изучить теоретические сведения по теме “Написание программы на

языке Паскаль с использованием стандартных строковых процедур и функций”.

2. Получить у преподавателя индивидуальное задание и разработать программу для работы со стандартными строковыми процедурами и функциями согласно заданному варианту.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

106

Page 107: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Контрольные вопросы1. Понятие строки. Описание строкового типа данных.2. Представление строки в Паскале. Обращение к символу строки. Длина

строки.3. Стандартные строковые процедуры и функции в языке Паскаль.

Лабораторная работа № 24Написание программы на языке Паскаль с использованием

строковых переменных

Цель работы: формирование знаний и умений по работе со строками. Приобретение навыков работы со строковыми переменными.

Краткие теоретические сведения

Строковые выраженияВыражения, в которых операндами служат строковые данные, называются

строковыми выражениями. Они состоят из строковых констант, переменных, указателей функций и знаков операций. Над строковыми данными допустимы операция сцепления и операции отношения.

Операция сцепления (+) применяется для сцепления нескольких строк в одну результирующую строку.

Например:Выражение

'А'+'Т'+' '+ '386''Турбо'+'Паскаль + '7.0'

Результат'AT 386'

Турбо Паскаль 7.0'Следует учитывать, что в операциях сцепления длина результирующей

строки не должна превышать 255.Операции отношения (=, <>, >, <, >=, <=) проводят сравнение двух

строковых операндов и имеют приоритет более низкий, чем операция сцепления, т. е. вначале всегда выполняются все операции сцепления, если они присутствуют, и лишь потом реализуются операции отношения. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в стандартной таблице обмена информацией. Результат выполнения операций отношения над строковыми операндами всегда имеет булевский тип и принимает значение True, если выражение истинно, и False, если выражение ложно. Например:

Выражение'MS-DOS'<'MS-Dos'

'programm' >'PROGRAMM'

РезультатTrueTrue

Если строки имеют различную длину, но в общей части символы совпадают, считается, что более короткая строка меньше, чем более длинная.

107

Page 108: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Строки считаются равными, если они полностью совпадают по длине и содержат одни и те же символы.

Для присваивания строковой переменной результата строкового выражения используется оператор присваивания (:=).

Пример1.Strl := 'Группа, учащихся';Str2 := Strl + ' школы-лицея' ;Fio := 'Бочаров А.А.';

Если значение переменной после выполнения оператора присваивания превышает по длине максимально допустимую при описании величину, все лишние символы справа отбрасываются.

Например:Описание А Выражение Значение А A: String[6] А := 'ГРУППА 1'; 'ГРУППА'Допускается смешение в одном выражении операндов строкового и

литерного типа. Если при этом литерной переменной присваивается значение строкового типа, длина строки должна быть равна единице, иначе возникает ошибка выполнения.

К отдельным символам строки можно обратиться по номеру (индексу) данного символа в строке. Индекс определяется выражением целочисленного типа, которое записывается в квадратных скобках сразу за идентификатором строковой переменной или константы.

Например, выражения Str2[l+2] и Str2[6] обеспечат доступ к третьему('у') и шестому ('а') символам последнего значения переменной Str2 в приведенном выше примере (см. пример 1).

Запись Str2[0] дает доступ к нулевому байту, содержащему значение текущей длины строки. Значение нулевого байта не должно превышать 255, но нарушение этого правила не вызывает программного прерывания, так как директива компилятора R по умолчанию находится в пассивном состоянии {$R-}. Для обеспечения строгого контроля за диапазоном допустимых значений индекса следует перевести директиву R в активное состояние {$R+}. В этом случае компилятор активизирует дополнительные команды для проверки правильности диапазона. Обычно активный режим R устанавливается на стадии отладки программ.

Примеры программ работы со строковыми переменными

Программа 1. Пусть требуется разработать программу, которая во введенном слове подсчитывает число букв "а" и заменяет их буквами "б".

В реализации данной программы разработаем процедуру ChangeChar, в которой будем просматривать строку с целью поиска позиции буквы "а". Это можно организовать с помощью цикла, используя while и стандартную функцию Pos('a', S). Как только функция Pos обнаруживает первое появление в строке S подстроки "а", она возвращает результат — номер позиции буквы "а".

108

Page 109: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Счетчик найденных букв "а" увеличивается на единицу, а в эту позицию вписывается буква "б" и т. д., пока в строке есть буквы "а".

Текст программы может выглядеть следующим образом:program Change_Letter; {Подсчет и замена букв "а" на "б"}

Var S: String;

procedure ChangeChar(var S: string); {Процедура замены буквы "а" на "б"}Var

N : byte;begin

N:=0; {Обнуление числа букв "а"} While PoS('a', S) > 0 do {Если найдена буква "а", то}

beginN:=N+1; {Увеличить счетчик букв "а" на 1} S[Pos('a', S)] := 'б'; {Записать в позицию буквы "а" букву "б"}end;

Writeln ('В слове было ',N, ' букв "а" ');end ;

begin {Основная программа} Write('Введите исходную строку: ');

Readin (S);ChangeChar(S); {Вызов процедуры замены "а" на "б"} Writeln('Получилась строка ', S);

end.Программа 2. Составить программу, которая запрашивает две строки по

четыре символа, состоящие из цифр. Если в строках введены не цифры, выдать сообщение и прервать работу программы.

Программа склеивает введенные строки, затем преобразует исходные строки в числа, подсчитывает их сумму, преобразует результат в строку и печатает строки, полученные в результате склеивания и преобразования суммы чисел в строку.

Действие программы можно представить в виде трех самостоятельных фрагментов: ввод первой и второй строк и преобразование их в число, вывод на экран результата склеивания строк и суммирования чисел. Вывод на экран результатов организуем с помощью стандартных процедур вывода Writeln, а для ввода строк и преобразования их в числа создадим процедуру Inp_Str.

Для передачи данных между процедурой и основной программой введем формальные параметры-переменные S типа String и Х типа Integer. Для преобразования введенной строки в число применим стандартную функцию Val, а для анализа операции преобразования строки в число введем локальную переменную Cod целого типа. После преобразования строки в число проверим значение переменной Cod, если оно не равно 0, то в строке не все символы являются цифрами. Значение Cod укажет позицию первого символа в строке, не

109

Page 110: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

являющегося цифрой. В этом случае напечатаем на экране сообщение об ошибке и. укажем позицию неверно введенного символа в строке, после чего прервем работу программы, используя стандартную процедуру Halt.

Получим следующий текст программы:program Demo_Val_Str;Var

Sl, S2 : String;X1, X2 : Integer;

(Процедура ввода строки цифр и преобразования строки в число}procedure Inp_Str (var S: string; var X:integer);Var

Cod: Integer; {Результат преобразования строки в число} begin

Write('Введите строку цифр');Readln(S) ;Val(S, X, Cod) ;{Преобразование строки S в целое число X} if Cod <> 0 then {Если не все символы в строке являются цифрами}

beginWriteLn('Ошибка! В позиции',Cod,'введенной строки не цифра');

Halt(1); {Прерывание программы} end ;

end ;Begin {Начало основной программы}Inp_Str(Sl,Xl); {Вызов процедуры ввода строки с фактическими

параметрами-переменными S1,X1}Inp_Str(S2,X2); {Вызов процедуры ввода строки с фактическими

параметрами-переменными S2,X2}Writeln('Результат склеивания строк -> ', Concat(Sl,S2));Writeln('Сумма введенных чисел= ',Х1+Х2) ;

end.Программа 3. Составить программу, определяющую, является ли

введенное слово перевертышем. Перевертышем называется слово, которое одинаково читается как сначала, так и с конца, например: шалаш, казак.

Как видно из определения, для выяснения, является ли слово перевертышем, необходимо сравнивать 1-й и последний символ в строке, 2-й и предпоследний, 3-й и предпредпоследний символ, и т. д. до середины слова. Если в процессе сравнения будет установлено отличие сравниваемых символов, т. е. выясняется, что слово читается слева направо иначе, чем справа налево, значит можно сделать вывод, что это слово не является перевертышем. Если в процессе сравнения не будет выявлено отличие сравниваемых символов, значит это слово — перевертыш. Введем следующие переменные: для хранения слов — Word типа String с максимальным размером слов 30 символов и переменную

110

Page 111: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

I целого типа, указывающую номер позиции сравниваемого символа от начала строки.

Текст программы:program Perev_Word; {Является ли введенное слово перевертышем?}Var

I : byte;Word : string[30];

BeginWrite('Введите слово ');Readln(Word) ;{Проверяем символы поочередно от начала до середины слова}for I:=1 to Trunc (Length (Word)/ 2) do

begin{Если соответствующие символы не одинаковы} if Word[I]<>Word[Length(Word)-I+1] then beginWritein (' Неперевертыи') ;exit {Выход из цикла и завершение программы, дальше не имеет смысла сравнивать } end;

end;Writeln (' Перевертыш');end.Программа 4. Составить программу, которая обращает введенное слово, т.

е. переставляет символы в слове в обратном порядке, например: Петя — ятеП, мама — амам, про-грамма — аммаргорп.

Алгоритм обращения слова можно представить в виде следующей циклической процедуры обмена соответствующих символов: значение первого символа слова запоминается в некоторой переменной символьного типа Ch, затем на место первого символа записывается значение последнего символа, а на его место записывается значение первого символа, хранимое в переменной Ch, после этого аналогично выполняется обмен второго и предпоследнего символа, третьего и предпредпоследнего и т. д., пока не дойдем до середины слова. Далее обмен продолжать не нужно, иначе символы опять займут прежние места.

Исходя из этих рассуждений, введем следующие переменные: для хранения слова Word типа String с максимальным размером слов 30 символов и переменную I целого типа, указывающую номер позиции сравниваемого символа от начала строки, а также символьную переменную Ch для временного хранения значения символа при обмене.

Текст программы может выглядеть так:program Obr_Word;Var

111

Page 112: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

I : byte;Ch : char;Word : String[30] ;

BeginWrite(' Введите слово ');Readln(Word) ;{Перебирая символы поочередно от начала до середины слова}for I:=l to Trunc(Length (Word)/2) do

begin {Обмениваем соответствующие символы} Ch:=Word[I];Word[I]:=Word[Length(Word)-I+1] ;Word[Length(Word)-I+1]:=Ch ;

end ; Write('Получилось слово ',Word) ;end.

Порядок выполнения работы1. Изучить теоретические сведения по теме “Написание программы на

языке Паскаль с использованием строковых переменных”.2. Получить у преподавателя индивидуальное задание и разработать

программу для работы со строками согласно заданному варианту.3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Понятие строковых выражений. 2. Операции со строковыми данными.3. Примеры программ работы со строками.

Лабораторная работа № 25Написание программы на языке Паскаль с использованием записей

Цель работы: формирование знаний и умений по работе с записями. Приобретение навыков работы с записями.

Краткие теоретические сведенияПри решении научно- технических и экономических задач обработки

совокупностей большого количества значений используются массивы. Но при работе с массивами основное ограничение заключается в том, что каждый элемент массива должен иметь один и тот же тип данных.

Иногда для решения задач, в которых возникает необходимость хранить и обрабатывать совокупности данных различного типа, используются записи.

Запись представляет собой наиболее общий и гибкий структурированный тип данных, так как она может быть образована из не однотипных компонентов

112

Page 113: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

и в ней явным образом выражена связь между элементами данных, характеризующими реальный объект.

Запись-это структурированный тип данных, состоящий из фиксированного числа компонентов, называемых полями записи. Определение типа записи начинается идентификатором Record и заканчивается зарезервированным словом end. Между ними заключен список компонентов, называемых полями, с указанием имен полей и типа каждого поля.

Структура объявления типа записи такова:

Type<имя типа> = Record

<имя поля>: <тип компонентов>;…<имя поля>: <тип компонентов>;

End;VAR

<имя переменной>: <имя типа>;

Пример описания записи:Type

Car=RecordNumber:Integer;Marka:String[20];FIO:String[40];Address:String[60];End;

VarMashina: Car;

В данном примере была объявлена запись с именем Car, у которой имеется 4 поля: номер, название марки машины, ФИО владельца и его адрес.

Идентификатор поля должен быть уникален только в пределах записи, однако лучше его сделать уникальным в пределах всей программы. Объем памяти, необходимый для записи, складывается из длин полей. Значения полей записи могут быть использованы в выражениях. Обращение к значению поля осуществляется с помощью идентификатора переменной и идентификатора поля, разделенных точкой. Такая комбинация называется составным именем.

Например, доступ к полям записи Car осуществляется как: Mashina.Marka, Mashina.FIO, Mashina.Number. Составное имя можно использовать везде, где допустимо применение типа поля. Для присваивания полям значений используется оператор присваивания. Пример присваивания полям записи Mashina:

Mashina. Number:=164536l;Mashina.Marka:=’ГАЗ-24’;

113

Page 114: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Mashina.FIO:=’Иванов И.И’;Mashina. Address:=’ул.Пушкина 12-30’;Составные имена можно использовать в операторах ввода-вывода:

Read (Mashina. Number, Mashina. FIO, Mashina. Address);Write(Mashina. Number:4, Mashina. FIO:12, Mashina. Address:25);

Допускается применение оператора присваивания и к записям в целом, если они имеют один и тот же тип. Например,

Mash:=Mashina;После выполнения этого оператора значения полей записи Mash станут

равны значениям соответствующих полей записи Mashina.В ряде задач удобно пользоваться массивами из записей. Их можно

описать следующим образом: TypeCar=Record

Number:Integer;Marka:String[20];FIO:String[40];Address:String[60];End;

VarMashins: array [1..20] of Car;

Обращение к полям такой записи имеет громоздкий вид, для решения этой проблемы в языке Паскаль предназначен оператор With, который имеет следующий формат:

With <переменная типа запись> do <оператор>;Один раз, указав переменную типа запись в операторе With, можно

работать с именами полей как с обычными переменными.Пример присвоения значения полям записи Car с помощью оператора With.

With Mashina do Begin

Number:=164536l;Marka:=’ГАЗ-24’;FIO:=’Иванов И.И’;Address:=’ул.Пушкина 12-30’;

End;Пример программы работы с записями

Пусть необходимо составить программу, которая создает каталог компьютерных программ и обеспечивает поиск программ по фамилии автора.

Для описания сведений о компьютерных программах в разделе типов введем тип Prog_Type –запись следующей структуры:

Prog_Type=RecordTitle:String[50];

114

Page 115: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Author:String[50];Entry:Integer;Firma:String[40];

End;где Title- поле для записи названия программы, Author-поле для записи фамилии автора, Entry- поле для записи года разработки, Firma-поле для записи фирмы-разработчика.

В разделе описания переменных введем массив Prog_Katalog из 10 записей типа Prog_Type.Переменную Num_Array, принимающую значения от 1до 10 введем для указания на порядковый номер записи в массиве Prog_Katalog. Для критерия поиска введем переменную Author строкового типа. Результат поиска записывается в переменную логического типа Yes_Prog.

В целом текст программы может выглядеть так:Program Katalog;TypeProg_Type=record Title:string[50];

Author:String[50]; Entry:Integer; Firma:String[40];end;Var

Prog_Katalog:Array[1..10] of Prog_Type;Num_Array:1..10;Author:String[50];Yes_Prog:Boolean;

Procedure Input_Data;Begin

Writeln('Введите данные о ',Num_Array,'-й программе:');With Prog_Katalog[Num_Array] do

beginWrite('Название программы: ');Readln(Title);Write('Автор:');Readln(Author);Write('Год разработки:');Readln(Entry);Write('Фирма:');Readln(Firma);

Writeln;end;

end;

115

Page 116: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Procedure Write_Data(Num:Integer);beginWriteln('Программа № ',Num);With Prog_Katalog[Num_Array] do

beginWriteln('Название:',Title);Writeln('Фамилия автора:',Author);Writeln('Год разработки:',Entry);Writeln('Фирма:',Firma);end;

end;{Основная программа}Begin{У пользователя запрашивается 3 раза ввод данных о программах}for Num_Array:=1 to 3 do

Input_Data;Writeln;Writeln('Поиск информации(программы) по фамилии автора: ');Writeln;Write('Введите фамилия автора: ');Readln(Author);Yes_Prog:=False;for Num_array:=1 to 10 do

if Prog_Katalog[Num_Array].Author=Author thenbegin

Write_Data(Num_Array);Yes_Prog:=True;

end;if not Yes_Prog then Write('Нет программ данного автора ',Author);end.

Порядок выполнения работы1. Изучить теоретические сведения по теме “ Работа с записями”.2. Получить у преподавателя индивидуальное задание.3. Разработать программу для работы с записями согласно полученному

заданию.4. Показать работающую программу преподавателю.5. Ответить на контрольные вопросы.

Контрольные вопросы1. Понятие записи. Структура объявления типа записи.2. Обращение к значению поля. Составные имена.3. Присвоение полям записи значений. Массивы записей.4. Пример программы с использованием записей.

116

Page 117: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Лабораторная работа № 26Написание программы на языке Паскаль с использованием записей

с вариантамиЦель работы: формирование знаний и умений по работе с записями с вариантами. Приобретение навыков работы с вариантными полями.

Краткие теоретические сведенияЗаписи, рассмотренные в предыдущей лабораторной работе, имеют строго

определенную структуру. В некоторых случаях это резко ограничивает возможности их применения. Поэтому в языке Паскаль имеется возможность задать тип записи, содержащий произвольное число вариантов структуры. Такие записи называются записями с вариантами. Записи с вариантами обеспечивают средства объединения записей, которые похожи, но не идентичны по форме. Они состоят из фиксированной и вариантной частей.

Вариантная часть формируется с помощью оператора Case. Он задает особое поле записи-поле признака, которое определяет, какой из вариантов в данный момент будет активизирован. Значением признака в каждый текущий момент выполнения программы должна быть одна из расположенных далее констант. Константа, служащая признаком, задает вариант записи и называется константой выбора.

Формат:

Type<имя типа> = Record

Case <поле признака>: <имя типа> of<константа выбора 1>: (поле, …: тип);…<константа выбора n>: (поле, …: тип);

End;Компоненты каждого варианта (идентификаторы полей и их типы)

заключаются в круглые скобки. У части Case нет отдельного end. Одно слово end заканчивает всю конструкцию записи с вариантами. Количество полей каждого из вариантов не ограничено. Объем памяти, необходимый для записи с вариантами, складывается из объемов полей фиксированной части и максимального по объему поля переменной части.

Пример:Type

Rec=Record Number:Byte; Code:Integer;

Case Flag :Boolean ofTrue:(Proce1:Integer);False:(Price2:Real);

End;

117

Page 118: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

VarPRec: Rec;

В данном примере была объявлена запись с именем Rec, у которой поля Number и Code расположены в фиксированной части записи, они доступны в программе в любой текущий момент независимо от значения поля признака. Поле Price 1 может использоваться только в том случае, если значение поля признака Flag равно True. Поле Price 2 доступно в противоположном случае, т.е. если значение Flag равно False.

При использовании записей с вариантами необходимо придерживаться следующих правил:

все имена полей должны отличаться друг от друга, по крайней мере, одним символом, даже если они встречаются в разных вариантах

запись может иметь только одну вариантную часть, причем вариантная часть должна размещаться в конце записи

если поле, соответствующее какой-либо метке, является пустым, то оно записывается следующим образом: <метка>: ();

Пример программы работы с записямиПусть необходимо составить программу, которая создает каталог изданий

в библиотеке, обеспечивает ввод данных о литературе, поиск и подсчет количества книг данного издания.

Литературу в библиотеке можно разделить на три типа изданий: книги, журналы, газеты. Для описания сведений о типе изданий в разделе типов введем перечисляемый тип:

Type_Publ=(Book,Journal,Newspaper);Для описания сведений о литературе в разделе типов ведем тип Liter. Для

разного типа изданий в каталоге требуется хранить разную информацию, например: если для поиска книги нужно знать год издания, то для журнала помимо года издания, нужно знать его номер, а для газеты не только год, номер, но и день выпуска. В связи с необходимостью хранения разной информации в структуре записи Liter наряду с неизменной частью - полями Title и Author, в которых отображается название публикации и фамилия автора будет вариантная часть, отражающая дату издания по-разному в зависимости от типа издания. Запись Liter будет иметь следующую структуру:

Liter=RecordTitle:String[50];Author:String[50];Case V: Type_Publ of Book: (YearB:Integer);Journal: (Num:1..12; YearJ:1900..2001);Newspaper: (Day:1..31; Month:1..12;

118

Page 119: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

YearN:Integer);End;

где V- признак выбора вариантов, который может принимать значение Book, Journal, Newspaper. Для типа Book предусмотрено хранение года издания (поле YearB), для издания типа Journal-номера(Num) и год издания (поле YearJ), для издания типа Newspaper –дня (поле Day), месяца (поле Month) и года выпуска (поле YearN).

В разделе описания констант зададим значение максимального числа записей в каталоге Count=10.

Текст программы:Program Kat_Library;Type Type_Publ=(Book,Journal,Newspaper); Liter=Record Title:string[50]; Author:String[50]; case V:Type_Publ of Book:(YearB:Integer); Journal:(Num:1..12; YearJ:1900..2000); Newspaper:(Day:1..31; Month:1..12; YearN:Integer); end;Const Count=10;Var

Katalog:Array[1..Count] of Liter;Num_Array:1..Count;Yes_Liter:Boolean;Vybor:Byte;Edition:Type_Publ;Count_Find:Integer;

Procedure Input_Data;Begin

Writeln('Введите данные о литературе ',Num_Array,':');Write('Введите число, указывающее вид издания:');Write('1-книга, 2-журнал, 3-газета: ');Readln(Vybor);Case Vybor of

1:Katalog[Num_Array].V:=Book;2:Katalog[Num_Array].V:=Journal;3:Katalog[Num_Array].V:=Newspaper;

end;With Katalog[Num_Array] do

119

Page 120: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

beginWrite('Фамилия автора: ');Readln(Author);Write('Название:');Readln(Title);

Case V ofBook:begin

Write('Год издания: ');Readln(YearB);end;

Journal:beginWrite('Номер: ');Readln(Num);Write('Год издания: ');Readln(YearJ);end;

Newspaper:beginWrite('Дата издания: День ');Readln(Day);Write('Месяц: ');Readln(Month);Write('Год: ');Readln(YearN);

end;end;end;end;Procedure Write_Data;begin

Writeln;Writeln('Литература № ',Num_Array);

With Katalog[Num_Array] dobeginWriteln('Название:',Title);Writeln('Фамилия автора:',Author);

Case V ofBook:begin Writeln('Год издания:',YearB); end;Journal:begin Write('Номер: ',Num); Writeln('Год издания: ',YearJ); end;Newspaper:beginWriteln('Дата издания: День:',Day,'Месяц:',Month,'Год:',YearN);

120

Page 121: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

end;end;end;end;procedure Find_Liter;begin

Writeln('Поиск литературы по типу издания: ');Writeln;Write('Введите число, указывающее вид издания: ');Write('1-книга, 2-журнал, 3-газета');Readln(Vybor);

case Vybor of1:Edition:=Book;2:Edition:=Journal;3:Edition:=Newspaper;

end;Yes_Liter:=False;Count_Find:=0;for Num_Array:=1 to Count do

If Katalog[Num_Array].V=Edition thenbeginCount_Find:=Count_Find+1;Write_Data;Yes_Liter:=True;end;

if not Yes_Liter thenWriteln('В библиотеке нет такой литературы ')elseWriteln('Всего в библиотеке',Count_Find,' таких изданий');end;

beginfor Num_Array:=1 to Count do

Input_Data;Writeln;Find_Liter;

end.Порядок выполнения работы

1. Изучить теоретические сведения по теме “ Работа с вариантными записями”.

2. Получить у преподавателя индивидуальное задание.3. Разработать программу для работы с записями с вариантами согласно

полученному заданию.4. Показать работающую программу преподавателю.5. Ответить на контрольные вопросы.

121

Page 122: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Контрольные вопросы1. Понятие записи с вариантами. Структура объявления.2. Правила использования записей с вариантами.3. Пример программы с использованием записей с вариантами.

Лабораторная работа № 27Написание программы на языке Паскаль с использованием

множеств

Цель работы: формирование знаний и умений по работе с множествами. Приобретение навыков обработки множеств.

Краткие теоретические сведения

Основные понятия и определенияМножество – это структурированный тип данных, представляющий собой

набор взаимосвязанных по какому-либо признаку или группе признаков объектов, которые можно рассматривать как единое целое. Каждый объект во множестве называется элементом множества.

Все элементы множества должны принадлежать одному из скалярных типов, кроме вещественного. Этот тип называется базовым типом множества. Базовый тип задается диапазоном или перечислением. Область значений типа множество – набор всевозможных подмножеств, составленных из элементов базового типа.

В выражениях на языке Паскаль значения элементов множества указываются в квадратных скобках:[1,2,3,4], [‘a’,’b’,’c’], [‘a’..’z’]. Если множество не имеет элементов, оно называется пустым и обозначается, как [ ]. Количество элементов множества называется его мощностью.

Формат записи множественных типов:Type <имя типа> = set of <элемент 1,…., элементN>;Var<идентификатор, ….> : <имя типа>;

Можно задать множественный тип и без предварительного описания:Var<идентификатор, …> : set of <элемент1, …>;

Пример:Type Simply = set of ‘a’ ..’h’; Number = set of 1..31;Var Pr : Simply; N : Number;

122

Page 123: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Letter : set of char; {определение множества без предварительного описания в разделе типов}

В данном примере переменная Pr может принимать значения символов латинского алфавита от ‘a’ до ‘h’; N – любое значение в диапазоне 1..31; Letter – любой символ. Попытка присвоить другие значения вызовет программное прерывание.

Количество элементов множества не должно превышать 256, соответственно номера значений базового типа должны находиться в диапазоне 0..255. Контроль диапазонов осуществляется включением директивы {$R+}. Объем памяти, занимаемый одним элементом множества, составляет 1 бит.

Объем памяти для переменной типа множество вычисляется по формуле:Объем памяти = (Max DIV 8) – (Min DIV 8) + 1,

где Max и Min – верхняя и нижняя границы базового типа.

Операции над множествамиПри работе с множествами допускается использование операций

отношения “=”, “<>”, “>=”, “<=”, объединения, пересечения, разности множеств и операции in. Результатом выражения с применением этих операций является значение True или False.

Операция “равно” (=). Два множества А и В считаются равными, если состоят из одних и тех же элементов. Порядок следования элементов в сравниваемых множествах значения не имеет.

Например:Значение А Значение В Выражение Результат[1,2,3,4][‘a’, ’b’, ’c’][‘a’..’z’]

[1,2,3,4][‘c’, ‘a’][‘z’..’a’]

A=BA=BA=B

TrueFalseTrue

Операция “не равно” (<>). Два множества А и В считаются не равными, если они отличаются по мощности или по значению хотя бы одного элемента.

Например:Значение А Значение В Выражение Результат[1,2,3][‘a’..’z’][‘c’..’t’]

[3,1,2,4][‘b’.. ‘z’][‘t’..’c’]

A<>BA<>BA<>B

TrueTrueFalse

Операция “больше или равно” (>=). Операция “больше или равно” (>=) используется для определения принадлежности множеств. Результат операции А >=В равен True, если все элементы множества В содержаться в множестве А. В противном случае результат равен False.

Например:Значение А Значение В Выражение Результат[1,2,3,4][‘a’..’z’][‘z’,’x’,’c’]

[2,3,4][‘b’.. ‘t’][‘c’,’x’]

A>=BA>=BA>=B

TrueTrueTrue

123

Page 124: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Операция “меньше или равно” (<=). Эта операция используется аналогично предыдущей операции, но результат выражения А<=В равен True, если все элементы множества А содержаться во множестве В. В противном случае результат равен False.

Значение А Значение В Выражение Результат[1,2,3][‘d’..’h’][‘a’,’v’]

[1,2,3,4][‘z’.. ‘a’][‘a’,’n’,’v’]

A<=BA<=BA<=B

TrueTrueTrue

Операция in. Операция in используется для проверки принадлежности какого-либо значения указанному множеству. Обычно применяется в условных операторах.Значение А

Значение В Результат

2‘v’X1

if A in [1,2,3] then..if A in [‘a’..’n’] then..if A in [X0,X1,X2,X3] then..

TrueTrueTrue

При использовании операции in проверяемое на принадлежность значение и множество в квадратных скобках не обязательно предварительно описывать в разделе описаний. Операция in позволяет эффективно и наглядно производить сложные проверки условий, заменяя иногда десятки других операций. Например, выражение if(a=1) or (a=2) or (a=3) or (a=4) or (a=5) or (a=6) then…можно заменить более коротким выражением if a in [1..6] then… .

Часто операцию in пытаются записать с отрицанием: X NOT in M. Такая запись является ошибочной, так как две операции следуют подряд; правильная инструкция имеет вид: NOT (X in M).

Объединение множеств (+). Объединением двух множеств является третье множество, содержащее элементы обоих множеств.

Например:Значение А Значение В Выражение Результат[1,2,3][‘A’..’D’][]

[1,4,5][‘E’.. ‘Z’][]

A+BA+BA+B

[1,2,3,4,5][‘A’..’Z’][]

Пересечение множеств (*). Пересечением двух множеств является третье множество, которое содержит элементы, входящие одновременно в оба множества.

Например:Значение А Значение В Выражение Результат[1,2,3][‘A’..’Z’][]

[1,4,2,5][‘B’.. ‘R’][]

A*BA*BA*B

[1,2][‘B’..’R’][]

Разность множеств (-). Разностью двух множеств является третье множество, которое содержит элементы первого множества, не входящие во второе множество.

Например:

124

Page 125: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Значение А Значение В Выражение Результат[1,2,3,4][‘A’..’Z’][X1,X2,X3,X4]]

[3,4,1][‘D’.. ‘Z’][X4,X1]

A-BA-BA-B

[2][‘A’..’C’][X2,X3]

Результат операций рад двумя множествами можно наглядно представить с помощью закрашенных частей двух кружочков: Объединение Пересечение Разность

Использование в программе данных типа set дает ряд преимуществ: значительно упрощаются сложные операторы if , увеличивается степень наглядности программы и понимания алгоритма решения задачи, экономятся память, время компиляции и выполнения.

Имеются и отрицательные моменты, основной из них – отсутствие в языке Паскаль средств ввода-вывода элементов множества, поэтому программист сам должен писать соответствующие процедуры.

Иллюстрацией описания и операций над множествами может служить следующий фрагмент программы:Program Dem_Mno; {демонстрация операций над множествами}Type Digits=set of 0..9;Var D1, D2, D3, D:Digits;Begin

D1:=[2,4,6,8]; {заполнение множеств}D2:=[0..3,5];D3:=[1,3,5,7,9];D:=D1+D2; {объединение множеств D1 и D2}D:=D+D3; {объединение множеств D и D3 }D:=D-D2; {разность множеств D и D2 }D:=D*D1; {пересечение множеств D и D1}

end.Как видно из текста программы, сначала описан тип Digits=set of 0..9,

затем описаны переменные D1,D2,D3,D этого типа. В первой части программы осуществляется заполнение множеств, а затем над множествами выполняются операции объединения, пересечения, разности.

Вторым примером работы с множествами может служить следующая задача: описать множество М (1..50) и сделать его пустым. Вводя целые числа с клавиатуры, заполнить множество 10 элементами.Program Input_Mno;

125

Page 126: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

VarM:set of 1..50;X,I:integer;

BeginM:= [ ]; {М – пустое множество}for I:=1 to 10 do

beginwrite(‘введите ‘, I, ‘ –й элемент множества: ‘);readln (X);if (X in M) then {если введенное число входит в множество М}

beginwriteln(X,’ помещен в множество 1..50’);M:=M+[X];end;

end;writeln;end.

В разделе описания переменных описано множество целых чисел от 1 до 50, переменная Х целого типа, которая используется для считывания числа-кандидата в множество, и целая переменная I, используемая для подсчета количества введенных чисел. В начале программы применена операция инициализации множества М, так как оно не имеет элементов и является пустым:

M:= [ ];Заполнение множества элементами производится с использованием

оператора повтора for, параметр которого I будет указывать порядковый номер вводимого элемента. Операция заполнения множества записывается оператором присваивания:

M:=M+[X];Контроль заполнения множества записан операцией проверки

принадлежности in. Если условие X in M выполняется, выводится сообщение о том, что число Х помещено в множество.

Третий пример демонстрирует описание множества гласных и согласных букв русского языка и определяет количество гласных и согласных букв в предложении, введенном с клавиатуры пользователем.

Зададим тип Letters –множество букв русского языка, затем опишем переменные этого типа: Glasn-множество гласных букв, Sogl-множество согласных букв. Вводимое с клавиатуры предложение опишем переменной Text типа String. Для указания символа в строке Text применим переменную I типа Byte.Для подсчета количества гласных и согласных букв опишем переменные Gи S. Проверку принадлежности символов, составляющих предложение множествам гласных или согласных букв русского языка запишем с использованием цикла for , параметр I которого, изменяясь от 1 до значения длины предложения, будет указывать порядковый номер символа в

126

Page 127: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

предложении. Принадлежность очередного символа предложения множеству гласных или согласных букв запишем операцией in. Если символ является гласной буквой (Text[I] in Glasn), то счетчик гласных букв G увеличивается на 1. Аналогично с согласными буквами. Текст программы может выглядеть так:Program Glasn_Sogl;Type

Letters=set of ‘A’..’я’;Var

Glasn, Sogl:Letters;Text:String;I:Byte;G,S:Byte;

BeginGlasn:=[‘A’,’a’, ‘Е’,’е’,’И’,’и’,’О’,’о’,’У’,’у’,’Э’,’Ю’,’ю’, ‘Я’,’я’];Sogl:=[‘Б’..’Д’,’б’..’д’,’Ж’,’ж’,’З’,’з’,’К’..’Н’,’к’..’н’,’П’..’Т’,’п’..’т’,’Ф’..’Щ’,’ ‘ф’..’щ’,’Ъ’,’ъ’,’Ь’,’ь’];Write(‘Введите предложение’);Readln(Text);G:=0;S:=0;For I:=1 to Length(Text) do

BeginIf Text[I] in Glasn then G:=G+1;If Text[I] in Sogl then S:=S+1;

End;Writeln(‘В предложении” ’,Text,’ ”‘,G,’гласных и ‘,S,’согласных букв’);End.

Порядок выполнения работы1. Изучить теоретические сведения по теме “ Работа с множествами”.2. Получить у преподавателя индивидуальное задание.3. Разработать программу для работы с множествами, используя возможные

операции. 4. Показать работающую программу преподавателю.5. Ответить на контрольные вопросы.

Контрольные вопросы1. Множества. Основные понятия и определения.2. Операции над множествами.3. Фрагменты программ с использованием множеств.

127

Page 128: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Лабораторная работа № 28Написание программы на языке Паскаль с использованием с

использованием файловых переменных. Разработка программы для работы с текстовым файлом

Цель работы: формирование знаний и умений по работе с файловыми переменными. Приобретение навыков работы с текстовыми файлами.

Краткие теоретические сведения

Большие совокупности данных, например сведения обо всех учащихся школы или телефонный справочник, удобно иметь записанными во внешней памяти в виде последовательности сигналов. Любой язык программирования должен содержать средства для организации хранения информации на внешних запоминающих устройствах и доступа к этой информации. В Паскале для этих целей предусмотрены специальные объекты - файлы.

Файлом называется совокупность данных, записанная во внешней памяти под определенным именем.

Любой файл имеет три особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во- вторых, он содержит компоненты одного типа. Таким компонентом может быть любой тип Паскаля, кроме файлового. Например, допускается файл записей или файл строк, но нельзя создать файл файлов. В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

Для доступа к файлу описывается специальная файловая переменная, которая считается представителем файлов в программе.

Формат описания файлового типаType

<имя типа> =<тип компонентов>;Var

<F > : file of <имя типа>;

Файл можно представить как список значений одного и того же (базового) типа. Все элементы файла считаются пронумерованными, начальный элемент имеет нулевой номер.

В любой момент времени программе доступен только один элемент файла, на который ссылается текущий указатель (указатель обработки). Часто позицию размещения доступного элемента называют текущей позицией.

128

Page 129: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Как правило, все действия с файлом (чтение из фала, запись в файл) производятся поэлементно, причем в этих действиях участвует тот элемент файла, который обозначается текущим указателем. В результате совершения операций текущий указатель может перемещаться.

По способу доступа к элементам различают фалы последовательного и прямого доступа. Файлом последовательного доступа называется файл, к элементам которого обеспечивается доступ в такой же последовательности, в какой они записывались. Фалом прямого доступа называется файл, доступ к элементам которого осуществляется по адресу элемента. Например, для поиска нужного элемента в последовательном файле необходимо, начиная с нулевого, перемещать указатель обработки до тех пор, пока он не будет указывать на искомый элемент, а при поиске нужного элемента в файле прямого доступа достаточно указать номер его позиции.

При организации данных в файл последовательного доступа нельзя одновременно читать данные из файла и записывать данные в файл, т.к. для чтения некоторого элемента последовательного файла указатель обработки помещен на данный элемент, а для записи нового элемента этот указатель одновременно должен быть в конце файла.

В Паскале имеется 3 класса файлов: Текстовые Типизированные Нетипизированные

Средства обработки файловКаждому файлу в языке ставится в соответствие файловая переменная,

которая должна быть связана с конкретным внешним файлом. Поэтому перед началом работы с файлом необходимо установить данное соответствие. Для этого в языке используется процедура:

Assign(Var F; Name:String);где F- переменная любого файлового типа, а строковое выражение Name

содержит полное имя файла, удовлетворяющее требованиям операционной системы.

Процедура Assign всегда предшествует другим процедурам работы с файлами, так как ставит в соответствие конкретному файлу на внешнем устройстве логическую файловую переменную языка, к которой впоследствии будут обращаться все другие файловые процедуры. Недопустимо использование процедуры Assign для уже открытого файла. Это значит, что если было назначено имя конкретного набора данных файловой переменной с помощью процедуры Assign, а затем этот файл был открыт, то, прежде чем использовать ту же файловую переменную для нового набора данных, необходимо с помощью процедуры Close закрыть этот файл.

Для работы с файлом прежде всего необходимо его открыть. В языке Паскаль предусмотрены для этого две процедуры:

Reset(var F : file ); - открывает существующий файл;

129

Page 130: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Rewrite(var F : file ); -создает и открывает новый файл.При описании обеих процедур параметр file означает файловую

переменную любого типа. Открытие внешнего файла с помощью процедуры Reset в случае его отсутствия на диске может привести к ошибке при выполнении программы.

Пример1. Стандартное открытие файлаAssign(F, ' ') ;Reset(F) ;

Процедура Rewrite создает и открывает новый файл. Использование этой процедуры требует особого внимания. При попытке создать и открыть новый файл с именем уже существующего на диске набора данных действие процедуры Rewrite сведется к удалению этого набора и созданию нового пустого файла с тем же именем.

Если процедура Rewrite используется для текстового файла, то к открываемому новому набору данных в дальнейшем могут быть применимы только операции записи.

Операция закрытия файла является логическим окончанием работы с любым открытым файлом. Для этого служит процедура

Close (Var F);Использование процедуры Close позволяет устранить связь файловой

переменной с внешним файлом, установленную с помощью процедуры Assign.Пример 2. Полная цепочка команд для создания простого текстового

файла с именем WORK.TXT:…Var

F: text;begin

Assign(F, ' WORK. ТХТ') ;Rewrite(F) ;Write(F, 'Простой текстовый файл');Close(F) ;

end.К языковым средствам обслуживания файлов необходимо отнести

процедуры переименования и удаления неоткрытых файлов. Использование этих процедур не зависит от типа файла.

Rename(var F; NewName : string);Процедура переименовывает неоткрытый файл F любого типа. Новое имя

задается строкой NewName. ]Erase(var F) ;

Процедура удаляет неоткрытый внешний файл любого типа, задаваемый переменной F.

130

Page 131: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Обе процедуры нельзя использовать для уже открытых файлов. Операции удаления и переименования осуществляются только для реально существующих файлов, иначе возникает ошибка выполнения программы.

Пример 3. Удаление или переименование файлаVar

F: file ;Ch: char ;St: string;

beginWrite('Введите имя файла: ');Readln(St); {Чтение имени}Assign(F, St); {Назначить имя файловой переменной}

Write('Удалить файл (У), Переименовать(П), Выход(В)');Readln(Ch) ;case Ch of

'У ', ' y' : Erase(F); {Удаление файла} 'П','п' : begin

Write('Введите новое имя файла: ');Readln(St) ;Rename(F, St); {Переименование файла} end;

'В','в' : Halt(1);end;

end.В приведенном примере альтернативный выбор тех или иных действий

зависит целиком от того, что будет введено с клавиатуры. Этот вариант программы не позволяет обработать ошибочные ситуации в случае, если файла с именем St не существует на диске.

Для того чтобы файловые операции выполнялись без ошибок, необходимо использовать специальную функцию IOresult. Функция работает без параметров и возвращает значение типа integer, представляющее статус последней выполненной операции ввода-вывода. Использование этой функции в программах возможно лишь в том случае, если на время выполнения файловых операций отключена стандартная проверка операций ввода-вывода. Для этих целей используется либо специальная опция в интегрированной системе, либо директива компилятора {$I}, которая может задаваться внутри текста программы.

Пример 4. Вариант программы для проверки существования файла на диске

VarF: file ;St: string;

131

Page 132: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

beginWrite('Введите имя файла : ');Readln(St) ;Assign(F, St) ;{$I-} {Отключить стандартную обработку ошибок} Reset(F); {Открыть файл}{$I+} {Включить стандартную обработку ошибок} if IOresult = 0 then

beginWriteln('Файл существует и нормально открыт');Close(F); {Закрыть файл}end

elseWriteln('Файла с именем '+St+' на диске нет');

end.После корректного выполнения операции ввода-вывода функция IOresult

возвращает значение, равное нулю, в остальных случаях функция возвращает соответствующий код ошибки.

Рассмотренные операции ввода-вывода охватывают все типы файлов в Турбо Паскале и характеризуют взаимоотношения файловой и операционной систем.

Итак, для работы с любым типом файлов используются следующие процедуры и функции:

Процедуры и функции для работы с любыми

файламиОписание

ASSIGN(F,Name)

Связь файловой переменной F с внешним файлом Name. Name-переменная или константа типа String,Char. Имя файла должно быть написано в соответствии с правилами DOS. F- переменная любого файлового типа.

RESET(F[,SIZE])

Открытие существующего файла. Открывается существующий файл, с которым связана файловая переменная F и указатель текущего компонента файла перемещается на начало файла. Необязательный параметр SIZE используется только в нетипизированных файлах и задает размер пересылаемого элемента информации в байтах.

REWRITE(F[,SIZE]) Открытие нового пустого файла.Открывается новый пустой файл, и ему присваивается имя, заданное процедурой

132

Page 133: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

ASSIGN. Если файл с таким именем уже существует, то он уничтожается. Необязательный параметр SIZE используется только в нетипизированных файлах и задает размер пересылаемого элемента информации в байтах.

ERASE(F)Уничтожение файла. Удаляет неоткрытый внешний файл, задаваемый переменной F.

RENAME (F,NewName)

Переименование файла.Переименовывает неоткрытый внешний файл, задаваемый переменной F, новое имя задается строкой NewName.

CLOSE(F) Закрытие файла.EOF(F) Конец файла.

Текстовые файлыТекстовые файлы представляют собой совокупность символов,

разделенных на строки, причем в конце каждой строки стоит признак конца строки. Особенностью работы с текстовыми файлами является то, что параметры, значения которых вводятся и выводятся с помощью процедур READ или WRITE, могут быть не только типа String или Char, но и других типов (целых, вещественных - при вводе, целых, вещественных, логических - при выводе).

При работе с текстовыми файлами необходимо, прежде всего, объявить соответствующую файловую переменную:

Var F:text;Начало работы с текстовым файлом - стандартное: файловой переменной

ставится в соответствие имя файла (процедура Assign), а затем открывается новый текстовый файл (процедура Rewrite) или открывается существующий текстовый файл (процедура Reset).

Далее в таблице представлены процедуры и функции для работы с текстовыми файлами.

Процедуры и функции для работы с текстовыми файлами Описание

APPEND(F) Открытие существующего файла. Открывается существующий файл, с которым связана файловая переменная F и указатель текущего компонента файла перемещается на конец файла.F- переменная любого файлового типа.После открытия текстовый файл можно дополнять информацией, начиная с конца

133

Page 134: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

строки. READ(F,<список>) Чтение из файла.

READLN(F,<список>) Чтение строки из файла.

SETTEXTBUF(F,BUF[,SIZE])

Назначение буфера ввода- вывода.Для файла, с которым связана файловая переменная F, назначается буфер ввода- вывода в виде переменной BUF любого типа.

WRITE(F,<список>) Запись в файл. WRITELN(F,<список>) Запись строки в файл.

EOLN(F) Коней строки файла. EOF(F) Конец файла.

Пример программы работы с текстовым файломProgram Txt_file; {Пример обработки текстового файла}Type

fil = text;Var

Fl, Fl_New : fil;Name, New_Name : string[12] ;Txt : string;Ch : char;

procedure Read_Text; {Считывание текста из файла} begin{$I-} {Директива компилятору на отключение стандартной проверки

операций ввода-вывода}Repeat

Write('Введите имя файла для считывания текста: ');Readln(Name); Writeln;Assign(Fl,Name) ;Reset (Fl);if IOresult<>0 then

beginWriteln('Файл не найден...');Close(Fl);end ;Writeln;

Until IOresult=0 ;

{$I+} {Директива компилятору на включение стандартной проверки операций ввода-вывода}

Writeln('Файл ' ,Name, ' : ') ;Writeln;

134

Page 135: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

while not Eof(Fl) do begin

Readln(Fl, Txt) ;Writeln(Txt) ;

end;Close(Fl);Writeln;Write('Файл считан, нажмите Enter...');Readln;

end ; {конец процедуры Read_Text }procedure App_Text; {Добавление текста в файл}begin

Append(Fl); {Открыть файл для присоединения нового текста}Writeln('Файл ',Name,' открыт для присоединения нового текста ') ;Writeln('Вводите текст для записи(для окончания нажмите Enter) :');Writeln;

RepeatWrite (' :>') ; Readln(txt); Writeln(fl,txt);

Until txt=' '; Close(Fl);Writeln;

Writeln('Присоединение нового текста окончено, нажмите Enter...');Readln;

end ; {конец процедуры App_Text}procedure Erase_File; {Удаление файла}begin

Erase(Fl); {Удаление файла} Writeln('Файл ',Name,' удален с диска, нажмите Enter...');Readln;

end; {конец процедуры Erase_File}procedure Rename_File; {Переименование файла}begin

Write('Введите новое имя файла: ');Readln (New_Name) ;Rename(Fl,New_Name); {Переименование файла}

Writeln('Файл',Name,'переименован в ',New_Name,',нажмите Enter...');Readln;

end ; {конец процедуры Rename_File}procedure Copy_File; {Копирование текстового файла}

beginWrite('Введите имя файла, в который копируется файл ', Name);

135

Page 136: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Readln(New_Name);Reset(Fl) ;Assign (Fl_New,New_Name) ;Rewrite(Fl_New);while not Eof(Fl) do

beginReadln(Fl,Txt);Writeln (Fl_New, Txt) ;end ;

Close (Fl);Close (Fl_New);Writeln;

Write('Файл ',Name,' скопирован в ',New_Name,', нажмите Enter...');Readln ;

end ; {конец процедуры Copy_File}Begin {Начало основной программы}

Inp_Text;App_Text;

Write('Удалить файл (D),переименовать(R),скопировать(С),Выход(Е) ');Readln(Ch) ;case Ch of

'D','d' : Erase_File;'R','r' : Rename_File;'С','с' : Copy_File ;'E', 'e' : Halt(1);

end;end.

Порядок выполнения работы1. Изучить теоретические сведения по теме “Написание программы на

языке Паскаль с использованием файловых переменных. Разработка программы для работы с текстовым файлом”.

2. Получить у преподавателя индивидуальное задание и разработать программу для работы с текстовым файлом согласно заданному варианту.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Понятие файла. Описание файлового типа данных.2. Файлы последовательного и прямого доступа. Средства обработки

файлов.3. Текстовые файлы. Процедуры и функции работы с текстовыми файлами.

136

Page 137: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Лабораторная работа № 29Разработка программы для работы с типизированным файлом

Цель работы: формирование знаний и умений по работе с типизированными файлами.

Краткие теоретические сведения

Типизированные файлыК типизированным файлам относятся файлы строго определенного типа.

Чаще всего это файлы, состоящие из записей. Они применяются для создания различных баз данных. Стандартное задание в программе такой файловой переменной осуществляется следующим образом:

TypeFileRec = record

…end;

VarF : file of FileRec;

Если в текстовых файлах содержимое рассматривается как наборы символов, подготовленные специальным образом с учетом общепринятых соглашений о представлении текстовой информации, то в типизированных файлах их содержимое рассматривается как последовательность записей определенной структуры. Единицей измерения такого набора данных является сама запись. Длина записи определяется как SizeOf(FileRec). Так как длина любого компонента типизированного файла строго постоянна, это дает возможность организовать прямой доступ к любому компоненту по его порядковому номеру, поэтому типизированные файлы часто называют файлами прямого доступа.

Seek(var F; NumRec: Longint)Процедура устанавливает текущую файловую переменную F на запись с

номером NumRec; F - файловая переменная для типизированных и нетипизированных наборов данных. При открытии типизированного файла текущая позиция для работы с ним установлена на начало первой записи, которая по принятым соглашениям имеет номер 0, т. е. номер физической записи на единицу меньше номера логической записи.

Средства работы с типизированными файламиДля работы с файлами прямого доступа дополнительно можно

использовать следующие средства:Truncate(var F);Процедура уничтожает все компоненты файла F, начиная с места текущего

положения файлового указателя.FilePos(var F) : Longint

137

Page 138: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Функция возвращает для файла F текущую файловую позицию (номер записи, на которую она установлена) в виде значения типа Longint

FileSize(var F) : Longint и его размер (количество записей) в виде значения типа Longint.Для пустого файла вызов FileSize возвращает значение 0. Локализация

ошибок при обращении к внешним носителям для обоих функций производится через IOresult.

Для того чтобы очередная запись могла быть записана в конец типизированного файла, необходимо перевести текущую файловую позицию в конец файла. Когда создается новый файл, это происходит автоматически после формирования каждой очередной записи. Если файл уже создан и файловая позиция, установленная по Seek, находится где-нибудь в начале файла (FilePos(F) < FileSize(F)), то в конец файла ее позволяет перевести вызов

Seek(F, FiieSize(F));В каждом файле число логических и физических записей совпадает, а при

позиционировании номер физической записи на единицу меньше номера логической записи.

Когда записи располагаются в неотсортированном по фамилиям порядке, поиск необходимо осуществлять последовательно по всему файлу. Такое расположение записей требует значительных расходов ресурсов системы для поиска нужной записи. Любая программная система по манипулированию базами данных всегда имеет в своем составе средства упорядочения записей по ключу.

Ключом называется совокупность знаков, идентифицирующая запись в файле. Ключ сортировки — одно или несколько полей в записи файла, по содержимому которых осуществляется упорядочение его записей, например список учащихся в классном журнале отсортирован по ключу фамилия.

На практике это выражается в создании так называемых индексных файлов по отношению к главному файлу данных. Индексные файлы содержат номера записей главного файла, отсортированных по конкретному ключу. Такое построение позволяет экономить время обращения к внешним носителям, так как во всех перемещениях при сортировке участвуют записи малой длины, содержащие номера записей главного файла в соответствии с ключом сортировки.

Пример программы работы с типизированным файломПусть требуется составить программу, которая создает на диске файл

данных “Телефонного справочника”, обеспечивает ввод и изменение данных, поиск номера телефона по фамилии абонента.Program BookPhone; {Телефонный справочник}Uses Crt;Type

StFio=string[20];StPhone=string[10];

138

Page 139: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

RecBook=record {Запись сведений об абоненте} FIO:StFio; Phone:StPhone; End;

VarBookFile:file of RecBook; {Переменная для файла с записями RecBook}

Work:RecBook; {Переменная для доступа к записям}

Vid:byte;End_Menu:boolean;Name:String[12];

Procedure Name_File; {Ввод имени файла данных}Begin

Write(‘Введите имя файла данных телефонного справочника’);Readln(Name);

End;Procedure AddRec; {Добавление записи в файл}Begin

Writeln(‘Ввод записи № ’, FilePos(BookFile)+1); {+ 1 - указывает номер физической записи (к номеру логической записи добавляется 1) }With Work do

BeginWriteln(‘Введите фамилию ’);Readln(FIO);Write(‘Введите номер телефона ’);Readln(Phone);

Write(BookFile,Work); {Записать в файл значение переменной Work: фамилию и номер телефона}End;

End;Procedure Create_Book_Phone; {Создание нового файла данных}

VarInd,Count:integer;

BeginName_File;

Assign(BookFile, Name); {Открыть новый файл для записи}Rewrite(BookFile);Writeln(‘Создание записей файла ’, Name);Write(‘Введите число записей в справочнике’);Readln(Count);For Ind:=1 to Count doAddRec;Writeln(‘Создание фала завершено’);Writeln(‘Файл данных имеет , FileSize(BookFile), записи’);

139

Page 140: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Close(BookFile);End;Procedure OutputRec; {Вывод текущей записи на экран}Begin

Read(BookFile,Work);With Work do

BeginWrite(‘Запись № ’,FilePos(BookFile),’:’);Writeln(‘ФИО: ’, Fio, ‘телефон: ’,Phone);End;

End;

Procedure OutputAllRec; {Вывод всех записей файла на экран}Begin

Name_File;Assign(BookFile,Name);{$I-}Reset(BookFile);{$I+}if IOResult=0 then

beginSeek(BookFile,0); {Установка на первую запись}Writeln(‘Вывод телефонного справочника из файла’, Name);While (not EOF(BookFile)) doOutPutRec;End

ElseWriteln(‘Файла с именем ’ +Name+’ на диске нет’);

End;Procedure UpdateRec;Var

NumRec: LongInt;Begin

Name_File;Assign(BookFile,Name); {Открыть новый файл для записи}

{$I-}Reset(BookFile);{$I+}if IOResult=0 then

beginWrite(‘Укажите номер изменяемой записи’);Readln(NumRec);Seek(BookFile,NumRec-1); {Установка файловой позиции по указанному номеру записи}Writeln(‘–Старое значение записи:’);

140

Page 141: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

OutputRec; {Вывод записи и переход на следующую}Seek(BookFile,NumRec-1); {Возврат на прежнюю позицию}Writeln(‘Задаем новое значение ’, NumRec, ‘записи’);AddRec;Close(BookFile);

EndElse

Writeln(‘Файла с именем ’+Name+’ на диске нет’);End;Procedure AddRecToEnd; {добавление записи в конец файла}Begin

Name_File;Assign(BookFile,Name);{$I-}Reset(BookFile);{$I+}if IOResult=0 thenbegin

Seek(BookFile,FileSize(BookFile)); {Установка текущей позиции в конец файла}

AddRec;Writeln(‘Измененный файл данных имеет’, FileSize(BookFile),’записи’);Close (BookFile);

EndElseWriteln(‘Файла с именем ’+Name+’ на диске нет);

End;Procedure FindFio; {Поиск номера телефона по фамилии абонента}Var

BookFile:file of RecBook;Work:RecBook;Maska:StFio;Rez_Find:boolean;CountRec:integer;

BeginName_File;Assign(BookFile,Name);{$I-}Reset(BookFile);{$I+}if IOResult=0 then

beginWrite(‘Введите фамилию для поиска’);

141

Page 142: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Readln(Maska);RezFind:=False;CountRec:=0;

While(not Eof(BookFile)) do {Просмотреть все записи до конца файла}

BeginRead(BookFile,Work);With Work doIf Pos(Maska,Fio)<>0 then{Найдена запись абонента с указанной фамилией}

BeginRez_Find:=True;Inc(CountRec);Writeln(‘Фамилия ’, Fio,’телефон ’,Phone);End;

End;If Rez_Find then

Writeln(‘Число записей для ’, Maska,’=’,CountRec)ElseWriteln(‘В справочнике нет абонентов с фамилией ’, Maska);Close(BookFile);EndElseWriteln(‘Файла с именем ’+Name+’ на диске нет’);

End;

{Основная программа}BeginClrScr;End_Menu:=False;Repeat {Повторять показ меню, пока End_Menu=False}

Writeln(‘Телефонный справочник ’);Writeln(‘Выберите вид работы ’);Writeln(‘1-создание нового файла ’);Writeln(‘2-просмотр списка справочника ’);Writeln(‘3-изменение записи’);Writeln(‘4-дополнение справочника’);Writeln(‘5-поиск абонента ’);Writeln(‘0-завершение работы ’);Write(‘Ваш выбор ’);

Readln(Vid);Case Vid of {Вызов разных процедур в зависимости от вида работы}

1: Create_Book_Phone;2:OutPutAllRec;

142

Page 143: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

3:UpdateRec;4:AddRecToEnd;5:FindFio;0:End_Menu:=True;

end;Writeln(‘Нажмите клавишу Enter’);Readln;ClrScr;Until End_Menu; {Больше не выводить меню)End.

В начале программы очищается экран, переменной End_Menu присваивается значение False, и затем на него с помощью оператора повтора repeat выводится текст меню из шести пунктов. В заключение списка вариантов меню выводится запрос и считывается значение переменной Vid, задаваемое пользователем в соответствии с избранным видом работы со справочником.

В зависимости от значения селектора Vid оператор выбора case осуществляет выбор, т. е. выбирают соответствующую значению константы выбора процедуру (например, если Vid=2, то вызывается процедура OutputAllRec для вывода всего содержимого справочника). После выполнения процедуры управление программой передается в конец оператора case, и, так как значение переменной End_Menu не равно True, оператор повтора repeat выполняется вновь, очищая экран и выводя список меню, и так до тех пор, пока пользователь выберет завершение работы. В результате этого переменной Vid будет присвоено значение 0, из-за чего в операторе case переменной End_Menu будет присвоено значение True, и цикл repeat завершится.

В начале процедуры создания нового файла данных справочника записан вызов процедуры задания имени файла данных Name_File. Процедура Name_File записана выше по тексту программы. Создание нового файла данных производится с использованием стандартной процедуры Rewrite. Ввод записей об абонентах описывается с использованием оператора повтора for, параметр Ind которого, изменяясь от 1 до числа записей Count, будет указывать порядковый номер записи с данными абонента в файле. Добавление одной записи в файл данных сделанов виде процедуры AddRec, которая также записана выше в тексте программы.В окончании процедуры организуется вывод сообщения о результатах создания файла. Для измерения размера файла в записях используется функция FileSize.

Для сокращения записи при обращении к полям Fio и Phone переменной типа запись Work используется предложение with Work do.

Для вывода на экран всех записей файла сначала, используется функция IOresult, выполняется проверку, есть ли данный файл на диске. Если функция IOresult возвращает значение, отличное от 0, то на экран выводится сообщение о том, что данного файла на диске нет, иначе позиционируется указатель на первую запись Seek(BookFile, 0), а затем, используя оператор повтора while, записывается вызов процедуры вывода на экран одной записи OutputRec.

143

Page 144: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Условием окончания цикла while будет выражение Eof(BookFile). Как только оно выполнится, цикл завершится. Данные всех записей файла выведены на экран.

В процедуре поиска номера телефона описаны локальные переменные: Maska типа StFio, которая будет принимать значение фамилии искомого абонента; Rez_Find типа boolean, которая будет принимать значения True или False в зависимости от результатов поиска; CountRec типа integer, значение которой будет равно числу записей с такой фамилией.

После записи запроса имени файла данных справочника и проверки есть ли он на диске, в случае если файл есть, записывается запрос о фамилии искомого абонента. Перед поиском присвоено значения Rez_Find:=False и CountRec:=0. Просмотр всех записей файла данных при поиске записан, используя оператор повтора while. Условие завершения поиска- Eof(BookFile) - достижение конца файла. Если значение поля Fio очередной записи совпадает со значением переменной Maska, то переменной Rez_Find присваивается значение True (абонент найден), значение переменной CountRec увеличивается на 1 и печатается сообщение о фамилии и номере телефона найденного абонента.

Порядок выполнения работы1. Изучить теоретические сведения по теме “ Разработка программы для

работы с типизированным файлом”.2. Получить у преподавателя индивидуальное задание и разработать

программу для работы с типизированным файлом согласно заданному варианту.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Понятие типизированного файла. 2. Средства работы с типизированными файлами.3. Пример программы для работы с типизированными файлами.

Лабораторная работа № 30Разработка программы для работы с нетипизированным файлом

Цель работы: формирование знаний и умений по работе с нетипизированными файлами.

Краткие теоретические сведения

Нетипизированные файлыФайлами, поддержка которых осуществляется с максимально возможной

скоростью являются нетипизированные файлы. Введение таких файлов в систему Турбо Паскаль было вызвано стремлением повысить эффективность

144

Page 145: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

программ, участвующих в интенсивном обмене с внешними наборами данных. Эти файлы в отличие от текстовых и типизированных не имеют строго определенного типа.

Нетипизированный файл рассматривается в Паскале как совокупность символов или байтов. Представление Char или Byte не играет никакой роли, а важно лишь относительно объема занимаемых данных. Для определения в программе нетипизированного файла служит зарезервированное слово File:

VarUntypedFile : File;

Внутренняя поддержка таких файлов выглядит наиболее близкой к аппаратной поддержке работы с внешними носителями. За счет этого достигается максимально возможная скорость доступа к наборам данных. Для нетипизированных файлов не нужно терять время на преобразование типов и поиск управляющих последовательностей, достаточно считать содержимое файла в определенную область памяти. Нетипизированный файл является файлом прямого доступа, что говорит о возможности одновременного использования операций чтения и записи. Для таких файлов самым важным параметром служит длина записи в байтах. Открытие нетипизированного файла с длиной записи в 1 байт можно выполнить следующим образом:

Rewrite(UntypedFile, 1) ; илиReset(UntypedFile, 1) ;

Второй параметр, предназначенный только для использования с нетипизированными файлами, задает длину записи файла на сеанс работы.

Особенность аппаратной поддержки заключается в том, что при обращении к внешнему устройству минимально возможным объемом для считывания являются 128 байт. В стремлении добиться наибольшей эффективности файловых операций в Турбо Паскале принято соглашение, по которому длина записи нетипизированного файла по умолчанию составляет 128 байт. Поэтому после открытия файла с помощью вызовов:

Rewrite(UntypedFile) ; илиReset(UntypedFile) ;все процедуры и функции, обслуживающие файлы прямого доступа,

работают с записями длиной 128 байт. Каждый пользователь для своих программ может выбрать наиболее подходящий размер записи.

Используя для базовых операций ввода-вывода с нетипизированными файлами стандартные процедуры Read и Write, нельзя добиться большой эффективности в скорости передачи данных. Поэтому только для данного типа файлов в Турбо Паскаль введены две новые процедуры, поддерживающие операции ввода-вывода с более высокой скоростью.Средства работы с нетипизированными файлами

BlockRead(var F : file ; var Buf; Count : word {;Result:word});Процедура считывает из файла F определенное число блоков в память,

начиная с первого байта переменной Buf. Параметр Buf представляет любую переменную, используемую для накопления информации из файла F. Параметр

145

Page 146: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Count задает число считываемых блоков. Параметр Result является необязательным и содержит после вызова процедуры число действительно считанных записей.

Использование параметра Result подсказывает, что число считанных блоков может быть меньше, чем задано параметром Count. Если Result указан при вызове, то ошибки ввода-вывода в такой ситуации не произойдет. Для отслеживания этой и других ошибок чтения можно использовать опции {$I-}, {$I+} и функцию IOresult.

BlockWrite(var F : file ; var Buf; Count:word {;Result :word}) ;Процедура предназначена для быстрой передачи в файл F определенного

числа записей из переменной Buf. Все параметры процедуры BlockWrite аналогичны параметрам процедуры BlockRead. Обе процедуры выполняют операции ввода-вывода блоками. Объем блока в байтах определяется по формуле:

06ъем = Count * RecSize,где RecSize - размер записи файла, заданный при его открытии. Суммарный

объем разового обмена не должен превышать 64 Кбайт. Помимо скорости передачи данных преимущество этих процедур заключается в возможности пользователя самостоятельно определять размер буфера для файловых операций.

Эта возможность играет значительную роль в тех задачах, где необходимо жесткое планирование ресурсов.

Пример программы для работы с типизированными файламиПусть требуется составить программу, которая создает нетипизированный

файл из 100 вещественных чисел и выводит на экран k-й элемент файла. Проиллюстрируем обработку созданного файла двумя разными способами: поиск элемента в файле данных прямого доступа по его номеру и поиск элемента в файле данных с последовательным доступом.

В разделе описания переменных опишем файловую переменную F, представляющую в программе нетипизированный файл вещественных чисел; вещественную переменную Р, которой будет присваиваться значение очередного элемента файла при заполнении файла случайными вещественными числами и искомого элемента файла; целую переменную типа byte К, значения которой будут указывать на номер элемента в файле.

Program UnTyped_File;Uses Crt;Var

F : File of real;P : real;К : byte;

procedure Mak_file; {Создание файла вещественных чисел}begin

Assign(F,'a.dat') ;Rewrite(F) ; {Открыть файл для записи}Randomize; for K:=l to 100 do

146

Page 147: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

beginP:=Random(100) ;Write(F,P) ; {Записать в файл значение К-го элемента}

end;Writeln('Создание файла вещественных чисел завершено');

Close(F); {закрыть файл}end; {конец процедуры Mak_file}

procedure Find_Elem; {Поиск элемента в файле прямого доступа по его номеру}begin

Assign(F,'a.dat');Write('Введите номер нужного элемента ');Readln(К) ;Reset(F) ;Seek(F,K-l); {Переместить указатель обработки на К-1-й элемент}Read(F,P); {Присвоить значение элемента, на который указывает указатель обработки переменной Р}Writeln(K,'-й элемент файла ',Р:6:2) ;Close(F) ;

end; {процедура Find_Elem}procedure Find_Fil_P; {Поиск элемента в файле последовательного доступа}

var N : byte;begin

Assign(F,'a.dat');Write('Введите номер нужного элемента ');Readln(К) ;Reset(F) ;N:=0; {Поместить указатель обработки в начало файла}

While not Eof(F) do {Повторять, пока не будет просмотрен весь файл}begin

Read(F,P); {Чтение элемента и смещение указателя обработки вправо на один элемент}if N=K-1 then {Найден элемент с искомым номером}

beginWriteln(K,'-й элемент файла равен ',Р:6:2);Exit; {Прервать поиск, так как элемент найден}

end;N:=N+1; (Увеличить числа элементов файла на 1}

end;Close(F);end ; {конец процедуры Find_Fil_P}Begin {Основная программа}

Mak_file; {Вызов процедуры создания файла вещественных чисел} Find_Е1еm; {Вызов процедуры поиска элемента в файле прямого

доступа}Find_Fil_P; {Вызов процедуры поиска элемента в файле с последовательным доступом}

end.При обработке файла a.dat как файла прямого доступа для чтения

определенного элемента выполняется позиционирование указателя обработки

147

Page 148: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

на указанный элемент, а при обработке файла a.dat как файла последовательного доступа перемещение указателя на нужный элемент осуществляется последовательным чтением элементов, начиная с первого, до тех пор, пока указатель обработки не будет установлен на искомый элемент.

Порядок выполнения работы1. Изучить теоретические сведения по теме “ Разработка программы для

работы с нетипизированным файлом”.2. Получить у преподавателя индивидуальное задание и разработать

программу для работы с нетипизированным файлом согласно заданному варианту.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Понятие нетипизированного файла. Описание нетипизированного файла.2. Средства работы с нетипизированными файлами.3. Пример программы для работы с нетипизированными файлами.

Лабораторная работа № 31Изучение карты памяти. Разработка программы доступа к полям

PSP

Цель работы: формирование знаний и умений по работе со схемой распределения памяти, адресацией и работой с Heap-областью. Приобретение навыков разработки программ для доступа к полям префикса программного сегмента.

Краткие теоретические сведенияЧтобы более полно представить все процессы, протекающие внутри

любой программы на Паскале, необходимо знать расположение ее внутренних областей в памяти. Для каждой отдельной программы при ее запуске (загрузке в память) MS-DOS организует в памяти что-то вроде анкеты (длинной в 256 байт). Это файл, называемый префиксом программного сегмента (Program Segment Prefix (PSP)).Система адресации MS-DOS.

От F0000 до FFFFFОт E0000 до ……..От D0000 до ……..От C0000 до ……..

148

ПЗУ

Область кассет ПЗУ

Расширение BIOS

16 блоков по 64 кб каждый

Page 149: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

ВА90000…………………..1000000000

Блок или сегмент обозначается 16-ричной цифрой, обозначающей старшую цифру адреса. 0-блок – это адреса: от 00000 до 0FFFF. Абсолютный адрес – это адрес без учета сегментов, он не может быть > FFFFF. Физический адрес = Абсолютный адрес + Смещение. Абсолютный адрес - адрес самого сегмента (16 бит = 2 б). Смещение – адрес внутри сегмента (4 бита). Это содержимое сегментного регистра.Таким образом, адрес любой ячейки памяти определяется парой чисел:СЕГМЕНТ:СМЕЩЕНИЕ.Знак $ - предшествует 16-ой записи числа.

Распределение памяти при выполнении программы

Верхняя граница памятиОбласть для динамических переменных (куча)Она заполняется вверх от отметкиОбласть памяти оверлеев (оверлейный буфер, если он необходим).

Заполненая часть стека

Свободная часть стека

Глобальные переменныеТипизированные константы.Сегмент кода модуля System.

Сегмент кода первого модуля (Unit)Cегмент кода других модулей.Сегмент кода последнего модуля (Unit)Cегмент кода основной программы.Префикс сегмента программы (PSP) = 256 байт Это файл анкета о загружаемой

149

Рабочее ОЗУ (10 блоков 640 кб)

Обычно под OS

память дисплея

FrePtr

OvrHeapEnd

вверх

Верхняя граница стека

Sseg : 0000Sseg : Str

OvrHeapOrg

Стандартная переменная

PrefixSeg = 0000Начальный адрес

программы

Если он есть в программе

Dseg : 0000

Cseg : 0000

Cодержимое регистров CS, DS, SS не изменяется в ходе программы! А SP-снижается вниз пока не достигнет конца!

Стек, для хранения локальных

переменных и параметров процедур и

функций

Свободная память HeapPtr

Занятая динами ческая памятьHeapOrg

Здесь содержится образ EXE файла

Сегмент данных

Заполняется вниз

Page 150: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

программе

После PSP (ProgramSegmentPrefix) располагаются коды EXE-файла – это может быть один сегмент = 64 кбайтам. Если программа разбита на модули, то каждому модулю соответствует свой сегмент кода программы. За СЕГМЕНТОМ КОДА ОСНОВНОЙ ПРОГРАММЫ располагаются сегменты в порядке, обратном тому, который указан при вызове в разделе USES.

Затем располагается СЕГМЕНТ КОДА МОДУЛЯ System. После следует СЕГМЕНТ ДАННЫХ – все константы, переменные (глобальные).

За СЕГМЕНТОМ ДАННЫХ следует СЕГМЕНТ СТЕКА. Назначение сегмента стека:1.при вызове процедур и функций он служит для передачи параметров;2. здесь размещаются все локальные переменные на уровне процедур и

функций;3.здесь сохраняются все критические значения программы.Чтобы узнать количество стековой памяти, требуемой программе,

можно после компиляции, посмотреть это режиме Info.

Пример программы распределения памяти и получения доступа к полям PSP.

{Программа, демонстрирующая распределение памяти}program Demo_Size;uses Crt;varP : pointer;I : word; procedure ProgSize;varSysemTotalSize : word {Общий размер кучи} PrefixSize : word {Размер PSP} CodeSize : word {Размер сегмента кода} DataSize : word {Размер сегмента данных} HeapSIze : word {Размер динамической памяти} AllocHeapSize: word {Размер занятой части динамической памяти}Factor : real ;S : string[80] ;LI : byte absolute S;1,1 : byte;function Lin_Adr (P : pointer) : longint; {Вычисление абсолютного

(линейного) адреса объекта по обычному сегментному адресу} beginLin_Adr:=longint(Seg(P^)*16+0fs(Р^); end;begin {Начало процедуры}SystemTotalSize := 640*1024 div 16;

150

Page 151: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

PrefixSize := 256 div 16;CodeSize := Dseg — PrefixSeg — PrefixSize;DataSize := SegtHeapOrg^ — SSeg;HeapSize ;= Mem[PrefixSeg:2] - Seg (HeapOrg^);AllocHeapSize := (Lin_Adr(HeapPtr)-Lin_Adr(HeapOrg)+1) div 16;Writein (' Распределение памяти: ');Factor := 67 / SystemTotalSize;L:= Round(Factor*PrefixSize) ;FillChar(S[l],L,#176) ;Writeln ('PSP ',PrefixSize:5,' ',S);L := Round(Factor*CodeSize) ;FillChar(S[l],L,#176) ;Writeln('Код ',CodeSize:5,' ',8);L := Round(Factor*DataSize) ;FillChar(S[l],L,#176) ;Writeln ('Данные ',DataSize:5,' ',S);L := Round(Factor*HeapSize) ;LI := Round(Factor*AllocHeapSize) ;FillChar(S[l],LI,#176) ;FillChar(S[LI+l],L-LI,#219) ;Writein ('Куча:', HeapSize: 5,' ',S);Writein end;begin {Основная программа}Randomize;for I:=l to 100 do {Попробуйте поменять конечное значение параметра I

(от 1 до 1000)}GetMam(P,Random(1000)); {Занимаем часть динамической.памяти

блоками случайных размеров}ProgSize; {Выводим на экран карту памяти}end.

Порядок выполнения работы1. Изучить теоретические сведения по теме: “Изучение карты памяти.

Разработка программы доступа к полям PSP”.2. Изучить программу распределения памяти и доступа к полям PSP.3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Адреса MS-DOS. Абсолютный адрес, сегмент, смещение.2. Карта распределения памяти при выполнении программы.3. Сегмент кода, сегмент данных, сегмент стека. Назначение каждого из

сегментов.

151

Page 152: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Лабораторная работа № 32Разработка программы использования динамической памяти

Цель работы: формирование знаний и умений по работе с динамической памятью. Приобретение навыков работы с динамическими переменными, указателями.

Краткие теоретические сведенияВ любой вычислительной системе память относится к таким ресурсам,

которых всегда не хватает. Управление памятью — одна из главных забот программиста, так как для него очень важно создавать программы, эффективно использующие память, ведь во время выполнения программы память необходима для следующих элементов программ и данных:

• сама программа пользователя;• системные программы времени выполнения, которые осуществляют

вспомогательные действия при работе программы пользователя;• определяемые пользователем структуры данных и константы;• точки возврата для подпрограмм;• временная память для хранения промежуточных результатов при

вычислении выражений;• временная память при передаче параметров и т.п.Из этого перечня видно, что управление памятью касается широкого

класса объектов. Ранее в программах использовался простейший способ распределения памяти — статическое распределение, т. е. распределение памяти при трансляции программы. Статическое распределение памяти эффективно, поскольку на управление памятью не тратится ни время, ни память. В данной лабораторной работе рассматривается динамическое (во время выполнения программы) управление памятью.

Статические и динамические переменныеПрактика программирования часто выдвигает на передний план два

конфликтующих фактора: время выполнения программы и объем занимаемой памяти. Конечно, высокое быстродействие программы всегда желательно, но бывают случаи, когда важнее обеспечить максимальную экономию памяти даже ценой потери в скоростных характеристиках.

Рассмотрим пример. Пусть в программе обрабатывается матрица 300*300 целых чисел, тогда ее нужно описать следующим образом:

var M1 : array[1..300,1..300] of Integer;Такие переменные, описанные в разделе Var, Н.Вирт назвал

статическими. Название "статические" они получили за то, что компилятор Паскаля может обработать их без выполнения программы, т. е. на основании лишь статического текста программы. Статические переменные можно использовать в случаях, когда память, необходимая для работы программы, предсказуема в момент написания программы.

152

Page 153: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

В данном случае мы имеем наглядный пример нерационального использования памяти компьютера с применением статических переменных. Так как один элемент матрицы — целое число — занимает в памяти два байта, а общее количество элементов равно 300*300= 90000, то для размещения всей матрицы вышеописанным способом в памяти компьютера нужно 90000*2 байт = 180000 байт. Вместе с тем маловероятно, чтобы при всяком выполнении программы ей действительно были нужны одновременно все элементы такого огромного массива. К тому же все переменные, объявленные в программе, размещаются в одной непрерывной области оперативной памяти, которая называется сегментом данных. Длина сегмента данных определяется архитектурой микропроцессора 8086 и составляет 65536 байт (64 Кбайта), что также вызывает затруднения при обработке больших массивов данных.

Выходом из этого положения может быть использование динамической памяти. Динамическая память - это оперативная память компьютера, предоставляемая программе при ее работе, за вычетом сегмента данных (64 Кбайта), стека (обычно 16 Кбайт) и собственно тела программы. Размер динамической памяти определяется всей доступной памятью компьютера и составляет 200...400 Кбайт.

Решение проблемы экономного расходования памяти состоит в том, чтобы не резервировать заранее максимальный объем памяти для размещения данных, а, предварительно определив тип данных, создавать новый экземпляр данных всякий раз, когда в нем возникает необходимость. Такие переменные, которые создаются и уничтожаются в процессе выполнения программы, называются динамическими. Динамическая память широко используется для временного запоминания данных при работе с графическими и звуковыми средствами компьютера.

УказателиВсе рассмотренные ранее типы данных содержат непосредственно данные,

размещенные в памяти компьютера. Для организации динамической памяти применяются особые переменные, называемые указателями. Назначение их состоит в том, чтобы указывать местоположение какой-то другой переменной заранее определенного типа.

Таким образом, указатель - это переменная, которая в качестве своего значения содержит адрес первого байта памяти, по которому записаны данные. Сам по себе указатель занимает в памяти всего четыре байта, а данные, на которые он указывает, могут простираться в памяти на десятки килобайт. Переменной, на которую указывает указатель, не обязательно присваивать какое-либо имя. К ней можно обращаться через имя указателя, потому она называется ссылочной переменной.

Типизированные указателиУказатели, содержащие адрес, по которому записана переменная заранее

определенного типа, называются типизированными. Для объявления типизированного указателя используется знак ^, который помещается перед соответствующим типом.

153

Page 154: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Для объявления типа указателя Р на целочисленный тип данных следует записать:

Type Р = ^Integer;Тип Integer в данном примере является базовым типом. Имея в программе

определение типа указателей (ссылочного типа), можно по общим правилам описать переменные этого типа. При этом ссылочные типы в описаниях переменных можно задавать как посредством идентификаторов, так и явно, например:

Var Р1, Р2 : Р; {Тип Р введен выше}R : ^Byte;

Описание типов указателей - единственное исключение из общего правила, согласно которому все идентификаторы должны быть описаны перед использованием. Однако если базовый тип является еще не объявленным идентификатором, то он должен быть объявлен в той же самой части объявления, что и тип указатель.

Например:RecPtr = ^RecordType;RecordType=record

Name : string[20];Number : integer;end;

В данном примере RecPtr описывается как указатель на переменную RecordType. Базовый тип RecordType описывается в той же самой последовательности определений типов, что и тип RecPtr.

Реально значения ссылочных типов (указателей) содержат адреса расположения в памяти конкретных значений базового типа. В персональном компьютере адреса задаются совокупностью двух шестнадцатиразрядных слов, которые называются сегментом и смещением. Сегмент - это участок памяти, имеющий длину 65536 байт (64 Кбайт) и начинающийся с физического адреса, кратного 16 (0, 16, 32, 48 и т.д.). Смещение указывает, сколько байт от начала сегмента необходимо пропустить, чтобы обратиться к нужному адресу. Таким образом, по своей внутренней структуре любой указатель представляет собой совокупность двух слов (данных типа Word), трактуемых как сегмент и смещение.

Абсолютный адрес образуется следующим образом: сегмент* 16+смещение.

Для того чтобы присвоить переменной ссылочного типа некоторое значение, можно воспользоваться унарной операцией взятия указателя, которая строится из знака этой операции-символа @ (амперсант) и одного операнда-переменной. Например, если имеется описание переменной I целого типа:

Vаr I : integer;

154

Page 155: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

то применение этой операции к переменной I: @I дает в качестве результата значение типа указатель на целое. Аналогичный результат получится и в результате операции Р = ^Integer;

Операция взятия указателя допустима для любых переменных, в том числе для элементов массивов, полей записи и т. д.

Например, если есть описание: Var А : array[1..10] of integer; то конструкция @А[I] имеет смысл указателя на I-е целое в массиве А и

также может участвовать в присваивании: Р := @А[I].Ссылочные типы можно образовывать от любых типов, поэтому допустимо

определение вида указатель на указатель.Среди всех возможных указателей в Турбо Паскале выделяется один

специальный указатель, который "никуда не указывает". Можно представить такую ситуацию: в адресном пространстве оперативной памяти компьютера выделяется один адрес, в котором заведомо не может быть размещена никакая переменная. На это место в памяти и ссылается такой нулевой (или пустой) указатель, который обозначается словом Nil. Указатель Nil считается константой, совместимой с любым ссылочным типом, поэтому его значение можно присваивать любому указателю. Обычно значение Nil присваивают указателю, когда его указание надо отменить или в начале инициализации программы. Это позволяет проверять значение указателя, прежде чем присваивать ему какое-либо значение.

Нетипизированный указатель (pointer)В Турбо Паскале можно объявлять указатель и не связывать его при этом с

каким-либо конкретным типом данных. Для этого служит стандартный тип Pointer. Он обозначает нетипизированный указатель, т. е. указатель, который не указывает ни на какой определенный тип. С помощью нетипизированных указателей удобно динамически размещать данные, структура и тип которых меняются в ходе программы.

Переменные типа Pointer не могут быть разименованы: указание символа ^ после такой переменной вызывает появление ошибки. Как и значение, обозначаемое словом Nil, значения типа Pointer совместимы со всеми другими типами указателей.

Над значениями ссылочных типов допускаются две операции сравнения на равенство и неравенство, например @Х <> @Y или Р1 = Р2.

Два указателя равны только в том случае, если они ссылаются на один и тот же объект.

Доступ к переменной по указателю Для доступа к переменной имеются две возможности: первая -

использовать идентификатор переменной, вторая - воспользоваться адресом этой переменной, который содержится в указателе на эту переменную.

Например, чтобы увеличить значение переменной I, на которую указывает указатель Р: по первому способу можно записать: I:=I+2.Для реализации второго, косвенного доступа к переменной по указателю, используется

155

Page 156: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

разыменование указателя. Правило разыменования таково: для того чтобы по указателю на переменную получить доступ к самой переменной, нужно после переменной-указателя поставить знак ^. Так, запись: Writeln(Int2^) означает напечатать значение переменной, на которую ссылается указатель Int2. Поэтому чтобы увеличить значение переменной I, на которую указывает указатель Р, используя косвенный доступ к переменной по указателю, можно записать: Р ^:= P^ + 2.

Разыменование допускается для любых ссылочных типов. В случае использования указателя на указатель возможно многократное разыменование. Разыменование считается некорректным, если ссылочная переменная имеет значение Nil, т. е. в этом случае не существует переменной, на которую ссылается указатель.

Управление динамической памятьюВся динамическая память в Турбо Паскале рассматривается как сплошной

массив байтов, который называется кучей. Физически куча располагается в старших адресах сразу за областью памяти, которую занимает тело программы.

Начало кучи хранится в стандартной переменной HeapOrg, конец - в переменной HeapEnd. Текущую границу незанятой динамической памяти указывает указатель HeapPtr.

Для управления кучей используются следующие стандартные процедуры и функции.

Процедуры динамического распределенияDispose Уничтожает динамическую переменнуюFreeMem Уничтожает динамическую переменную данного

размераGetMem Создает новую динамическую переменную заданного

размера и устанавливает переменную-указатель для нее Mark Записывает в переменной-указателе состояние кучи New Создает новую динамическую переменную и

устанавливает на нее переменную-указательRelease Возвращает кучу в заданное состояние

Функции динамического распределенияMaxAvail Возвращает размер наибольшего непрерывного

свободного блока кучи, соответствующей размеру наибольшей динамической переменной, которая может быть распределена в момент вызова MaxAvail

MemAvail Возвращает количество имеющихся в куче свободных байтовФункции для работы с указателями и адресами

Addr Возвращает адрес заданного объектаCseg Возвращает текущее значение регистра CSDseg Возвращает текущее значение регистра DSOfs Возвращает смещение заданного объекта

156

Page 157: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Ptr Преобразует базовый адрес сегмента и смещение в значение типа указатель

Seg Возвращает сегмент для заданного объектаSPtr Возвращает текущее значение регистра SPSseg Возвращает текущее значение регистра SS

Основные действия над динамическими переменными - создание и уничтожение - реализуются в Турбо Паскале стандартными процедурами New и Dispose.

Процедура New предназначена для создания динамических переменных определенного типа. Она отводит новую область памяти в куче для данной динамической переменной и сохраняет адрес этой области в переменной-указателя. Можно присвоить значение переменной-указателю и с помощью оператора @ или функции Ptr. Оператор @ устанавливает переменную-указатель на область памяти, содержащую существующую переменную, включая и те переменные, которые имеют идентификаторы. Функция Ptr устанавливает переменную-указатель на определенный адрес в памяти. Например:

New(Int1); P1 := @X; Ptr($40, $49);

Для освобождения памяти в куче предназначена процедура Dispose с параметром указатель на динамическую переменную, причем эта переменная должна быть ранее размещена в куче посредством New, а тип размещенной переменной должен совпадать с базовым типом параметра процедуры Dispose. Например: Dispose(Int1) освобождает выделенный в предыдущем примере в куче фрагмент памяти так, что его можно снова использовать, если потребуется.

Если в программе не предполагается использование кучи, то при работе с программой Турбо Паскаля рекомендуется снизить потребность в памяти для создаваемой программы с помощью меню Options/Heap.

При освобождении динамической памяти нужно соблюдать осторожность, т.е. пользоваться либо New/Dispose, либо New/Mark/Release, либо GetMem/FreeMem, но ни в коем случае не путать сочетание этих процедур.

Пример программы с использованием динамической памяти

{Программа указателя на массив, доступа к элементам массива}Program Point1;Uses Crt;Type

massiv=array[1..10] of integer; {описание типа массива из 10 целых чисел}Var

i:integer;a:massiv; {массив из 10 целых чисел}

157

Page 158: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

PtrMas:^massiv;{указатель на массив}Begin

{ввод элементов массива}Writeln('Введите элементы массива : ');for i:=1 to 10 dobegin

Writeln(i,'-й элемент массива ');Readln(a[i]);

end;ClrScr;Writeln('Введенный массив: ');

{вывод элементов введенного массива }for i:=1 to 10 doWrite(' ',a[i]);Writeln;{Присвоить указателю PtrMas адрес начала размещения массива в

памяти}PtrMas:=@a;

Writeln('Значение первого элемента массива, на который указывает PtrMas: ');{Напечатать значение первого элемента массива, на который указывает указатель PtrMas}Writeln(PtrMas^[1]);{Присвоить указателю PtrMas  адрес начала размещения второго

элемента массива}PtrMas:=@a[2];

Writeln(' Значение второго элемента массива, на который указывает указатель PtrMas: ');

{Напечатать значение первого элемента массива, на который указывает указатель PtrMas}Writeln(PtrMas^[1]);Writeln(' Значение 4-того элемента массива, на который указывает указатель PtrMas: ');{Присвоить указателю PtrMas адрес 4-того элемента массива}PtrMas:=Ptr(Seg(a[3]),Ofs(a[3])+SizeOf(integer));{Ptr- преобразует базовый адрес сегмента и смещения в значение типа

указатель}{Напечатать значение 1 элемента массива, на который указывает

указатель PtrMas}Writeln(PtrMas^[1]);Readkey;

end.

158

Page 159: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Порядок выполнения работы1. Изучить теоретические сведения по теме ” Разработка программы

использования динамической памяти”.2. Получить у преподавателя индивидуальное задание и разработать

программу для работы с динамической памятью и динамическими переменными согласно заданному варианту.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Статические и динамические переменные. 2. Указатели: типизированные, нетипизированные, Nil. Доступ к

переменной по указателю.3. Процедуры и функции управления динамической памятью

Лабораторная работа № 33Разработка программы создания связанного списка

Цель работы: формирование знаний и умений по работе с динамической памятью. Приобретение навыков работы с динамическими структурами данных.

Краткие теоретические сведения

Использование указателей для организации связанных списков

Чаще всего указатели используются для ссылки на записи, тем самым достигается значительная экономия памяти. Если же сама запись содержит в себе поле-указатель, указывающий на следующую за ней запись, то это позволяет образовать связанные списки - структуру, в которой отдельные записи последовательно связаны друг с другом. В приведенном ниже примере используются записи, в которых наряду с данными об автомобиле имеется указатель на следующую запись, благодаря чему получается связанный список.

159

Page 160: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Одно из полей каждого объекта связанного списка имеет тип указатель и указывает на очередной объект в списке. Указатель на первый объект содержится в переменной First, а последний объект имеет указатель на Nil.

Пример программы создания и использования связанного списка

Пусть требуется создать связанный список из записей, содержащих сведения об автомобилях, а также реализовать операции со связанным списком: запись первым в список, удаление первого объекта из списка, просмотр всего списка, удаление объекта, следующего за указанным.

{Пример использования указателей для обработки связанного списка} Program point; Uses Crt;Type

NameStr = String [20];Link = ^Auto;Auto = record

Name : NameStr; {Марка автомобиля} Speed : real; {Скорость}Next : Link; {Поле для связи со следующим объектом в списке}end;

VarР,First : Link; {Указатели на запись: текущую, первую}

NamFind : NameStr; {Марка автомобиля для поиска} V : 0..4; {Селектор меню}EndMenu : boolean; {Окончание вывода меню}

{Поиск объекта с именем FN, по результатам поиска возвращает указатель на найденный объект или Nil, если объект не найден}

Function FindName(FN:NameStr) : Link; Var

Curr : Link;begin

Curr:=First; {Установить указатель на первом объекте в списке } {Повторять пока не дойдем до конца списка} while Curr <> Nil do

if Curr^.Name=FN then {Если нашли заданный объект} beginFindName:=Curr; {Возвращаем значение указателя на него}

Exit; {Завершаем функцию} end

elseCurr:=Curr^ .Next; {Перейти к следующей записи} FindName:=Nil; {В списке нет искомого объекта}

end; {Конец FindName}

160

Page 161: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

{Добавление записи первой в связанный список}procedure AddFirst(A:Link); begin A^. Next:=First; {Новый объект первый в списке} First:=А; {Голова списка ссылается на новый объект}end; {Конец AddFirst}{Удаление первого объекта из списка}procedure DelFirst(var A:Link); begin

A:=First;First:=First^. Next; {Теперь First указывает на тот объект, на который ранее ссылался объект А}

end; {Конец DelFirst}{Удаление из списка объекта, стоящего после объекта Old} procedure DelAfter(Old:Link; var A:Link); begin

A:=Old^.Next; {Переменной А присваивается значение указателя на удаляемый объект}Old^.Next:=Old^.Next^.Next; {Теперь Old указывает на тот объект, на который ранее ссылался следующий за ним объект, а объект А исключен из связанного списка}

end; {Конец DelAfter} {Ввести данные об объекте}procedure InpAvto;begin

P:=New(Link); {Создать очередной объект типа Auto}Write('Введите марку автомобиля :');Readln(P^.Name) ;Write('Максимальная скорость :');Readln(Р^.Speed);AddFirst(Р); {Вызов процедуры добавления записи, на которую ссылается указатель Р (Р- фактический параметр, А - формальный параметр-значение) }

end; {Конец InpAvto} {Вывести на экран все объекты из связанного списка} procedure MyList;var

Curr : Link; {Локальная переменная - указатель на очередной объект}begin

Curr:=First; {Установить указатель на первом объекте в списке} {Повторять, пока не дойдем до конца списка}while Curr <> Nil do begin

Writeln( 'Марка : ' , Curr^. Name,' скорость : ', Curr^. Speed) ;

161

Page 162: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Curr:=Curr^.Next; {Перейти к очередному объекту связанного списка}

end ;Write('Вывод списка окончен. Нажмите Enter');Readln;end; {Конец MyList}Begin {Основная программа}

New(P); {Создать новую динамическую переменную и установить на нее переменную-указатель} EndMenu:=False ;repeat {Очищать экран и выводить меню до тех пор, пока

EndMenu<>True} CIrScr;Writeln('Укажите вид работы:');Writein('1. Запись первым в список');Writeln('2. Удаление первого объекта из списка');Writein('3. Просмотр всего списка') ;Writein('4. Удаление объекта, следующего в списке за указанным') ;Writein('0. Окончание работы');Readin(V) ;Case V of {Вызов разных процедур в зависимости от выбора пункта

меню}1 : InpAvto; {Ввод данных об объекте}2 : DelFirst(P); {Удаление первого в списке}3 : MyList; {Вывод списка всех элементов связанного списка}4 : begin {Удаление объекта, следующего за указанным}

Write('Введите марку автомобиля, за которым следует удаляемый из списка :');

Readln(NamFind) ;DelAfter(FindHame(NamFind),P); {Вызов процедурыDelAfter с параметрами: функцией FindName(NamFind) и

указателем Р}end

elseEndMenu:=True; {Завершить вывод меню} end;

until EndMenu; {Если EndMenu=True, то завершить вывод меню на экран}

Dispose(Р); {Уничтожить динамическую переменную Р и освободить память в куче}

end.Порядок выполнения работы

1. Изучить теоретические сведения по теме ” Разработка программы создания связанного списка”.

162

Page 163: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

2. Получить у преподавателя индивидуальное задание и разработать программу для работы со связанным списком согласно заданному варианту.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Связанные списки. 2. Применение указателей для организации связанных списков.

Лабораторная работа № 34Разработка программы для работы с процедурным типом

Цель работы: формирование знаний и умений по работе с процедурным типом данных.

Краткие теоретические сведения

Нетипизированные параметры. Параметры процедурного типа

Нетипизированные параметры - это группа параметров, перед которыми стоит ключевое слово Var и за которым не следует тип. Фактическими параметрами в операторе вызова процедуры в данном случае могут быть переменные любого типа.

Поскольку у нетипизированных параметрах тип отсутствует, то изначально они совместимы с переменными всех типов.

Обеспечение совместимости с фактическими параметрами может быть достигнуто двумя способами.

Способ 1: внутри процедуры объявляется локальная переменная нужного типа, наложенная на переданный фактический параметр. Для описания такой переменной используется зарезервированное слово Absolute.

Пример 1.program Primer1;Var {Обьявление глобальных переменных} x1,x2,y1,y2,z1,z2: real;{процедура возведения в степень}procedure stepen (x,y : real; var s); {x, y – параметры значения}var ss: real absolute s; {s- параметр без типа, ss наложенная на s – локальная переменная типа real}begin ss:=exp(y*ln(x));end; {конец процедуры stepen}

begin{основная программа}writeln(‘Введите значение переменных в последовательности: x1 y1 x2

y2’ );

163

Page 164: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

readln (x1, y1, x2, y2); {Чтение исходных данных}stepen (x1, y1, z1); {Первый оператор вызова процедуры stepen}stepen(x2, y2, z2); {Второй оператор вызова процедуры stepen}z1:= z2+z1; {Формироваие результата}

writeln(z1); {печать результата}end.Способ 2: внутри процедуры вводится нужный тип. Данный тип ставится

в соответствие нетипизированному параметру с помощью присваивания типа переменной.

Пример 2. В программе функция Sum выдает сумму двух вещественных переменных при N=Ø, и сумму двух одномерных массивов при N<>Ø.

program Primer2;var

ind: integer;m1,m2: array [1..5] of integer ; {описание массивов m1 m2}x1,x2:real;

{функция вычисления суммы}function sum(n: integer ; var y1,y2): real;Type

mas = array [1..MaxInt] of integer;Var

i: integer;s: real;

begin if n=Ø then sum:= real(y1)+real(y2);

else begin

s:=Ø;for i:=1 to n dos:= s + mas(y1)[i]+mas(y2)[i];sum:=s;

end;end; {конец функции sum}Begin {основная программа}for ind:= 1 to 5 do real(m1[i], m2[i] ); {заполнение массивов данными}writeln(‘Введите 2 вещественных числа: ’)read(x1,x2); writeln(’x1 + x2’, sum(Ø,x1,x2)); {вызов в операторе writeln функции sum-для суммирования вещественных чисел x1 и x2 (n=0)}writeln(’Массивы’, sum (5,m1, m2)); {вызов в операторе writeln функции sum-для суммирования массивов m1 и m2 (n=5<>0)}end.

164

Page 165: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Параметр процедурного типаВ Паскале допускается передача в качестве параметра имени других

процедур или функций. Например:Type

Func = function(x,y:byte):byte;Proc = procedure(var x,e:byte);

var P1 : Proc; F1: Func;

При этом должны совпадать число параметров и соответственно типы параметров. Всем процедуры и функции, имена которых присваиваются процедурным переменным, необходимо компилировать в режиме {$F+}.

Описание процедурных типов вводится в разделе Type. Синтаксис описания совпадает с заголовком процедуры, однако имя процедуры в описании опускается.

Имена параметров в описании процедурного типа играет чисто иллюстративную роль. Никакого влияния на значение этого описания данные имена не оказывают.

Процедурной переменной может быть присвоено значение другой процедурной переменной, имя процедуры или функция. При этом переменная слева и значение в правой части оператора присваивания должны быть совместимы по присваиванию.

Для обеспечения такой совместимости процедура, если её нужно присвоить процедурной переменной, должна удовлетворять следующим требованиям:

1. Она должна компилироваться в состоянии {$F+} (в исходном тексте программы перед описанием такой процедуры должна быть размещена директива компилятора {$F+}, а в конце описания {$F-})

2. Она не должна быть стандартной процедурой или функцией.3. Она не должна быть вложенной.4. Она не должна быть процедурой типа inline.5. Она не должна быть процедурой прерывания (interrupt).

Пример 3.Program Primer3;Type

Func=function(x,y:anteger):integer;{$F+}Function Add(a,b:integer):integer;Begin

Add:=a+b;end;Function Multiplay(a,b:int):int;

Begin Multiplay:=a+b;

end;

165

Page 166: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Function Div(a,b:int):int;Begin

Div:=a/b; end;{$F-}Procedure RAB(n,m:integer;Operation:Func); {Operation-параметр

процедурного типа}Var

i,j:integer;Begin

for i:=1 to n do for j:=1 to m do write(operation (i,j):5); end;Begin {основная программа}

RAB(10,10,Add); {вызов процедуры RAB с последним параметром- процедурой Add}

RAB(20,10,Multiplay); ); {вызов процедуры RAB с последним параметром- процедурой Multiplay} RAB(10,5,Div); ); {вызов процедуры RAB с последним параметром-

процедурой Div}End.

Порядок выполнения работы1. Изучить теоретические сведения по теме “ Разработка программы для

работы с процедурным типом”.2. Получить у преподавателя индивидуальное задание и разработать

программу для работы с процедурными типами данных согласно заданному варианту.

3. Показать работающую программу преподавателю.4. Ответить на контрольные вопросы.

Контрольные вопросы1. Нетипизированный параметр. Способы присвоения конкретного типа

нетипизированному параметру.2. Назначение процедурной переменной, объявление.3. Обеспечение совместимости процедуры, если её нужно присвоить

процедурной переменной.

166

Page 167: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Литература1 Гусева А. И. Учимся программировать: Pascal 7.0. - М.: Бином, 1999.2 Сурков Д.А., и др. Программирование в среде Borland Pascal для

Windows.-Мн.: “Вышэйшая школа”, 1996.3 Грызлов В.И. и др. Pascal 7.0.- Киев, BHV, 1999.4 Вирт Н. Алгоритмы и структуры данных –М.: “Мир”, 1989

167

Page 168: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

СодержаниеЛабораторная работа № 1 Блок-схемы как графическое представление алгоритмов. Основные блоки, используемые в блок- схемах алгоритмов...........4Лабораторная работа №2 Построение блок-схем алгоритмов................................9Лабораторная работа № 3 Вызов интегрированной среды (ИС) языка программирования Паскаль. Структура основного экрана. Изучение меню......15Лабораторная работа №а 4 Нписание программы на Паскале с использованием операторов ввода-вывода данных............................................................................24Лабораторная работа № 5 Написание программы на Паскале.............................27с использованием операторов ввода-вывода данных с различными форматами выводимых данных...................................................................................................27Лабораторная работа № 6 Написание программы на Паскале с использованием операторов присваивания и безусловного перехода..............................................30Лабораторная работа № 7 Написание программы на Паскале с использованием условных операторов и оператора выбора Case.....................................................34Лабораторная работа № 8 Написание программы на Паскале с использованиемоператоров повтора (For, Repeat)............................................................................39Лабораторная работа № 9 Написание программы на Паскале.............................44с использованием операторов повтора (While)......................................................44Лабораторная работа № 10 Написание программы на Паскале для решения задач на ввод-вывод линейных и двумерных массивов........................................46Лабораторная работа № 11 Написание программы на Паскале для решения задач на обработку линейного массива...................................................................53Лабораторная работа № 12 Написание программы на Паскале для решения задач на обработку двумерного массива.................................................................57Лабораторная работа № 13 Написание программы на Паскале с использованием встроенных функций.................................................................................................61Лабораторная работа № 14 Написание программы на Паскале с использованием функций, определенных пользователем.................................................................66Лабораторная работа № 15 Написание программы на Паскале с использованием процедур, определенных пользователем................................................................69Лабораторная работа № 16 Написание программы на Паскале с использованием рекурсии.....................................................................................................................74Лабораторная работа № 17 Реализация алгоритма бинарного поиска при написании программы на Паскале...........................................................................78Лабораторная работа № 18 Реализация алгоритмов сортировок включением и выбором при написании программы на Паскале...................................................82Лабораторная работа № 19 Реализация алгоритмов обменных сортировок при написании программы на Паскале………………………………………………...85Лабораторная работа № 20 Реализация алгоритмов внешних сортировок при написании программы на Паскале...........................................................................89Лабораторная работа № 21 Написание программы на языке Паскаль с использованием разработанного собственного модуля........................................91

168

Page 169: umniki-sm.ucoz.ru  · Web viewБелорусский техникум бизнеса и права. Языки программирования высокого уровня. Язык

Лабораторная работа № 22 Изучение наиболее часто употребляемых универсальных процедур и оформление их в виде личной библиотеки программиста.............................................................................................................97Лабораторная работа № 23 Написание программы на языке Паскаль с использованием стандартных строковых процедур и функций.........................101Лабораторная работа № 24 Написание программы на языке Паскаль с использованием строковых переменных..............................................................107Лабораторная работа № 25 Написание программы на языке Паскаль с использованием записей.........................................................................................112Лабораторная работа № 26 Написание программы на языке Паскаль с использованием записей с вариантами.................................................................116Лабораторная работа № 27 Написание программы на языке Паскаль с использованием множеств......................................................................................122Лабораторная работа № 28 Написание программы на языке Паскаль с использованием с использованием файловых переменных................................128Лабораторная работа № 29 Разработка программы для работы с типизированным файлом........................................................................................137Лабораторная работа № 30 Разработка программы для работы с нетипизированным файлом....................................................................................144Лабораторная работа № 31 Изучение карты памяти. Разработка программы доступа к полям PSP...............................................................................................148Лабораторная работа № 32 Разработка программы использования динамической памяти.............................................................................................151Лабораторная работа № 33 Разработка программы создания связанного списка ...................................................................................................................................159Лабораторная работа № 34Разработка программы для работы с процедурным типом.........................................................................................................................162Литература…………………………………………………………………………166

169