На занятии объясняется, как работать с одномерными массивами в Паскале, как использовать генератор случайных чисел — функцию 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
]
Сегодня мы с вами наконец-то начинаем новую тему — одномерные массивы.
Одномерные массивы. Определение.
Одномерный массив — это фиксированное количество элементов одного и того же типа, объединенных одним именем, где каждый элемент имеет свой номер. Обращение к элементам массива осуществляется с помощью указания имени массива и номеров элементов.
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].
На сегодня все! Если у вас еще остались вопросы о том, как работает программа выше, оставляйте их в комментариях. И очень скоро мы начнем решать задачи на массивы из задачника М. Э. Абрамяна.
Содержание
- Работа с одномерными массивами на языке программирования Паскаль
- Одномерный числовой массив
- Способы заполнения одномерных массивов
- Ручной ввод данных
- Заполнение случайными числами
- Ввод данных по заданному правилу (формуле)
- Ввод данных из текстового файла
- Вывод линейного массива
- Шаблон для использования в однотипных задачах
- Задачи с решением
- Простая обработка элементов
- Сортировка элементов одномерного массива
- Задачи с использованием массива
Работа с одномерными массивами на языке программирования Паскаль
Массив — самая распространенная структура хранения данных, присутствующая в любом языке программирования.
В Pascal используются одномерные и двумерные массивы. В школьной программе обычно их изучают в 9-10 классах.
Одномерный массив — это конечное количество однотипных элементов, объединенных общим именем. Каждому элементу присвоен свой порядковый номер. Обращение к элементам происходит по имени массива и индексу (порядковому номеру).
Одномерный числовой массив
Одномерные массивы называют линейными, так как элементы расположены друг за другом. Их можно представить в виде таблицы, в которой всего две строки. В первой перечислены индексы элементов, а во второй — значения элементов.
Имя массива формируется по тем же правилам, что и имя любой другой переменной в программе. Границы индексов задают при описании массива в квадратных скобках. Удобнее задавать начальный индекс равный единице. Конечный индекс определяется условием задачи и численно равен размеру массива — количеству элементов. Числовые массивы могут содержать целые и действительные числа. Тип элементов указывается в описании. Смотрите рисунок выше.
Способы заполнения одномерных массивов
В наших примерах будем использовать одномерный массив целых чисел, состоящий из пяти элементов. Для этого выполним его описание в разделе переменных
var i:integer; a: array[1..5] of integer; {определение одномерного массива из пяти целых чисел}
Ручной ввод данных
Если вам необходимо выполнить обработку небольшого линейного массива, то его элементы можно ввести с клавиатуры самостоятельно. Ввод данных может быть организован с использованием любой циклической структуры. В нашем примере будем использовать — цикл с параметром.
for i:=1 to 5 do read a[i]; {ручной ввод значений элементов массива с клавиатуры}
Заполнение случайными числами
В задачах на массивы, количество элементов может быть достаточно большим. Использование ручного ввода становиться затруднительным. В этом случае для удобства отладки и проверки работоспособности программы целесообразнее использовать другие способы заполнения. Например, случайные числа, сгенерированные служебной функцией Random().
for i:=1 to 5 do a[i]:=random(10); {задаются случайные числа из интервала [0,10)}
Ввод данных по заданному правилу (формуле)
В некоторых задачах могут быть определены правила генерации элементов массива или вычисляться по формуле. Например, заполнить массив квадратами натуральных чисел.
for i:=1 to 5 do a[i]:=i*i; {квадрат натурального числа - число, умноженное само на себя}
Ввод данных из текстового файла
Еще один способ получить данные — прочитать их из файла.
Подробнее про работу с файлами на Паскале читайте здесь.
Вывод линейного массива
В языке программирования Pascal ABC вывод элементов одномерного массива организуется с помощью цикла.
for i:=1 to 5 do write (a[i]); или так for i:=1 to 5 do print (a[i]);
Шаблон для использования в однотипных задачах
Определение, заполнение и вывод одномерного массива.
var i,n:integer; a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел} begin write('Введите количество элементов в массиве'); readln(n); for i:=1 to n do begin a[i]:=random(100)-random(100);{заполнение случайными числами из интервала (-100;100)} print (a[i]); {можно использовать write} end; {здесь записывается код обработки по условию задачи} end.
Задачи с решением
Простая обработка элементов
Задача 1. Дан одномерный массив из N целых элементов. Написать программу вычисления произведения всех элементов. Используйте ручной способ ввода чисел.
Посмотреть решение
var i,n,p:integer; a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел} begin write('Введите количество элементов в массиве'); readln(n); p:=1; for i:=1 to n do begin write('Введите ',i,' -й элемент'); readln(a[i]); p:=p*a[i]; end; write('Произведение = ',p); end.
Задача 2. Дан линейный массив из N целых чисел. Написать программу вычисления суммы этих элементов. Используйте для заполнения массива случайные числа.
Посмотреть решение
var i,n,s:integer; a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел} begin write('Введите количество элементов в массиве'); readln(n); s:=0; writeln('Исходный массив'); for i:=1 to n do begin a[i]:=random(10); print(a[i]); s:=s+a[i]; end; write('Сумма = ',s); end.
Задача 3. Дан массив A(n). Заполнить двузначными числами. Найти элементы сумма цифр, которых равна числу элементов массива.
Посмотреть решение
Решение:
var i,n,s,c1,c2,k:integer; a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел} begin k:=0; write('Введите количество элементов в массиве'); readln(n); for i:=1 to n do begin a[i]:=random(90)+10;{заполнение случайными числами из интервала [10;99]} print (a[i]); {можно использовать write} end; writeln; writeln('Сумма цифр элементов равна размеру массива'); for i:=1 to n do begin c1:=a[i]div 10; c2:=a[i]mod 10; If c1+c2=n then print (a[i])else k:=k+1; end; If k=n then print ('Таких элементов нет'); end.
Сортировка элементов одномерного массива
Задача 4. Упорядочить массив чисел по возрастанию.
Посмотреть решение
Решение:
Применяем сортировку методом пузырька.
const n=10; var i,j:integer; x:real; a:array[1..n] of real; begin println('Исходный массив'); for i:=1 to n do begin a[i]:=random(100); print(a[i]); end; {сортировка по возрастанию} for i:=1 to n-1 do for j:=1 to n-i do if a[j]>a[j+1] then begin x:=a[j];a[j]:=a[j+1];a[j+1]:=x; end; println; {вывод отсортированного массива} println('Упорядоченный массив'); for i:=1 to n do print(a[i]); end.
Задачи с использованием массива
Задача 5. Составьте программу, которая выполнит перевод натурального числа из десятичной системы счисления в любую с основанием 2-16
Посмотреть решение
Решение:
var a,b,c,i,k,s:integer; mas: array[0..1000] of integer; begin k:=0; write('Введите число ');readln(a); write('Введите основание системы для перевода ');readln(s); repeat b:=a mod s; k:=k+1; mas[k]:=b; c:=a div s; if c>=s then a:=c; until c<s; case c of 10: write('A'); 11: write('B'); 12: write('C'); 13: write('D'); 14: write('E'); 15: write('F'); else write(c); end; for i:=k downto 1 do case mas[i] of 10: write('A'); 11: write('B'); 12: write('C'); 13: write('D'); 14: write('E'); 15: write('F'); else write(mas[i]); end; end.
Дополнительные задания:
mas1 Дан целочисленный массив произвольного размера. Подсчитать сколько раз заданная цифра встречается в элементах массива. Числа в массиве только 3-х значные.
Огромную роль в создании программных приложений играют массивы. Они бывают нескольких типов, каждый из которых имеет свои ключевые особенности. Далее будут изучены нюансы одномерного массива. Информация пригодится как новичкам, так и опытным программистам.
Определение
Массив a – это структура данных, которая хранит в себе набор значений (элементы массива), идентифицируемая по индексу или его наборам, принимающих целые (или приводимые к целым) значения некоторого заданного непрерывного диапазона. Это – своеобразная реализация абстрактного типа данных – вектора. В некоторых языках программирования массивы носят названия:
- рядов;
- таблиц;
- матриц;
- векторов.
Массив – это упорядоченный набор (множество) данных. Хранит значения при помощи одного или нескольких индексов. Самый простой вариант рассматриваемого элемента обладает постоянной длиной. Включает в себя единицы информации одного и того же типа. В виде индексов тут выступают целые числа.
Разновидности
Различают несколько видов рассматриваемого объекта в зависимости от того, какое количество элементов в массиве будет содержаться в конечном итоге:
- Одномерный. У него всего один индекс.
- Двумерный. Содержит два индекса.
- Трехмерный и так далее.
На практике чаще всего дан одномерный массив или двумерный. Вариации с тремя и более индексами встречаются крайне редко.
В некоторых языках разработки есть динамические массивы. В них размер меняется непосредственно при выполнении программного кода. Остальные носят название фиксированных или статистических.
Одномерный массив в Паскале: особенности
Чаще всего в программе, написанной на Pascal, используют одномерные массивы. Они представлены конечным количеством однотипных элементов, объединенных общим именем. Каждый элемент имеет собственный порядковый номер. Обращение к ним осуществляется по имени массива и индексу (имеющемуся порядковому номеру).
Одномерный соответствующий элемент носит название вектора. Диапазон индексов в Паскале определяется в качестве произвольных значений любого типа данных, приводимого к целому.
В рассматриваемом языке программирования предстоит работать с линейным множеством данных. Он будет рассмотрен более подробно далее. А еще предстоит раскрыть способы заполнения одномерных множеств информации в Pascal.
Числовой одномерный вид
Одномерные массивы носят название линейных. Связано это с тем, что все его элементы располагаются друг за другом. Они с легкостью представляются в виде таблицы с двумя строчками:
- перечисление индексов;
- имеющиеся значения элементов.
Имя задается точно так же, как и в случае с переменными в приложении. Границы index задают непосредственно при описании множества данных. Делается это в квадратных скобках.
Рекомендуется задавать начальный индекс в виде единицы. Конечный определяется условием конкретной поставленной задачи. Численно выражен размеру множества данных – количеству содержащихся компонентов.
Числовой массив содержит целые и действительные числа. Тип элементов указывается непосредственно в описании. Пример – таблица выше. Множество данных может состоять из шести, трех, сотни или иного количества элементов.
Как заполнять
Вносить информацию в одномерный массив, который дан в задаче, можно несколькими способами:
- вручную;
- случайными элементами;
- ввод данных по формуле/правилу;
- из текстового файла.
Далее каждый вариант будет рассмотрен отдельно. Не важно, из шести или более элементов состоит множество. Главное, что внести в него данные не составит никакого труда.
В процессе изучения примеров даю небольшой линейный массив, который состоит не из шести, а из пяти элементов. Его описание рекомендуется провести в разделе переменных:
var i : integer;
var a: array [1…5] of integer; {здесь происходит определение одномерного множества из количества элементов целых чисел, которое равно пяти}
Вручную
Этот вариант хорош, когда требуется обработка небольшого линейного массива. Его элементы можно задать вручную с клавиатуры. Ввод информации организовывается с использованием любого цикла:
For i: = 1 to 5 do
Read a[i];
Здесь – пример использования цикла с параметром. Достаточно быстрый и простой вариант. Вторая строка – это реализация непосредственного ввода с клавиатуры.
Случайное число
Иногда множества информации оказываются объемными. Тут на помощь приходит не ручной ввод, а автоматический. Первый вариант – использование случайных значений:
For i: = 1 to n do {в нашем случае n = 5}
a [i]: = random (10); {задаются случайные числа из интервала от 0 (включительно) до 10}
Это – один из самых простых примеров. Интервал значений можно задать согласно условиям поставленной задачи.
По правилу
Вариант, который иногда встречается на практике. В некоторых задачах встречаются принципы и правила генерации элементов одномерного массива, который дан изначально. Вычисления компонентов проводятся по формулам.
Выше – пример, который поможет заполнить множество данных квадратами натуральных чисел.
Текст
Также можно получить данные при помощи чтения их из файлов. В Pascal соответствующий процесс требует определенной сноровки и значительного багажа знаний. Используется крайне редко.
Можно найти туториалы и видео-уроки по чтению информации для массивов одномерного типа из текстовых документов. Вот – пример и основные принципы работы с соответствующими компонентами.
Вывод и шаблон для типовых задач
В Pascal ABC отобразить элементы одномерного множества можно при помощи цикла:
А вот шаблон, который поможет решать типовые задачи на определение, заполнение и вывод одномерных множеств информации:
var
i,n:integer;
a: array[1..100] of integer; {множество, включающее в себя 100 целых чисел}
begin
write('Укажите количество элементов');
readln(n);
for i:=1 to n do begin
a[i]:=random(100)-random(100);{заполнение множества случайными значениями из интервала (-100;100)}
print (a[i]); {в качестве альтернативы допускается работа с write}
end;
{код обработки согласно условию заданной задачки}
end.
А вот – видео-урок, который лучше объяснит рассмотренную тему новичкам.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!
Ввод и вывод
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: Программы и алгоритмы для начинающих