vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство...

145
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Московская Государственная академия приборостроения и информатики Конспект лекций по информатике для специальностей 2102, 2103 Автор доц., к.т.н. Каширская Е.Н. Москва, 2001 ОРГАНИЗАЦИЯ ДАННЫХ В ЭВМ И ОСНОВЫ ПРОГРАММИРО ВАНИЯ 1. ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ 1.1. Основные этапы решения задач на ЭВМ: постановка задачи; построение математических моделей; разработка методики решения задач; разработка алгоритма решения задачи; составление программы по разработанному алгоритму; ввод программы в ЭВМ; отладка программы (поиск и исправление ошибок); проведение расчетов по программе; вывод результатов; анализ результатов. При составлении любого вида программы для ЭВМ понятие алгоритма является ключевым. Само слово «алгоритм» означает правило выполнения арифметических действий с использованием арабских цифр. В средние века были две враждующие партии, среди приверженцев различных традиций счета. Абакисты считали на абаках, алгоритмики же использовали зачатки математической символики.

Transcript of vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство...

Page 1: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Московская Государственная академия приборостроения и информатики

Конспект лекций по информатике

для специальностей 2102, 2103

Автор доц., к.т.н. Каширская Е.Н.

Москва, 2001

ОРГАНИЗАЦИЯ ДАННЫХ В ЭВМ И ОСНОВЫ ПРОГРАММИРО ВАНИЯ

1. ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ

1.1. Основные этапы решения задач на ЭВМ: постановка задачи; построение математических моделей; разработка методики решения задач; разработка алгоритма решения задачи; составление программы по разработанному алгоритму; ввод программы в ЭВМ; отладка программы (поиск и исправление ошибок); проведение расчетов по программе; вывод результатов; анализ результатов.

При составлении любого вида программы для ЭВМ понятие алгоритма является ключевым.

Само слово «алгоритм» означает правило выполнения арифметических действий с использованием арабских цифр.

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

Слово «алгоритм» происходит от латинской формы написания имени математика IX века Аль-Хорезми, автор учебника арифметики, который сформулировал правила выполнения арифметических действий.

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

Page 2: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

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

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

Пять характеристик алгоритмов:1) вход алгоритма;2) выход алгоритма;3) определенность шагов алгоритма;4) выполнимость шагов;5) конечность.Пример невыполнимого шага: присвоить Х значение, равное наибольшему вещественному числу, меньшему 1.

Это невозможно сделать, какое бы значение для Х мы не выбрали, всегда можно составить большее, добавив к десятичной части числа любую цифру: 0,999→0,9994 и т.д.Пример. Алгоритм сложения столбиком: 315

+ 48 363

Указана последовательность действий, приводящих к результату за конечное число шагов. Можно дать точное словесное описание алгоритма:Шаг 1. Ввод – любых двух слагаемых (из класса объектов, к которым применим алгоритм).Шаг 2. Сложить цифры, стоящие в разрядах единиц; единицы полученного результата записать в разряд единиц суммы.Шаг 3. Сложить цифры, стоящие в разрядах десятков и прибавить к ним единицу, если результат шага 2 не меньше десяти.Шаг 4. То же для разряда сотен и т.д., пока не закончатся разряды слагаемых.Шаг N. Вывод – значение суммы.

1.2. Схемы алгоритмовСхема – это графическое изображение алгоритма. При ее построении

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

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

2

Page 3: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

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

Параллелограмм (блок ввода-вывода) содержит информацию о входных и выходных данных.

Овал означает начало или окончание вычислительного процесса.Блок сравнения, в отличие от остальных, имеет 2 выхода – “да” и “нет”.

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

Наиболее часто употребляемые символы схем алгоритмов

3

Пуск (начало), останов (конец)

Вычислительные действия, приводящие к изменению значения данных (процесс)

Ввод, вывод

Проверка условия (принятие решения)

Подготовительные операции (задание массива, начало цикла), модификация

Печать на бумаге

Вычисления по подпрограмме или стандартной программе (предопределенный процесс

Соединитель на одной странице

Переход на часть схемы, расположенную на другой странице (межстраничный соединитель)

Ручная операция

Дисплей

Page 4: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

1.3. Линейные алгоритмыЛинейным называется алгоритм, выполнение шагов которого происходит

последовательно в порядке возрастания их номеров. В схеме он изображается последовательностью вычислительных блоков и блоков ввода-вывода.

Общий вид линейного участка:

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

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

Общая структура ветвления:

4

Комментарий

- ввод

вычисления

вывод

-продолжение вычислений

Условие

Вар «да» Вар. «нет»

да ет

Page 5: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

1.5. Циклические алгоритмыАлгоритм циклической структуры – алгоритм, в котором предусмотрено

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

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

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

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

переход к началу цикла, если повторения не закончены.Пример. Вычислить сумму: S=12+22+32+…+n2=∑i2 ,

где n – заданное число.Предлагается следующий алгоритм решения задачи.Шаг 1. Ввести n.Шаг 2. Положить S=0 (обнуление ячейки суммы).Шаг 3. Положить i = 1.Шаг 4. Вычислить i2 и прибавит к текущему значению S: обозначение: S=S+i2 .Шаг 5. Увеличить i на 1; обозначение: i = i + 1.Шаг 6. Сравнить i с n; если i < n, вернуться к шагу 4, иначе перейти к шагу 7.Шаг 7. Вывести S.Шаг 8. Останов.

Основная повторяющаяся операция: S=S+i2 выполняется при различных значениях i. Величина i называется параметром цикла. В рассмотренном примере параметр цикла изменяется от начального значения i = 1 до конечного i = n с шагом 1.Варианты : 1) S=12+32+52+…

2) S=1*2*3*…*nЗадача. Задача табулирование функции. Требуется построить таблицу

значений функции y=f(x) на отрезке [a, b] с шагом h, т.е. вычислить значения функции в точках x=a, a+h, a+2h, … , b вывести их на печать.

Задача. Составить схему алгоритма вычисления 100 значений функции y=sin(ax)/x при xi=1,2,3,…,100. Очевидно, что для определения всех значений функции y необходимо 100 раз вычислять по этой формуле значения y и печатать их, изменяя каждый раз аргумент x на единицу. Цикл должен повторяться, пока x<100. Если х станет больше 100, то будет осуществлен выход из цикла, т.е. переход к следующему по порядку действию.

5

Page 6: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Пример алгоритма.

2. ОСНОВНЫЕ ПОНЯТИЯ ЯЗЫКА ПРОГРАММИРОВАНИЯ ПАСКАЛЬЛюбая программа, выполняемая на ЭВМ, обрабатывает данные с целью

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

6

Вкл.

Эта штука работает?

Кто-нибудь об этом знает?

Ты – самый несчастный человек на

свете!

Тысможешь свалить вину

на кого-нибудь другого?

Нет проблем!

Ты ее трогал?

Нетрогай

ее !

Ох, и зря ты это сделал!Никому не

говори!

Кто-нибудь из-за этого рас-сердился?

Забудь об этом!

да нет нет

нет

да

да

нет

нет

да

Конец

Page 7: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

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

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

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

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

простые переменные, массивы, последовательные файлы, множества, записи, записи с вариантами, указатели, а также развитые средства построения из них новых

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

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

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

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

Основная цель структурного программирования - создать программу с минимальными взаимосвязями между ее модулями. В ИДЕАЛЕ каждый модуль должен иметь один вход и один выход.

7

Page 8: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Опыт использования методов структурного программирования позволяет сделать следующие выводы:1) структурное программирование упрощает процесс создания сложных программ и способствует значительному уменьшению количества ошибок в них;2) использование модулей небольших размеров позволяет упростить и ускорить процессы их отладки;3) при использовании структурного программирования значительно сокращается трудоемкость разработки технической документации, т.е. в качестве документации на каждый модуль используется только описание его функций;4) структурное программирование является хорошей базой автоматизации разработки модульных программ.

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

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

2.2. Основные символы языкаАлфавит языка. Основными символами языка являются:- буквы A,B,C, .....,Z - заглавные,

- буквы a,b,c, .......,z - строчные- цифры 0,1,2, .......,9,- знаки + - * / = < > ( ) _ “пробел”,- спецсимволы [ ] { } . , : ; ‘ # $.Нет различий между заглавными и строчными буквами при их

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

использованы иначе как служебные (они зарезервированы):

8

Page 9: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

ABSOLUTE - адресAND - логическое умножениеARRAY - массивBEGIN - начатьCASE - в случае (выбор)CONST - константаCONSTRUCTOR - создать объектDIV - целочисленное делениеDO - делать (в цикле)DOWNTO - шаг в уменьшенииELSE - иначеEND - конецEXTERNAL - внешняя процедураFILE - описание файлаFOR - дляFORWARD - опережающее описаниеFUNCTION - функцияGOTO - идтиIF - еслиIMPLEMENTATION - правило выполнения модулейIN - вINLINE - включение в строкуINTERFACE - связь модулейINTERRUPT - прерываниеLABEL - меткаMOD - остаток от целочисленного деленияNIL - пустотаNOT - нетOBJECT - переменная типа “типа”OF - изOR - логическое сложениеPACKET - упакованныйPROCEDURE - процедураPROGRAM - программаRECORD - записьREPEAT - повторитьSET - множествоSTRING - строкаTHEN - тогдаTO - кTYPE - типUNIT - программный модульUNTIL - до тех пор, покаUSES - использоватьVAR- переменнаяVIRTUAL - внутренняя переменная

9

Page 10: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

WILE - покаWITH - сXOR - икс ор

2.3. Элементы языкаИдентификатор - начинается с буквы или “_” (символа подчеркивания) и

состоит из букв, цифр и “_”. Длина идентификатора ограничена длинной программной строки, т.е. 126 символами, но при этом компилятор различает только первые 63 символа. Большие и маленькие буквы не различаются.Пример. MYVAR три различных написания

myvar одной и той же MyVar переменной

Числа в Паскаль - программе - это константы целого или действительного типа. Целые константы представляются в десятичной или шестнадцатеричной системе счисления. Признаком шестнадцатеричной системы является предшествующий символ $. Целые константы должны принадлежать диапазону от -2147483648 до 2147483647.Пример. -1 константы

65535 целого типа1.234 константы-1.45Е+27 действительного0.9542Е-12 типа257Е0

Строки - последовательность символов, заключенных в апострофы (в одиночные кавычки). Максимальная длина строковой константы - 255 символов.Пример. ‘TURBO PASCAL 6.0’

‘язык программирования’Комментарий в Паскале - любой текст, ограниченный (*.........*) или

{........}. Вложенность компонентов допускается лишь двумя способами:(* ...... {........} ........*) или {......(*........*).......}

2.4. Интегрированная среда TURBO PASCALСистема программирования TURBO PASCAL представляет собой

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

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

2.5. Структура программы в TURBO PASCALProgram <название> - заголовок программыLabel - описание метокConst - описание константType - описание типовVar - описание переменных

10

Page 11: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Procedure - описание процедурFunction – описание функций

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

Раздел “описание” состоит из пяти секций.Описание меток. Переход по метке выполняется оператором GOTO. Все

метки должны быть описаны. Метки могут быть целочисленными от 0 до 9999 или идентификаторами. Каждая описанная метка должна появиться в программе.Пример. Label X1, Finish, 4444;

Описание констант. Общий вид:Const идентификатор = выражение (или число).

Пример.Const Limit = 256M = 25*16;K = M*Limit - 1Error = ‘Ошибка’; - символьная константа;Err1 = Error + ‘Повторите ввод’;

При построении выражений для определения значения констант можно использовать только ранее определенные константы, соединенные знаками операций, и следующие функции:ABS - абсолютная величинаCHR - символическая переменная типа порядковый номерHI - старший байт (хай)LENGTH - длина строковой переменнойLO - младший байтORD – порядковый номерPRED - предыдущее значениеPTR - указатель (пойнтер)ROUND - округлениеSIZEOF - размер переменнойSUCC - следующийSWAP - перестановка байтовTRUNC – отбрасывание дробной части числа

Предопределенные константы:FALSE - истинаTRUE - ложьMAXINT = 32767MAXLONGINT = 2147483647BOOLEAN - логическая переменнаяINTEGER - целоеLONGINT - длинное целое

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

11

Page 12: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Пример. Const L = 100;H = -L;

В данном примере сначала определяется идентификатор константы L, который затем используется при определении константы Н.

В качестве констант в языке Паскаль разрешается использовать целые и вещественные значения, а также строки.Пример. Const PI = 3,14;

STR = ‘-----’;LENGHT = 80;

2.6. Определение типовКонцепция типов является одной из основных в языке Паскаль. С каждым

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

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

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

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

Type идентификатор = тип;идентификатор = тип;

12

Page 13: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

Описание типов.Общий вид: Type идентификатор = тип;

Пример. TYPE NUMBER = INTEGER;INDEX = -1...99;VALUE = - 999...999;LIST = ARRAY [INDEX] OF VALUE;COLOR = (RED, GREEN, BLUE);EXT = REAL;

Описание переменных.Общий вид: Var - идентификатор, идентификатор: тип

Пример. VAR R1, R2, R3: INTEGER; V1, V2, X1: REAL; EGUAL: BOOLEAN; WORD1: CHAR;

2.7. Операторы в программеЛюбая программа на языке Паскаль начинается со слова PROGPAM и

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

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

VAR A, B, C, X1, X2: REALВ этой строке необходимо описать все переменные, которые затем будут

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

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

Файл - это набор данных. Это может быть:1) совокупность величин, взаимосвязанных по каким либо признакам, обозначенная одним именем и хранящаяся во внешней памяти ЭВМ как единое целое;2) хранящаяся в памяти ЭВМ программа решения конкретной задачи.

13

Page 14: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

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

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

2.7.2. Операторы вводаЧасто первыми действиями, выполняемыми программой, являются

действия по вводу данных. В языке Паскаль для этой цели служит процедура чтения READ, например, READ(A, B, C);

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

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

2.7.3. Оператор присваиванияОператор присваивания с помощью знака присваивания := разбивается на

2 части: левую и правую. В правой части записывается выражение, значение которого необходимо вычислить. После вычисления выражения оно присваивается переменной, стоящей в левой части.D : = SQR(B) - 4 * A * C;D=B*B-4AC;

В языке Паскаль обязательно указываются все знаки операций (* - знак умножения).

В языке Паскаль отсутствует операция возведения в степень, но для возведения в квадрат предусмотрена стандартная функция SQR.

/ - знак операции деления В операторах присвоения часто в левой и правой частях стоят одни и те

же идентификаторы, например: X := X + 1. Этот оператор имеет следующий смысл: необходимо взять текущее значение Х, изменить его в соответствии с действиями, указанными в правой части, и полученное значение взять в качестве нового текущего значения Х.

С помощью оператора присваивания можно задавать начальные значения переменным. Так, вместо процедуры READ(A, B, C);

И последующего ввода значений, 5, 3, 2 можно было бы записать три оператора присваивания:

14

Page 15: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

A := 5; B := 3; C := 2;Однако такая форма задания исходных данных для программы вряд ли

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

2.7.4. Оператор условного переходаКроме перечисленных операторов существуют еще условные операторы,

имеющие вид:IF условие THEN оператор1 ELSE оператор2

Каждый условный оператор осуществляет выбор одной из альтернатив. Этот выбор определяется значением условия, которое стоит после разделителя IF. Условие может принимать два значения: истина или ложь. Если значение условия истина, то выполняется оператор1, а вслед за ним оператор, стоящий за всем условным оператором. Если значение условия ложь, то выполняется оператор2, а вслед за ним оператор, стоящий за всем условным оператором. Таким образом, в результате выполнения условного оператора будет выбран и выполнен один из операторов, стоящих внутри условного оператора. В языке Паскаль разрешается использовать сокращенную форму условного оператора, имеющего вид:IF условие THEN оператор.

В этой форме условного оператора отсутствует часть ELSE. Соответственно модифицируется и правило его выполнения. Если значение условия есть истина, то выполняется оператор, стоящий внутри условного оператора. В противном случае весь условный оператор пропускается.Пример. Если Х = 1, сделать Х = 2; если Х = 2, сделать Х = 1.IF X = 1 THEN X := 2;IF X = 2 THEN X := 1;

Это неверно при Х=1. Правильное решение:IF X = 1 THEN X := 2 ELSE

IF X :=2 THEN X :=1;Процедура вывода WRITELN выдает на печать сообщения. Оно

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

чтобы обойти синтаксическое ограничение, имеется составной оператор, служащий средством группирования других операторов. Составной оператор - это один оператор. Поэтому, если после любого из разделителей THEN или ELSE по сути решения задачи требуется записать более одного оператора, то необходимо использовать составной оператор. Он начинается со слова BEGIN и заканчивается словом END. Между ними может располагаться любая последовательность операторов.

Для ввода и вывода данных предусмотрены процедуры:

15

Page 16: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

READREADLNWRITEWRITELN

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

Процедура READLN (А) считывает данные из одной строки и обеспечивает переход к началу следующей строки. Процедура READLN без параметров осуществляет переход к началу следующей строки.READLN(A, B, C, D); эквивалентноREAD(A); READ(B); READ(C); READ(D); READLN;

Для вывода данных используются процедуры WRITE и WRITELN. Различие между ними такое же, как между READ и READLN. WRITELN начинает сообщение с новой строки, а WRITE помещает в выходную запись сообщения друг за другом.Пример. X = 5, Y = 7. Вывести эти значения.WRITЕLN (X, Y);Получим: 57 (два значения без пробела между ними).WRITELN (‘X=‘,X, ‘Y=‘,Y); Получим: X=5Y=7 (тоже без пробела).

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

Существует еще одна возможность управлять выводом: после переменной через двоеточие указана ширина поля, которое отводится для представления числа.WRITELN(‘X=‘, X:4,’ Y=‘, Y:4); X= 5 Y= 7

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

WRITELN(X:7:3)Пример. Максимальное из трех чисел уменьшить на 0.3

IF Y > MAX THEN MAX:=YELSE IF Z>MAX THEN MAX:=Z;

MAX:=MAX-0.3Задача. Вычислить Y=X*X+1, если X<0

Y=X-2.1, если X>/2SINX, если 0<=X=</2

Задание. Найти ошибки, если они есть:а) IF A<B THEN A:=б) IF X>0 THEN S:=в) IF K<>M THEN K:=M;

16

Page 17: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

