Что такое регулярный тип данных? Что такое массив?
Обсуждение вопроса:
Регулярный тип — это структурный тип данных, представляющих собой совокупность пронумерованных однотипных величин.
Массив — переменная величина регулярного типа.
Регулярный тип — это структурный тип данных, представляющих собой совокупность пронумерованных однотипных величин.
Массивом в Паскале называют переменную величину регулярного типа.
В общем случае массив – это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.
Массив – это составной объект, образованный из элементов (компонент) одного и того же типа. Такой тип данных применяется в программировании для обозначения объектов, аналогичных числовым последовательностям в математике, где сразу целая группа чисел обозначается одним именем (чаще всего буквой), а для обращения к каждому отдельному числу данной последовательности используются различные индексы (номера элементов).
Название регулярный тип (или ряды) массивы получили за то, что в них объединены однотипные (логически однородные) элементы, упорядоченные (урегулированные) по индексам, определяющим положение каждого элемента в массиве.
Массив это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.
Название регулярный тип (или ряды) массивы получили за то, что в них объединены однотипные (логически однородные) элементы, упорядоченные (урегулированные) по индексам, определяющим положение каждого элемента в массиве.
В качестве элементов массива можно использовать и любой другой ранее описанный тип, поэтому вполне правомерно существование массивов записей, массивов указателей, массивов строк и т.д. Элементами массива могут быть данные любого типа, включая структурированные. Тип элементов массива называется базовым. Особенностью языка Паскаль является то, что число элементов фиксируется при описании и в процессе выполнения программы не меняется.
Элементы, образующие массив, упорядочены таким образом, что каждому элементу соответствует совокупность номеров (индексов), определяющих его местоположение в общей последовательности. Индекс представляет собой выражение любого порядкового типа. Чтобы обратиться к элементу массива, надо указать его базовое имя и индекс (номер).
Описание массива.
Массивы можно описать 2-мя способами: через описание типа массива и простое описание:
Описание через тип:
Простое описание:
Общий вид описания массива
правильный идентификатор;
ARRAY, OF
служебные слова (массив, из);
список из одного или нескольких индексных типов, разделённых запятыми;
любой тип Паскаля.
Если в форме описания массива задан один индекс, массив называется одномерным, если два индекса двумерным, если n индексов n-мерным. Одномерный массив соответствует понятию линейной таблицы (вектора), двумерный понятию прямоугольной таблицы (матрицы).
Примеры описаний массивов разной размерности:
В место числа, точной ссылки на элемент, можно подставить переменную (математическое выражение) порядкового типа, значение которой(ого) не выходят за пределы диапазона массива.
Индексированные элементы массива называются индексированными переменными и могут быть использованы так же, как и простые переменные. Например, они могут находиться в выражениях в качестве операндов, использоваться в операторах FOR, WHILE, REPEAT, CASE, входить в качестве параметров в операторы READ, READLN, WRITE, WRITELN; им можно присваивать любые значения, соответствующие их типу.
Заполнение массива
Инициализация (присваивание начальных значений) массива заключается в присваивании каждому элементу массива значения, соответствующего базовому типу. Наиболее эффективно эта операция выполняется с помощью оператора FOR.
Паскаль не имеет средств ввода-вывода элементов массива сразу, поэтому ввод и вывод значений производится поэлементно. Значения элементам массива можно присвоить с помощью оператора присваивания, однако чаще всего они вводятся с помощью оператора READ или READLN с использованием оператора цикла FOR (см. выше).
Операции над массивами
Для работы с массивом как единым целым используется идентификатор массива без указания индекса в квадратных скобках. Массив может участвовать только в операциях отношения «равно», «не равно» и в операторе присвоения. Массивы, участвующие в этих действиях, должны быть идентичны по структуре, т.е. иметь одинаковые типы индексов и одинаковые типы компонентов. Например, если массивы описаны так
то применение к ним допустимых операций даст следующий результат:
A = B
True, если значение каждого элемента массива А равно соответствующему значению элемента массива В;
A <> B
True, если хотя бы одно значение элемента массива А не равно значению соответствующего элемента массива В;
A := B
Все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В остаются неизменны.
Если массивы описаны следующим образом
то к ним не применимы перечисленные выше операции (т.е. возникнет ошибка при попытке их использования).
В предыдущем уроке мы ввели понятие структурированных данных.
Изучение данных структурированного типа начнем с регулярного типа данных — массивов.
Название регулярный тип массивы получили за то, что в них объединены однотипные элементы, упорядоченные (урегулированные) по индексам, определяющим положение каждого элемента в массиве.
Массив — структурированный тип данных, состоящий из фиксированного числа однотипных элементов, объединённых одним именем, где каждый элемент имеет свой номер (индекс).
Когда возникает необходимость использовать массивы?
Рассмотрим следующую задачу: ввести с клавиатуры 30 целых чисел и вычислить их сумму, при этом каждое из чисел сохранить в памяти для последующей обработки.
Мы будем вынуждены ввести 30 имен переменных, что, естественно, очень неудобно. Как быть?
В этом случае лучше организовать массив. Имя у всех элементов будет общее. Чтобы получить доступ к элементу, достаточно будет указать имя массива и его порядковый номер.
И так, массивы будем использовать тогда, когда нужно обработать большой объем однотипной информации, которую необходимо сохранить в памяти для последующей обработки.
Определим еще несколько понятий, связанных с массивами.
Элемент массива — отдельная переменная, входящая в массив.
Размерность массива — количество индексов, по которым определяется положение элемента в массиве.
Индексы элемента массива — совокупность номеров, определяющих его местоположение в массиве.
Чтобы лучше понять, что такое размерность массива, сравним их с таблицами.
Одномерный массив сравним с таблицей, состоящей из одной строки. Для определения положения элемента в строке достаточно знать порядковый номер ячейки, в которой находится элемент. Поэтому в одномерном массиве один индекс — порядковый номер элемента.
Двумерный массив — прямоугольная таблица. Для определения положения элемента в прямоугольной таблице нужно знать порядковый номер строки и столбца, на пересечении которых находится ячейка. Поэтому в двумерном массиве — два индекса, номер строки и номер столбца.
И так, потребность использовать массив возникает всякий раз, когда при решении задачи приходится иметь дело с большим, но конечным количеством однотипных данных, которые необходимо хранить в памяти.
Переходим к изучению массивов.
Описание массива
Прежде чем использовать массив в программе, его необходимо предварительно описать. Описать массив — значит выделить в памяти место, достаточное для хранения всех его элементов. Для этого надо указать имя массива и длину массива — количество элементов в нем. В большинстве случаев при задании размеров массива используются диапазоны изменения значений индекса.
При описании массива используется зарезервированное слово array (массив), указываются диапазон изменения для индексов и тип компонентов массива.
Способ 1. Описание массива с определением типа.
Способ 2. Описание массива без определения типа.
Двумерный массив описывается так же, как и одномерный. Различие состоит в том, что вы должны указать диапазон для двух индексов массива — положение каждого элемента массива A[i, j] определяется номером строки и номером столбца.
Например, описание двумерного массива натуральных чисел размера N x М может быть задано следующей строкой:
Вернемся к нашей задаче. У нас 30 целых чисел, выделим для них 30 ячеек, объединим их общим именем А.
№
A
Имя А — это общее имя для всех элементов. Элементы массива — это числа, их 30
1
25
2
64
3
27
…
…
29
53
30
89
Опишем одномерный массив из 30 целых чисел для этой задачи следующим образом:
Напомним, что раздел типов начинается со служебного слова type, после этого идет имя нового типа и его описание. Между именем типа и его описанием ставится знак «равно» (в разделе переменных между именем переменной и её описанием ставится двоеточие).
myarray — это имя нового типа;
array — служебное слово (в переводе с английского означает «массив», «набор»);
[1..30] — в квадратных скобках указывается номер первого элемента, затем, после двух точек, номер последнего элемента массива, в этом примере первый элемент имеет номер 1, а последний — номер 30;
Of — служебное слово (в переводе с английского — «из»);
Integer — тип всех элементов массива.
Так как каждый элемент имеет свой номер, то к каждому элементу можно обращаться непосредственно. Для того чтобы получить доступ к i-му элементу этого массива, необходимо записать: A[i] — сначала имя массива, а в квадратных скобках указывается номер элемента, к которому обращаемся, — i.
Например, обращаемся к первому элементу массива А — А[1], а к пятому — А[5].
Тот же самый массив может быть задан и при определении соответствующей переменной:
Особенность языка Паскаль
Особенностью языка Паскаль является то, что число элементов массива фиксируется при описании и в процессе выполнения программы не меняется. Это считается недостатком языка, так как не во всех программах можно заранее предсказать необходимый размер массива (который может определяться в зависимости от тех или иных условий, возникающих в процессе исполнения).
Для решения этой проблемы используют прием, позволяющий имитировать работу с массивами переменной длины, который заключается в следующем: в разделе описания предварительно определяют возможное максимальное значение размера массива, а затем в программе запрашивают текущее значение размера и используют это значение далее при заполнении и обработке массива.
На следующем уроке мы рассмотрим основные алгоритмы, которые используются при обработке данных, хранящихся в массиве.
Урок 48. Массивы. Описание массивов на Паскале. Правила организации ввода и вывода значений массива
Массивы
Массивом в Паскале называют переменную величину регулярного типа.
Регулярный тип — это структурный тип данных, представляющих собой совокупность пронумерованных однотипных величин.
Описание массивов. Переменная регулярного типа описывается в разделе описания переменных в следующей форме:
Var : array[ ] of
В данном случае квадратные скобки — это обязательные символы, которые называются индексными скобками. Чаще всего в качестве типа индекса употребляется ограниченный тип. Например, массив вещественных чисел, хранящий 12 значений среднемесячных температур в течение года, опишется так:
Var Т: array[1..12] of Real;
Описание массива определяет, во-первых, размещение массива в памяти, во-вторых, правила его дальнейшего употребления в программе.
Элемент массива идентифицируется в виде переменной с индексами:
Тип индекса может быть любым скалярным порядковым типом, кроме Integer. Например, в программе могут присутствовать следующие описания:
Var cod: array[Char] of 1..100; L: array[Boolean] of Char;
В такой программе допустимы следующие обозначения элементов массивов:
cod[‘x’]; Lftrue]; cod[chr(65) ] ; L[a>0].
В некоторых случаях бывает удобно в качестве индекса использовать перечислимый тип. Например, данные о количестве учеников в четырех десятых классах одной школы могут храниться в следующем массиве:
Type Index = (А, В, С, D) ;
Var class_10: array[Index] of Byte;
И если, например, элемент class 10 [А] равен 35, то это означает, что в 10А классе 35 человек. Такое индексирование улучшает наглядность программы.
Часто структурному типу присваивается имя в разделе типов, которое затем используется в разделе описания переменных.
Type Masl = array [1..100] of Integer;
Mas2 = array [-10.. 10] of Char;
Var Num: Masl; Sim: Mas2;
До сих пор речь шла об одномерных массивах, в которых типы элементов скалярные.
Многомерный массив в Паскале трактуется как одномерный массив, тип элементов которого также является массивом (массив массивов).
В качестве примера рассмотрим таблицу с информацией о среднемесячных температурах за 10 лет, например с 2001 по 2010 год. Очевидно, для этого удобна прямоугольная (двумерная) таблица, в которой столбцы соответствуют месяцам, а строки — годам.
Для обработки такой таблицы в программе следует описать массив:
Var Тabl: array[2001..2010] of array[1.. 12] of Real;
Вот примеры обозначения некоторых элементов этого массива:
Однако чаще употребляется другая, эквивалентная форма обозначения элементов двумерного массива:
Переменная ТаЫ [2 001] обозначает всю первую строку таблицы, т. е. весь массив температур за 2001 год. Другим эквивалентным вариантом приведенному выше описанию является следующее:
Туре Month = array [1..12] of Real;
Year = array [2001..2010] of Month;
Var Tabl: Year;
Наиболее краткий вариант описания данного массива такой:
Var Tabl: array [2001.. 2010, 1..12] of Real;
Продолжая по аналогии, можно определить трехмерный массив как одномерный массив, у которого элементами являются двумерные массивы. Вот пример описания трехмерного массива:
Var A: array[1..10, 1..20, 1..30] of Integer;
Это массив, состоящий из 10 • 20 • 30 = 6000 целых чисел и занимающий в памяти 6000 • 2 = 12 000 байтов. В Паскале нет ограничения сверху на размерность массива. Однако в каждой конкретной реализации Паскаля ограничивается объем памяти, выделяемый под массивы. В Турбо Паскале это ограничение равно 64 килобайтам.
По аналогии с математикой одномерные числовые массивы часто называют векторами, а двумерные — матрицами.
В Паскале не допускается употребление динамических массивов, т. е. таких, размер которых определяется в процессе выполнения. Изменение размеров массива происходит через изменение в тексте программы и повторную компиляцию. Для упрощения таких изменений удобно определять индексные параметры в разделе констант:
Const Imax = 10; Jmax = 20;
Var Mas: array[1..Imax, l..Jmax] of Integer;
Теперь для изменения размеров массива Mas и всех операторов программы, связанных с этими размерами, достаточно отредактировать только одну строку в программе — раздел констант.
Действия над массивом как единым целым. Такие действия допустимы лишь в двух случаях:
• присваивание значений одного массива другому; • применение к массивам операций отношения «равно», «не равно».
В обоих случаях массивы должны иметь одинаковые типы (тип индексов и тип элементов).
Пример 1
Var Р, Q: array [1.. 5, 1..10] of Real;
При выполнении операции присваивания
все элементы массива Р станут равными соответствующим элементам массива Q.
Пример 2
Как уже отмечалось, в многомерных массивах переменная с индексом может обозначать целый массив. Тогда если массив ТаЫ описан так:
Type mas = array [1..12] of Real;
Var Таbl: array [2001.. 2010] of mas;
и в нем требуется данные за 2009 год сделать такими же, как за 2001 год (девятой строке присвоить значение первой строки), то это можно сделать одним присваиванием:
Таbl [2009] : =Таbl [2001]
А если нужно поменять местами значения этих строк, то это делается через третью переменную того же типа:
Р:=Таbl [2009] ; Таbl [2009] : =Таbl [2001 ] ; Таbl [2001] :=Р; где Р описана так:
Var Р: mas;
Ввод и вывод массивов производятся покомпонентно. Вот примеры ввода с клавиатуры значений одномерного и двумерного массивов:
For I: =1 То 12 Do
For I:=l To Imax Do
For J:=l To Jmax Do
Здесь каждое следующее значение будет вводиться с новой строки. Для построчного ввода используется оператор Read.
Аналогично в цикле по индексной переменной организуется вывод значений массива на экран. Например:
For I: =1 То 12 Do Write (Т [ I ] : 8 : 4 ) ;
Напомним, что модификатор формата 8:4 означает вывод числа в формате с фиксированной точкой в 8 позициях, из которых в 4 последних позициях размещается дробная часть.
Следующий фрагмент программы организует построчный вывод матрицы на экран:
После вывода очередной строки матрицы оператор Writeln без параметров переведет курсор в начало новой строки. Следует заметить, что в последнем примере матрица на экране будет получена в естественной форме прямоугольной таблицы, если Jmax не превышает 12 (подумайте почему).
Вопросы и задания
1. Что такое регулярный тип данных? Что такое массив?
2. Какие типы допустимы для индексов массива?
3. Как в Паскале трактуется многомерный массив?
4. Какие действия можно выполнять над массивом как единым целым?
5. Дан вектор , i = 1, …, 50. Составьте программу ввода значений и вычисления длины этого вектора по следующей формуле:
Все простые типы данных, рассматриваемые ранее, имеют два характерных свойства: неделимость и упорядоченность их значений. Составные, или структурированные типы данных задают множество сложных значений с одним общим именем. Существует несколько методов структурирования, каждый из которых отличается способом обращения к отдельным компонентам. В данном учебном пособии будут рассмотрены только два структурированных типа данных: регулярный тип (массивы) и строковый тип.
С понятием «массив» приходится встречаться при решении научно-технических, экономических задач обработки большого количества однотипных значений.
Таким образом, массив – это упорядоченная последовательность данных, состоящая из фиксированного числа элементов, имеющих один и тот же тип, и обозначаемая одним именем.
Название регулярный тип массивы получили за то, что в них объединены однородные элементы, упорядоченные (урегулированные) по индексам, определяющим положение каждого элемента в массиве.
Массиву присваивается имя, посредством которого можно ссылаться на него как на единое целое. Элементы, образующие массив, упорядочены так, что каждому элементу соответствует совокупность номеров (индексов), определяющих его место в общей последовательности. Индексы представляют собой выражения простого типа. Доступ к каждому отдельному элементу осуществляется обращением к имени массива с указанием индекса нужного элемента:
Чтобы использовать массивы в программах, нужно их описать в разделе описаний. Тип массива не является стандартным, поэтому его необходимо описать в части описания типов. Описание типа массива определяет его имя, размер массива и тип данных:
type =array[ ] of ;
Далее, в перечне переменных указывается имя массива и через двоеточие указывается имя нового типа данных:
Массив может быть описан и без представления типа в разделе описания типов данных:
var :array[ ] of ;
Этот вариант описания короче, но в некоторых случаях, когда описание переменных типа массив встречается несколько раз в различных частях программы, необходимо описание этого типа отдельно, как приведено в первом варианте.
Чаще всего в качестве типа индекса используется интервальный целый тип.
1. Одномерные массивы
Линейный (одномерный) массив – массив, у которого в описании задан только один индекс; если два индекса, то это двумерный массив и т. д. Одномерные массивы часто называют векторами, т. е. они представляют собой конечную последовательность пронумерованных элементов. Пример описания одномерного массива:
type vec=array[1..5] of real;
var x:vec;
var x: array[1..5] of real;
Оба из вариантов описывают одномерный массив x, состоящий из 5 вещественных элементов.
Присваивание начальных значений (заполнение массива) заключается в присваивании каждому элементу массива некоторого значения заданного типа. Наиболее эффективно эта операция осуществляется при помощи оператора for. Ввод данных может осуществляться: с клавиатуры, из файла данных, при помощи различных формул, в том числе и датчика случайных чисел.
Индексированные элементы массива называются индексированными переменными и могут быть использованы так же, как и простые переменные. Например, они могут находиться в выражениях в качестве операндов, им можно присваивать любые значения, соответствующие их типу, и т. д.
Алгоритм решения задач с использованием массивов:
1.1. Заполнение массива
Рассмотрим типичные варианты заполнения массива х, описанного выше.
Заполнение всех элементов массива числом 1 :
for i:=1 to 5 do x[i]:=1;
Заполнение всех элементов массива случайными числами из диапазона 0–9 :
for i:=1 to 5 do x[i]:=random(9);
Заполнение всех элементов массива при помощи ввода с клавиатуры:
for i:=1 to 5 do
begin
readln(x[i]);
1.2. Вывод массива на экран
Вывод массива на экран в одну строку без пояснений:
for i:=1 to 5 do writeln(x[i]:6:1);
Вывод массива на экран в столбец с пояснениями. Этот вариант гораздо нагляднее. Старайтесь использовать его:
for i:=1 to 5 do writeln(‘x[’,i,‘]=’,x[i]:6:1);
1.3. Работа с массивами
Пример 6.1. Определить самую высокую температуру и самый теплый день в мае.
program massiv;
uses crt;
var t:array[1..31] of integer;
i,max,n:integer;
begin
Clrscr;
for i:=1 to 31 do
begin
t[i]:=random(20);
write(t[i],‘ ’);
writeln;
max:=t[1]; n:=1;
for i:=2 to 31 do
begin
if t[i]>max then
begin max:=t[i]; n:=i; end;
writeln(‘t-макс.= ’,max,‘ в ’,n, ‘день’);
2. Двумерные массивы
Двумерный массив – структура данных, хранящая прямоугольную матрицу. В матрице каждый элемент определяется номером строки и номером столбца, на пересечении которых он расположен. В Паскале двумерный массив представляется массивом, элементами которого являются одномерные массивы. Два следующих описания двумерных массивов тождественны:
var a:array [1..5] of array [1..6] of real;
var a:array [1..5,1..6] of real;
Чаще всего при описании двумерного массива используют второй способ. Так же как и для одномерных массивов, для двумерных можно использовать отдельно описание нового типа массива, а затем описывать переменную, используя этот тип:
type matr=array [1..5,1..6] of integer;
var a:matr;
Доступ к каждому отдельному элементу осуществляется обращением к имени массива с указанием индексов (первый индекс – номер строки, второй индекс – номер столбца). Все действия над элементами двумерного массива идентичны действиям над элементами линейного массива. Только для инициализации двумерного массива используется конструкция, когда один цикл for вложен в другой. Например:
for i:=1 to 5 do
for j:=1 to 6 do
a[i,j]:=0;
При организации вложенных (сложных) циклов необходимо учитывать:
2.1. Заполнение матрицы
Рассмотрим типичные варианты заполнения матрицы a, описанной выше.
Заполнение всех элементов матрицы случайными числами из диапазона 1 – 9 :
for i:=1 to 5 do
for j:=1 to 6 do
a[i,j]:=random(9);
Заполнение всех элементов матрицы при помощи ввода с клавиатуры:
for i:=1 to 5 do
for j:=1 to 6 do
begin
readln(a[i,j]);
2.2. Вывод матрицы на экран
Вывести на экран матрицу 5 ´ 6 можно следующим образом:
for i:=1 to 5 do
begin
for j:=1 to 6 do
2.3. Работа с матрицами
Работа с матрицами осуществляется также поэлементно.
Пример 6.2. Сформировать таблицу Пифагора (таблица умножения) и вывести ее на экран.
program pifagor;
uses crt;
var p:array [1..9,1..9] of integer;
i,j:integer;
begin
Clrscr;
for i:=1 to 9 do
for j:=1 to 9 do
p[i,j]:=i*j;
for i:=1 to 9 do
begin
for j:=1 to 9 do
write(p[i,j]:4);
writeln;
program massiv;
uses crt;
var b:array[1..10,1..10] of integer;
i,j,s:integer;
begin
Clrscr;
for i:=1 to 10 do
begin
for j:= 1 to 10 do
begin
b[i,j]:=random(20)-10;
write(b[i,j]:4);
writeln;
for i:=1 to 10 do
s:=s*b[i,11-i];
writeln(‘Произведение = ’,s);
Пример 6.4. Ввести с клавиатуры матрицу В(5, 5) и поменять местами первый и последний столбец.