На занятии объясняется, как работать с одномерными массивами в Паскале, как использовать генератор случайных чисел — функцию 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: Программы и алгоритмы для начинающих
Добрый день, товарищи!
В этой статье я покажу вам как создать массив и заполнить его случайными вещественными (не целыми) числами, количество которых будет задавать пользователь
Поехали.
1. Объявление переменных
В этих строках кода мы объявляем массив вещественного типа real, а так же две переменные – первая для цикла, а вторая для того, чтобы пользователь сам задал количество элементов массива. Мы лишь ограничим их максимальное количество цифрой 100.
2. Ввод количества элементов массива
Здесь мы предлагаем пользователю самому выбрать, сколько в массиве будет чисел.
3. Создаем массив и заполняем его числами
В этой части мы создаем цикл, и ставим количество его витков до того числа, которое выбрал пользователь НО – 1, так как не стоит забывать , что нумерация массивов начинается с 0!
С помощью оператора random мы выбираем диапазон чисел, в данном случае это 100 чисел, начиная с -50. Тоесть диапазон выглядит так: [-50…50]. Программу можно улучшить путем предложения пользователю самому выбрать размеры диапазона.
Оператор round округляет каждый новый элемент массива до двух знаков после запятой.
После всех этих манипуляций массив выводится пользователю.
4. Тесты программы
Давайте протестируем написанную программу
5. Заключение
Весь код программы выглядит следующим образом:
По ссылке далее вы можете скачать этот код с Яндекс.Диска:
Скачать код с Яндекс.Диска
Ну а сейчас.. Спасибо, что прочитали эту статью и надеюсь, она была вам полезна
Данный человек всегда открыт для обсуждения контента и общения с подписчиками, если найдутся какие либо вопросы то я обязательно постараюсь ответить на них.
По возможности я попросил бы подписаться и оценить публикацию. Сейчас это критически важно для развития канала.
Доброго вам всем здоровьица в эти трудные времена!
Содержание
- Работа с одномерными массивами на языке программирования Паскаль
- Одномерный числовой массив
- Способы заполнения одномерных массивов
- Ручной ввод данных
- Заполнение случайными числами
- Ввод данных по заданному правилу (формуле)
- Ввод данных из текстового файла
- Вывод линейного массива
- Шаблон для использования в однотипных задачах
- Задачи с решением
- Простая обработка элементов
- Сортировка элементов одномерного массива
- Задачи с использованием массива
Работа с одномерными массивами на языке программирования Паскаль
Массив — самая распространенная структура хранения данных, присутствующая в любом языке программирования.
В 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-х значные.
Сформировать массив случайных чисел (язык Паскаль)
Будем получать случайное целое число функцией random из промежутка [-30, 70].
В цикле for для счетчика k от 1 до N будем получать случайное число и присваивать его ячейке массива a[k], значение ячейки будем выводить на экран оператором write(a[k],’ ‘)
Программа решения на языке Паскаль
var a:array[1..100] of integer;
k,N:integer;
begin
write(‘Введите количество элементов массива N=’);
readln(N);
for k:=1 to N do
begin
a[k]:=random(-30,70);
write(a[k],’ ‘);
end;
end.
Результат выполнения программы
А как сформировать массив из 5 случайных неповторяющихся чисел?
Напишите программу в комментариях.