- •Лекция № 5 Структурированные типы данных. Массивы
- •1 Структурированные типы данных
- •2 Описание типа массива
- •3 Действия над массивами
- •Ввод массива Паскаля
- •Вывод массива Паскаля
- •Пример: даны два n -мерных вектора. Найти сумму этих векторов.
- •4 Действия над элементами массива Изменение значения некоторых элементов
- •Нахождение номеров элементов с заданным свойством
- •Нахождение количества элементов с заданным свойством
- •Удаление элементов из одномерного массива
- •Вставка одного элемента
- •Вставка нескольких элементов
- •Перестановка двух элементов
- •Перестановка части массива
Перестановка двух элементов
Пример. Поменять местами два элемента массива с номерами k1 и k2.
Procedure Obmen2(Var m : MyArray; n, k1, k2 : integer;); Var x : integer; Begin x:=m[k1]; m[k1] := m[k2]; m[k2] := x; End; |
Перестановка части массива
Пример. Дан одномерный массив А, состоящий из 2n элементов. Поменять местами первую и вторую его половины
Домашнее задание. Оформите решение этой задачи, применив процедуру обмена значений Obmen2. Вы должны поменять местами элементы с номерами 1 и n+1, 2 и n+2 и т.д., последняя пара - n и 2n, а значит, обмен происходит по правилу: элемент с номером i меняется местами с элементом с номером n+i. Эту закономерность следует применить в организации обращения к процедуре обмена.
for i := 1 to n do Obmen2(A, 2*n, i, i+n,); |
Работа с элементами двумерного массива
Пример. Найти максимальный элемент массива и его индексы.
Так как элементы могут повторяться, то будем запоминать только индексы первого максимального элемента. Опишем процедуру, которой передается массив, и ее результатом является значение максимального элемента и индексы первого из таких значений.
Procedure Maximum(X : MyArray2; n, m : integer; Var Max, Maxi, Maxj : integer); Var i, j : integer; Begin Max := X[1, 1]; {Предположим, что максимумом является первый элемент} Maxi := 1; {в этом случае запомним первую строку} Maxj := 1; {и первый столбец} for i := 1 to n do for j := 1 to m do if X[i, j] > Max then {если среди элементов массива нашелся больший элемент, то} begin Max := X[i, j]; {внесем новое найденное значение в переменную Мах} Maxi := i; {и не забудем запомнить индексы строки} Maxj := j; {и столбца этого элемента} end; End; |
Пример. Найти количество отрицательных элементов в каждой строке.
Способ 1 - количество элементов каждой строки хранить в одномерном массиве (Y) соответствующей размерности.
Procedure KolOtr1(X : MyArray2; n, m : integer; Var Y : MyArray1); Var i, j : integer; Begin for i := 1 to n do begin Y[i]:= 0; {записываем начальное значение количества элементов в соответствующую столбцу ячейку} for j := 1 to m do if X[i, j] < 0 then {если отрицательный элемент найден} Inc(Y[i]); {то увеличиваем текущее значение на единицу} end; End; |
Способ 2 - использовать счетчик, находить количество элементов строки и выводить значение на экран.
Procedure KolOtr2(X : MyArray2; n, m : integer); Var i, j, k : integer; Begin for i := 1 to n do begin k := 0; for j := 1 to m do if X[i, j] < 0 then Inc(k); writeln(i,' - ', k); end; End; |
Пример1. Найти скалярное произведение двух массивов. a[1]*b[1] + a[2]*b[2] + ... + a[n-1]*b[n-1] + a[n]*b[n]
Function Sp (a, b : MyArray; n ; integer) : LongInt; Var i : Integer; s : LongInt; Begin s:= 0; for i := 1 to n do s := s+a[i]*b[i]; Sp := s; End;
Пример2. Составить программу заполнения одномерного массива, так чтобы его i-ый элемент был равен a[i]=(i*i+1)/sin(i).
program mas2;
var a: array [1..10] of real;
i: integer;
begin
for i:=1 to 10 do
begin
a[i]:=(i*i+1)/sin(i);
writeln('a(', i, ')=', a[i], ' ');
end;
readln;
end.
Пример3. Составить программу определения количества элементов одномерного массива, значение элементов которых меньше заданного действительного числа t.
program mas3;
var a: array [1..10] of real;
i,k: integer; t:real;
begin
write('Введите число t=');
read(t);
k:=0;
for i:=1 to 10 do
begin
write('Введите значение элемента a(', i, ') = ');
readln(a[i]);
if a[i]=x[j] then
begin
r:=x[i]; x[i]:=x[j]; x[j]:=r;
end;
end;
writeln('Сортировка массива по возрастанию произведена:');
for i:=1 to 20 do writeln(x[i]);
writeln('Для выхода введите любое число.');
readln(q);
end.