г) IF 5 then S:=S+5;Пример. Какие значения будут иметь переменные А и В в результате выполнения фрагмента программы?IF A<B THEN A:= B

Дано: А=0.5, В = 1.7Ответ: А=0.5, В=0.5

Задача. Какая задача решается?IF X<Y THEN MAX:=Y ELSE MAX:=X;

Пример. Выполнить с помощью условного оператора: меньшее из двух чисел Х и Y заменить нулями, а в случае их равенства - заменить нулями оба.IF X=Y THEN BEGIN X:=0;

Y:=0;END

ELSE IF X < Y THEN X:=0 ELSE Y:=0;2.7.5. Пример простой программыРешить квадратное уравнение АХ*Х + ВХ + С = 0

Возможности:1) если А=0, В=0, С=0, то уравнение имеет бесконечное множество решений;2) если А=0, В=0, С<>0, то уравнение не имеет решений;3) если А=0, В<>0, С<>0, то уравнение имеет единственный корень Х=-С/В4) если А<>0, В<>0, С<>0, то решение уравнения зависит от дискриминанта D=B*B-4AC;4a) если D<0, то уравнение имеет комплексные корни;4б) если D=0, то уравнение имеет два одинаковых корня X=-B/2A;4в) если D>0, то уравнение имеет два корня X1 = (-B+D) / 2A;

X2=(-B-D)/2A PROGRAMM QUADRAVAR A,B,C,D,X1,X2: REAL;BEGINWRITE (‘ВВЕДИТЕ А, В, С’);READLN(A,B,C);IF (A=0) AND (B=0) AND (C=0) THEN WRITELN (‘Уравнение имеет беск. множество решений’) ELSE IF (A=0) AND (B=0) AND (C<>0)

THEN WRITELN (‘Уравнение не имеет решений’)ELSE IF (A=0) AND (B<>0) AND (C<>0)

THEN WRITELN (‘Корень Х = ’ -C/B) ELSE IF D<0 THEN

WRITELN (‘Комплексные корни’)ELSE WRITELN (‘Два равных корня Х=’, -В/2А)

ELSE BEGIN D:=SWRT(B*B-4*A*C); X1:=(-B+SQRT(D))/(2*A); X2:=(-B-SQRT(D))/(2*A); WRITELN(‘Корни уравнения: X1=‘,X1,’ X2=‘,X2)

17

Page 18: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

END;END.

2.7.6. Оперетор безусловного переходаОбычно операторы программы на языке Паскаль выполняются в том

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

Goto метка;В качестве меток в языке Паскаль разрешается использовать целые числа

из диапазона 0…9999 или идентификаторами. Метка может предшествовать любому оператору и отделяться от него двоеточиемПример:………….Goto 99;……………99:writeln(‘выполнен оператор’);…………….

Все метки, прежде чем они используются в программе, должны быть описаны в разделе описания меток. Напомним еще раз одно из основных правил языка программирования Паскаль: все объекты, используемые в программе, должны быть описаны. Метки в этом смысле не представляют собой исключения. Раздел описания меток начинается со слова LABEL, за которым через запятую перечисляются используемые в программе метки, например: LABEL 5, 99, 100, start, error;

Вопрос об использовании (точнее говоря, о неиспользовании)оператора перехода многократно обсуждался. Ясно, что бессистемное использование оператора перехода вредно, поскольку программа становится малопонятной и, что еще важнее, статический текст программы не отражает динамики ее выполнения. Общая рекомендация по использованию операторов перехода заключается в следующем: их следует использовать в каких-то необычных ситуациях, когда без них трудно обойтись. Чаще всего это возникает при различных нетипичных завершениях циклов. Во всяком случае, их следует стараться избегать.Пример. Пусть производится последовательное чтение и суммирование какого-то ряда положительных чисел, причем их количество неизвестно. Концом последовательности служит первое же отрицательное число.Program summa;Label 99;Var number,sigma: real;Begin

Sigma:=0;While sigma>=0 do

Begin

18

Page 19: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Read(number);If number <0 them goto 99;Sigma:=sigma+number;

End;99: write(‘summa chisel=’,sigma);

end.В данной программе с помощью заголовка цикла While sigma>=0 do

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

2.8. Организация цикловБольшинство задач, решаемых на ЭВМ, невозможно представить в виде

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

2.8.1. Использование операторов условного и безусловного перехода

1) Искусственно вводим счетчик числа шагов цикла2) Проверяем условие окончания циклических расчетов3) Если надо продолжить, увеличиваем значение счетчикаЗадача. Вычислить таблицу квадратов и корней целых чисел от 1 до 100.Здесь счетчиком чисел может служить само число. Дадим ему имя N.Использовать операторы условного перехода в программе крайне не желательно!

2.8.2. Цикл с параметромЕсли число повторений цикла известно, используется цикл FOR, для

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

Общий вид оператора цикла с параметром:А) Если начальное значение параметра меньше конечного, то используется форма вида:FOR I: = M TO N DO оператор;Б) Если начальное значение параметра цикла больше конечного, то используется форма вида:FOR I: = N DOWNTO M DO оператор;

M и N- выражения задающие начальное и конечное значения параметра I,

А - простой или составной оператор.Если после слова DO необходимо записать несколько операторов, то

следует воспользоваться составным оператором BEGIN оператор1; оператор2; оператор3END;

Параметр цикла не может быть вещественным(действительным), а только целым или другим типом, который можно пронумеровать и сосчитать. Шаг всегда равен 1 или –1. Задать другой шаг нельзя!

19

Page 20: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Пример(тот же).For n :=1 to 100 do

Writeln(‘n=’,n,’sqr(n)=’,sqr(n),’sqrt(n)=’,sqrt(n));С помощью этого цикла процедура WRITELN будет последовательно

выполняться для следующих значений переменной N: 1,2,…,100.Для циклов FOR нет необходимости следить за их завершаемостью.

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

Ограничения.1) Значения параметра цикла, начального и конечного значений параметра цикла

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

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

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

2.8.3. Цикл с предусловием - цикл WHILEПример. Составить таблицу квадратов и квадратных корней для чисел от 1 до 100.N:=1 ;While n<=100 do

BeginWriteln (‘n=’,n,’sqr(n)’,sqr(n),’sqrt(n)’,sqrt(n));N: =N+1

End;В общем случае данный оператор цикла записывается так:While условие DO оператор;Правило его выполнения следующее: оператор выполняется до тех пор,

пока остается истинным условие цикла. Как только значение условия становится ложным, цикл прекращает выполняться. Если значение условия ложно перед первым выполнением цикла, то он не выполняется ни разу. Обратите внимание на то, что после слова DО может стоять только один оператор, поэтому чаще всего после слова DO стоит составной оператор.

Приведенный в примере оператор WHILE работает так. Первоначальное значение переменной NUMBER равно 1. Оно задается оператором присваивания. Затем проверяется условие, которое в данном случае имеет вид: N<=100. Знак <= означает “ меньше или равно”. Естественно, что условие 1<= 100 истинно, поэтому выполняется оператор стоящий после слова DO. Этот оператор называется телом цикла. Он вычисляет и выдает на печать значения квадрата и квадратного корня числа 1, а также увеличивает значение переменной на единицу. Теперь ее значение равно двум, условие цикла

20

Page 21: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

остается истинным, и цикл выполняется еще раз. Последний раз цикл будет выполняться для значения n=100. Условие 100<=100 истинно, и цикл выполняется. Внутри цикла происходит очередное увеличение переменной N на 1, и ее значение становится равным 101. Очередная проверка условия цикла дает значение условия ложное, и выполнение цикла прекратится. Таким образом, данный цикл выдает значения квадратов и квадратных корней для чисел от 1 до 100 включительно.

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

2.8.4. Цикл с постусловием - цикл repeatОн имеет вид:REPEAT оператор1;

оператор2;оператор3;……………оператор n

UNTIL условие;В отличие от цикла предусловием, выход из цикла постусловием

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

Заметим, что если в операторе WHILE условие проверяется до очередного выполнения цикла, то в операторе REPEAT - после очередного выполнения.

Таким образом, оператор REPEAT - оператор с постусловием) всегда выполняется, по крайней мере, 1 раз, в то время как оператор WHILE(оператор с постусловием) может не выполняться ни разу.

Еще одна особенность цикла REPEAT - в нем разрешается использовать произвольное число операторов.Пример (тот же).Repeat

Writeln (‘n=’,n,’sqr(n)’,sqr(n),’sqrt(n)’,sqrt(n));N: =N+1

Until n>100;Когда переменная NUMBER принимает последовательно значения 1,2,

…,100, значение условия N>100 остается ложным и для них цикл выполняется (UNTIL- до тех пор, пока не). Как только переменная NUMBER принимает значение 101, то условие N>100 становится истинным (101>100) и выполнение цикла прекращается.

Заметьте, что при использовании как цикла WHILE, так и цикла REPEAT.Необходимо принудительно увеличить значение переменной N. Если

этого не делать, то цикл никогда не завершится, т.к. переменная N так и остается равным единице. Условие N<=100 никогда не станет ложным, а условие N>100 никогда не станет истинным. В результате оба цикла будут выполняться бесконечно долго. В этом случае говорят, что программа

21

Page 22: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

зацикливается. Оба этих цикла применяются, когда число повторений неизвестно(хотя это число можно сосчитать).Пример. Лист бумаги разрезан пополам. Одну из полученных половинок снова делят пополам и т.д. Сколько понадобится делений, чтобы получить частицы размером с атом? Масса листа 1 грамм(М), масса атома 1Е-24 грамма.Решение:Program List;Var m: real;I: integer;Begin

I:=1;m:=1;While m>1E-24 do

BeginM:=m/2;I:=I+1;

End;Writeln(‘I=’,I,’ делений’);Writeln;End.

2.9. Оператор выбора вариантаУсловный оператор позволяет при выполнении программы выбирать

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

Пусть перед нами стоит следующая задача.Пример. Числами от 1 до 7 пронумерованы дни недели от понедельника до воскресенья. Необходимо преобразовать числовое значение соответствующего дня недели в его название и вывести на печать.Задача легко решается с использованием последовательности условных операторов:If day =1 then writeln(‘понедельник’) else

If day =2 then writeln(‘вторник’) else ………….………….If day =7 then writeln(‘воскресенье’);

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

1: writeln(‘понедельник’);2: writeln (‘вторник’) ;3: ………………….……………………..

22

Page 23: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

7: writeln(‘воскр.’);else writeln(‘ошибка….’);

end;Если переменная day принимает значение 1, то выполняется оператор,

перед которым стоит 1:. Если day равно 2, то выполняется оператор, перед которым стоит 2: и т.д. Если же переменная принимает значение вне диапазона1…7, скажем 0 или 8, то выполняется следующий оператор.Общий вид оператора выбора варианта:Case селектор of

метка1:оператор1;…………………….метка n: оператор N;

End; {of case}

Другой вид оператора выбора:Case селектор of

Метка1:оператор1;………………………….Метка n: оператор N;

Else оператор M;End; {of case}

2.10. Расположение операторов в программеТекст любой программы можно записать многими разными способами.

Пример. Определить длину стороны треугольника по двум другим и углу между ними.Первый вариант.program length;Var side1,side2,side3,angle: real;Begin

Read(side1,side2,side3,angle);Side3 :=sqrt(sqr(side1)+sqr(side2)-2*side1*side2*cos(angle));Write (‘third side=’,side3)

End.Второй вариант. Все то же записано в строчку: Var side1,side2,side3,angle: real; Begin Read(side1,side2,side3,angle); Side3 :=sqrt(sqr(side1)+sqr(side2)-2*side1*side2*cos(angle)); Write (‘third side=’,side3) End.

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

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

Правила форматирования1. Составной операторBEGIN здесь S1, S2,…,Sn - операторы

23

Page 24: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

S1;S2;….Sn

End; 2. Условный операторif B

then S1else S2; В- логическое выражение(условие); S1,S2- операторы

Если S1,S2 - составные операторы, то надо использовать такое расположение:If B

ThenS1

ElseS2;

3. Операторы циклаwhile B DO

beginS1;S2;….Sn;

End;Если один из операторов S1 есть снова оператор цикла WHILE, то рекомендуется расположение:While B DO

BeginS1;S2;While B1 DO

BeginS3;S4;

End;S5End;

Оператор REPEAT располагается так:Repeat

S1;S2;….Sn;

Until B;Оператор FOR располагается следующим образом:For i:=A1 to A2 DO A1,A2- выражения

S1;

24

Page 25: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

4. Оператор выбораCASE C OF

A1: S1;A2: S2;……..An: Sn;

End;5. Оператор WITH

with k DOS1; k - идентификатор поля

6. Служебные (зарезервированные) слова PROGRAM, LABEL, CONST, TYPE, VAR, PROCEDURE ,FUNCTION записываются в самой левой позиции. При использовании вложенных процедур и функций соответствующие им слова PROCEDURE, FUNCTION записываются правее. Соответственно сдвигаются вправо и тела вложенных процедур и функций. Итак, при написании программ вложенную конструкцию рекомендуется располагать правее на 3-5 позиций объемлющей ее конструкции.

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

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

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

2.11. Концепция типов данныхЯзык должен способствовать повышению надежности программ.

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

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

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

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

25

Page 26: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

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

3. СТАНДАРТНЫЕ ПРОСТЫЕ ТИПЫ

3.1 Целый типЦелый тип Диапазон значений Размер памятиShortint (короткое целое) -128..127 1 байтInteger (целое) -32 768..32 767 2 байтаLongint (длинное целое) -2147483648..2147483 647 4 байтаByte (байт) 0..255 (беззнаковый тип) 1 байт

Типы данных

Скалярные Структурированные

Стандартные

Действит. (веществ.)

Целый

Символьный

Логический

Нестандартные(переменные)

Перечислимый

Ограниченный (интервальный, диапазон)

Нерегулярные

Запись

Множество

Файл

Статические Динамические

Указатели

Регулярные

Массивы

Строки

26

Page 27: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Word (слово) 0..65536 (беззнаковый тип) 2 байтаДанные целого типа используются в тех случаях, когда какую-то

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

Константа целого типа – это десятичное число , записанное без точки. Если константа отрицательная, то перед ней должен стоять знак «-» а если положительная ,то знак «+» можно не указывать.Const k=15;

null=0;p1=-46;

Описание переменной имеет тип integer.A: integer;Summa: integer;B1, B2, B3: integer;

В разделе операторов указанные переменные должны принимать значения целых десятичных типов:A: = 25;Summa: = 0;

3.1.1. Операции над данными целого типа:+ сложение (результат – целое число) — вычитание(——«——«——-«—-—) * умножение (——«——«——«——)Div – деление с отбрасыванием дробной части (получение целого

частного при делении целого данного на целое).Mod – получение целого остатка при делении целого данного на целое.

Пример. Program delen;Var A,B,Y,Z: Integer;Begin

Writeln(‘вв A,B’);Readln(A,B);Y: = A Div B;Z: = A Mod B;Writeln( Y:3, Z:3);

End.Переполнение при выполнении арифметических операций не

обнаруживается!!!Формат: Write(A:4)Пример. A = 25;B = 5;C = -3;A+5 = 30;B Mod A = 5;13-A = -20;A Mod C = 1;

C*15 = -45;A Mod C = -8;A Div 7 = 3;25 Div -3 = 8;A Mod 7 = 4;-25 Mod –3 = -1

27

Page 28: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

С аргументами целого типа могут использоваться следующие стандартные функции:Имя функции Математическое

обозначениеТип результата

Sin (x) Sin x RealCos(x) Cos x RealLn(x) Ln x RealSqrt(x) RealArctan(x) Arctg x RealExp(x) ex RealSqr(x) x2 IntegerAbs(x) |x| IntegerOdd(x) False, x=2n

True, x=2n+1Boolean

Succ(x) x + 1 IntegerPread(x) x - 1 IntegerInc(x) x + 1 IntegerInc(x,n) x + n IntegerDec(x) x - 1 IntegerDec(x,n) x - n Integer

3.2. Действительный типДанные действительного (вещественного) типа используются

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

плавающей точкой: 127.3 25.0 -16.0034Е-5 0.62Е+4 -10.8Е12 -20Е-3

0.52Е+3 = 5.2Е+2 = 52Е+1 = 520Е = 5200Е-1В разделе описания констант:Const L = -1/602E-19;

NA=6.022E23;PI=3.14;Summa=-5.6;

Описание переменной имеет тип Real:Var U, I, R: Real;

Z1:Real;В разделе операторов: Z1:=-0.03E14;

Scorost:=12.6; I:=5;

Здесь целое число 5 автоматически преобразуется к действительному типу 5.0 для присвоения переменной I.

3.2.1. Операции над данными действительного типа:+ — * /Результат - тоже действительное число.

28

Page 29: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Если в операции ,кроме данных вещественного типа, участвуют и данные целого типа, результат все равно будет вещественный. Степень представляется так: Aх exp(x*LN(A)) приA>0

Формат: Write(x:m:n), где: m - общее поле, n - поле дробной части.В арифметических выражениях принят следующий приоритет операций:

1)Вычисление функции.2) * , / , Div , Mod.3) + , — .Пример.25 Mod 3*4=425 Div 3*4=32

5*5 Div 3*4=325+5 Mod 3-4=3

Вещественные типыREAL - действительный (вещественный) тип. Абсолютная величина для этого типа изменяется в диапазоне 2.9Е - 39..1.7Е+38, имеет мантиссу с 11 десятичными цифрами. Занимает в памяти 6 байтов.SINGL - простой точности, 4 байта.DOUBLE - двойной точности, 8 байт.EXTENDED - расширенной точности, 10 байт.При переполнении вещественного типа происходит программное прерывание.С аргументами вещественного типа могут не пользоваться следующие стандартные функции:Sin(x), Cos(x) ,Ln(x), Sqrt(x), Arctan(x), Exp(x), Sqr(x), Abs(x). Все они вырабатывают результат вещественного типа.Определены также стандарты функции преобразования значения вещественного типа в значение целого типа:TRUNC (X) - вырабатывает результат путем отбрасывания дробной части аргумента;ROUND (X) - вырабатывает целый результат путем округления до ближайшего целого.Пример.x=21.53 trunc (x)=21 round (x)=22x=-27— trunc (x)=-2 round (x)=-3

3.3. Логический типBoolean - логический тип имеет 2 значения: false и true, занимают 1 байт

памяти.Над булевскими переменными определены 3 логические операции:

