Массивы в Pascal

Что такое массивы и матрицы. Как их объявить и использовать в языке программирования Pascal. Открытые массивы.

Заполнение одномерного массива

for i := 1 to N do begin write(‘Введите значение a[‘, i, ‘] = ‘); readln(a[i]); end;

Работа с одномерными массивами на языке программирования Паскаль

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

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

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

Описание и выделение памяти

Динамический массив описывается так:

begin var a: array of integer;end.

Память под динамический массив a выделяется в момент работы программы:

begin var a: array of integer; var n := ReadInteger; a := new integer[n];end.

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

Можно совместить описание и выделение памяти — тип динамического массива выводится автоматически:

begin var n := ReadInteger; var a := new integer[n];end.

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

begin var n := ReadInteger; var a := |0| * n;end.

Создание динамического массива

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

var<имя массива>: arrayof<тип элементов массива>;

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

Пример задания длины массива:

Ввод:var a: array of integer;
begin
writeln(‘Length1: ‘, length(a));
Setlength(a, 2);
writeln(‘Length2: ‘, length(a));
Setlength(a, 4);
writeln(‘Length3: ‘, length(a));
end.
Вывод:Length1: 0
Length2: 2
Length3: 4

Ввод массива в Паскале с клавиатуры.

Ввод массива в Паскале с клавиатуры.

programMas_Read_Task;//Ввод массива в Паскале с клавиатурыvari:word;// задаем размерность массива. Индекс массива 1 по 10// тип элементов массива Integeri_MasNum:array[1..10]ofinteger;begin//заполяем массивReadln(i_MasNum[i]);// ввод i- го элемента производится с клавиатуры//завершение работы программыWriteLn(‘Нажмите <Enter>, чтобы выйти.’);ReadLn();end.

Ссылки

  • Программы для начинающих
  • Сайт PascalABC.NET: Программы и алгоритмы для начинающих

Одномерный числовой массив

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

одномерный массив в паскалеОдномерный массив. Обозначение элементов

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

Индексация в динамических массивах и использование статических массивов

Динамические массивы индексируются с нуля — это эффективно. В качестве индексов в динамических массивах могут выступать только целые.

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

var a := array [‘a’..‘z’] of integer;

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

Циклы по массиву

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

  1. Цикл for по индексам (если требуется менять элементв или нужна информация об индексах)
    for var i:=0 to a.Length1 do a[i] *= 2;
  2. Цикл foreach по элементам (если индексы не видны и мы не меняем массив)
    var sum := 0;foreach var x in a do sum += x;
  3. Цикл foreach по индексам
    foreach var i in a.Indices do a[i] += 2;
  4. Цикл foreach по диапазону индексов
    var (K,L) := ReadInteger2;foreach var i in K..L do a[i] := 777;

Пример. Найти количество чётных элементов, стоящих на чётных местах

begin var a := ArrRandomInteger(10); a.Println; var count := 0; foreach var i in a.Indices do if i.IsEven and a[i].IsEven then count += 1; Print(count); end.

Двумерные и многомерные массивы

Размерность массивом может быть разной. 

Двумерные хранилища и многомерные – это наборы, в которых хранятся переменные во втором или n-м измерении, имеющие n * m мест хранения. 

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

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

Пример двумерного массива

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

В Паскале эта декларация записывается как единый блок:

TYPE DayType = INTEGER;

DayNames = (Sun, Mon, Tue, Wed, Thu, Fri, Sat);

WeekType = ARRAY [DayNames] OF DayType;

MonthType = ARRAY [1..6] OF WeekType;

Тип MonthType также может быть записан как:

TYPE MonthType = ARRAY [1..6] OF

ARRAY [DayNames] OF DayType;

Можно записать с использованием ярлыка, как:

Тип MonthType = ARRAY [1..6, DayNames] OF DayType;

DayNames = (Вс,Пн,Вт,Ср,Чт,Пт,Сб);

WeekType = ARRAY [DayNames] OF DayType;

MonthType = ARRAY [1..6] OF WeekType;

Другой пример двумерного массива в Pascal:

Задание двумерного массива

Примеры работы с динамическими массивами

Ввод массива

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

Пример ввода массива:

var c: array of integer;
n, i: integer;
begin
read(n); // вводим длину с клавиатуры
SetLength(c,n); // задаём длину массива
fori := 0 to n-1 do
read(c[i]); // вводим n элементов массива
end.

Вывод массива

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

var c: array of integer;
i: integer;
begin
SetLength(c, 5); // задаём длину
fori := 0 to 4 do
c[i] := 1; // заполняем массив единицами
fori := 0 to 4 do
write(c[i], ‘ ‘); // выводим элементы через пробел
end.

Изменение размера динамического массива

Если в процессе работы программы требуется чтобы динамический массив менял свой размер, то следует … пользоваться типом List!Это — динамический массив с возможностью эффективного измненения размера и рядом дополнительных методов. Основным является методы Add — добавить в конец:

begin var l := new List<integer>; l.Add(1); l.Add(3); l.Add(5); l.Printend.

Для первоначального заполнения списков List используется короткая фунеция Lst:

begin var l := Lst(1,3,5); l.Printend.

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

begin var l := Lst(1,3,5); var a := l.ToArray;end.

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: