[МУЗЫКА] Продолжаем
рассматривать, какие типы есть в языке Pascal.
Рассмотрим порядковые типы.
Напоминаю, что порядковые типы отличаются от всех остальных тем,
что элементы этих типов обязательно упорядочены.
Итак, первый из порядковых типов — это тип integer (целый).
Значения этого типа в памяти компьютера занимают 4 байта,
и на слайде указан диапазон значений для данного типа.
И есть константа MaxInt,
которая хранит значения максимально возможного целого числа.
Таким образом, нам не нужно запоминать это значение.
Обращаю ваше внимание, что отрицательных чисел на 1 больше,
чем чисел положительных.
Поэтому если мы хотим получить минимальное целое значение,
то мы должны записать: −MaxInt − 1.
Затем рассмотрим тип byte.
Тип byte — это также целый тип,
только это величина без знака, в отличие от типа integer.
И значение этого типа находится в диапазоне от 0 до 255.
И занимают они ровно 1 байт.
Далее, есть тип word.
Тип word — это также целое без знака,
значения этого типа занимают больше памяти, это 2 байта,
и диапазон значений от 0 до 65535.
Далее, есть тип char, символьный тип, от слова character (символ).
Значения этого типа также занимают 1 байт, и это один символ в кодировке Windows.
Причем есть стандартная функция Chr,
которая возвращает символ с заданным кодом.
Константы этого типа также могут быть записаны в форме #, а затем x,
где x — это целое число в диапазоне от 0 до 255, то есть это тоже код.
Далее, у нас есть так называемый перечислимый тип, это тип,
который пользователь создает сам.
Для того чтобы сделать перечислимый тип,
мы задаем просто упорядоченный набор идентификаторов.
Ну, например, я возьму тип Season, это будет: Winter, Spring, Summer и Autumn.
Иными словами говоря, это времена года.
Далее я могу предложить тип DayOfWeek.
Здесь перечислены дни недели.
И значения для перечислимого типа будут занимать 4 байта.
Далее, мы должны соблюдать правило при работе с этим
типом: что константа не может иметь двойного значения,
то есть она не может принадлежать двум перечислимым типам сразу.
Правда, из этого правила есть исключения, когда мы с вами задаем интервальный тип,
который мы рассмотрим чуть позже, то там такой случай возможен.
Но тем не менее описание, где у нас есть Years и Animals неправильно, недопустимо.
Чем оно недопустимо?
Если посмотреть внимательно, то мы видим,
что константа Dog принадлежит у нас и к тому типу, и к другому, так делать нельзя.
Рассмотрим интервальный тип.
Интервальный тип — это некоторое подмножество значений для
определенного типа базового.
Этим типом может быть целый тип, символьный, а также перечислимый тип.
И этот тип описывается в виде: a..b,
где a — это нижняя граница значений этого типа, ну а b — это верхняя граница.
Ниже приведены примеры.
Например, переменная a у нас находится в интервале от 0 до 10.
То есть значения переменной a могут быть любым целым числом в этом диапазоне.
Далее у нас есть переменная c.
Переменная c у нас принимает значение в интервале от a до z,
причем буквы используются строчные.
Мы с вами знаем,
что в кодировочной таблице латинские буквы упорядочены по алфавиту, во возрастанию.
А также переменная d, которая у нас с вами использует тип,
который мы рассматривали чуть раньше.
Это значение в диапазоне от понедельника до пятницы,
то есть это рабочие дни недели.
Мы можем сказать, что тип, на основе которого мы создаем наш интервальный тип,
называется базовым.
Значения интервального типа при хранении занимают 4 байта.
Теперь мы с вами говорили, что из правила,
что одна и та же константа не может быть членом двух разных типов, есть исключение.
Так вот оно, это исключение: одна и та же константа может принадлежать
двум различным перечислимым типам, если один из них есть интервал другого.
Например, я рассмотрю тип Year.
В тип Year я помещу сокращенные обозначения месяцев года.
И далее я рассмотрю тип Kvartal.
Тип Kvartal является интервалом над типом Year, он от января до марта,
это первый квартал.
И здесь константа: «январь»,
«февраль» и «март» принадлежат как одному типу, так и другому.
И это вполне допустимо.
Далее, мы должны понимать, что если мы делаем интервальный тип,
то мы имеем некоторое ограничение для выбора базового типа.
Например, мы не можем взять вещественный тип, ну, например,
взять интервал от 0 до числа «Пи»,
потому что базовый интервал является вещественными числами.
Этот тип не относится к порядковым значениям вещественного типа,
их очень много, их нельзя упорядочить по возрастанию.
Далее мы с вами должны рассмотреть такое понятие, как массив.
Массив является одним из базовых понятий программирования.
И они довольно часто встречаются при решении задач.
Итак, начнем с определения.
Массив есть пронумерованная поименованная совокупность данных одного типа.
Для каждого массива у нас есть имя и есть тип элементов.
Для всего массива тип элементов будет одинаков.
Что значит «пронумерованная»?
Это значит, что у каждого элемента массива есть свой уникальный номер.
«Поименованная» означает, что у массива есть имя.
Оно одинаковое для всех элементов.
И «совокупность данных одного типа» означает,
что в одном массиве все элементы обязательно одного и того же типа.
Мы можем изобразить, например, такой массив.
Для этого массива a является именем массива, номера элементов
в этом массиве в диапазоне от 1 до 5, и каждый элемент массива – целого типа.
То есть это одномерный целочисленный массив из 5 элементов.
Имя этого массива — a.
Далее рассмотрим, какие свойства есть у массива.
Во-первых, количество элементов массива в Pascal определяется сразу при описании
данного массива и в дальнейшем процессе работы программы меняться не должно.
Это так называемый статический массив.
Кроме того,
для обращения к элементам массива всегда используется следующий способ.
Мы сначала пишем имя массива,
а затем в квадратных скобках указываем номер элемента.
Причем номер элемента может быть либо константой, либо переменной
того же самого типа, какой мы с вами задали при объявлении массива.
Рассмотрим различные способы описания массивов, а также массивы,
содержащие элементы разных типов и некоторые способы нумерации элементов.
Массив можно описать, используя один из двух способов.
Можно использовать описания типа, а можно обойтись без него.
При описании массива мы применяем формат Type A = array [T1] of T2.
Здесь A — это имя типа, оно должно быть идентификатором,
который отличается от всех других идентификаторов,
используемых в программе, а также от стандартных идентификаторов.
T1 — это тип индекса, то есть номер элемента,
а T2 есть тип самих элементов массива.
После того как мы описали тип, нам необходимо объявить переменную этого типа,
потому что описание типа не приводит к выделению памяти для переменной.
И мы можем использовать вариант без описания типа, где вся необходимая
информация будет просто записана после имени переменной или группы переменных.
Например, если мы рассмотрим два следующих описания:
первое — Type mass = array [1..20] of real,
а затем Var a типа mass, это вариант, когда мы используем тип.
Но мы можем получить совершенно аналогичный результат,
если запишем: Var a: и дальше точно такое же описание типа,
то есть array [1..20] of real.
Способ с применением типов удобен, если мы с вами хотим использовать в
нашей программе подпрограммы — процедуры и функции, задав имя типа,
мы в дальнейшем указываем просто имя, а не описываем тип целиком.
И теперь рассмотрим, какие ограничения у нас существуют на типы T1 и T2.
Тип индекса должен быть непременно порядковым,
то есть обладать свойством упорядоченности.
При этом типы integer и real в качестве индексов использовать нельзя.
Тип integer имеет слишком широкий диапазон,
а тип real вообще не относится к порядковым.
Но в качестве индекса мы можем использовать литерный тип,
перечислимый тип и ограниченный тип.
При этом тип элементов массива может быть совершенно произвольным.
Посмотрим несколько примеров того, какие типы могут использоваться для
нумерации элементов и для самих элементов массива.
Например, тип mass — это массив, который состоит из данных
вещественного типа с номерами от 1 до 20.
Тип year — это у нас перечислимый тип,
и мы перечисляем на английском языке называния всех месяцев.
Тип temper представляет собой массив с нумерацией от января до декабря,
то есть в качестве индекса мы используем перечисляемый тип.
И тип элемента — это целое число в диапазоне от −40 до 40,
то есть это у нас, например, средняя температура для каждого месяца.
Далее, тип variant представляет собой массив, элементы которого
нумеруются при помощи букв английского алфавита (от a до z) of integer.
Для того чтобы использовать данные этих типов,
мы должны объявить переменные соответствующего типа.
Например, a будет типа mass, b будет принадлежать типу temper,
а c будет типом variant.
Можно изобразить схематически,
как выглядят массивы описанного типа и как произвести присваивание элементу.
Например, первый массив у нас имеет имя a,
номера элементов от 1 до 20, и мы можем,
к примеру, a первому присвоить значение, равное 3,14.
И точно так же мы можем обратиться к любому из номеров элемента.
Для второго массива: имя b, номером элемента
служит название месяца, и мы можем, например,
температуре января присвоить значение, равное −20.
Для третьего массива у нас имя c,
индексом служит латинская буква от a до z.
Причем буквы расположены по алфавиту, по возрастанию.
И мы можем, например, присвоить значению c['z'] число 125.
То есть номер элемента у нас соответствует типу,
который применен для нумерации, а значения элементов в каждом случае
соответствуют тому типу, который мы указали для элемента массива.
Рассмотрим программу для ввода данных
для одномерного массива и вывода элементов массива на экран.
Я использую константу lmax, равную 20 — это максимальное
количество элементов, которые можно поместить в данный массив.
Далее у меня есть тип для массива.
Это массив в нумерацией элементов от 1 до 20.
И тип каждого элемента — это вещественное число.
Далее у меня используется переменная для массива, это переменная a.
И две переменных целого типа n и i – это у меня длина массива и номер
текущего элемента.
Первым делом я должна ввести длину массива.
Я проверяю, что длина массива у меня находится в границах от 1 до lmax,
то есть от 1 до 20, и я буду повторять ввод данных до тех пор,
пока не получу правильные данные.
Далее я должна ввести собственно элементы массива.
Я подсказываю пользователю, что мне нужно столько элементов,
сколько он ввел в предыдущем операторе ввода.
И далее я читаю элементы по одному.
Затем я должна вывести то, что введено пользователем.
Я опять подсказываю, сколько элементов введено,
то есть количество элементов будет подставлено и выведено на экран,
и я вывожу элементы массива последовательно,
причем в данном случае они выводятся по одному элементу на каждой строке.
Запущу программу.
Если я введу длину массива, допустим, равную 5,
то на экране появляется надпись: «введите 5 элементов массива».
Далее я ввожу эти элементы, нажимаю на клавишу ввода,
и вот передо мной собственно эти элементы массива,
расположенные по 1 элементу на каждой строке.
Обращаю ваше внимание, что при данном
способе ввода я могу располагать элементы
массива как на одной строке, так и по одному на каждой строке.
Как в одной строке,
так и по одному на каждый строке.
Если я хочу, чтобы мои элементы выводились в одну строчку,
я изменю вывод следующим образом: я writeln заменю на write,
использую при выводе формат, [БЕЗ
ЗВУКА] и после того как вывод элементов
массива завершен, для красоты я просто перейду на следующую строку экрана.
Я запишу пустой оператор writeln, который будет просто переходить на новую строку.
Запустим программу.
И теперь мои элементы
располагаются в одной строке и промежутки между ними одинаковые.
Каждое из чисел занимает при выводе ровно 10 позиций.
Когда мы вводим элементы массива, в принципе,
мы могли бы тоже использовать не read, а readln.
Давайте посмотрим, чем будет отличаться этот вариант.
Предположим, у меня в массиве 3 элемента,
и если я ввожу их по одному
на каждой строке, то все работает.
Если же я попробую ввести те же самые 3 элемента,
но только в одну строку, то что произойдет в этом случае?
Первый элемент будет прочитан, а затем произойдет переход на новую строку.
То есть я буду вынуждена, по-другому никак нельзя,
располагать элементы массива только по одному на каждой строке.
Обращаю ваше внимание, что все те данные, которые у меня располагаются после 1,
были игнорированы первым оператором readln.
И только в таком варианте у меня будет ввод массива правильным.
Я считаю, что предпочтительнее первый вариант,
когда мы читаем данные при помощи оператора read,
когда мы с вами можем при вводе располагать элементы массива произвольным
образом — либо по одному на каждой строке, либо по несколько на каждой строке,
либо все элементы в одной строчке.
[МУЗЫКА]
[МУЗЫКА]