AND - конъюнкция (логическое умножение),OR - дизъюнкция (логическое сложение),NOT - отрицание.FALSE<TRUE , поэтому применимы операции отношения.

Значения FALSE и TRUE можно рассматривать как упорядоченное множество, состоящее из двух элементов.Ord (false)=0 {номер)Succ (false)=true {следующий)Ord (true)=1 {номер)

29

Page 30: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Pred (true)=false {предыдущий)Логический тип (тип boolean) определяет диапазон логических значений, который содержит 2 элемента: TRUE (истина) и FALSE (ложь).Type Boolean = (False, True);Логические переменные описываются в разделе описания переменных так:Var P, Q, R : Boolean;Логические переменные могут принимать только 2 значения:True и False.

3.3.1. Алгебра логики в ПаскалеНад аргументами логического типа определены следующие операции:

NOT (Не) - отрицаниеAND (и) - конъюнкция (логическое умножение)OR (или) - дизъюнкция (логическое сложение)XOR (икс ор) - исключающее илиP Q Not P P And Q P Or Q P Xor QFalse False True False False FalseTrue False False False True TrueFalse True True False True TrueTrue True False True True False

Все операции сравнения дают результат типа Boolean.= , < >, < , < = , > , > =.Например, в результате выполнения оператора P: = X<= 5;логическая переменная Р получит значение True, если текущее значение переменной Х меньше или равно 5. При Х>5 P = False.В языке Паскаль принято следующее старшинство операций:1) Not2) And3) Or, Xor + -4) Операции сравнения , что это значит?Not P = Q (Not P) = QP < = Q And R P < = (Q And R)P Or Q And R P Or (Q And Q)Для задания явного порядка - круглые скобки:(A - B) AND (C< = D)

3.3.2. Законы алгебры логики в Паскале1) Закон коммутативности (переместительный)P Or Q = Q Or PP And Q = Q And P2) Закон ассоциативности (сочетательный)(P Or Q) Or R = P Or (Q Or R)(P And Q) And R = P And (Q And R)3) Закон дистрибутивности (распределительный)(P And Q) Or R = (P Or R) And (Q Or R)(P Or Q) And R = (P And R) Or (Q And R)4) Закон де Моргана

30

Page 31: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Not (P Or Q) = (Not P) And (Not Q)Not (P And Q) = (Not P) Or (Not Q)Правила отрицания:Not (Not P) = PNot (A = B) = A <>BNot (A <= B) = A > BNot (A< B) = A > = B и.т.д.Пример.Not ((A < = B) And (c = D)) = (A > B) Or (C < > D)

Обратим внимание на следующий факт. Логический тип в языке Паскаль задается как перечисляемый тип, содержащий лишь 2 стандартных идентификатора: True и False. Элементы перечисляемого типа упорядочены. Поэтому оказывается, что False меньше, чем True. Этим можно воспользоваться:For P:=False To True Do S;S - оператор, он будет выполняться сначала для значения Р, равного False, а затем для значения True. Если надо наоборот, то:For P:= True Downto False Do S;Пример.Написать программу для составления таблицы истинности для логической функции F = P And Not (Q Or R) And T. Для каждого из значений логических переменных P, Q, R, T необходимо вычислить и напечатать значение функции F.Program logic;Var P,Q,R,T,F:Boolean;Begin

For P:=False To True DoFor Q:=False To True Do

For R:=False To True DoFor T:=False To True Do

BeginF:=P And Not (Q Or T) And TWrite(‘P=’,P,’Q=’,Q,’R=’,R,’T=’,T);Write(‘F=’,F);writeln;

End;End.

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

В языке Паскаль нельзя записать двухстороннее неравенство 1< X <2. Вместо этого надо воспользоваться логическим выражением: (X>1) And (X<2).

Нельзя записать X = Y = Z, а надо: (X = Y) And (X = Z).Если надо записать, что Х не лежит в диапазоне от - 2 до +2, то:

Not ((X>-2) And (X>=2)) или (X<=-2) Or (X>=2)

31

Page 32: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Стандартные идентификаторы True и False можно использовать в качестве логических констант. Равноправные операторы.If P Then S; If P=True Then S;Функция Odd(x) = True при X=2n-1, n=1,2,3,...

False при X=2n3.4. Символьный тип

Символьная константа - это символ , заключенный в апострофы (чтобы представить апостроф , его повторяют дважды).‘A’, ‘R’,’+, ‘7’В описании констант:Const Sim = ‘A’;

A = ‘A’;S = ‘+’;D1 = ‘;’;

Символьная переменная принимает значение одного символа. Она описывается в разделе переменных как CHAR.Var Bukwa: Char;

B1, B2, R: Char;В операторе присваивания:Bukwa : = ‘+’;R: = Bukwa;

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

Ввод символьных данных имеет особенности: символьные данные вводят сплошной строкой, без пробелов, т.к. пробел - это тоже символ!!!Var S1, S2, S : Char;

Read (S1 , S2 , S3 )- - - - - - - - - - - - - - - ABC —> S1 = ‘A’ , S2 = ‘B’ , S3 = ‘C’A_B_C_ —> S1 = ‘A’ , S2 = _ , S3 = ‘B’

Формат: X : M‘_’ : 7 - вывод семи пробелов.Результатом операции сравнения является логическая константа True или False. ‘A’<’B’Встроенные функции:Ord(x) - определяет порядковый номер символа Х, например, ORD(‘R’) = 82.Chr(x) - определяет символ, стоящий по порядковому номеру Х, например, CHR(68)= ‘D’.Эти две функции носят название функций преобразования.Очевидно , что Chr(Ord(S)) = S; Ord(chr(68)) = 68.Если С1 и С2 - переменные символьного типа, то С1<С2 , если Ord(C1) < Ord(C2)Pred(x) - дает предыдущий символ но относительно к Х, например,. Pred(‘N’) = ‘M’.

32

Page 33: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Succ(x) - определяет следующий за Х символ, например,. Succ(‘R’) = ‘S’, Succ(‘9’) = ‘:’Справедливы равенства:Ord (false) = 0 Ord (True) = 1Succ (False) =True Pred (True) = False

3.4.1. Символьные строковые константыСимвольные строки - последовательность любого, в том числе и равного

нулю количества символов, заключенных в апострофы. Символы - из набора ASCII.‘Номер’ , ‘Summa’ , ‘_ _ ‘ , ‘A+B’‘Д’’АРТАНЬЯН’ - внутри апостроф - двойнойConst C1 = ‘ ‘;

C2 = ‘РЕЗУЛЬТАТ’;К строкам применимы операции отношения. Результат: True или False,

сравнение происходит посимвольно слева направо .‘ABC’>=’ACB’результат False , т.к. ‘B’<’C’

Переменной нельзя присвоить значение строки!!! Ограничение - максимальный размер строки, воспринимаемый компилятором, - не более 126 символов. Строка, состоящая из одного символа, называется символьной константой. Если между апострофами нет ни одного символа, то такая строка называется пустой (см. далее раздел «Регулярные типы»).

Для включения в строку символов, не имеющих физического изображения, используется их ASCII-код с символом # перед ним, например, A = ‘#31’ - это - управляющий символ.Задания1. Можно ли выполнить / (деление) над переменными целого типа?2. Определить:Odd(15) Odd(26) Succ(137) Pred(26)3. Найти ошибки в записи вещественных чисел. 4. .0Е – 2 - 71 - 6.1 0.1Е – 5 А56 2.15. Вычислить:Trunc(5.61) Round(17.16) Round(- 17.16)6. Что не правильно?Odd(17.1) Cos(32.1) Cos(5) Sin(0.2) Succ(3.2) Pred(7)7. Найти:Ord(chr(49)) = 49 Chr(ord(‘+’)) = +Pred(‘B’) = ‘A’ Succ(‘B’) = ‘C’8. Вычислить при A = 2, B = 3, C = 4, M = 5, X = 6, E = Trueа) (A+B)/C*M = (2+3)/4*5 = б) 2+X*X/(X+(A+B)/5) = 2+6*6/(6+(2+3)/5) = 2+36/7 = в) (A<B) and (X+A-<B) or (C<M) or E = 9. Записать:а) A не принадлежит отрезку [0;3]б) A принадлежит отрезку [- 2,0]в) A принадлежит промежуткам [- 5,- 4] или [0,2) или (3.2,7]

33

Page 34: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

4. НЕСТАНДАРТНЫЕ ПРОСТЫЕ ТИПЫ (ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ)

Мы установили, что тип данных задает набор значений, которые могут принимать данные. Например,. данные целого типа могут принимать значения целых чисел. от -32768 до 32767, данные логического типа - значения True и False. Задание типа данных устанавливает и ограниченный набор операций, которые могут выполняться над этими данными. Например, над данными вещественного типа можно выполнять операции +, - , * , / , но нельзя производить операции Div и Mod, которые предназначены для данных целого типа.

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

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

арифметической величины, а как указатель некоторого элемента сравнительно небольшого множества. В таких случаях в описании программы обычно приводится список всех возможных значений вместе с указанием предполагаемой интерпретацией каждого значения. Такую величину можно рассматривать как элемент специального типа, который в языке Паскаль называется перечисляемым типом данных. Перечисляемый тип определяется как упорядоченный набор идентификаторов, заданный путем их перечисления.Пример. Type Colour = (Red , Orange , Green) ;

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

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

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

Описание перечисляемого типа имеет вид:Type Имя типа = (Список констант);

34

Page 35: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Var : Имя переменной: имя типа;Здесь под константой понимается особый вид констант - констант,

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

В общем виде:Type T = (A1, A2,...,An);Пример. Type Year = (Winter , Spring , Summer , Autumn);

Var A:Year;Здесь Year - имя перечисляемого типа:Зима, Весна, Лето, Осень - константы;A - переменная, которая может принимать значение любой из констант.

Объект, указанный в списке ,может присутствовать только в одном описании.Пример. Type T1 = (One , two , three);

T2 = (Tree , four , five);Эти два задания типов несовместимы.

Имена объектов, указанных в описании перечисленного типа, являются константами этого типа. В языке Паскаль допускается указывать константы перечислимого типа непосредственно в разделе переменных без использования раздела Type.Пример. Var A: (Winter , Sprihg , Summer , Autumn);

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

типа.Пример .Type Name =(Jon , Tom , Nick) ;

Color =(Red , Blue , Black);Var X , Y , Z : Name ;

C1 , C2 : Color ;Каждая из констант имеет порядковый номер, счет начинается с нуля. Упорядоченность констант позволяет применять к ним операции отношения (сравнения): < ,<= ,= , <>, >, >=. Результат операции будет логического типа (Type , False). Winter < Spring < Summer < Autumn (Зима < Весна< Лето< Осень)Свойства перечисляемого типа:1) Ai <> Aj, если i ><j (различимость).2) Ai < Aj, если i < j (упорядоченность).3) Значениями типа Т могут быть только А1, А2, ... Аn.Упорядоченность определяется той последовательностью, в которой перечислены константные идентификаторы. Наличие упорядоченности позволяет применить стандартные функции:Ord (x) - нахождение порядкового номера, Pred (x) - нахождение предыдущего элемента,Succ (x) - нахождение последующего элемента.Succ (Ai) = Ai +1 для i= 1,2,...n-1 - последующий член .Pred (Ai) = Ai- 1 для i = 1,2,3...n - предыдущий член .

35

Page 36: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Ord (Ai) = i -1 - функция определения порядкового номера Аi. Нумерация условно начинается с нуля.Пример.Имеется перечень зверей: лиса, волк, заяц, зубр, тигр, лев, медведь, косуля, олень, барс. Определить порядковый номер тигра (N1) и порядковый № зверя после косули (N2)Program Zver;Type Zver = (lisa,volk,zaiac,zubr,tigr,lev,medved,kosulia,olen,bars);Var P1,P2: Zver;

N1,N2 : Integer;Begin

P1 : = tigr;P2 : = Succ (kosulia);N1 : = Ord(P1)+1;N2 : = Ord(P2)+1;Writeln (‘N1 = ‘, N1:2);writeln (‘N2 = ‘, N2 : 2);

End.Так как счет перечислимых начинается с нуля, а не с единицы, для вычисления порядкового номера необходимо прибавить единицу.Пример. Некто по средам и пятницам учится, в остальные будние дни работает. Составить программу, распечатывающую эти занятия последовательно по дням недели.Program Den;Type Week = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);Var Day: Week;BeginFor Day : = Monday To Sunday Do

If (Day : = (Wednesday) Or (Day = Friday)Then Writeln (‘Study’)Else If (Day : = (Saturday) Or (Day = Sunday)

Then Writeln (‘Nothing’)else Writeln (‘Work’)

End.Результат будет такой: Work

WorkStudyWorkStudyNothingNothing

В языке P askal нельзя вводить и выводить данные перечислимого типа с помощью операторов Read и Write .

36

Page 37: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

4.2. Ограниченный тип (диапазон, интервал)Множество значений простых типов упорядоченно и конечно

(разумеется, кроме вещественного типа). Если программисту необходимо сузить диапазон значений, принимаемых некоторым объектом скалярного типа, то он осуществляет это в явном виде наложением ограничения на стандартный или определенный ранее перечислимый тип, который в этом случае называется базовым. Если какая-то переменная принимает не все значения своего типа, а только значения, содержащиеся в некотором ограниченном диапазоне, то ее можно рассматривать как переменную ограниченного типа (иногда говорят интервальный тип или тип диапазон).Пример.Type Day = (Mo , Tu , We , Th , Fr , Sa , Su);

Mom = 10...25 Sss = ` C`...`X`; Wd = SA...SU;

Для ограниченного типа Mom базовым является целый тип, для SSS - символьный, для Wd - определённый ранее перечислимый тип Day.

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

Таким образом,. введение ограниченных типов перекладывает проверку допустимости значений с программиста на компилятор.Пусть, например, в разделе описания указан перечислимый тип Год:Type Year = ( Jan, Febr, Mart, Apr, May, Jun, Jul, Aug, Sent, Okt, Nov, Dec);А нам предстоит решать задачи, связанные только с весенним временем года. Тогда можно ввести ограниченный тип: Spring Sum = Маy .. Aug; который является частью перечислимого типа.

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

Общий вид описания ограниченного типа:Type имя типа = константа 1 .. константа N;Общий вид описания переменных ограниченного типа:Var имя переменной: имя типа;Пример.Type T = 1... 100;Var A, B: T;

Переменные А и В могут принимать любые значения из диапазона 1..100.При использовании ограниченного типа должно выполняться следующее

Правила:1) обе граничные константы должны быть одинакового типа;

2) начальное значение не должно быть больше конечного;3) тип констант может быть любой простой, кроме действительного (целый, символьный, логический, перечислимый).

Пример. К= 15 ... 70; - целыйLit = ‘A’ ... ‘ z’ ; - символьныйSummer = Jun ... Aug ; - переменный

37

Page 38: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Если константы имеют стандартный типа можно делать непосредственно в разделе переменных.Пример. Var S1, S2: 1..100;

Sim : ‘A’..’R’;Тип констант называется базовым. Над переменными ограниченного типа

разрешается выполнять все операции, которые допустимы для данных его базового типа. Пример. Если переменная К принимает только целые значения 4,5,6,7,8,9, то лучше дать описание: Var K: 4..9; чем Var K: Integer; И вот почему. В случае выхода ‘K’ за диапазон 4..9 в первом варианте (ограниченный тип) будет выдано диагностическое сообщение об ошибке. Во втором варианте (целый тип) может быть выдан неверный результат.

Целый тип описания переменных рекомендуется использовать только тогда , когда диапазон значения переменной либо заранее неизвестен, либо занимает весь допустимый в языке Паскаль диапазон для целого типа.Пример. Вычислить W = a ln |x| при |x| <1

W = при |x| >=1Program usl;Var A,X,W : Real;Label : Error;Begin

Writeln (‘ввести данные’);Write (‘A=’);Readln (A);Write (‘X=’);Readln (X);If Abs (X) <1 Then Writeln (‘W=’, A*ln (Abs(X)))

Else If Sqr (X) >A Then begin Writeln (‘ошибка’); goto Error

End.Else Writeln (‘W=’, Sqrt (A-Sqrt(X)));

Error: End.Пример. Составить программу для вывода возможных значений координат X и Y в зависимости от № квадранта.Program Kvadrant;Var Number : Integer;Begin

Writeln (‘N=’);Readln (Number);Case Number of

1: Writeln (‘X и Y >0/’)2: Writeln (‘X < 0/ , Y > 0/’);3: Writeln (‘X и Y <0/’);4: Writeln (‘X >0/ , Y <0/’);

End;End.

38

Page 39: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Пример. Вывод первых дести натуральных чисел в возрастающем порядке.Program Num 10;Const KN = 10;Var N:Integer;Begin

For N:=1 To KN DoWrite (N:6);Writeln;

End.

Program Num 10;Const KN = 10;Var N:Integer;Begin

N:=0;Rеpeat

N:=N+1;Write (N);

Until N>=KN;End.

39

Page 40: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Пример. Определить к, при котором функция становится меньше или равна а.

Program Inter;Var X,A,P:Real;K: Integer;Begin

Writeln (‘ввести X,A’);Read (X,A);K:=1;P:=X;Write P/K >A DoBegin

K: = K+1;P: = P*X;

End;Writeln (‘K = ‘, K);End.

Program Inter;Var X,A,P : Real;K: Integer;Begin

Writeln (‘Ввести X,A’);Readln (X,A);K: = 0;P: = 1;Repeat

K : = K+1;P : = P*X;

Until P/K <=A;Write(‘K = ‘,K);

End.Пример. Вычислить сумму бесконечного ряда с точностью до члена ряда,

меньшего Е: Z = 1+

Рекуррентная формула Yn = Y n-1 * X / nProgram Ryad;Var X, Eps,Y,Z:Real;N:Integer;Begin

Writeln (‘Ввести X, Eps’);Readln (‘X, Eps’);N: = 0’Y: = 1;Z: = 1;While Y > = Eps Do Begin

N: = N+1;

Page 41: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Y: = Y*X/N;Z: = Z+Y;

End;Write (‘Z = ‘Z);

End.

5. ПРОЦЕДУРЫ И ФУНКЦИИКак записывается текст песни? Припев даётся один раз. Если нужно

