На занятии объясняется, как работать с одномерными массивами в Паскале, как использовать генератор случайных чисел — функцию random в Паскале. Рассматривается пример того, как вывести числа Фибоначчи
Материалы сайта labs-org.ru направлены на практическое освоение языка программирования Pascal. Краткие теоретические сведения не претендуют на полное освещение материала по теме; необходимую информацию можно найти в сети Интернет в большом количестве. В наши же задачи входит предоставление возможности получения практических навыков программирования на Паскале. Решенные наглядные примеры и задания изложены по мере увеличения их сложности, что позволит с легкостью изучить материал с нуля.
Содержание:
- Одномерные массивы в Паскале
- Объявление массива
- Инициализация массива
- Вывод элементов массива
- Динамические массивы (pascalAbc.Net)
- Функция Random в Pascal
- Числа Фибоначчи в Паскале
- Максимальный (минимальный) элемент массива
- Поиск в массиве
- Циклический сдвиг
- Перестановка элементов в массиве
- Выбор элементов и сохранение в другой массив
- Сортировка элементов массива
Одномерные массивы в Паскале
Объявление массива
Массивы в Паскале используются двух типов: одномерные и двумерные.
Определение одномерного массива в Паскале звучит так: одномерный массив — это определенное количество элементов, относящихся к одному и тому же типу данных, которые имеют одно имя, и каждый элемент имеет свой индекс — порядковый номер.
Описание массива в Паскале (объявление) и обращение к его элементам происходит следующим образом:
Объявление массива
var dlina: array [1..3] of integer; begin dlina[1]:=500; dlina[2]:=400; dlina[3]:=150; ...
dlina
— идентификатор (имя) массива;Array
(в переводе с англ. «массив» или «набор»);[1..3]
— в квадратных скобках ставится номер (индекс) первого элемента, затем две точки и индекс последнего элемента массива, т.е. по сути, указывается количество элементов; количество элементов массива называется размерностью массиваof integer
(с англ. «из целых чисел») — указывает, к какому типу относится массив, of здесь — служебное слово.Объявить размер можно через константу:
Инициализация массива
Кроме того, массив может быть сам константным, т.е. все его элементы в программе заранее определены. Описание такого массива выглядит следующим образом:
const a:array[1..4] of integer = (1, 3, 2, 5);
Заполнение последовательными числами:
Результат: A[1] = 8, A[2] = 9, A[3] = 10, ..., A[N] = A[N-1] + 1
Ввод с клавиатуры:
Пример: Рассмотрим, как происходит ввод массива в Паскале:
writeln ('введите кол-во элементов: '); readln(n); {если кол-во заранее не известно, - запрашиваем его} for i := 1 to n do begin write('a[', i, ']='); read(a[i]); ... end; ...
✍ Пример результата:
введите кол-во элементов: 3 a[1]=5 a[2]=7 a[3]=4
Вывод элементов массива
Пример: Рассмотрим, как вывести массив в Паскале:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var a: array[1..5] of integer; {массив из пяти элементов} i: integer; begin a[1]:=2; a[2]:=4; a[3]:=8; a[4]:=6; a[5]:=3; writeln('Массив A:'); for i := 1 to 5 do write(a[i]:2); {вывод элементов массива} end. |
✍ Пример результата:
Для работы с массивами чаще всего используется в Паскале цикл for с параметром, так как обычно известно, сколько элементов в массиве, и можно использовать счетчик цикла в качестве индексов элементов.
Задача Array 0. Необходимо задать вещественный массив размерностью 6 (т.е. из шести элементов); заполнить массив вводимыми значениями и вывести элементы на экран. Использовать два цикла: первый — для ввода элементов, второй — для вывода.
Пример результата:
введите элемент массива: 3.0 введите элемент массива: 0.8 введите элемент массива: 0.56 введите элемент массива: 4.3 введите элемент массива: 23.8 введите элемент массива: 0.7 Массив = 3, 0.8, 0.56, 4.3, 23.8, 0.7
[Название файла: taskArray0.pas
]
В данном примере работы с одномерным массивом есть явное неудобство: присваивание значений элементам.
Обработка массивов в Паскале, так же как и заполнение массива, происходит обычно с использованием цикла for
.
Динамические массивы (pascalAbc.Net)
Основным недостатком статических массивов является то, что их размер нельзя задать с учетом текущих обрабатываемых данных. Приходится описывать массивы с максимально возможным значением количества элементов, выделяя для них столько памяти, сколько может потребоваться для хранения самой большого из возможных наборов исходных данных.
Объявление:
var a: array of integer; var n:=readInteger; a:=new integer[n]; // инициализация, выделение памяти для элементов массива
или:
var a: array of integer; var n:=readInteger; SetLength(a,n); // устанавливаем размер
Аналогичным образом массивы могут описываться в качестве параметров подпрограмм, например:
procedure p(a: array of integer);
Созданные элементы сразу получают начальное значение, равное нулевому значению соответствующего типа: для чисел это целый или вещественный нуль, для символов — символ с кодом 0, для строк и других ссылочных типов данных — нулевая ссылка nil
Объявление и инициализация массива:
Пример:
begin var a: array of integer; a := new integer[3]; a[0] := 5; a[1] := 2; a[2] := 3; end.
или в одну строку:
begin var a: array of integer; a := new integer[3](5,2,3); print(a) end.
или короткая запись:
var a:=Arr(1,2,3);// по правой части - integer
Элементы динамического массива всегда индексируются от 0.
Ввод элементов:
Пример:
var a:=ReadArrInteger(5); // ввод пяти целых var a:=ReadArrReal(5); // ввод пяти вещественных
Функции генерации массивов:
1. ArrFill :
var a := ArrFill(10, 1); // массив из 10 целых чисел, равных 1
2. ArrGen :
var a := ArrGen(ReadInteger, 1, e -> e + 2); // массив, состоящий из n первых положительных нечетных чисел a.Print;
Проход по элементам массива:
Пример:
for var i:=0 to a.Length-1 do a[i] += 1;
или:
for var i := 0 to a.High do a[i] += 1;
Проход по элементам (только для чтения):
Пример:
foreach var x in a do Print(x)
Length
Low
и High
, определяющие соответственно нижнюю и верхнюю границу диапазона изменения индекса. Свойство a.Low
всегда возвращает 0, а свойство a.High
определяется как a.High = a.Length – 1
Простой вывод элементов:
Writeln(a); // пример вывода: [1,5,3,13,20]
или метод массива Print
:
a.Print; // пример вывода: 1 5 3 13 20 a.PrintLines; // каждый элемент с новой строки
Функция Random в Pascal
Для того чтобы постоянно не запрашивать значения элементов массива используется генератор случайных чисел в Паскаль, который реализуется функцией Random
. На самом деле генерируются псевдослучайные числа, но суть не в этом.
Для генерации чисел от 0
до n
(не включая само значение n
, целые числа в интервале [0,N)) используется запись random (n)
.
Перед использованием функции необходимо инициализировать датчик случайных чисел с помощью процедуры randomize
.
Диапазон в Паскале тех самых случайных чисел от a
до b
задается формулой:
Пример: Заполнение массива случайными числами в Pascal:
1 2 3 4 5 6 7 8 9 10 |
var f: array[1..10] of integer; i:integer; begin randomize; for i:=1 to 10 do begin f[i]:=random(10); { интервал [0,9] } write(f[i],' '); end; end. |
✍ Пример результата:
Для вещественных чисел в интервале [0,1):
var x: real; ... x := random(0.0,1.0);; { интервал [0,1), т.е. единица не включена }
PascalABC.NET
:
var (a, b, c) := Random3(10.0, 20.0); // диапазон [10, 20) write(a:0:2,' ',b:0:2,' ', c:0:2) // 14.73 18.63 19.72
Пример:
var a:=arrRandomInteger(10);
или с дополнительными параметрами (диапазон [5;15]):
var a:=arrRandomInteger(10,5,15);
Задача Array 1. Необходимо задать массив размерностью 5, заполнить массив случайными числами в интервале [-1,1] и вывести элементы на экран: определить три позиции для вывода каждого элемента, с двумя знаками после запятой.
Пример результата:
Массив = 0.22 0.00 -0.69 -0.35 -0.11
[Название файла: taskArray1.pas
]
Числа Фибоначчи в Паскале
Наиболее распространенным примером работы с массивом является вывод ряда чисел Фибоначчи в Паскаль. Рассмотрим его.
Пример: Ряд чисел Фибоначчи: 1 1 2 3 5 8 13…
f[0]:=1; f[1]:=1; f[2]:=2; …или
f[2]:=f[0]+f[1]; f[3]:=f[1]+f[2];или
Получили формулу элементов ряда.
Пример: Вычислить и распечатать первые 20 чисел Фибоначчи.
1 2 3 4 5 6 7 8 9 10 11 |
var i:integer; f:array[0..19]of integer; begin f[0]:=1; f[1]:=1; for i:=2 to 19 do begin f[i]:=f[i-1]+f[i-2]; writeln(f[i]) end; end. |
На данном примере, становится понятен принцип работы с числовыми рядами. Обычно, для вывода числового ряда находится формула определения каждого элемента данного ряда. Так, в случае с числами Фибоначчи, эта формула-правило выглядит как f[i]:=f[i-1]+f[i-2]
. Поэтому ее необходимо использовать в цикле for
при формировании элементов массива.
Задача Array 2. Дан ряд из 10 произвольных чисел: a[1], a[2], ... , a[10]
(использовать функцию random()
). Подсчитать и напечатать суммы троек стоящих рядом чисел: a[1]+a[2]+a[3]
, a[2]+a[3]+a[4]
, a[3]+a[4]+a[5]
, …… , a[8]+a[9]+a[10]
Пример результата:
Массив = 2 0 4 29 3 11 26 11 9 4 mas[1] + mas[2] + mas[3] = 6 mas[2] + mas[3] + mas[4] = 33 mas[3] + mas[4] + mas[5] = 36 mas[4] + mas[5] + mas[6] = 43 mas[5] + mas[6] + mas[7] = 40 mas[6] + mas[7] + mas[8] = 48 mas[7] + mas[8] + mas[9] = 46 mas[8] + mas[9] + mas[10] = 24
[Название файла: taskArray2.pas
]
Задача Array 3. Написать программу решения задачи о печати ряда чисел 2 4 8 16 32 ... 512
; для заполнения массива использовать цикл Repeat
[Название файла: taskArray3.pas
]
Максимальный (минимальный) элемент массива
Псевдокод:
Поиск максимального элемента по его индексу:
PascalABC.NET
:
Минимальный элемент и его индекс:
Решение 1:
// … var (min, minind) := (a[0], 0); for var i:=1 to a.Length-1 do if a[i]<min then (min, minind) := (a[i], i); Result := (min, minind);
Решение 2:
// … var (min, minind) := (real.MaxValue, 0); for var i:=0 to a.Length-1 do if a[i]<min then (min, minind) := (a[i], i); Result := (min, minind);
Решение 3:
begin var a := new integer[5]; a := arrRandomInteger(5); // [86,37,41,45,76] print(a.Min,a.IndexMin); // 37 1 end.
Задача Array_min: Найдите минимальный элемент массива. Выведите элемент и его индекс.
Пример результата:
9 5 4 22 23 7 3 16 16 8 Минимальный элемент массива A[7]=3
[Название файла: taskArray_min.pas
]
Задача Array 4. Дан массив из 10 целочисленных элементов. Найти количество отрицательных и вывести количество на экран.
Пример результата:
3 4 6 -1 6 -2 1 5 0 1 Количество отрицательных элементов: 2
[Название файла: taskArray4.pas
]
Задача Array 5. Найти минимальное и максимальное из n введенных чисел (массива). Определить расстояние между этими элементами.
3 2 6 1 3 4 7 2 >>> min=1, max=7, distance=3
[Название файла: taskArray5.pas
]
Задача Array 6. Дан целочисленный массив размера N. Вывести все содержащиеся в данном массиве четные числа в порядке убывания их индексов, а также их количество K.
N=4 mas: 8 9 2 5 >>> 2 8 количество= 2
[Название файла: taskArray6.pas
]
Задача Array 7. Ввести с клавиатуры массив из 5 элементов, найти в нем два максимальных элемента и их номера.
Пример:
Исходный массив: 4 -5 10 -10 5 максимальные A[3]=10, A[5]=5
[Название файла: taskArray7.pas
]
Поиск в массиве
Рассмотрим сложный пример работы с одномерными массивами:
Пример: Дан массив из 10 чисел. Определить, есть ли в массиве число, введенное пользователем. Если есть – выводить «найдено», если нет – «не найдено».
Сложность задания заключается в том, что выводить слова «найдено» или «не найдено» необходимо один раз.
Для решения поставленной задачи понадобится оператор break
— выход из цикла.
Решение Вариант 1. Цикл for:
PascalABC.NET
:
Cтандартные методы a.IndexOf(x)
и a.LastIndexOf(x)
:
begin var a := new integer[10]; a := arrRandomInteger(5,0,5); //[1,3,5,4,5] print(a.IndexOf(3)) // 1 end.
или метод a.Contains(x)
наравне с x in a
:
begin var a := new integer[10]; a := arrRandomInteger(5,0,5); //[1,3,5,4,5] print(a.Contains(3)); // True print(3 in a)// True end.
Рассмотрим эффективное решение:
Задача: найти в массиве элемент, равный X
, или установить, что его нет.
Алгоритм:
- начать с 1-го элемента (
i:=1
); - если очередной элемент (
A[i]
) равенX
, то закончить поиск иначе перейти к следующему элементу.
решение на Паскале Вариант 2. Цикл While:
Поиск элемента в массиве
Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):
Задача Array 8. Заполнить массив из 10 элементов случайными числами в интервале [0..4]
и вывести номера всех элементов, равных X
.
Пример:
Исходный массив: 4 0 1 2 0 1 3 4 1 0 Что ищем? 0 A[2], A[5], A[10]
[Название файла: taskArray8.pas
]
Циклический сдвиг
Пример: сдвинуть элементы массива влево на 1 позицию, первый элемент становится на место последнего.
Решение:
Алгоритм:
A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N];
Программа:
PascalABC.NET
:
Циклический сдвиг влево:
// … var v := a[0]; for var i:=0 to a.Length-2 do a[i] := a[i+1]; a[a.Length-1] := v;
Циклический сдвиг вправо:
// … var v := a[a.Length-1]; for var i:=a.Length-1 downto 1 do a[i] := a[i-1]; a[0] := v;
Задача Array 9. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и выполнить циклический сдвиг влево без первого элемента.
Пример:
Исходный массив: 4 -5 3 10 -4 -6 8 -10 1 0 Результат: 4 3 10 -4 -6 8 -10 1 0 -5
[Название файла: taskArray9.pas
]
Перестановка элементов в массиве
Рассмотрим, как происходит перестановка или реверс массива.
Пример: переставить элементы массива в обратном порядке
Решение:
Алгоритм:
Псевдокод:
Программа:
PascalABC.NET
:
Перестановка (ревёрс):
Решение 1:
begin var a: array of integer := (1,3,5,7); var n := a.Length; for var i:=0 to n div 2 - 1 do Swap(a[i],a[n-i-1]); End.
Решение 2 (стандартная процедура Reverse()
):
begin var a:=new integer[10]; a:=arrRandomInteger(10); print(a);// [41,81,84,63,12,26,88,25,36,72] Reverse(a); print(a) //[72,36,25,88,26,12,63,84,81,41] end.
Задача Array 10. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и сделать реверс всех элементов, кроме последнего.
Пример:
Исходный массив: -5 3 10 -4 -6 8 -10 1 0 4 Результат: 0 1 -10 8 -6 -4 10 3 -5 4
[Название файла: taskArray10.pas
]
Выбор элементов и сохранение в другой массив
Пример: найти в массиве элементы, удовлетворяющие некоторому условию (например, отрицательные), и скопировать их в другой массив
Решение:
Решение: подсчитывать количество найденных элементов с помощью счетчика count, очередной элемент устанавливать на место B[count]. Переменой count необходимо присвоить 1.
Вывод массива B:
writeln('Выбранные элементы'); for i:=1 to count-1 do write(B[i], ' ')
PascalABC.NET
:
Процедура SetLength()
:
// ... for var i := 0 to a.length - 1 do if a[i] < 0 then begin b[j] := a[i]; j += 1; end; SetLength(b, j);
Задача Array 11. Заполнить массив случайными числами в интервале [20,100] и записать в другой массив все числа, которые оканчиваются на 0.
Пример:
Исходный массив: 40 57 30 71 84 Заканчиваются на 0: 40 30
[Название файла: taskArray11.pas
]
Сортировка элементов массива
Сортировка методом «Пузырька»
- В таком типе сортировок массив представляется в виде воды, маленькие элементы — пузырьки в воде, которые всплывают наверх (самые легкие).
- При первой итерации цикла элементы массива попарно сравниваются между собой:предпоследний с последним, пред предпоследний с предпоследним и т.д. Если предшествующий элемент оказывается больше последующего, то производится их обмен.
- При второй итерации цикла нет надобности сравнивать последний элемент с предпоследним. Последний элемент уже стоит на своем месте, он самый большой. Значит, число сравнений будет на одно меньше. То же самое касается каждой последующей итерации.
Pascal | PascalABC.NET | ||||
|
|
Задача Array 12. Заполнить массив из 10 элементов случайными числами в интервале [0..100] и отсортировать первую половину массива по возрастанию, а вторую – по убыванию (методом ‘Пузырька’).
Пример: Исходный массив: 14 25 13 30 76 58 32 11 41 97 Результат: 13 14 25 30 76 97 58 41 32 11
[Название файла: taskArray12.pas
]
Сортировка методом выбора
- в массиве ищется минимальный элемент и ставится на первое место (меняется местами с A[1]);
- среди оставшихся элементов также производится поиск минимального, который ставится на второе место (меняется местами с A[2]) и т.д.
Pascal | PascalABC.NET | ||||
|
|
Задача Array 13: Заполнить массив из 10 элементов случайными числами в интервале [0..50] и отсортировать его по возрастанию суммы цифр
Пример: Исходный массив: 14 25 13 12 76 58 21 87 10 98 Результат: 10 21 12 13 14 25 76 58 87 98
[Название файла: taskArray13.pas
]
PascalABC.NET
:
Стандартная процедура sort():
Sort(a); SortByDescending(a);
Быстрая сортировка или quick sort
Алгоритм:
- Выбирается и запоминается средний элемент массива (присвоим X):
- Инициализируем две переменные (будущие индексы массива): L:=1, R:=N (N — количество элементов).
- Увеличиваем L и ищем первый элемент A[L], который больше либо равен X (в итоге он должен находиться справа).
- Уменьшаем R и ищем элемент A[R], который меньше либо равен X (в итоге он должен находиться слева).
- Смотрим, если L<=R, то меняем местами A[L] и A[R], возвращаемся к пункту 3.
Выполнение на Паскале:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
procedure QSort ( first, last: integer); var L, R, c, X: integer; begin if first < last then begin X:= A[(first + last) div 2]; L:= first; R:= last; while L <= R do begin while A[L] < X do L:= L + 1; while A[R] > X do R:= R - 1; if L <= R then begin c:= A[L]; A[L]:= A[R]; A[R]:= c; L:= L + 1; R:= R - 1; end; end; QSort(first, R); QSort(L, last); end; end. |
Задача Array 14:
Заполнить массив из 10 элементов случайными числами в интервале [-50..50] и отсортировать его с помощью алгоритма быстрой сортировки.
[Название файла: taskArray14.pas
]
Ввод и вывод
const Sz = 100; // Размер массива var a: array [1..Sz] of integer; N: integer; // Количество элементов в массиве i: integer; begin write('Введите количество элементов в массиве: '); readln(N); write('Введите элементы массива: '); for i:=1 to N do read(a[i]); write('Вывод элементов массива: '); for i:=1 to N do write(a[i],' '); end.
Заполнение случайными числами
const Sz = 100; // Размер массива var a: array [1..Sz] of integer; N: integer; // Количество элементов в массиве i: integer; begin N := 20; for i:=1 to N do a[i] := Random(100); writeln('Элементы массива: '); for i:=1 to N do write(a[i],' '); end.
Заполнение арифметической прогрессией
const Sz = 100; a0 = 5; // Первый элемент арифметической прогрессии d = 3; // Разность арифметической прогрессии var a: array [1..Sz] of integer; N: integer; // Количество элементов в массиве begin N := 20; a[1] := a0; for var i:=2 to N do a[i] := a[i-1] + d; writeln('Арифметическая прогрессия: '); for var i:=1 to N do write(a[i],' '); end.
Заполнение степенями двойки
const Sz = 100; var a: array [1..Sz] of integer; N: integer; begin N := 20; a[1] := 2; for var i:=2 to N do a[i] := a[i-1] * 2; writeln('Степени двойки: '); for var i:=1 to N do writeln(i:3,a[i]:9); end.
Заполнение числами Фибоначчи
const Sz = 100; var a: array [1..Sz] of integer; N: integer; begin N := 20; a[1] := 1; a[2] := 1; for var i:=3 to N do a[i] := a[i-2] + a[i-1]; writeln('Числа Фибоначчи: '); for var i:=1 to N do write(a[i],' '); end.
Инвертирование массива
const Sz = 100; var a: array [1..Sz] of integer; N: integer; begin N := 20; for var i:=1 to N do a[i] := Random(100); writeln('Элементы массива: '); for var i:=1 to N do write(a[i],' '); writeln; for var i:=1 to N div 2 do Swap(a[i],a[N-i+1]); writeln('После инвертирования: '); for var i:=1 to N do write(a[i],' '); end.
Минимальный элемент в массиве и его индекс
const Sz = 100; var a: array [1..Sz] of real; N: integer; min: real; minind: integer; begin N := 20; for var i:=1 to N do a[i] := Random(100); writeln('Элементы массива: '); for var i:=1 to N do write(a[i],' '); writeln; min := a[1]; minind := 1; for var i:=2 to N do if a[i]<min then begin min := a[i]; minind := i; end; writeln('Минимальный элемент: ',min); writeln('Индекс минимального элемента: ',minind); end.
Минимальный четный элемент и его индекс
const Sz = 100; var a: array [1..Sz] of integer; N: integer; min: integer; minind: integer; begin N := 20; for var i:=1 to N do a[i] := Random(100); writeln('Элементы массива: '); for var i:=1 to N do write(a[i],' '); writeln; min := integer.MaxValue; for var i:=1 to N do if (a[i]<min) and (a[i] mod 2 = 0) then begin min := a[i]; minind := i; end; if min = integer.MaxValue then writeln('Четных элементов нет') else begin writeln('Минимальный четный элемент: ',min); writeln('Индекс минимального четного элемента: ',minind); end; end.
Запись четных элементов массива в новый массив
const Sz = 100; var a,b: array [1..Sz] of integer; aN: integer; // Количество элементов в массиве a bN: integer; // Количество элементов в массиве b begin aN := 20; for var i:=1 to aN do a[i] := Random(100); writeln('Элементы массива: '); for var i:=1 to aN do write(a[i],' '); writeln; bN := 0; for var i:=1 to aN do if a[i] mod 2 = 0 then begin bN += 1; b[bN] := a[i]; end; writeln('Четные элементы массива: '); for var i:=1 to bN do write(b[i],' '); end.
Слияние отсортированных массивов в отсортированный
Способ 1.
const aN = 10; // Количество элементов в массиве a bN = 6; // Количество элементов в массиве b cN = aN + bN; // Количество элементов в массиве c var a: array [1..aN] of integer := (1,5,12,15,47,89,98,112,171,180); b: array [1..bN] of integer := (13,44,58,71,73,111); c: array [1..сN] of integer; ai,bi,ci: integer; begin writeln('Элементы массива a: '); for var i:=1 to aN do write(a[i],' '); writeln; writeln('Элементы массива b: '); for var i:=1 to bN do write(b[i],' '); writeln; ci := 1; ai := 1; bi := 1; while (ai<=aN) and (bi<=bN) do begin if a[ai]<b[bi] then begin c[ci] := a[ai]; ai += 1; end else begin c[ci] := b[bi]; bi += 1; end; ci += 1; end; while ai<=aN do begin c[ci] := a[ai]; ai += 1; ci += 1; end; while bi<=bN do begin c[ci] := b[bi]; bi += 1; ci += 1; end; writeln('Результат слияния: '); for var i:=1 to cN do write(c[i],' '); end.
Способ 2. С барьерным элементом
const aN = 10; // Количество элементов в массиве a bN = 6; // Количество элементов в массиве b cN = aN + bN; // Количество элементов в массиве c var a: array [1..aN+1] of integer := (1,5,12,15,47,89,98,112,171,180,0); // последний элемент - барьерный b: array [1..bN+1] of integer := (13,44,58,71,73,111,0); c: array [1..cN] of integer; ai,bi,ci: integer; begin writeln('Элементы массива a: '); for var i:=1 to aN do write(a[i],' '); writeln; writeln('Элементы массива b: '); for var i:=1 to bN do write(b[i],' '); writeln; a[aN+1] := integer.MaxValue; // барьерный элемент - самый большой b[bN+1] := integer.MaxValue; ci := 1; ai := 1; bi := 1; for ci:=1 to cN do if a[ai]<b[bi] then begin c[ci] := a[ai]; ai += 1; end else begin c[ci] := b[bi]; bi += 1; end; writeln('Результат слияния: '); for var i:=1 to cN do write(c[i],' '); end.
Сдвиг элементов влево
const N = 10; var a: array [1..N] of integer; begin for var i:=1 to N do a[i] := Random(100); writeln('Элементы массива a: '); for var i:=1 to N do write(a[i],' '); writeln; for var i:=1 to N-1 do a[i] := a[i+1]; a[N] := 0; writeln('После сдвига влево: '); for var i:=1 to N do write(a[i],' '); writeln; end.
Сдвиг элементов вправо
const N = 10; var a: array [1..N] of integer; begin for var i:=1 to N do a[i] := Random(100); writeln('Элементы массива a: '); for var i:=1 to N do write(a[i],' '); writeln; for var i:=N downto 2 do a[i] := a[i-1]; a[1] := 0; writeln('После сдвига влево: '); for var i:=1 to N do write(a[i],' '); writeln; end.
Удаление элемента
const N = 10; var a: array [1..N] of integer; K: integer; begin for var i:=1 to N do a[i] := Random(100); writeln('Элементы массива a: '); for var i:=1 to N do write(a[i],' '); writeln; K := Random(1,N); for var i:=K to N-1 do a[i] := a[i+1]; writeln('После удаления элемента с индексом ',K,':'); for var i:=1 to N-1 do write(a[i],' '); writeln; end.
Вставка элемента
const N = 10; Elem = 666; var a: array [1..N+1] of integer; K: integer; begin for var i:=1 to N do a[i] := Random(100); writeln('Элементы массива a: '); for var i:=1 to N do write(a[i],' '); writeln; K := Random(1,N); for var i:=N downto K do a[i+1] := a[i]; a[K] := 666; writeln('После вставки элемента ',Elem,' в позицию ',K,':'); for var i:=1 to N+1 do write(a[i],' '); writeln; end.
Подсчет количества элементов, удовлетворяющих условию
const N = 20; var a: array [1..N] of integer; K,Count: integer; begin for var i:=1 to N do a[i] := Random(10); writeln('Элементы массива a: '); for var i:=1 to N do write(a[i],' '); writeln; K := Random(10); Count := 0; for var i:=1 to N do if a[i] = K then Count += 1; writeln('Количество элементов, равных ',K,': ',Count); end.
Есть ли элемент, удовлетворяющий условию
const N = 10; var a: array [1..N] of integer; K: integer; IsFound: boolean; begin for var i:=1 to N do a[i] := Random(15); writeln('Элементы массива a: '); for var i:=1 to N do write(a[i],' '); writeln; K := Random(15); IsFound := False; for var i:=1 to N do if a[i] = K then begin IsFound := True; break end; if IsFound then writeln('Элемент ',K,' найден') else writeln('Элемент ',K,' не найден') end.
Сортировка пузырьком
const N = 10; var a: array [1..N] of integer; begin for var i:=1 to N do a[i] := Random(100); writeln('Элементы массива a: '); for var i:=1 to N do write(a[i],' '); writeln; for var i:=n downto 2 do for var j:=1 to i-1 do if a[j+1]<a[j] then Swap(a[j+1],a[j]); writeln('После сортировки пузырьком: '); for var i:=1 to N do write(a[i],' '); writeln; end.
Сортировка выбором
const N = 10; var a: array [1..N] of integer; K: integer; IsFound: boolean; begin for var i:=1 to N do a[i] := Random(100); writeln('Элементы массива a: '); for var i:=1 to N do write(a[i],' '); writeln; for var i:=1 to N-1 do begin var min := a[i]; var ind := i; for var j:=i+1 to N do if a[j]<min then begin min := a[j]; ind := j; end; a[ind] := a[i]; a[i] := min; end; writeln('После сортировки выбором: '); for var i:=1 to N do write(a[i],' '); writeln; end.
Ссылки
- Программы для начинающих
- Сайт PascalABC.NET: Программы и алгоритмы для начинающих
title | keywords | last_updated | sidebar | permalink | toc | folder |
---|---|---|---|---|---|---|
Массивы в PascalABC.NET |
styles |
19.12.2020 |
mydoc_sidebar |
school_arrays.html |
true |
mydoc |
В PascalABC.NET рекомендуется использовать динамические массивы. В отличие от статических, они имеют огромное количество методов и операций, просты в создании, заполнении и выводе.
Описание и выделение памяти
Динамический массив описывается так:
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 a := array ['a'..'z'] of integer;
Заполнение статических массивов — увы — производится в цикле. Кроме того, они не помнят свою длину и передача таких массивов в качестве параметров подпрограмм связана с техническими сложностями 40-летней давности, не нужными начинающим.
Простейшее заполнение
Важную роль играют функции заполнения динамических массивов. Перед заполнением они выделяют для массива память, поэтому в одной строке можно совмещать описание, выделение памяти и заполнение.
Простейшее заполнение — набором значений:
Заполнение диапазоном целых или символьных значений делается с использованием функции Arr:
var a := Arr(1..9); var b := Arr('a'..'z');
Заполнение определённым значением осуществляется с помощью операции умножения массива на число:
begin var n := ReadInteger; var a := |0| * n; // массив из n нулей end.
Для заполнения можно также использовать функцию ArrFill:
begin var n := ReadInteger; var a := ArrFill(n,0); // массив из n нулей end.
Для заполнения массива случайными значениями следует использовать
begin var n := ReadInteger; var a := ArrRandomInteger(n); // по умолчанию значения от 0 до 100 var a1 := ArrRandomInteger(n,1,10); // случайные от 1 до 10 var r := ArrRandomReal(n); // по умолчанию значения от 0 до 10 var r1 := ArrRandomReal(n,2,5); // случайные вещественные от 2 до 5 end.
Не рекомендуется использовать алгоритм для заполнения массива случайными в каждой задаче:
begin var n := ReadInteger; var a := new integer[n]; for var i:=0 to n-1 do a[i] := Random(0,100); end.
Повторять этот текст в каждой задаче — странно. Для этого есть стандартные функции.
Ввод и вывод элементов массива
Для ввода элементов массива базовых типов используются функции
begin var n := ReadInteger; var a := ReadArrInteger(n); var r := ReadArrReal(n); var s := ReadArrString(n); // ... end.
Стандартная процедура вывода Write или Print выводит значения в массиве в квадратных скобках черезх запятую:
begin var a := Arr(1..9); Print(a); // [1,2,3,4,5,6,7,8,9] end.
Однако лучше всего для вывода воспользоваться методом Print, выводящим все значения в массиве через пробел:
begin var a := Arr(1..9); a.Print; // 1 2 3 4 5 6 7 8 9 end.
Не рекомендуется вводить и выводить элементы массива в цикле
begin var n := ReadInteger; var a := new integer[n]; for var i:=0 to n-1 do a[i] := ReadInteger; end.
Повторять этот текст в каждой задаче — странно. Для этого есть стандартные функции.
Циклы по массиву
Для обработки элементов массива используются следующие циклы:
- Цикл for по индексам (если требуется менять элементв или нужна информация об индексах)
for var i:=0 to a.Length-1 do a[i] *= 2;
- Цикл foreach по элементам (если индексы не видны и мы не меняем массив)
var sum := 0; foreach var x in a do sum += x;
- Цикл foreach по индексам
foreach var i in a.Indices do a[i] += 2;
- Цикл 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.
Методы массива
Массивы содержат большое количество стандартных методов:
a.Length - длина массива
a.Min - минимальный элемент в массиве
a.Max - максимальный элемент в массиве
a.IndexMin - индекс первого минимального элемента в массиве
a.IndexMax - индекс первого максимального элемента в массиве
a.Sum - сумма элементов в числовом массиве
a.Product - произведение элементов в числовом массиве
a.Average - среднее элементов в числовом массиве
a.First - первый элемент в массиве
a.Last - последний элемент в массиве
a.IndexOf(x) - индекс первого значения x или -1 если не найдено
a.Replace(x,y) - заменить в массиве все значения x на y
Кроме того, доступны процедуры
Sort(a) - сортировка элементов по возрастанию SortDescending(a) - сортировка элементов по убыванию Reverse(a) - инвертирование элементов массива
Методика. Обращаем внимание, что в методических целях естественно рассказывать, как эти алгоритмы устроены «внутри».
Но потом следует пользоваться стандартными алгоритмами, а не заставлять учеников во всех задачах использовать рукописные сортировки или рукописный поиск минимума. Например, рекомендуется показать, как накопить сумму элементов массива:
begin var a := ArrRandomInteger(10); a.Println; var sum := 0; foreach var x in a do sum += x; Print(sum); end.
Здесь следует обратить внимание, что этот алгоритм может быть легко модифицирован в алгоритм нахождения суммы элементов по условию: например, всех чётных элементов:
begin var a := ArrRandomInteger(10); a.Println; var sum := 0; foreach var x in a do if x.IsEven then sum += x; Print(sum); end.
Отметим, что заполнение случайными и вывод — это технические части программы, которые делаются в PascalABC.NET в одну строку, позволяя концентрироваться на алгоритме.
Если условие надо накладывать на индексы, то в этом случае (и только в этом случае) следует использовать цикл for по индексам:
begin var a := ArrRandomInteger(10); a.Println; var sum := 0; for var i:=0 to a.Length-1 do if i.IsEven then sum += a[i]; Print(sum); end.
Для нахождения суммы без условия необходимо использовать стандартный метод a.Sum:
begin var a := ArrRandomInteger(10); a.Println; Print(a.Sum); end.
Отметим также, что для поиска суммы по условию также имеется короткая однострочная запись. Она требует использование стандартного метода Where с параметром, являющимся лямбда-выражением. Лямбда-выражения мы будем рассматривать далее:
begin var a := ArrRandomInteger(10); a.Println; Print(a.Where(x -> x.IsEven).Sum); end.
Методика. Поскольку данная запись использована здесь впервые, обращаем внимание на её высокую универсальность: алгоритмы фильтрации и поиска суммы не слиты в один алгоритм, а используются порознь один за другим, что позволяет:
- Лучше читать код (потому что он записан компактно и методами с понятными и очевидными названиями)
- Лучше модифицировать код
- Решать более сложные и более прикладные задачи за одно и то же время урока
Далее лямбда-выражения объясняются подробно и тщательно и используются повсеместно.
Операции с массивами
x in a - возвращает true если значение x содержится в a
a1 + a2 - возвращает массив, образованный слиянием массивов a1 и a2
a1 * n - возвращает массив, состоящий из n раз повторенных значений массива a
Изменение размера динамического массива
Если в процессе работы программы требуется чтобы динамический массив менял свой размер, то следует … пользоваться типом List!
Это — динамический массив с возможностью эффективного измненения размера и рядом дополнительных методов. Основным является методы Add — добавить в конец:
begin var l := new List<integer>; l.Add(1); l.Add(3); l.Add(5); l.Print end.
Для первоначального заполнения списков List используется короткая фунеция Lst:
begin var l := Lst(1,3,5); l.Print end.
При необходимости список List можно преобразовать к динамическому массиву, вызвав метод .ToArray:
begin var l := Lst(1,3,5); var a := l.ToArray; end.
Большинство методов, которые имеются в массивах, есть и в списках List. Поэтому выбор типа List или array of для контейнера при решении задач определяется тем, будет ли данный контейнер расширяться по ходу работы программы.
{% include links.html %}
Массивом
называется способ организации однородной информации, при котором облегчается
доступ к любому элементу информации по его индексу (номеру) и достаточно легко
производится обработка информации.
Объявление
массивов производится в блоке описания следующим образом:
x:array[1..100] of integer; – массив на 100 элементов для целых
чисел с индексами от 1 до 100.
a,b:array[10..29] of string; – два массива по 20 элементов для
символьных переменных с индексами от 10 до 29.
Двумерный массив объявляется так:
y:array[1..10,1..5] of real; – массив размером 10 на 5 для
вещественных чисел с индексами от 1 до 10 и от 1 до 5.
Конкретный элемент массива обозначается с помощью ссылки на
переменную (имя) массива, за которой в квадратных скобках указывается индекс
данного элемента, например: a[7]
Строковая
переменная типа string также может рассматриваться как массив переменных типа
char, например: b:string[20] Это дает доступ к каждому символу в
строковой переменной, если значение символа имеет тип Char.
Конкретный символ в строковой переменной обозначается с помощью
ссылки на строковую переменную, за которой указывается индекс, определяющий
позицию символа в строке, например:b[15].
В программах можно использовать присваивание элементам массива:
а[5] := 8; числовому, b[3] := ‘Виктор’ строковому
и выборочную печать элементов:
write (а[5]);
writeln (b[3]);
С массивами удобно работать с помощью циклов:
— заполнение
for t := 1 to 20 do
begin
write(‘Введите ‘,t,’-й элемент’);
readln(a[t]);
end;
— вывод на печать
for t := 1 to 20 do
writeln(t,’-й элемент равен’,a[t]);
— выбор по условию
for t := 1 to 20 do
if a[t]>=3 then writeln(‘У студента ‘,b[t],’ оценка по
экзамену ‘,a[t]);
— при использовании двумерных массивов применяются вложенные
циклы.
var m,k:integer;
x:array[1..10,1..5] of string;
begin
for m:=1 to 10 do
for k:=1 to 5 do
begin
write(‘Введите фамилию жильца ‘,m,’-го подъезда и ‘,k,’-го
этажа’);
readln(x[m,k]);
end;
write(‘Полный список жильцов:’);
for m:=1 to 10 do
for k:=1 to 5 do
write(m,’-й подъезд, ‘,k,’-й этаж’,x[m,k])
end.
Просмотрите предлагаемые ниже задачи, разберитесь в их работе.
При необходимости наберите и изучите программы.
1. Программа «исчезающие звезды».
В цикле for массивы заполняются случайными числами: x – до 640
(координата х), y – до 400 (координата y), c – до 1000000 (цвет). В цикле
repeat последовательно проходятся все элементы массива и по указанным
координатам сначала окружность (круг) рисуется черным цветом (звезды гаснут), а
затем по новым случайным координатам и цвету вспыхивают звезды. Процесс
продолжается до нажатия любой клавиши.
uses crt, graphabc;
var a,b,d,e,f:integer;
x,y,c:array[1..100] of integer; {3 числовых массива по 100
элементов каждый}
begin
floodfill(10,10,clblack); {заливка фона черным}
for b:=1 to 100 do begin {заполнение массивов}
x[b]:=random(640);
y[b]:=random(400);
c[b]:=random(1000000);
end;
repeat
for b:=1 to 100 do begin
SetPenColor (clblack); {звезды гаснут}
circle(x[b],y[b],2);
floodfill(x[b],y[b],clblack); {заливка звезды черным}
x[b]:=random(640);
y[b]:=random(400);
c[b]:=random(1000000);
delay(25);
setpencolor(c[b]); {звезды вспыхивают}
circle(x[b],y[b],2);
floodfill(x[b],y[b],c[b]); {заливка звезды}
end;
until keypressed
end.
2. Cортировка массива. Массив заполняется случайными числами,
которые затем упорядочиваются и печатаются на экране.
uses crt;
var a,b,c,d:integer;
q:array[1..15] of integer;
begin
clrscr;
writeln(‘исходные случайные числа:’);
for a:=1 to 15 do
begin
q[a]:=random(50);
write(q[a],’ ‘);
end;
writeln;
for a:=1 to 15 do
begin
for b:=1 to 14 do
begin
if q[a]>q[b] then { Числа располагаются в порядке убывания }
begin { смена знака на < расположит числа по возрастанию}
c:=q[b];
q[b]:=q[a];
q[a]:=c;
end;
end;
end;
writeln;
writeln(‘отсортированные случайные числа:’);
for a:=1 to 15 do
write(q[a],’ ‘);
end.
3. Неповторяющиеся случайные числа до 100.
uses crt;
var a,b,c,d:integer;
q:array[1..10] of integer;
begin
clrscr;
a:=1;
while a<11 do
begin
q[a]:=random(100)+1;
if a>1 then
for b:=1 to a-1 do
begin
if q[a]=q[b] then a:=a-1;
end;
a:=a+1;
end;
for a:=1 to 10
do writeln(q[a]);
end.
Задачи для
самостоятельного решения
- Описать числовой массив на 5 элементов и заполнить его
присваиванием любыми числами, распечатать содержимое элементов массива
а) в столбик
б) в строку.
2.Описать числовой
массив на 5 элементов и заполнить его в цикле с клавиатуры любыми числами,
распечатать содержимое элементов массива.
Упражнения.
Выполните
задания с Array1 по Array10 по электронному задачнику (стр.49).
Выполните
задания с Array51 по Array60 по электронному задачнику (стр.54).
Выполните
задания с Array65 по Array69 по электронному задачнику (стр.55).
Выполните
задания с Matrix1 по Matrix4, с Matrix7 по Matrix10 по
электронному задачнику (стр.64).
Открыть его
можно в режиме Помощь – Электронный задачник РТ.
Сегодня мы с вами наконец-то начинаем новую тему — одномерные массивы.
Одномерные массивы. Определение.
Одномерный массив — это фиксированное количество элементов одного и того же типа, объединенных одним именем, где каждый элемент имеет свой номер. Обращение к элементам массива осуществляется с помощью указания имени массива и номеров элементов.
var a : array [1..N] of integer; //или type arr = array[1..N] of integer; var a: arr;
Между именем типа и именем переменной ставится знак «двоеточие». Array — служебное слово (в переводе с английского означает «массив», «набор»); [1..N] — в квадратных скобках указывается номер первого элемента, затем, после двух точек, номер последнего элемента массива; of — служебное слово (в переводе с английского «из»); integer — тип элементов массива.
Индексом могут быть не только натуральные числа: мы можем написать так: [0..10], [-29..45], [‘a’..’z’], [false..true] — то есть нам подходят любые символы и числа — главное соблюсти следующее условие: левая часть меньше правой. Для того чтобы определить, что меньше — восклицательный знак(‘!’) или точка(‘.’) используем таблицу ASCII и функции Ord() и Chr().
Как же производится ввод одномерного массива?
Для того чтобы ввести или вывести значения элементов такого массива, используем цикл с параметром(или с постусловием, или с предусловием — в общем, любой цикл. ).
for i := 1 to N do read(a[i]); //где a[i] -- элемент одномерного массива a с индексом (порядковым номером) i.
Как видите, ничего страшного в массивах нет. Массивы применяют в тех случаях, когда нельзя обойтись одной-двумя переменными (примеры таких задач мы рассматривали в решении задач из блока Series). В случаях, когда после ввода последовательности целиком пользователю необходимо обратиться к переменным в середине последовательности, в начале, поменять их значения местами, отсортировать.
Раз уж мы затронули тему задач из блока Series, давайте решим пару задачек оттуда с помощью массивов, а не тем увечным способом, которым нам приходилось пользоваться.
Одномерные массивы. Решение задач.
Series8. Дано целое число N и набор из N целых чисел. Вывести в том же порядке все четные числа из данного набора и количество K таких чисел.
Исходное решение: Series8.
Модифицированное решение:
var a: array[1..1000] of integer; {мы не знаем заранее N, поэтому берем с запасом.} k, N, i: integer; begin write('N = '); readln(N); write('Введите ', N, ' целых чисел: '); for i := 1 to N do read(a[i]); {заполняем масссив} {Начинаем выбирать чётные числа} write('Чётные числа: '); for i := 1 to N do begin if a[i] mod 2 = 0 then begin Inc(k); write(a[i], ' '); end; end; writeln(); writeln('Количество четных чисел - ', k); end.
Series28. Дано целое число N и набор из N вещественных чисел: A1, A2, …, AN. Вывести следующие числа:
(A1)N, (A2)N−1, …, (AN−1)2, AN.
Исходное решение: Series28.
Более подробно про возведение числа в степень мы говорили в решении задачи for36.
Модифицированное решение:
var a: array[1..1000] of integer; N, i, j, n_pow: integer; d, r: real; begin write('N = '); readln(N); write('Введите ', N, ' целых чисел: '); for i := 1 to N do read(a[i]); {Возводим элементы массива в степень} for i := 1 to N do begin n_pow := N + 1 - i; d := a[i]; if n_pow mod 2 <> 0 then r := d else r := 1; //в r будет записываться результат while n_pow > 1 do begin n_pow := n_pow div 2; d := d * d; if n_pow mod 2 <> 0 then r := r * d; end; writeln(a[i], ' в степени ', N + 1 - i, ' равно ', r); end; end.
Ну и напоследок давайте разберём веселенькую задачу на длинную арифметику.
Задача. Найти факториал числа.
Мы уже решали эту задачу здесь(for19).
Научимся вычислять факториал натурального числа N. Факториал числа — это произведение чисел 1*2*3*…*(N-1 )*N (обозначается как N!). Сложность задачи в том, что уже 8!=40320, а 13!=6227020800. Типы данных Integer, Longlnt применимы весьма в ограниченном диапазоне натуральных чисел. Для представления факториала договоримся использовать массив. Пример:
A[0] | A[1] | A[2] | A[3] | A[4] | A[5] | A[6] | A[7] | A[8] |
8 | 0 | 0 | 8 | 6 | 1 | 9 | 9 | 3 |
В массиве записано значение 11!=39916800. Каким образом? В А[0] фиксируется число занятых элементов массива, в А[1] — цифра единиц результата, в А[2] — цифра десятков результата, в А[3] — цифра сотен результата и т. д. Почему так, а не наоборот? Такая запись позволяет исключить сдвиг элементов массива при переносе значений в старший разряд. А сейчас наберите, как обычно, текст программы, выполните компиляцию и, выполните ее в пошаговом режиме, отслеживая изменение значений переменных при не очень большом значении N. Добейтесь полного понимания логики работы программы.
Для того чтобы выполнить программу в пошаговом режиме, нажмите «шаг без входа в подпрограмму» и перейдите в «локальные переменные».
const MaxN = 300; var A: array [0..MaxN] of integer; i, j, r, w, N: integer; begin Write('Введите число, факториал которого необходимо подсчитать: '); Read(N); A[0] := 1; A[1] := 1; j := 2; {Начальные присвоения, начинаем вычислять 2! } while (j <= N) and (A[0] < MaxN) Do {Второе условие позволяет избежать выхода из границ диапазона, если количество цифр в факториале превзойдет 300.} begin r := 0; i := 1; {r - перенос из разряда в разряд при выполнении умножения числа j на очередную цифру A[i] предыдущего результата.} while (i <= A[0]) or (r <> 0) Do begin {Пока не «прошли» все цифры предыдущего результата или есть перенос цифры в старший разряд} w := A[i] * j + r;{Умножаем очередную цифру и прибавляем цифру переноса из предыдущего разряда} A[i] := w mod 10; {Оставляем остаток от деления на 10} r := w div 10;{Вычисляем значение переноса} if A[A[0] + 1] <> 0 then Inc(A[0]);{Изменяем количество элементов, если их количество увеличилось.} Inc(i); end; Inc(j); end; write('Факториал: '); for i := A[0] downto 1 Do Write(A[i]);{Вывод результата} end.
Подведем итоги:
Одномерный массив — это конечное упорядоченное множество элементов. За первым элементом идет второй, за вторым — третий и т. д. Индекс может быть чем угодно — и целым числом, и символом. Но чаще мы всё-таки будем пользоваться следующим диапазоном: [1.. N].
На сегодня все! Если у вас еще остались вопросы о том, как работает программа выше, оставляйте их в комментариях. И очень скоро мы начнем решать задачи на массивы из задачника М. Э. Абрамяна.