повторять его, то указывается одно слово – припев. Зачем же повторять несколько раз одно и тоже? Этот же принцип действует и в программировании. Если какая-нибудь часть программы многократно повторяется, то её оформляют отдельно от основной программы и называют подпрограммой. К ней обращаются при необходимости ее использования.

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

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

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

В языке программирования Паскаль есть два вида подпрограмм: Procedure – процедура и Function - функция.

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

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

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

Procedure имя (список формальных параметров);

Page 42: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Раздел описанийBeginРаздел операторовEnd;

Раздел описаний процедуры подобен разделу описаний программы и состоит из разделов меток, констант, типов, переменных, процедур и функций. Он может отсутствовать вообще. Раздел операторов заключён в операторные скобки Begin End;

Процедура может быть и без параметров, тогда в заголовке указывается только её имя. С помощью параметров осуществляется передача исходные данных в процедуру, а также передача результатов работы в вызвавшую её программу. Список формальных параметров может включать в себя:параметры – значенийпараметры - переменных (перед ними должно стоять слово VAR),параметры – процедуры (перед ними должно стоять служебное слово Procedure),параметры – функции (перед ними должно стоять служебное слово Function)Выполнение процедуры происходит при её вызове по имени:

Имя (фактические параметры).Между формальными и фактическими параметрами должно быть полное

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

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

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

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

Page 43: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Процедура может содержать несколько операторов и несколько результатов выполнения. Каждый результат обозначается своим именем. В основной программе после вызова процедуры мы можем использовать эти результаты, сохраняя те же имена или давая другие.Пример: Пусть в программе необходимо многократно вычислять площадь квадрата sк=а^2 и площадь прямоугольника sp=a*b при различных значениях сторон а и b.Procedure Place (x, y: real);BeginSk:=x*xSp:=x*yEnd;Вызвать эту процедуру можно, используя фактические переменные:Place (A, B); где значения параметра А и В передаются в процедуру параметром X, Y.Другой вариант:Procedure Place (x, y: real; Var Sk, Sp: real);Тогда обращение к ней: Place (A, B, S1, S2);При вызове процедуры вместо переменных А, В можно указать конкретные значения: Place (2.5, 4, S1, S2).Допускается одинаковое обозначение соответствующих формальных и фактических параметров.Пример: В 1-ой вводимой с терминала строке подсчитать количество точек, а во 2-ой – количество букв ‘A’. Подсчёт символов реализовать в процедуре Podshet.Program Pod;Const Tochka =’.’;Var S:Integer;Procedure Podchet (Sim: Char; Var Kol:Integer);Var C:char;Begin kol:=0;

Writeln (‘Введите строку’);Repeat read (c);

If c=sim then kol:=kol+1;Until EOLN

End;Begin Readln;

Podchet (Tochka,S);Writeln (‘Кол-во точек=’,S:3);Podchet (Tochka’A’,S);Writeln (‘Кол-во букв А’,S:3);

End.Здесь процедура Podschet имеет два формальных пар-ра:

Sim - входной параметр (параметр значения), определяет символ, который подсчитывается в строке;

Kol - выходной параметр, через который передаётся количество подсчитанных символов.

Page 44: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Для того, чтобы результаты работы процедуры Podschet был доступен в программе, он передается по ссылке.Фактический параметр, соответствующий формальному параметру sim, при первом вызове процедуры задается именем константы, определенной в основной программе, а при втором вызове – в явном виде. Обе формы задания правильны, так как в качестве фактического параметра, передаваемого по значению, м. использоваться произвольное выражение соответствующего типа.

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

Изменим процедуру Podschet, чтобы она передавала результат своей работы через глобальную переменную.Program Pod1;Const Tochka=’.’;Var s:integer;Procedure Podshet (Sin:Char);Var c:char;Begin s:=0

Writeln (‘Введите строку’);Repeat Read (c);

If c=sim then S:=s+1;Until EOLN

End;Begin Readln;

Podshet (tochka);Writeln (‘Кол-во точек=’s:3);Podshet (‘A’);Writeln (‘Кол-во букв A=’,S:3);

End.Программы Pod и Pod1 работают одинаково. Для конкретной задачи

программист можно выбирать тот или иной способ передачи результатов работы процедуры и вызвавшую её программу.Однако в сложных программных комплексах не рекомендуется использовать глобальные переменные, т.к. это ухудшает структурированность программы.Пример:Procedure Summa (A:integer;var B:Integer);Begin A:=A+3;B:=B+3;End;

В основной программе: A:=5; B:=5;Summa (A,B);

Page 45: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Write (A,B);Здесь значения A:=5; B:=5 передаются в процедуру, где вычисляются новые

значения A=5+3=8 и B=5+3=8. Новое значение В передается в программу, а значение А нет. Поэтому в основной программе будет А=5, В=8.

Если в процедуру нужно передать в качестве параметра не просто одно значение, а массив, то в этом случае фактически параметрами является имя массива. При этом формальный параметр указывается после слова VAR вместе с типом массива. Само же описание массива делается в разделе TYPE основной программы.

В языке программирования Паскаль допускается использование процедур без параметров. В этом случае отсутствует как формальные, так и фактические параметры.Пример: Определить длину окружности С, площадь круга S, (радиуса = R) удаление L центра окружности от начала координат. X, Y – координаты центра окружности.1й вариант

y

R

y

L

x x

Program Ex;Var R:Real;(*радиус*)X,Y,:Real; (*центр*)C:Real; (*длина окружности*)S:Real; (*S круга *)L:Real; (*Удаление центра*)Procedure Round;Begin

C:=2*Pi*R;S:=Pi*SQR(R);L:=SQRT (SQR(X)+SQR(Y));

Page 46: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

End;Begin

Writeln (‘Ввод);Read (r,x,y);Round; (*вызов процедуры*)Writeln (‘Длина окр-ти=’,C:6:2);Writeln (‘S круга=’,S:6:2);Writeln (‘Удал-е центра=’,L:6:2);

End.

2й вариантProgram Ex;Var R,X,Y,C,S,L:Real;Procedure Round (R,X,Y:Real; Var C,S,L);Begin

C:2*Pi*R;S:=Pi*SQR (R);L:=SQRT (SQR (X)+ SQR (Y));

End:Begin

Writeln (‘Ввод’);Read (R,X,Y);Round (R,S,Y,S,L,C);Writeln (‘Длина окружности=’,C:6:2);Writeln (‘S круга=’,S:6:2);Writeln (‘Удаление центра’,L:6:2);

End.5.2. Стандартные процедуры

Это, в первую очередь, процедуры ввода и вывода Read, readln, write, writeln. С ними вы знакомы.

В циклах Repeat, While и For можно использовать еще две процедуры – Break и Continue. Процедура Break позволяет досрочно выйти из цикла, не дожидаясь выполнения условий выхода.

Процедура Continue позволяет начать новую итерацию цикла, даже если предыдущая не завершена.Пример: В массиве целых чисел найти первое отрицательное число и вывести его на экран.Фрагмент программыFor I:=1 to N do {поиск отрицательного числа}Begin

If A[i]>=0 thenContiniue; {не отр.=> на след. число}

Writeln (‘1-ое отриц. число=’, A[i]);Break

End;

Page 47: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Процедура Exit служит для досрочного выхода из программы. Дело в том, что безусловный переход с использованием оператора goto можно осуществлять далеко не из каждого места программы и не в любое место программы. Так, например, нельзя с его помощью перейти из основной программы в подпрограмму или выйти из подпрограммы. Для этой цели используется процедура Exit.Пример: Функция, обращает первое отрицательное число в массиве.Function Minus---------------------Begin

Minus:=0For i:=1 to N doIf T[i]<0 thenBegin

Minus:=T[i];Exit {досрочный выход из фун-и}

ENDEnd;Существует множество стандартных процедур, которые работают с файлами:Halt(1) - остановка,Halt(0) - завершение,Halt=Halt(0).

5.3. Описание функцийОписание функции в основном аналогично описанию процедуры, однако

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

Общий вид заголовка функции:Function имя функции (список формальных параметров):тип результата.Если функция изменяет значения формальных параметров – переменных

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

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

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

Пример: Найти разность двух факториалов: F=m!-k!Program P1;Var F,M,K:Integer;Function Fact (N:Integer):Integer;Var P,I:Integer;BeginP:=1

Page 48: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

For I:=2 to N doP:=P*I;

Fact:=PEnd;BeginWriteln (‘Ввод М,К’);Readln (M,K);F:=Fact (M) – Fact (K);Writeln (‘F=’,F:5);End.

Внутри функции имена N,P,I являются локальными. Результат вычисления факториала обозначается именем функции Fact. В основной программе переменные F,M,K являются глобальными. При вычислении значения F дважды происходит обращение к функции Fact(M) и Fact(k) прямо в правой части оператора присваивания. При этом вызов функции м. делать непосредственно внутри выражения, подобно тому, как используются стандартные встроенные функции, например Sin(x).Пример: вычислить длину гипотенузы.S=h/tg

Program Dlina;Const Pi=3.14159;Var H:Real;Betta:Real;Function S(M:Real;Betta:Real):Real;Var x:Real;Begin x:=Betta*Pi/180;

S:=H/(sin(x)/cos(x));End;Begin x:=Betta*Pi/180;

S:=H/9sin(x)/cos(x));End;Begin Write (‘Ввести Betta,H’);

Readln (Betta,H);Write (‘S=’,s(H,Betta):10:4);

End;Вызов функции осуществляется непосредственно в операции ввода.

5.4. Стандартные функцииОни вам известны: это арифметические, алгебраические и

тригонометрические функции. Кроме того, есть функция конца строки: Eoln - end of line.

5.5. Итерация и рекурсияИтерация (от лат. повторение) - повторение, применение какой – либо

математической.

Н

Page 49: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Пример: Вычислить сумму ряда:S=a1+a2+….+anS1=a1S2=a1+a2S3=a1+a2+a3S4=a1+a2+a3+a4…………………S=a1+a2+…+an

Рекурсия (от лат. возвращение) - вычисление последующего значения ряда через предыдущее. Последовательность, в которой соседние значения связаны формулой, называется рекурсивной.Пример: Арифметическая прогрессия: a1, a2=a1+d, a3=a2+d, an=an-1+dПример.Begin

If (n=0) or (n=1) then Factorial:=1Else begin F:=1

For i:=2 to n doF:=f*i;Factorial:=f;

End;End;Begin Writeln (‘Введите N’);

Readln (N);Writeln (‘факториал=’,Fact);

End.

Пример.Program Rekursion;Var fact:real;N:integer;Function Factorial (N:integer):real;Begin

If (n=0) or (N=1) then factorial:=1Else factorial:=factorial (N-1)*n;

End;Begin

writeln (‘Введите N’);Readln (N);Fact:=factorial (N);Writeln (‘факториал=’,fact);

End.Здесь первый вызов функции происходит в основной программе, а затем,

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

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

Page 50: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

Вычисление факториала можно представить опять через факториал.N!=n(n-1)!-рекурсивная формула.Представление факториала в виде последовательности операций умножения – это итерационный процесс. n!= 1*2*3…n-итерационная формула. Итерация программируется с помощью циклов.Пример: Вычисление факториала.Program Iteracion ;Var fact: real;N:integer;Function factorial (n: integer):real;Var f:real;I: integer; Пример. В 13 веке итальянский математик Фибоначчи сформулировал задачу: ”Некто поместил пару кроликов в некое место, огороженное со всех сторон стеной, чтобы узнать, сколько пар кроликов родится в течении года, если через месяц пара кроликов производит на свет другую пару, а рожают со второго месяца после своего рождения.Program Krolik;Var kr:integer; (*число кроликов*) N:Integer; (*число месяцев*)Function fib(n:integer):integer;Begin

If (n=1) or (n=2) then fib:=1Else fib:=fib(n-1)+fib(n-2)

End;Begin

Writeln(‘ввести N’);Readln (N);Kr:=fib (N); (*вызов ф-и*)Writeln (kr:5);

End.5.6. Побочный эффект рекурсии

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

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

Page 51: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

При выполнении функций возникает один неожиданный эффект, причиной которого является изменение значений нелокальных переменных в теле функции.Если в некоторой функции имеются конструкции, например, операторы присваивания, изменяющие значения переменных, описанных в объемлющих блоках, то может возникнуть ситуация, при которой значения выражения, использующего вызов такой функции, зависит от порядка следования операторов, что является потенциальным источником ошибок и поэтому крайне нежелательно. Описанная ситуация называется побочным эффектом рекурсии.Пример:Program Side Effect;Var a,z :integer;Function change (x: integer): integer;Begin

Z:=z-x; {изменяем значение нелокальной переменной}Change:= sqr (x)

End;Begin

Z:=10; a:=change (z); writeln(a,z);Z:=10; a:=change (10)*change (z);Writeln(a,z);Z:=10; a:=change (z) * change(10);Writeln (a,z)

End.Выполнение этой программы приводит к следующему результату на дисплее:100 010000 -100 0

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

5.7. Предварительное описание (ссылки вперед)Объявления констант и переменных в любом блоке располагаются перед

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

Page 52: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Program Demo;Var a, b ,c : real ;Procedure Ring (var s , l : real ; d : real);

Begin L:=3.14 *d; {длина окружности }S:=cir (d) ; {компилятор еще не знает о функции cir}

End;Function Cir (d: real): real; {площадь круга }Begin cir:= 3.14* sqr(d) / 4;End;………………………………………………………………………Очевидный выход – поменять порядок строк так, чтобы функция Cir была определена перед процедурой Ring(…) .Однако можно и иначе.Действия:1. Оставить подпрограмму (функцию cir) на своем месте, вычеркнув из ее заголовка все параметры: Function cir;2. Вставить полный заголовок там, где ему надлежит бытью, т.е. перед подпрограммой, которая его вызывает.Function cir (d: real): real;1. После полного заголовка добавить слово Forward.

6. РЕГУЛЯРНЫЕ ТИПЫ

6.1. Одномерный массив, или переменные с индексамиМассив – это упорядоченный набор однотипных элементов. Под массивом

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

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

Var имя массива: Array [тип индекса] of тип элемента;Тип индекса может быть любым простым типом, кроме Real и Integer (Boolean, Char, перечислимый, ограниченный).

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

Var A: Array [1..5] of Real;Это массив из пяти действительных чисел: А[1], А[2], А[3], А[4], А[5].

Обычно нумерация начинается с единицы и заканчивается каким-нибудь положительным числом. Однако это совсем не обязательно.Пример: Var B: Array [1582..1994] of Integer;

Var C: Array [-754..-1] of Integer;(это, например, население за какие-то годы нашей эры и до нашей эры).Массив латинских букв: (можно посчитать частоту появления в тексте):

Var Lat: Array [‘A’..’Z’] of Integer;

Page 53: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Массив t0C воздуха на островах:Type Остров = (Gaiti, Sumatra, Taimir);Var T: Array [Остров] of Real;

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

Var А: Array [5] of Real;Var А: Array[Integer] of Real;

Пример: VarMassiv: Array [1..N] of Real;Year: Array [янв..дек] of Integer;

Если несколько массивов имеют одинаковый тип индексов и одинаковый базовый тип, то допускается в описание объединять массивы в список:

Var А, В, С: Array[1..50] of Real;Здесь объявлено списком три массива действительных чисел, каждый из которых содержит по 50 элементов:А[1], A[2],… A[50].B[1], B[2],… B[50].C[1], C[2],… C[50].

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

Элементы массива записываются в разделе операторов как идентификатор с индексом в квадратных скобках.

B[5]:=B[3]-1;Sum:=Sum-C[K];P1:=A[2*3+1];

Для ввода и вывода числовых значений элементов массива используются циклы.Пример: For I:=1 to 9 do

Read(A[I]);Это ввод 9-ти значений элементов массива А.For I:=1 to 9 do

Writeln(A[I]);Это их вывод.

Пример: Вычислить сумму 15-ти целых чисел.Program Sum;Var X: Array [1..15] of Integer;I: 1..15;Sum: Integer;Begin

Sum:=0;For I:=1 to 15 doBegin

Page 54: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Read(X[I]);Sum:=Sum+X[I];

End;End.

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

Type имя типа = Array [тип индекса] of тип элементов массива;Var имя массива: имя типа;

Пример: Программа с двумя процедурами: одна – для ввода элементов массива, другая для вычисления суммы и произведения элементов.Program TI4;Type Massiv = Array [1..20] of Real;Var A, B: Massiv;

Sum, Pr: Real;Procedure Vvod (N:Integer; Var X:Massiv);Var I: Integer;Begin

Writeln(‘Ввод’);For I:=1 to N do Read(X[I]);

End;Procedure Summa (N:Integer; Var X:Massiv; Var Sum, Pr: Real);Var I: Integer;Begin

Sum:= 0;Pr:=1;For I:=1 to N doBegin

Sum:=Sum+X[I];Pr:=Pr*X[I];

End;End;Begin

Vvod(8,A); (*вызов процедуры*)Summa(8,A,Sum,Pr); (*вызов процедуры*)Writeln (‘Sum=’,Sum:7:2,’ ’:3,’Pr=’,Pr);Writeln;Vvod(15,B);Summa(15,B,Sum,Pr);Writeln (‘Sum=’,Sum:7:2,’ ’:3,’Pr=’,Pr);

End.В основной программе описан тип массива длинной 20 элементов, а реально используются массивы А (8 элементов) и В(15 элементов).Пример: Расположить элементы заданного действительного массива в порядке убывания: 1 2 3 4 4 3 2 1

Page 55: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Program Rangir;Const N=10;Var A: Array [1..N] of Real;I, K: Integer; R: Real;BeginWriteln(‘Ввод’);

For I:=1 to N do Read (A[I]);For K:=1 to N do

For I:=1 to N-K doIf A[I]<A[I+1] thenBegin

R:= A[I];A[I]:= A[I+1];A[I+1]:=R;

End;For I:=1 to N do Write (A[I]);

End.K - номер просмотра строки (всего N-1 просмотров)I - номер сравнение элементов в просмотре (N-K сравнений).

Пример: Массив R состоит из 10-ти элементов действительного типа.Type Mas = Array [1..10] of Real;Var R: Mas;

Если в программе несколько таких массивов, то изменится лишь раздел описания переменных:

Var R, A, B, C: Mas;В разделе операторов программы используются массивы R, A, B, C. Тип

массива Mas введен формально только в разделе описаний и нигде в программе не указывается и не обрабатывается.Пример: Найти наибольшее из 10-ти заданных целых чисел.Program Max;Const N=10;Type Massiv = Array [1..N] of Integer;Var K: Massiv;

Max, I: Integer;BeginWriteln(‘Ввод’);

For I:=1 to N do Read (K[I]);Max:=K[1];For I:=2 to N do

If K[I]>Max then Max:=K[I];Writeln;Write (‘Max=’, Max:4);

End.Здесь 2 независимых цикла:

1-ый – для ввода значений массива;2-ой – для нахождения максимального элемента.

Page 56: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Сначала первый элемент массива K[1] обозначается именем Мах. Затем каждый последующий элемент сравнивается со значением Мах, и если он оказывается больше, то получает имя Мах.Пример: Составить программу определения минимального и максимального элементов заданного массива.Program Minmax;Const N=9; (*число элементов*)Type Massiv = Array [1..N] of Real;Var A: Massiv; (*массив элементов*)

I: Integer; (*параметр цикла*)Max, Min: Real; (*максимальный и минимальный элементы*)

Procedure Maxmin (K: Integer; Var X: Massiv; Var Max, Min: Real);Var J: Integer;Begin

Max:=X[1];Min:=X[1];For J:=2 to K doBegin

If X[J] > Max then Max:= X[J];If X[J] < Min then Min:= X[J];

End;End;Begin

Writeln (‘Ввод массива’);For I:=1 to N do Read (A[I]);Maxmin (N, A, Max, Min); (*вызов процедуры*)Writeln (‘макс. элемент=’, Max:4:1);Writeln (‘мин. элемент=’, Min:4:1);

End.В процедуре Maxmin определяются максимальный и минимальный элементы массива. Переменная J и формальные параметры процедуры K, X, Max, Min являются локальными. В основной программе происходит ввод значений массива, вызов процедуры и вывод результатов. Константа N, тип Massiv, а также переменные A, I, Max и Min являются глобальными.Пример: Дан массив действительных чисел {Ai}, где i=1,2,3,4,..M. Пусть M = 15. Вычислить сумму элементов с 1-го по 12-ый и сумму элементов с 8-го по 15-ый. Затем найти произведение этих сумм.Program Pr2;Const M=15; Var A: Array [1..M] of Real;

P: Real; (*произведение сумм*)J: Integer; (*параметр цикла*)

Function Summa (N, K: Integer): Real;Var I: Integer;

S: Real;Begin

Page 57: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

S:=0;For I:=N to K do S:=S+A[I];Summa:=S;

End;Begin

Writeln (‘Ввод массива’);For J:=1 to M do Read (A[J]);P:=Summa (1,12)* Summa(8,15);

Writeln(‘произведение=’,P:6:3);End.Пример: Дан массив (Х1,Х2,…Х100). Записать отдельно положительные и отрицательные элементы.Program Sort;Const Nmax=100; Var X,Pol,Otr: Array [1..Nmax] of Real;

I,N,K: Integer;Begin

N:=0; K:=0;For I:=1 to Nmax do Begin

Read (X[I]);If X[I] >0 thenBegin

K:=K+1;Pol[K]:=X[I];

EndElseBegin

N:=N+1;Otr[N]:=X[I];

End;End;For I:=1 to K do Write (Pol[I]);Writeln;For I:=1 to N do Write (Otr[I]);

End.Пример: Вычислить среднее арифметическое массива D из N элементов (N500).Program Sred;Const NM=500; Var D: Array [1..NM] of Real;

I,N,Nvar: Integer;Sum, Srd: Real;

BeginSum:=0;Writeln (‘Nvar=?’);

Readln(Nvar);

Page 58: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Writeln (‘Ввод массива’);For I:= 1 to Nvar do

BeginRead (D[I]);Sum:= Sum + D[I];

End;Srd:=Sum/Nvar;Writeln(‘Srd=’,srd);

End.Пример: Вычислить n!

Program Nfact;Var NF, K, N:Integer;Begin

Writeln(‘N=?’);Readln (N);NF:=1;For K:=1 to N do NF:=NF*K;Writeln(‘NF=’,NF);

End.Пример: Найти наибольший элемент массива (b1,b2,…b100) и его №.Program Max;Const NMax=100;Var B: Array [1..NMax] of Real;

I,Imax: Integer;Bmax: Real;

BeginWriteln (‘Ввод массива’);For I:=1 to NMax do Read (B[I]);

Bmax:=b[1]; Imax:=1;For I:=2 to NMax doIf B[I]>Bmax thenBegin

Bmax:=B[I];Imax:=I;

End;Writeln (‘Bmax=’, Bmax, ’Imax=’, Imax);

End.Пример: Найти скалярное произведение двух векторов:

X=(x1,x2,…xn) n Y=(y1,y2,…yn) (X,Y)= xiyi i=1

Program Scal;Const N=3;Type Vektor = Array [1..N] of Real;Var X, Y: Vektor;

I: Integer;

Page 59: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

S: Real;Begin

S:=0;Writeln (‘Ввести X,Y’);For I:=1 to N do

BeginRead(X[I],Y[I]);S:= S+ X[I]*Y[I];

End;Writeln(‘Scal=’,S);

End.Пример: Перемножить два вектора:

X=(x1,x2,x3) _ _ _ Y=(y1,y2,y3) Z = X * YProgram V;Type Vektor = Array [1..3] of Real;Var X, Y, Z: Vektor;

I: Integer;Begin

Writeln (‘Ввести X,Y’);For I:=1 to 3 do

BeginRead (X[I],Y[I]);Z[I]:= X[I]*Y[I];

End;Writeln (‘Вектор Z’);For I:=1 to 3 do Write (Z[I]);

End.(x1, x2, x3) * (y1, y2, y3) = (x1y1, x2y2, x3y3)6.1.1. Алгоритмы сортировки массивовПроблема упорядочивания данных с практической точки зрения:

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

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

1. Метод пузырька (метод обменной сортировки с выбором)

Page 60: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Идея этого метода отражена в его названии. Самые легкие элементы массива "всплывают" наверх, самые "тяжелые" - тонут. Алгоритмически это можно реализовать следующим образом. Мы будем просматривать весь массив "снизу вверх" и менять стоящие рядом элементы в там случае, если "нижний" элемент меньше, чем "верхний". Таким образом, мы вытолкнем наверх самый "легкий” элемент всего массива. Теперь повторим всю оперно для оставшихся неотсортироваными N-1 элементов (т.е. для тех, которые лежат "ниже" первого. Как видно, алгоритм достаточно прост, но, как иногда замечают, он является непревзойденным в своей неэффективности. Немного более эффективным, но таким наглядным является второй метод.

2. Сортировка выборомНа этот раз при просмотре мaccива мы будем искать наименьший элемент,

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

3. Метод ШеллаЭтот метод был предложен автором Donald Lewis Shеll в 1959 г. Основная

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

4. Метод Х oop а Этот метод, называемый также быстрой сортировкой (QuickSort), был

разработан в 1962 г. (его разработал Charles Antony Richard Hoare). Суть метода заключается в том, чтобы найти такой элемент множества, подлежащего сортировке, который разобьет его на два подмножества: те элементы, что меньше делящего элемента, и те, что не меньше его. Эту идею можно реализовать многими способами.

6.2. Многомерные массивыДо сих пор мы рассматривали массивы, каждый элемент которых содержал

один индекс. Такие массивы называют одномерными.Из многомерных массивов в математике наиболее часто используют двумерные массивы – матрицы.Описание матрицы 3 х 4:1) Type T = Array [1..3,1..4] of Integer;

Var A:T;2) Type T = Array [1..3] of Array [1..4] of Integer;

Var A:T;Пример: Type T1 = Array [1..4] of Integer;T = Array [1..3] of T1;Var A:T;

Page 61: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

B: T1;Здесь сначала описывается тип одной строки Т1, а затем, через тип строки Т1, описывается тип всей матрицы Т. В разделе переменных указывается, что А является двумерным массивом (т.е. матрицей), а В – одномерным массивом.Пример: Найти сумму положительных элементов массива D(n,m)n10, m20.Program Summa;Const n=10;

m=20;Var i, j:Integer;

Sum: Real;D: Array [1..n,1..m] of Real;

BeginSum: = 0;For i: = 1 to n do

For j: = 1 to m doBegin

Read (D[i,j]);If D[i,j] > 0 then Sum: = Sum + D[i,j];

End;Writeln (‘Sum=’,Sum);

End.Пример: Даны две матрицы: A[N*M], B[N*M]. Найти их сумму C[N*M]= A + B.Cij = aij + bij

Program Summa;Const N=3; (*количество строк*)

M=5; (*количество столбцов*)Type Mat = Array [1..N,1..M] of Real;Var A, B, C: Mat;

I: Integer; (*индекс строки*)J: Integer; (*индекс столбца*)

BeginWriteln (‘Ввести А, В’);For I: = 1 to N doBegin

For J: = 1 to M doBegin

Read (A[I,J],B[I,J]);C[I,J]:= A[I,J] + B[I,J];

End;Readln;

End;Writeln (‘Матрица С’);For I: = 1 to N doBegin

Page 62: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

For J: = 1 to M doWrite (C[I,J]:3:1, ‘ ‘:2);

Writeln;End;

End.6.3. Упакованные массивы

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

Элементы упакованного массива используются в программе точно так же, как элементы не упакованного массива. Только память машины при этом автоматически выделяется меньше.Например, массивы А и АР описаны как

Var AP: Packed Array [1..3] of Boolean;A: Array [1..3] of Boolean;

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

Описание в разделе типов:Type имя типа = Packed Array [имя индекса] of тип элемента;Var имя переменной:имя типа;

Здесь служебное слово Packed указывает на то, что массив данных является упакованным.

К упакованным символьным массивам в языке программирования Паскаль относится строки символов, которые задаются либо в разделе операторов, либо в разделе констант (строки символов, а не символьные строки String, о которых речь пойдет дальше). Как известно, тип константы однозначно определяется ее записью. Поэтому если, например, в разделе констант определена константа S=’end’, то она принадлежит к типу: Packed Array [1..3] of Char.

Считается, что символьные константы имеют тип упакованных массивов:Packed Array [1..n] of Char;

где n - длина строки.Символьные массивы и константы могут участвовать в операциях

присваивания и сравнения.Пусть, например, описание символов массива имеет вид:Type Mas= Packed Array [1..7] of Char;Var A:Mas;Тогда, можно записать такой оператор:A:=’ZADACHA’;

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

Page 63: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

количество символов, т.е. их типы д/б идентичными. Операции сравнения выполняются посимвольно, слева направо.Пример: ‘String’ < ’Strong’, т.к. в алфавите символ ‘i’ стоит раньше, чем ’o’ и его код меньше, т.е. ’i’<’o’.Пусть, например, имеется строка: “ABCDEFG”. Эту строку можно считать массивом символов, состоящим из 8 символов, включая пробел. Если этот массив символов обозначить именем Sim, то описание примет вид:

Type T = Packed Array [1..8] of Char;Var Sim:T;

Один элемент массива принимает значение одного символа, например:Sim[1]=’A’;Sim[6]=’ ’.

Элементы массива могут принимать свои значения с помощью оператора ввода Read, который располагается внутри цикла.Пример: ввода.1) I: = 1;

While I<=10 do Begin Read (A[I]); I:= I+1; End;2) For I:= 1 to 46 do Read (A[I]);

Вывод массива символьных данных также организуется с использованием цикла.Пример: Дана строка символов, обозначенная именем S1.‘To be or not to be’Требуется сформировать новый массив с именем S2, который содержит представленную строку символов с добавлением в конце вопросительного знака.Program Hamlet;Type Stroka = Packed Array [1..20] of Char;Var S1, S2: Stroka;

I: Integer; (*счетчик символов*)K: Integer; (*параметр цикла*)

BeginWrite (‘Ввести S1=’);I; = 0;While I <= 18 doBegin

I:= I+1;Raed (S1[I]); Readln;

End;S2:= S1;S2[I+1]:= ‘?’;For K:= 1 to I+1 do Write (S2[K]);

End.Разрешается ввод и вывод символьных массивов целой строкой, без организации цикла.Пример: Даны два символьных массива: А1= ‘Suvorov’ и А2= ‘Suhanov’. Требуется поменять их местами.Program Zamena;

Page 64: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Const N =12;Type Mas = Array [1..N] of Char;Var A1,A2,X: Mas;BeginWriteln (‘A1-Who?’);Readln (A1); {Суворов}Writeln (‘A2-Who?’);Readln (A1); {Суханов}Writeln (‘происходит замена’);X:=A1;A1:=A2;A2:=X;Writeln (‘A1=’,A1);Writeln (‘A2=’,A2);End.Обратите внимание, что для ввода и вывода символьных массивов здесь не применяется цикл!

6.4. СтрокиТип String (строка) в Паскале широко используется для обработки текстов и

во многом похож на одномерный массив символов Array [0..N] of Char. Однако в отличие от массива количество символов в строке – переменной может меняться от 0 до N, где N – максимальное количество символов в строке. Значение N определяется в разделе объявления типа String [N] и может быть любой константой порядкового типа, но не больше 255: N 255. Можно не указывать N, в этом случае длина строки принимается максимально возможной: N = 255.

Строка трактуется как цепочка символов. К любому символу в строке можно обратится точно так же, как к элементу одномерного массива Array [0..N] of Char.Пример:Var st: String;- - - - - - - - - - - - - -if st[5]= ‘A’ then …….

Самый первый байт в строке имеет индекс 0 и содержит текущую длину строки. Первый значащий символ строки занимает второй и имеет индекс 1. Над длиной строки можно совершать необходимые действия и таким способом менять длину строки.Пример:Var st:String[10];I:Integer;- - - - - - - - - - - - - - st[0]:=5;

Значение Ord (st[0]), то есть текущую длину строки можно получить с помощью функции length (st).

К строке можно применить операцию + (сцепление строк), например: St:=’a’+’b’;{ ab}

Page 65: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

St:=st+’c’; { abc}Если длина сцепленной строки превысит максимально допустимую длину

N, то «лишние» символы отбрасываются.Пример:Var st :String [1];Begin st:=’123’;

Writeln(st); { 1}End;

Кроме сцепления строк, все остальные действия над строками (и символами) реализуются с помощью встроенных функций.1) Concat (S1<, S2, S3,…SN>)– функция типа String, сцепление строк;2) Copy (имя строки,№ нач. символа, кол-во символов)– функция копирования;3) Delete (имя строки,№ нач. символа, кол-во символов)– функция удаления;4) Insert (имя подстроки, имя строки, № нач. символа в строке)– вставка;5) Length (имя строки)– функция типа Integer, вычисляет длину строки;6) Pos (имя подстроки, имя строки)- функция типа Integer, отыскивает в строке

первое вхождение подстроки и дает № позиции, с которой она начинается; если подстрока не найдена, значение функции будет = 0;

7) Str (число Real или Integer <: общая ширина поля<: кол-во симв. в дроб. части>>, имя строки) – процедура, преобразующая число типа Real или Integer в строку символов так, как это делает процедура Writeln перед вызовом; параметры, если они присутствуют, задают формат преобразования;

8) Val (имя строки, число Real или Integer, параметр) – процедура, преобразующая строку символов во внутреннее представление целое или вещественное числа; параметр = 0, если преобразование проведено успешно, в противном случае он содержит № позиции в строке, где обнаружен ошибочный символ;

9) Upcase (символ) – функция типа Char, возвращает символ в верхнем регистре, если он определен для него, либо сам символ, если для него нет верхнего регистра.

Пример: Upcase(‘a’) даст A, Upcase(‘2’) даст 2.

Пример:Varx: Real;y: Integer;

st, st1: String;- - - - - - - - - - - - - - - - -st:= concat (‘12’,’345’); (*получится st 12345*)st1:= copy (st, 3, lenght(st)-2); (*получится st1 345*)insert(‘-’,st1,2); (*получится st1 3-45*)delete(st, pos(‘2’,st),3); (*получится st 15*)str(pi:6:2,st); (*получится st 3.14*)st1:=’3.1415’; (*получится st1 3.1415*)val(st1,x,y); (*получится y=2, x – какой был*)

Page 66: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Операции отношения = <> > < >= <=

выполняются над двумя строками посимвольно, слева направо, с учетом внутренней кодировки символов. Если одна строка меньше другой по длине, недостающие символы короткой строки заменяются значением chr(0).Пример: Операции дают значение true:‘turbo’<’turbo-pascal’;‘A’<>’IFF’;‘ПАскаль’<’Паскаль’;

7. МНОЖЕСТВЕННЫЕ ТИПЫМножественный тип данных строится на основе некоторого базового типа, в

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

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

Множества могут состоять из любого числа объектов (элементов), но могут и не содержать элементов.

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

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

множества не могут повторяться.Пример. [круг, ромб, круг] – неверная запись множества.[круг, ромб, квадрат]=[ромб, круг, квадрат] – одинаковы и равны между

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

неупорядоченный набор различных элементов одинакового типа.Элементы множества заключаются в […].Множество может не содержать ни одного элемента. В этом случае оно

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

либо с помощью раздела Type, либо непосредственно в разделе переменных.Type имя_типа = set of t;

базовый тип элементов множества (любой простой кроме real и integer)

Var имя_множества: имя_типа;Дело вот в чём. Размерность множества, то есть допустимое количество

элементов множества обычно небольшое. Для большинства компьютеров оно не превышает 256 (то есть от 0 до 255). Поэтому объявление

Set of Integer является недопустимым.Вместе с тем запись Type M = Set of Boolean является корректной,

поскольку объявляется множество, содержащее два элемента со значениями True и False.

Таким образом, указанным ограничениям на тип элемента удовлетворяют базовые стандартные типы:

Page 67: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Byte,Char,перечислимые типы,ограниченные типы.Пример. Type Letters = Set of ‘A’..’Z’;

Holidays = Set of 1..31; U = Set of Char; I = Set of Byte;

Пример. Type M = Set of (A, B, C, D); Var G, F: M;

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

G := [A, B, D];F := [C, A, B];

Пример. Type Town = (Moscow, Kiev, Yalta); M = Set of Town;

Var P1, P2 : M;P3 : Set of ‘A’..’Z’;P4, P5 : Set of 0..9;

Переменная Р1 множественного типа М может принимать следующие значения:

[Moscow] [Kiev] [Moscow, Yalta] [Moscow, Kiev] [Kiev, Yalta][Moscow, Kiev, Yalta] [Yalta]

В общем случае, если базовое множество содержит N элементов, производный множественный тип определяет 2N подмножеств. Смотрите пример: 3 элемента, значит, 23 = 8 подмножеств.

Другой пример описания:Type MNOG = Set of 1980..2000;Var M1, M2: MNOG;В программе элементами множеств М1 и М2 могут быть любые целые числа

от 1980 до 2000, например:M1:= [1988, 1995, 1981];M2:= [1980, 1981, 1982, 1983];Приведём примеры описания множеств непосредственно в разделе

переменных:Var M1, M2: Set of 1980..2000;Var MS: Set of Char;Здесь элементами являются символьные константы, например:MS:= [‘A’, ‘N’, ‘R’];Количество элементов, входящих в множество, может быть ограничено. Оно

зависит от компьютера и версии языка Паскаль.

Page 68: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

7.1. Свойства множеств1. Все элементы базового типа, образующие множество, должны быть

различны. Запись элементов множества (2, 2, 3, 4) некорректна, поскольку два элемента тождественны.

2. Порядок расположения элементов во множестве не фиксируется, то есть множества представляют собой неупорядоченные совокупности объектов (элементов). Множества (1, 3, 5, 6), (6, 1, 3, 5) и (5, 3, 1,6) одинаковы.

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

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

множествами:1) + объединение множеств;2) * пересечение множеств;3) – вычитание множеств;4) =, < > проверка множеств на равенство, неравенство; множество А равно

множеству В, если каждый элемент множества А является элементом множества В и наоборот, каждый элемент множества В является элементом множества А; иначе множества А и В неравны друг другу; результат операции будет логического типа: True или False;

5) <= проверка множества на включение; множество А включено в множество В, если элементы множества А являются также элементами множества В; результат операции А <= В – логический: True или False;

6) IN проверка на принадлежность какого-либо значения множеству; результат операции – логический: True или False; операция S IN A служит для проверки, принадлежит ли элемент базового типа S множеству А.

Пример. Решето Эратосфена. Составить программу, реализующую алгоритм определения набора простых чисел, не превышающих некоторого заданного числа, то есть алгоритм построения “решета Эратосфена”.Program Resheto;

const N = 256; {Верхняя граница значений элементов множества}var S: Set of 2..N; C, M, P: integer;begin writeln(‘Введите границу’);

read(P);writeln(‘Простые числа до ‘, P: 3);S := [2..N];For C := 2 to P do

If C in S thenbegin writeln(C: 3);

for M := 1 to (P div C) do S := S – [C * M];

end;end.

Page 69: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Пример. Если взять то общее, что есть у боба с ложкой, добавить кота и поместить в тёплое место, то получится муравей. Так ли это? Состоит ли муравей из кота?

Пусть Y1, Y2, Y3 и Y4 – заданные множества символьного типа. Они получают значения с помощью операторов присваивания;

Y1 := [‘B’, ‘E’, ‘A’, ‘N’] – боб,Y2 := [‘S’, ‘P’, ‘O’, ‘O’, ‘N’] – ложка,Y3 := [‘C’, ‘A’, ‘T’] – кот,Y4 := [‘C’, ‘O’, ‘L’, ‘D’] – холод,[‘A’,’N’,’T’] – муравей.Применяя соответствующие операции над множествами, формируем новое

множество:X := (Y1 * Y2) + Y3 – Y4;

Program A28A;Var Y1, Y2, Y3, Y4, X: Set of Char; (* множества *)

S: Char; (* символ *)Begin

Y1 := [‘B’, ‘E’, ‘A’, ‘N’]; {боб}Y2 := [‘S’, ‘P’, ‘O’, ‘O’, ‘N’]; {ложка}Y3 := [‘C’, ‘A’, ‘T’]; {кот}Y4 := [‘C’, ‘O’, ‘L’, ‘D’]; {холод}X := (Y1 * Y2) + Y3 – Y4;write(‘X=’);for S := ‘A’ to ‘Z’ do if S in X then write(S);writeln;if Y3 <= X then write(‘Yes’) else write(‘No’);

end.Здесь для вывода значений нового множества Х используется оператор цикла

For. Параметром цикла является символьная переменная S, которая принимает значение каждого символа латинского алфавита от ‘A’ до ‘Z’. Если значение переменной S принадлежит множеству Х, то оно выводится на экран дисплея.

Для решения второй части задачи “Состоит ли муравей из кота?” используется операция включения <= в условном операторе.

Пример. Из множества целых чисел [2..20] выделить следующие множества: делящихся на 6 без остатка: делящихся без остатка на 2, или на 3 или на 2 и 3;Введём обозначения:N2 – множество чисел, делящихся на 2;N3 – множество чисел, делящихся на 3;N6 – множество чисел, делящихся на 6;N23 – множество чисел, делящихся на 2 и 3;

Program A23;

Page 70: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Const N = 20; (* размерность множества*)Var N2, N3, N6, N23: Set of Integer; K: Integer;Begin

N2 := [ ]; (* начальное значение N2 *)N3 := [ ]; (* начальное значение N3 *)For K := 1 to N doBegin

If K mod 2 = 0 then N2 := N2 + [K];If K mod 3 = 0 then N3 := N3 + [K];

End;N6 := N2 * N3;N23 := N2 + N3;writeln (‘ on 6 devite: ‘);For K := 1 to N do If K in N6 then write(K: 3);writeln;writeln(‘ on 2 or 3 devite: ‘);For K := 1 to N do If K in N23 then write(K: 3);

End.На экране:on 6 devite: 6 12 18on 2 or 3 devite: 2 3 4 6 8 9 10 12 14 15 16 18 20

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

Program Mnogestvo;Type M = Set of ‘A’..’Z’;Var M1, M2: M; B: Char;Begin M1 := [ ];

M2 := [ ];Repeat writeln(‘введите символ-элемент 1-го множества‘);

read(B);M1 := M1 + [B];

Until B =’.’;Repeat writeln(‘введите символ-элемент 2-го множества‘);

read(B);M2 := M2 + [B];

Until B =’.’;writeln(‘ все встретившиеся буквы: ‘);for B := ‘A’ to ‘Z’ do

Page 71: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

if B in M1 + M2 then write(B: 2);writeln(‘ общие буквы: ‘);for B := ‘A’ to ‘Z’ do if B in M1 * M2 then write(B: 2);if M1 = M2 then writeln(‘ множества совпадают ‘);if M1 < > M2 then writeln(‘ множества не совпадают ‘);if M1 >= M2 then writeln(‘ 2-ое есть подмножество 1-го ‘);if M1 <= M2 then writeln(‘ 1-ое есть подмножество 2-го ‘);

End.

8. КОМБИНИРОВАННЫЕ ТИПЫ

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

ограниченного числа данных различного типа.Примеры записей:

1) Данные о студенте:Фамилия – массив символов,Имя – массив символов,Год рождения – целое число,Название института – массив символов.

2) Формуляр книги в библиотеке:Автор – массив символов,Название – массив символов,Год издания – целое число,Издательство – массив символов,Количество страниц – целое число,Цена – действительное число.

Все данные можно объединить в одну группу и считать записью. Запись в целом и отдельные её элементы обозначаются именами.

К каждому элементу записи можно обратиться с помощью уточнённого имени. Оно содержит имя записи, а через точку – имя элемента.

Запись, как и другие данные, объявляется в разделе описаний и используется в разделе операторов.

Описание записи имеет следующий вид:Type имя_типа = Record

Имя_элемента 1: тип; Имя_элемента 2: тип; ………… Имя_элемента n-1: тип; Имя_элемента n: тип;End;

Var имя_записи: имя_типа;Здесь служебное слово Record (запись) выполняет роль открывающей

операторной скобки, End – закрывающей операторной скобки. Внутри

Page 72: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

Элементы записи вместе с их описанием называются полями записи.Пример.Список 1 Список 2No Фамилия Оценки 1 ------------1 ------------ (4 штучки 2 ------------2 ------------ у каждого) 3 ------------3 ------------ ………… 4 ------------

Type T = RecordN: Integer:Name: Array [1..10] of Char;Ball: Array [1..4] of Integer;

End;Var C1, C2: T;

Здесь сначала введён тип записи Т, а затем в разделе переменных указано, что переменные С1 и С2 имеют тип Т.

Каждый элемент записи имеет своё описание:N – переменная целого типа,Name – массив из 10 символов (если фамилия содержит меньше 10

букв, то оставшиеся позиции заполняются пробелами),Ball – массив из 4-х целых чисел (4 оценки за экзамен).

Допускается описание записи непосредственно в разделе переменных:Var имя_записи: Record

Имя_элемента 1: тип;Имя_элемента 2: тип;…………Имя_элемента n-1: тип;Имя_элемента n: тип;

End;Элемент записи используется в программе в том же самом смысле, как и

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

Read(C1.N);Read(C2.N);

б) вычислить сумму первых двух оценокSumma1 := C1.Ball[1] + C1.Ball[2]; Summa2 := C2.Ball[1] + C2.Ball[2];

Page 73: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

8.2. Оператор присоединения.Мы отметили, что обращение к элементам записи происходит с помощью

уточнённого имени. Оператор присоединения позволяет упростить обращение к элементу записи. Имя записи выносится в заголовок оператора присоединения, а в блоке Begin – end используются только имена элементов записи.

Оператор присоединения имеет вид:With имя_записи do Begin

Операторы End;

Пример. Для 1-ой экзаменационной ведомости (списка 1) оператор присоединения можно записать так:

With C1 do Begin Read(N); Summa := Ball[1] + Ball[3]; End;Пример. Имеется ведомость учащихся с оценками:

Иванов Иван 2Петров Пётр 2Сидоров Сидор 3

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

типа, введём запись с именем СПИСОК, состоящую из двух полей:Name – фамилия и имя – упакованный массив из 15 символов;Ball – оценка – целое число.

Для вычисление среднего балла Midball находится сумма всех оценок Summa, которая делится на число студентов N.Program W123;Const N = 3; (* число учащихся в списке *)

M = 15; (* максимальная длина Name *)Type T = Record

Name: Packed Array [1..M] of Char; Ball: Integer; End;

Var Spisok: T;I, K: Integer; (* параметры цикла *)Midball: Real; (* средний балл *)Summa: Integer; (* сумма оценок *)

BeginSumma := 0;Writeln(‘ введите таблицу ‘);

Page 74: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

For I := 1 to N doBegin

For K := 1 to M do Read(Spisok.Name[K]);Read(Spisok.Ball);Summa := Summa + Spisok.Ball;

End;Midball := Summa / N;Writeln(‘----------------------------‘);Writeln(‘ средний балл = ‘, Midball: 5: 2);

End.Описание записи сделано в разделе Type, где Т – имя типа. В разделе

переменных Var указано, что переменная СПИСОК тип Т.Раздел операторов состоит из двух циклов: один вложен в другой. Внешний

цикл с параметром I выполняется столько раз, сколько имеется фамилий в ведомости (в данном случае N = 3). Внутренний цикл с параметром К предназначен для ввода фамилии и имени. На фамилию и имя отводится поле из 15 позиций. Лишние позиции поля заполняются пробелами. Внутри поля фамилию и имя можно располагать свободно, например:

_ _ _ _ Иванов _ Иван или _ _Иванов _ Иван_ _или _ _ _Иванов _ Иван_или _ Иванов_ _ Иван_ _После имени следует оценка.

Пример. Присвоить звание “отличник” тем, у кого по всем предметам пятёрки.Из исходного списка С1, в котором содержатся фамилии и оценки, нужно сформировать другой список С2, состоящий из отличников. Для формирования списков используется массив массивов.Program otl;

Const K = 5; (* количество человек *)Type Tip = Record

Name: Array [1..K, 1..15] of Char; Math: Array [1..K] of Integer; Phis: Array [1..K] of Integer; Chem: Array [1..K] of Integer; End;

Var C1, C2: Tip; (* списки *)I, J, N: Integer; (* параметры циклов *)

BeginJ := 0;Writeln(‘ введите фамилию и оценки: ‘);For I := 1 to K doBegin

For N := 1 to 15 do Read(C1.Name[I, N]);Read(C1.math[I], C1.Phis[I], C1.Chem[I]);If (C1.Math[I] = 5) And

Page 75: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

(C1.Phis[I] = 5) And (C1.Chem[I] = 5) thenBegin

J := J + 1;C2.Name[J] := C1.Name[I];

End;End;If J = 0 then Writeln(‘нет отличников ‘)else Begin

Writeln(‘-----------------------‘);Writeln(‘отличники:‘);

For I := 1 to J do Writeln(C2.Name[I]);

End;End.

Пример. Дан многочлен 4А + 5В – 8С + 16А – 3А + 9К – 1АНайти подобные члены для переменной А и вычислить суммарный коэффициент. Один элемент многочлена можно считать записью, так как он состоит из данных различного типа – коэффициента (число) и буквы.

Введём обозначения:М1 – элемент многочлена (запись),М2 – результирующий элемент (запись),Coef – коэффициент (элемент записи),Buk – буква (элемент записи),Elem – тип записи,Sum – сумму коэффициентов.

Program Ex4;Type Elem = Record (* тип элемента *)

Coef: Integer; (* коэффициент *) Buk: Char; (* буква *) End;

Var M1: Elem; (* входной элемент *)M2: Elem; (* выходной элемент *)Sum: Integer; (* сумма коэффициентов *)

BeginSum := 0;Writeln(‘ введите многочлен ‘);While Not EOLN do (* end of line *)Begin

Read(M1.Coef, M1.Buk);If M1.Buk = ‘A’ then Sum := Sum + M1.Coef;

End;M2.Coef := Sum;M2.Buk := ‘A’;Writeln(‘подобный член = ‘, M2.Coef: 3, M2.Buk);

End.

Page 76: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

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

К каждому компоненту записи можно обратиться, используя имя переменной типа записи и имя поля, разделённых точкой.

В области действия оператора присоединения With имена переменных-записей и полей, указанные в его заголовке, можно опускать. Транслятор автоматически формирует полные имена. В области действия оператора присоединения нельзя изменять элементы списка переменных-записей и полей, указанные в заголовке. Пример. Определить число студентов 1974 г. рождения.Type Student = Record Name: Array [1..15] of Char; Date: Integer; End; { of record }Var Grope: Array [1..30] of Student; K, I: Integer;Begin

K := 0;For I := 1 to 30 do

With Grope[I].Date doIf Date = 1974 then K := K + 1;

Writeln(K);End.

В данном примере в заголовке оператора With стоит Grope[I] – элемент массива, зависящий от параметра I, поэтому оператор присоединения вставлен внутрь цикла по I.

8.3. Записи с вариантамиПри определении комбинированного типа в него можно включать

вариантную часть. Это означает, что разные переменные, хотя они и относятся к одному типу, могут иметь различные структуры. Например, пусть необходимо задать информацию о некотором человеке, указав фамилию и год рождения, а также, если это мужчина, то сообщить, военнообязанный ли он и какую имеет специальность; если это женщина, то указать, замужем ли она и сколько имеет детей:Type Pol = (Mug, Gen);Chel = RecordFam: Array [1..10] of Char;God: 1900..2000;MG: Pol; { заголовок вариантной части }Case Pol of

Mug: (Voen: Boolean; Spec: Array [1..15] of Char);Gen: (Zamugem: Boolean; Dety: Integer);

Page 77: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

End; (* of record *)Var Ch1, Ch2: Chel;

Вариантная часть записи начинается оператором Case и следует за общей частью; после её окончания в записи не появляться никакие другие поля, поэтому оператор Case не закрывается служебным словом End.

Обычно некоторое поле общей части указывает вариант. В примере это поле MG, называемое полем признака или дискриминации.

Все варианты описываются внутри оператора Case. Каждый вариант характеризуется задаваемым в скобках списком описаний присущих ему компонентов.

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

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

заголовок вариантной части:Case MG: Pol of

Для переменной Ch1 типа Chel можно написать следующие операторы присваивания:

Ch1.Fam := ‘Solomatin’;Ch1.God := 1977;Ch1.MG := Mug;Ch1.Voen := True;Ch1.Spec := ‘Programmist’;

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

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

В любой записи может быть только одна вариантная часть, и, если она есть, она должна располагаться за всеми фиксированными полями.Пример.Type Alfa = Array [1..10] of Char;

Variety = (Book, Journal, Newspaper);Name = Record

First, Last: Alfa;End; (* of Name *)Edition = Record

Name1: Name;Title, Publishers: Alfa;Case V: Variety of

Book: (Years: Integer);Journal: (Number: 1..12;

Volume: Integer;

Page 78: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

YearJ: 1900..2000);Newspaper: (Day: 1..31;

Month:1..12;YearN: Integer);

End; (* of Edition *)………………………Var E: Edition;…………………….…E.Name1.First := ‘Niklau’;E.Name1.Last := ‘Wirth’;E.Title := ‘Pascal’;E.Publichers := ‘Springer’;E.V := Journal;E.Number := 5;E.Volume := 12;E.YearJ := 1972;

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

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

X и Y – координаты одного из углов прямоугольника или треугольника или центра окружности.

Area – площадь.Skew – угол наклона одной из сторон прямоугольника.Side1 и Side2 – длины двух смежных сторон прямоугольника.Inclin – угол наклона одной из сторон треугольника.Side – её длина.Angle1 и Angle1 – углы, образованные с нею двумя другими сторонами.Diameter – диаметр окружности.

Program Opr; Const Pi = 3.141592;Type Figure = (Triangle, Rectangle, Circle);

GeometricFigure = RecordX, Y: Real;Area: Real;Case Shape: Figure ofTriangle: (Inclin, Side, Angle1,Angle2: Real);Rectangle: (Skew, Side1, Side2: Real);Circle: (Diameter: Real);

End; (* of record *)Var GFig: GeometricFigure;Begin

……………

Page 79: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Case GFig.Shape of Triangle: GFig.Area := 0.5*SQR(GFig.Side)/(cos(GFig.Angle1)/ sin(GFig.Angle2)+cos(GFig.Angle2)/sin(GFig.Angle1));

Rectangle: GFig.Area := GFig.Side1 * GFig.Side2;Circle: GFig.Area := Pi * SQR(GFig.Diameter) / 4;

End; (* of Case *)…………………….

End.

9. ТИПИЗИРОВАННАЯ КОНСТАНТАТипизированную константу можно использовать как переменную. Её

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

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

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

Синтаксис (вид описания):Const имя: тип = значение;

9.1. Простая типизированная константаЗадается как простая переменная.

Пример: Const A:Integer=1267;Kol:Real=12,32;Sim:Char =’Z’B:Char=Ord(65);

Типизированные константы разрешается использовать в место переменной в виде параметров в подпрограммах.

Типизированная константа представляет собой переменную с заданным значением. Т.о., её нельзя использовать в описании других констант или типов.Пример: Const X:Integer=0;

Y:Integer=50;Type Mas: Array [X..Y] of Integer; это недопустимо.

9.2. Структурированная (сложная) типизированная константа9.2.1. Типизированная константа массива

Пример: Type Sost = (cold, warm, hot);

Massiv = Array [Sost] of string[5];Const S: Mas = (‘cold’, ‘warm’, ‘hot’);

Page 80: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

Sost[cold]=’cold’Sost[warm]=’warm’Sost[hot]=’hot’

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

При описании типизированной много размерной константы массива каждый размер каждый размер заключается в отдельную пару скобок, а пары отделяются друг от друга запятыми, причем средняя константа соответствует размеру, наиболее далеко отстоящему с правой стороны.Пример:Type Massiv = Array [0..1,0..1,0..1] of Integer;Const chislo: Massiv = (((0,1),(2,3)),((4,5),(6,7)));Begin

Writeln(chislo[0,0,0],’=0’);Writeln(chislo[0,0,1],’=1’);Writeln(chislo[0,1,0],’=2’);Writeln(chislo[0,1,1],’=3’);Writeln(chislo[1,0,0],’=4’);Writeln(chislo[1,0,1],’=5’);Writeln(chislo[1,1,0],’=6’);Writeln(chislo[1,1,1],’=7’);

End.9.2.2. Типизированная константа записи

Пример:Type chislo = Record

a,b,c: Integer end;

Zvet = (Krasn, Gelt, Zelen, sin);Tkan = (Sherst, Shelk, Hlopok);Platye = Record

Dizain : Array [1..4] of Zvet;Material : Tcanend;

Const Nomer : chislo = (a:0, b:0, c:0);Model:Platye=(dizain: (krasn, gelt, zelen, sin); Material: Hlopok);Matrica: Array[1..3] of

chislo = ((a:1, b:4,c:5), (a:13,b:8,c:55), (a:200,b:16,c:-65));Константы массива должны задаваться в той же последовательности, в

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

Page 81: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

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

9.2.3. Типизированная константа множества.Она образуется из одной или нескольких спецификаций элементов,

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

идентификатора. Оно состоит из двух констант, разделенных двумя точками.Пример: Type Propisnoy = Set of ‘A’..’Z’;

Strochny = Set of ‘a’..’z’;Const PropBukw : Propis =[‘A’..’Z’];

StrochnBukw : Stroch =[‘a’, ’e’, ‘l’, ‘c’, ‘u’];Simvol : Set of char = [‘’..’/’, ‘:’..’?’, ‘[‘..’^’, ‘{‘..’~’];

10. ПРЕОБРАЗОВАНИЕ ТИПОВТип переменной позволяет не только установить длину ее внутреннего

представления, но и контролировать те действия, которые осуществляются над ней в программе. Контроль за использованием переменных еще на этапе компиляции программы – важное преимущество Турбо Паскаля перед другими языками программирования, в которых допускается автоматическое преобразование типов. Фактически именно та вольность, с какой, например, PL/1 преобразует по умолчанию различные типы данных, послужила объектом наиболее сильной его критики.

10.1. Неявные преобразования типовВ Паскале почти невозможны неявные (автоматические) преобразования

типов. Исключение сделано только в отношении констант и переменных типа Integer, которые разрешается использовать в выражениях типа Real.Пример: Var X : Integer; Y : Real;Y:=X+2 - правильно, хотя справа от знака присваивания стоит целочисленное выражение, а слева – вещественная переменная. Компилятор сделает необходимые преобразования автоматически.X=2.0 – неверно, так как автоматическое преобразование типа Real в тип Integer в Паскале запрещено.

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

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

Page 82: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

В частности, для преобразования Real в Integer имеются две встроенные функции:

Round округляет Real до ближайшего целого,Trung усекает Real путем отбрасывания дробной части.X:=Y/X – нельзя,X:=round(Y/X) – можно.

Ord преобразует Char в Integer,Chr преобразует Integer в Char.

Пример. Программа выводит на экран символ и соответствующий ему внутренний код.Var simvol : char;Begin readln (simvol);

Writeln (simvol, ‘=’, ord(simvol));End.

10.3. Явные преобразования типовНаличие двух операций деления есть еще одно появление

основополагающего принципа языка программирования Паскаль: программист должен явно подтверждать компилятору, что он готов к возможным последствиям преобразования типов. Если, например, в Фортране используется выражение 1/2, то результат этого действия будет зависеть от того, переменной какого типа он будет присвоен:

если X – целое,Y - действительное,то фортрановское присваивание дает:X = 1/2 0Y = 1/2 0.5

В языке программирования Паскаль такой двусмысленности нет: выражение 1/2 всегда имеет значение 0.5 и поэтому оператор X:=1/2 для целого Х просто недопустим. В то же времяVar Y : Real;

--------------Y : = 1 div 2;самим фактом использования операции целочисленного деления div программист свидетельствует, что он сознательно отбрасывает дробную часть.

10.4. Эквивалентность типовЕще две функции для целого типа:

Dec (X[,N]) – уменьшение значения X на N; если N не задан, то на 1,Inc (X[,N]) – увеличение.

Над символами и строками символов (тип string) применима единственная операция – сцепление строк (+).

Var slovo: string;Begin

Slovo:= ‘turbo’ + ‘-‘ + ‘pascal’;Writeln (slovo);

End.

Page 83: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Пример: А,В, С – типа integer.А = В and С < 0 где ошибка?

Надо (А = В) and (С < 0) так как логические операции имеют более высокий приоритет, чем операции отношения:0 not1 * / div mod and chr chi2 + - or xor3 = <> < > <= >= in.

10.5. Совместимость типовПаскаль – это типизированный язык. В нем соблюдается концепция типов, в

соответствии с которой все применяемые в языке операции определены только над операндами совместимых типов.

Два типа считаются совместимыми, если:1) оба они есть один и тот же тип,2) оба они действительные,3) оба они целые,4) один тип есть тип – диапазон второго типа,5) оба они являются типами – диапазонами одного и того же базового типа,6) оба они являются множествами, составленными из элементов одного и

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

предшествующим словом Packed) одинаковой максимальной длины,8) один тип есть тип – строка, а другой тип – строка, упакованная строка

или символ,9) один тип есть любой указатель, а другой – не типизированный указатель,10) оба они есть процедурные типы с одинаковым типом результатом

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

11. ФАЙЛОВЫЕ ТИПЫМы до сих пор рассматривали задачи, в которых во время выполнения

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

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

- формировать большие массивы данных,- своевременно их корректировать,- транспортировать их в другие программы

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

Page 84: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

11.1. Определение файлового типаКак правило, в файлах размещаются данные для длительного хранения, а

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

исходные данные;программа;результаты;любые тексты

Файл в операционной системе представляет собой последовательность элементов одного типа, расположенных на внешнем уровне.

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

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

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

структурами. Специалисты часто пользуются термином «последовательный файл» для описания последовательностей.

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

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

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

11.2. Структура файлаПервоначальный порядок компонент файла определяется самой

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

Page 85: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Если число компонент равно нулю, файл называется пустым. Итак, мы видим, что файл отличается от массивов, записей и множеств, т.к. это структура последовательного доступа, все компоненты которой относятся к одному и тому же типу: любому, кроме типа «файл». Нельзя создать файл файлов!

При описании каждой файловой переменной F автоматически вводится буферная переменная, относящаяся к типу компонент файла. Её можно считать некоторым средством доступа к файлу, с помощью которого просматривают (читают) существующие компоненты, либо создают (записывают) новые. Значение буферной переменной автоматически изменяется при выполнении ряда операций над файлами. Для файловых переменных операция присваивания не определена. Для добавления новых компонент существует единственный способ – добавлять их в файл по одной через буферную переменную. Если указатель текущей позиции в файле оказывается за последней его компонентой, значение буферной переменной становится неопределённым.

Характеристики файла:последовательный доступ;переменная длина;существование буферной переменной, –

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

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

Для определения признака конца файла используется встроенная стандартная функция EOF (файловая переменная);

Она определяет, достигнут или нет конец файла.EOF = True, если конец файла достигнут;EOF = False, если нет.Если файл не имеет компонентов, то он называется пустым и функция EOF

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

частности, в операторах цикла.Пример: While Not EOF ( имя ) Do Begin

……. End;

Если буферная переменная сдвинута за пределы конца файла (end of file), стандартная логическая функция eof (F) = true, в противном же случае – false.

Файловый тип – единственный тип значений, который связывает программу с внешним устройством (ввод-вывод данных).

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

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

Page 86: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

В общем и целом имеется две различных разновидности файлов:двоичные файлы;текстовые файлы

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

Текстовые файлы состоят из символов (char), а кроме того, каждый текстовый файл делится на строки. Каждая строка состоит из любого числа байтов и заканчивается символом конца строки. Файл завершается символом окончания файла. Таким образом, текстовые файлы – это файлы, состоящие из символов, причём не все байты представляют собой печатаемые символоы. Компонентами текстового файла являются строки различной длины, разделённые управляющими символами.

11.3. Имя файлаКаждому файлу, размещённому на диске, присваивается уникальное имя,

длина которого не должна превышать восьми символов. Длина расширения файла не должна превышать трёх символов.

Имя файла – это любое выражение строкового типа, которое строится по правилам определения имён в дисковой операционной системе (DOS):

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

- за именем может следовать расширение – последоватенльность до трёх разрешенных символов;

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

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

двоеточие. Имена А: и В: относятся к дисковым накопителям на гибких дисках, остальные – к жёстким дискам.

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

За именем диска может указываться имя каталога, содержащего файл. Если имени каталога предшествует обратная косая черта ( \ ), то путь к файлу начинается из корнего каталога, если черты нет – из текущего каталога, установленного в системе по умолчанию. За именем каталога может следовать одно или несколько имён каталогов нижнего уровня. Каждому из них должна предшествовать обратная косая черта. Весь путь к файлу отделяется от имени файла обратной косой чертой. Максимальная длина имени вместе с указанием пути – 79 символов.

11.4. Описание файлового типаФайловый тип или переменную файлового типа можно задать одним из

трёх символов:имя = file of тип;имя = text;

Page 87: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

имя = file;Пример: Var finp: text;

Fout: file of string;const name = ‘c:\dir\subdir\out.txt; …………………………

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

Общий вид описания файлового типа:Type имя = File of тип;

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

Type Number = file of integer; {файл целых чисел}Symb = file of ‘A’..’Z’; {файл прописных латинских букв}

Стандартный тип Text определяет тип–файл, содержащий символы, объединённые в строки. Следует иметь в виду, что тип Text в Турбо-Паскале не эквивалентен типу file of char.

В Турбо-Паскале можно использовать файл без типа, при определении которого не указывается тип компонент. В этом случае работа с файлом осуществляется на физическом уровне, в соответствии с внутренним форматом его данных. При этом реальные компоненты файла могут иметь и различные типы.Пример: Type untyp = file;

Итак, в Паскале файловый тип описывается следующим образом:type T = TValue;{ тип компоненты файла }

< имя файлового типа > = file of T;Как обычно, файловый тип может быть введен в употребление в разделе

типов, как было описано выше, либо непосредственно задан при описании переменных, например: var myfile: file of T;

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

11.5. Файловая переменнаяКаждому файлу ставится в соответствие уникальная файловая переменная.

Кроме того, обычными программными средствами нельзя создать программы, позволяющие взаимодействовать с устройствами ввода-вывода, кроме терминалов пользователя. Своеобразным «окном» между программами и внешними устройствами является файловая переменная. Поэтому в каждой программе, где предусматривается взаимодействие с устройствами ввода-вывода, организуется определённым образом логическая связь устройства ввода-вывода с файловой переменной.Пример:

Page 88: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Type ZAP = RecordFIO: array [1..10] of char;God: Integer

end; { of Record }F = File of ZAP;

Тогда любая переменная типа F – это последовательный файл, состоящий из записей. Каждая запись имеет 2 поля: FIO (фамилия) и God (год рождения).

Переменные файлового типа, как и обычные переменные, описываются в разделе переменных: Var C: F;

С переменной С автоматически связана некоторая буферная переменная, относящаяся к типу компонентов файла и представляющая собой своеобразное «окно», через которое можно просматривать или записывать очередные компоненты. В любой момент доступен только один компонент файла – тот, что виден через буферную переменную.

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

Описание файла в разделе описания переменных:Var Myfile: File of Integer;

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

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

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

Var имя файла: File of базовый типПример: Var FT: File of char; (* файл символьных данных *)

Finp: File of real; (* файл действительных данных *)М: File of integer; (* файл целых данных * )

Файлы символьных данных называются текстовыми файлами.Определение данных с использованием раздела описания типов Type делает

программу более универсальной и упрощает отладку программы.Type имя типа = File of базовый тип;Var имя переменной: имя типа;

Пример: Type T = File of Char;Var FT: T;

Здесь Т – введённое нами имя типа.Пример описания файловых типов и переменных:

Type SS = file of Char;Person = record

name: string [20];

Page 89: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

adress: string [25];sex: ( man, woman );day: 1..31;month: 1..12;year: 1900..2000

end;Var F1, F2: SS;

Table: file of string [50];Base: file of person;Data: file of integer;

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

11.6. Операции над файламиЯзык Паскаль не содержит встроенных операций по обработке файловых

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

Операции по установке связей между файловой переменной и внешним устройством или внешним файлом на магнитном носителе, т.е. операции по открытию файлов, а так же операции по «развязке» этих связей, т.е. закрытию файлов реализуются процедурами:

Assign Rewrite CloseReset Append FlushСвязывание файловой переменной с именем файла осуществляется

обращением к встроенной процедуре ASSIGN:Assign ( файловая переменная, имя файла ).

Здесь имя файла – переменная или константа типа String. Имя должно быть написано в соответствии с правилами MS DOS, может включать путь и не должно превышать 79 символов. Если строка имени пустая, осуществляется связь со стандартным файлом ввода или вывода (как правило, консолью).

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

1) Установление связи с внешним файлом на магнитном носителе. В этом случае имя внешнего файла представляет собой спецификацию файла:

Assign (Namefaile,’C:\direct\tfile.dat’);Assign (Kandy,’D:\direct\sadry\fio.dat’);

Page 90: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

2) Установление связи программного файла с внешним устройством. Для ввода с клавиатуры, если далее следует операция считывания данных; либо вывода на экран дисплея, если далее следует операция записи данных:

Assign (inputfile,’CON’);3) Для вывода данных на печатающее устройство (допускается

подключение до трёх печатающих устройств): LPT1 (синоним PRN), LPT2 и LPT3.

Assign ( Outhut,’LPT1’ );4) Для последующего обмена информацией по коммуникационным

каналам. Смысл записи псевдофайлов COM1 (или синоним AUX) либо СОМ2 определяется конкретным внешним устройством. Например, это может быть «мышь» или графопостроитель (плотер), либо узел при сетевой связи компьютеров:

Assign ( interfile,’COM1’ );5) Установление связи с фиктивным внешним устройством. Например, при

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

Assign (myfile,’NUL’);

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

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

Эта операция в общем случае выполняется следующими процедурами:Reset (файловая переменная, размер записи);Reset (файловая переменная);Rewrite (файловая переменная); Rewrite (файловая переменная, размер записи);Append (файловая переменная);

Основные процедуры обработки файловReset ( F ) – подготовка чтения файла F. При этом указатель позиции

помещается в начало файла. Если файл не пустой, то переменной F присваивается значение его первого компонента, а функция eof (F) = false. Параметр «размер записи» указывается лишь в случае обработки нетипизированных файлов. В результате обработки процедуры Reset, если соответствующий файл обнаружен, текущий указатель устанавливается в начале файла, т.е. на нулевом элементе файла. Если же внешний файл не обнаружен, то вырабатывается условие ошибки. Оператор процедуры reset(f) переводит файл f в режим чтения и устанавливает окно на первую позицию файла. Оператор процедуры read(f,v) присваивает переменной v значение текущей компоненты из файла f и передвигает окно на следующую позицию. Процедура reset может применятся к одному и тому же файлу несколько раз и при этом содержимое его не изменяется.

Rewrite ( F ) – подготовка записи в файл. Текущее значение файловой переменной F становится равным emply (пустой). Функция eof (F) = true. Может

Page 91: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

записывать новый файл. Оператор процедуры rewrite(f) устанавливает файл в режим записи, если раньше в этот файл были записаны какие-то данные, то они теряются. Оператор процедуры write(f,x) записывает в файл f очередную компоненту x, после чего окно сдвигается на следующую позицию. Общий вид оператора подготовки запист:

Rewrite (файловая переменная, [имя файла]);Если внешнее имя файла опущено при открытии файла для записи, то

файловая переменная трактуется как временный файл, который по окончанию работы программы ликвидируется. Параметр. «размер записи» указывается лишь в случае нетипизированного файла. В результате обработки процедуры ReWrite, если соответствующий файл обнаружен, текущий указатель устанавливается в начале файла, на место нулевого элемента записывается «символ конца файла». Другими словами, процедура rewrite очищает содержимое файла, а текущий указатель устанавливается в позицию готовности записи нулевого элемента.

Непосредственные операции ввода–вывода выполняются процедурами read и write. Обращения к этим процедурам:Read (файловая переменная, выражение);Write (файловая переменная, выражение);

После открытия на запись файл считается пустым, а указатель устанавливается на начало; в этот файл затем можно последовательно заносить информацию из буферной переменой при помощи процедуры write:

write (файловая переменная); Если файл с таким именем уже существует, то вся информация,

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

В принципе все операции создания и чтения последовательного файла можно сформировать из приведённых простых процедур и стандартной функции eof. На практике же часто полезно совмещать перемещение по файлу с доступом к буферной переменной. Поэтому введём две новые процедуры Read и Write следующим образом:

Read (F,X), где Х – некоторая переменная.Write (F,Y), где Y – некоторое выражение.Read и Write – специальные процедуры, распространённые для работы с

переменным числом параметров (Х1,Х2,…,ХN – переменные, а Y1,Y2,…,YN – выражения).

Обращение к функции Read (F,X1,…,XN) эквивалентно конструкцииbegin

Read (F,X1);Read (F,X2);…………….Read (F,XN)

end;к функции Write (F,Y1,Y2,…,YN) - эквивалентно конструкцииbegin

Write (F,Y1);

Page 92: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Write (F,Y2);…………….Write (F,YN)

end; Если элементы в файле хранятся по строкам, то для определения конца

строки файла используется оператор циклаWhile Not EOLN (имя) Do,

а для перехода на новую строку файла – оператор Readln (имя).Чтение файла – это ввод данных из внешнего файла, находящегося на диске,

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

Для чтения файла необходимо выполнить следующие действия:открыть файл для чтения ( процедура Reset );ввести данные файла в программу ( процедура Read );закрыть файл для чтения ( процедура Close )

Общая форма чтения файла:Reset ( файловая переменная, [имя файла] );……………..Read ( файловая переменная, параметры );……………..Close ( файловая переменная );

Читать файл можно только с начала, предварительно открыв его на чтение процедурой Reset.

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

последовательно считываются элементы файла и засылаются в поля переменных, указанных в выражении. После чтения очередного элемента текущий указатель смещается на начало следующего элемента файла. При достижении текущим указателем позиции, не содержащей элементов файла, завершается операция чтения, то есть достигается конец файла. Возникновение этой ситуации можно проверить с помощью встроенной функции EOF.Пример. При открытии файла с именем С для чтения соответствующая буферная переменная принимает значение первой записи файла С. Если файл пуст, то EOF (C) = True, а значение буферной переменной не определено. Для чтения очередной записи из файла С необходимо выполнить процедуру Read (C). При этом считанная запись станет доступной через буферную переменную. При окончании записи элементов в файл С его необходимо закрыть при помощи процедуры Close (C). При этом файл С сохраняется на внешнем носителе, если при его открытии на запись было указано внешнее имя.

Файловая переменная логически связана с внешним устройством. Если внешнее имя файла опущено при открытии файла для чтения, то файловая переменная трактуется как временный файл, созданный ранее в этой же программе.

Page 93: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

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

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

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

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

Если же соответствующие файлы на внешнем носителе не обнаружены, то процедуры Append и ReWrite открывают новый файл с указанным именем, соответствующим заданной файловой переменной.

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

Close (файловая переменная).Для применения операции обработки файла после его закрытия не нужно

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

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

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

Page 94: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Процедура Rename (файловая переменная, новое имя). Переименовывает файл. Перед выполнением процедуры Rename необходимо закрыть файл, если он ранее был открыт процедурами Reset, ReWrite, Append. Внешний файл, с которым связана файловая переменная, получает новое имя, заданное параметром «новое имя». Этот параметр по своим характеристикам аналогичен параметру «имя файла» в процедуре Assign.

Процедура Erase (файловая переменная) уничтожает файл.Erase (файловая переменная).

Перед выполнением процедуры необходимо закрыть файл, если он ранее был открыт процедурами Reset, ReWrite или Append.

Процедура Flush (файловая переменная). Поскольку обмены с файлами реализуются через некоторый внутренний буфер в оперативной памяти, то в процессе обработки информации могут возникать ситуации задержки данных, то есть «застревание» информации в буфере. Если же в процессе обработки информации не требуется пополнять буфер, то есть считывать следующий элемент, либо разбивать находящиеся в буфере данные на порядки, то с помощью процедуры Flash (файловая переменная) выполняется принудительный сброс информации при записи и очистка буфера. Процедура Flush игнорируется, если файл был инициирован для чтения процедурой Reset. Ценность этой процедуры сомнительна, так как все её функции реализуются процедурой Close, при выполнении которой закрытие файла автоматически сопровождается ликвидацией соответствующего буфера.

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

Процедура ChDir (путь) – излагает текущий каталог (директорию). Здесь «путь» – строковое выражение, содержащее путь к установленному по умолчанию каталогу. Параметр. «путь» может быть только типа String. Таким образом, ChDir устанавливает новый текущий каталог, путь к которому находится в процедуре «путь».

Процедура GetDir (устройство, каталог) позволяет определить имя текущего каталога (каталога по умолчанию). Здесь «устройство» - выражение типа Word, содержащее номер устройства:

0 – устройство по умолчанию,1 – диск А,2 – диск В и т. д.

Здесь «каталог» - переменная типа String, которая определяет путь к текущему каталогу на указанном диске.

Процедура MkDir (каталог) создаёт новый каталог на указанном диске. Здесь «каталог» - выражение типа String, задающее путь к каталогу. Последним именем в пути, то есть именем вновь создаваемого каталога, не может быть имя уже существующего каталога.

Процедура RmDir (каталог) удаляет каталог. Удалённый каталог должен быть пустым, то есть не содержать файлов или имён каталогов нижнего уровня.

Функция IOResult : Word возвращает признак последней операции ввод – вывод. Если операция завершилась успешно, функция возвращает ноль. Эта функция становится доступной только при отключённом автоконтроле ошибок

Page 95: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

ввода – вывода. Директива компилятора { $1-} отключает, а { $1+} включает автоконтроль. Если автоконтроль отключён и операция ввода – вывода привела к возникновению ошибки, устанавливается флаг ошибки и все последующие обращения к вводу – выводу блокируются, пока не будет вызвана функция IOResult.

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

Функция DiskFree (диск) : Longint. Возвращает объём в байтах свободного пространства на указанном диске. В этой функции «диск» - номер диска:0 – устройство по умолчанию,1 – диск А,2 – диск В и т. д. Функция возвращает значение -1, если указан номер несущего диска.

Функция DiskSize (диск): Longint. Возвращает полный объём диска в байтах ( -1, если указан номер несуществующего диска).

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

Read WriteReadln WritelnBlockRead BlockWrite

Пример. Работа с файлом FIZAP.В файл сначала заносятся три записи, каждая из которых представляет собой совокупность двух полей. Первое поле (FIO) содержит фамилию, а второе поле (GOD) - год рождения. Ввод исходной информации осуществляется с терминала. Затем этот файл закрывается и вновь открывается только уже на чтение, после чего из файла считываются три записи и выводятся на терминал. По окончанию работы программы файл FIZAP сохраняется. Внешнее имя РР71.datProgram PP71;Type ZAP = Record

FIO : Array [1…10] of Char;GOD: integerend; {of record}

F = File;Var FIZAP: F;

A, B : ZAP;J, I : integer;

begin Assign (FIZAP, `C: \ Program \ t – pas \ pp71.dat);ReWrite (FIZAP, 12);

For Y : = 1 to 3 doBegin Write (`=>`);

For I = 1 to 10 do

Page 96: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

read (B. FIO [I]); Readln (B. God); BlockWrite (FIZAP, B, 1)

end; close (FIZAP);Reset (FIZAP, 12);For J: = 1 to 3 dobegin BlockReadln (FIZAP, A, 1);

Writeln (J : 2, `-ая запись `, A. FIO, A. GOD: 5);end

end.Протокол работы программы:Иванов 1967Петров 1970Сидоров 1968

1 – ая запись Иванов 19672 – ая запись Петров 19703 – ая запись Сидоров 1968

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

Program PP74;Type ZAP = Record

FIO : Array [1…10] of Char;GOD: integerend; {of record}

F = File; Var FIZAP: F;

A : ZAP;I : integer;

begin Assign (FIZAP, `C: \ t – pas \ pp74.dat);ReWrite (FIZAP, 12);

RepeatWrite (`=>`);

For I = 1 to 10 do read (A. FIO [I]); Readln (A. God); BlockWrite (FIZAP, A, 1)

Until A . FIO = `**********`;close (FIZAP);Reset (FIZAP, 12);I: = 1;Repeat BlockRead (FIZAP, A, 1);

Page 97: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Writeln (I : 2, `-ая запись `, A. FIO, A. GOD: 5);I : = I+1

Until A . FIO = `**** `;end.Протокол работы программы:Иванов 1966Петров 1970Сидоров 1972Пушкин 1968

1 – ая запись 2 – ая записьи т. д.

Пример. В программе из внешнего файла с именем PP75.dat удаляются все записи, соответствующие людям, родившимся до 1970 года. Для этого используется рабочий файл с внешним именем `PPR.dat`, в который сначала последовательно переписываются из внешнего файла все оставляемые записи, затем внешний файл открывается на запись, рабочий файл – на чтение и всё содержимое рабочего файла переписывается во внешний файл. При этом для контроля работы программы оставляемые записи выдаются на терминал.

Program PP75; Type ZAP = Record

FIO : Array [1…10] of Char;GOD: integerend; {of record}

F = File; Var FIZAP, RB: FPK; A : ZAP; I : integer;{Ввод данных в файл FIZAP}

begin Assign (FIZAP, `C: \ t – pas \ pp75.dat); ReWrite (FIZAP, 12);

Repeat Write (`=>`);For I = 1 to 10 do

read (A. FIO [I]); Readln (A. God); BlockWrite (FIZAP, A, 1)

Until A . FIO = `**********`; {здесь год должен быть >1970}close (FIZAP);{контрольный вывод содержимого обрабатываемого файла FIZAP}Writeln;Writeln (`обрабатываемый файл :`);Reset (FIZAP, 12);I: = 1;Repeat BlockRead (FIZAP, A, 1);

Page 98: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Writeln (I : 2, `-ая запись `, A. FIO, A. GOD: 5);I : = I+1

Until A . FIO = `**********`;close (FIZAP);{Перепись из обработанного файла FIZAP в рабочий файл RB людей, родившихся не ранее 1970 года}Reset (FIZAP, 12);Assign (RB, `C: \ Language\ t – pas \ pp75.dat); ReWrite (RB, 12);

RepeatBlockRead (FIZAP, A, 1);If A . GOD >= 1970 Chen BlockWrite (RB, A, 1)Until A . FIO = `**********`;close (RB);close (FIZAP);{ контрольный вывод содержимого обрабатываемого файла RB}Writeln;Writeln (`рабочий файл :`);Reset (RB, 12);I: = 1;Repeat BlockRead (RB, A, 1);

Writeln (I : 2, `-ая запись `, A. FIO, A. GOD: 5);I : = I+1

Until A . FIO = `**********`;close (RB);{Перепись из рабочего файла RB в обрабатываемый файл FIZAP}Reset (RB, 12);ReWrite (FIZAP, 12);

RepeatBlockRead (RB, A, 1);BlockWrite (FIZAP, A, 1)Until A . F1O = `**********`;close (RB);close (FIZAP);{ контрольный вывод содержимого обрабатываемого файла}Writeln;Writeln (`обработанный файл :`);Reset (FIZAP, 12);I: = 1;Repeat BlockRead (FIZAP, A, 1);

Writeln (I : 2, `-ая запись `, A. FIO, A. GOD: 5);I : = I+1

Until A . FIO = `**********`;close (FIZAP);Writeln (`ok`)end.

Page 99: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

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

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

Program Z3; Type ZAP = Record

NOV : Array [1…10] of Char;Cena : integerend; {of record}

Tovar = File of ZAP; Var Nov, Star: Tovar; B : ZAP; I : integer;Begin(*ввод с терминала полей новой записи*) Write (`=>`);For I := 1 to 10 do read (B. Nazv [I]);Readln (B. Cena);(*открытие файлов*)Reset (Star, Star.dat);ReWrite (Nov, Nov.dat);(*вставка новой записи*)While условие окончания ввода записей doОператоры ввода записейClose (Nov):(*перепись данных из нового файла в старый и их печать*)Reset (Nov, Nov.dat);ReWrite (Star, Star.dat);Repeat

Page 100: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Операторы присваивания значений записей нового файла записям старого файла.Writeln (B. Nazv, B. Cena) (*вывод на терминал*)Until B. Nazv = `**********`;Close (Star)end.

11.7. Типизированные файлыДлина любого компонента типизированного файла строго постоянна, что

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

Такой способ доступа называется последовательным. В Турбо – Паскале имеется также возможность организации прямого доступа к компонентам типизированного файла (процедура Seck).

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

Процедура Read (файловая переменная, список ввода).Обеспечивает чтение очередных компонентов типизированного файла.Здесь «список ввода» - содержит одну или более переменных такого же

типа, что и компоненты файла.11.8. Текстовые файлы

11.9. Нетипизированные файлы

11.10. Стандартные файлы INPUT и OUTPUT

12. ССЫЛОЧНЫЕ ТИПЫ (УКАЗАТЕЛИ)

12.1. Динамические переменныеИспользование только статических объектов при программировании может

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

Page 101: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Динамический объект обозначается присоединением символа к имени переменной-ссылки на этот объект:type T = integer;{тип динамического объекта}pointer = ^T;{имя ссылочного типа - pointer}Переменная-ссылка должна быть описана в разделе var:var p:pointer;

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

оперативной памяти конкретной машины. Значение NIL принадлежит любому ссылочному типу. Оно указывает на отсутствие связи с объектом.

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

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

12.3. Динамические списковые структурыС помощью ссылочного типа можно создавать динамические структуры

самого разнообразного характера, например линейные списки.12.4. Однонаправленные списки

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

type TValue = integer;pointer = ^element;element = record

info:TValue;next:pointer;

end;list = pointer;

где поле next - указатель на следующий элемент списка.Указатель последнего элемента равен NIL.

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

Списки также допускают отображение на массив, например, однонаправленный список допускает такое отображение:

type elem = recordinfo:TValue;

Page 102: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

next:integer;end;

list = array [1..10] of elem;var L:list;use, free:integer;

где поле next - указатель на расположение (индекс) следующего элемента вмассиве,

переменная use указывает на первый элемент списка.Также используется список свободных элементов, тоже связанных между

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

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

Init(L) - создание списка.Insert(L,n,v) - вставка элемента v в список под номером n.Delete(n) - удаление n-го элемента списка или удаление элемента по имени.Print(L) - печать списка.Find(L,v) - поиск элемента в списке.

12.4.1. Удаление из списка любого элемента, кроме первого12.4.2. Вставка элемента в произвольное место, кроме начала12.4.3. Добавление элемента в конец списка12.4.4. Удаление первого элемента12.4.5. Вставка элемента в начало списка12.4.6. Формирование списка с одновременным упорядочением его

элементов по заданному признаку

12.5. Двунаправленные спискиПо однонаправленному списку можно двигаться только в одну сторону - от

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

type pointer = ^element;element = recordinfo:TValue;prev:pointer;next:pointer;end;dlist = pointer;

Page 103: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

Динамическая структура состоящая из звеньев такого типа называется двунаправленным списком. Наличие ссылки на предыдущий элемент списка позволяет двигаться в любом направлении по списку. В поле prev заглавного звена стоит ссылка NIL, так как у заглавного звена нет предыдущего. Иногда значением поля next последнего звена ставят ссылку на заглавное звено, а в поле prev заглавного звена - ссылку на последнее звено. Список замыкается в "кольцо". Списки такого вида называют кольцевыми.

12.6. СтекиСтек - структура данных, в которой можно добавлять и удалять элементы

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

type pointer = ^elem;elem = recordinfo:TValue;sled:pointer;end;Stask = pointer;или отображения на массив:const N=10;type Stask = recordtp:integer;body:array [1..N] of TValue;end;

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

Для работы со стеком реализуются процедуры:Init(S) - процедура создания стека S.Empty(S) - логическая функция, выдающая true если стек пуст и false если в нем есть элементы.Push(S,v) - процедура вставляющая новый элемент v в стек.Pop(S) - процедура выталкивающая верхний элемент из стека.Top(S) - функция, возвращающая значение верхнего элемента стека.Size(S) - функция,возвращающая число элементов стека.Display(S) - процедура, распечатывающая содержимое стека.Имея эти базовые процедуры довольно просто реализовать процедуры: вставки элемента в стек под каким-то номером (Insert(S,v,n)) и удаления элемента из стека по значению (Remove(S)).

Page 104: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

12.6.1. Формирование стека12.6.2. Включение нового узла в стек12.6.3. Удаление узла из стека

12.7. ОчередиОбработка элементов списка сводится к корректировке соответствующих

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

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

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

const N=10;type Qel:integer;Queue: recordfirst,last:integer;body: array [1..N] of Qel;end;

где first и last - указатели на первый и последний элемент очереди соответственно, а N - максимальное число компонент очереди. Отображение на массив накладывает ограничение на длину очереди, кроме того программист сам запрещает себе прямой доступ к элементам массива.

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

type T = Qel;pointer = ^T;Queue = recordinfo:T;pred,sled:pointer;end;

где pred и sled - указатели на предыдущий и следующий элемент очереди. Операции над очередью при такой организации определяются аналогично.Для работы с очередью реализуются следующие процедуры:Init(Q) - процедура создания очереди Q.Empty(Q) - логическая функция, если очередь пуста Empty выдает значение true, если нет - false.Pop(Q) - процедура, выталкивающая первый элемент очереди Q.Top(Q) - функция, выдающая значение первого элемента очереди.Push(Q,v) - процедура, добавляющая новый элемент v типа Qel в конец очереди Q.Print(Q) - процедура, распечатывающая содержимое очереди.Size(Q) - функция, выдающая число компонент (длину) очереди.Отображение очереди на файл выглядит так:

Page 105: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

type T = Qel;Queue = file of T;

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

12.8. ДекDeque (double-ended queue) - двухсторонняя очередь, структура данных, где

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

12.9. ГрафМножество объектов соединенных произвольным образом, но не более чем

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

В Паскале удобно для этой цели представлять граф в виде матрицы смежности, в которой хранится информация о связях между вершинами графа.Если граф содержит N вершин, то матрица смежности - квадратная булевская матрица N*N, в которой М(i,j)=true, если есть связь между i-ой и j-ой вершинами и М(i,j)=false в противном случае. Для неориентированных графов матрица смежности симметрична.

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

12.10. ДеревьяДерево - частный случай графа. Структура определяется

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

В Паскале двоичное дерево можно определить так:type BTree = ^BNode;BNode = recordinfo:TValue;left,right:BTree;end;

Page 106: vera-chan.narod.ruvera-chan.narod.ru/lections.doc  · Web viewМинистерство образования Российской Федерации. Московская Государственная

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

Для бинарного дерева определены три способа обхода: прямой или префиксный (корень - левое поддерево - правое поддерево),обратный или инфиксный (левое поддерево - корень - правое поддерево) и концевой или постфиксный (левое поддерево - правое поддерево - корень).

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

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

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

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

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