Использование языка Free Pascal для обработки массивов. Вставка и удаление элементов в массивах
X[ 3 ] : =X [ 4 ];
X[ 4 ] : =X [ 5 ];
X[ 5 ] : =X [ 6 ];
Таким образом, все элементы с третьего по пятый надо переместить влево на один - на место i -го элемента нужно записать (i+1) -й. Блок-схема алгоритма представлена на рис. 5.25 .
Рис.
5.25.
Рис. 5.26.
Рис. 5.27.
Теперь рассмотрим более общую задачу: необходимо удалить m -й элемент из массива X , состоящего из n элементов. Для этого достаточно записать элемент (m+1) -й на место элемента c номером m, (m+2) -й элемент - на место (m+1) -го и т. д., n -й элемент - на место (n–1) -го. Процесс удаления элемента из массива представлен на рис. 5.26 .
Алгоритм удаления из массива Х размерностью n элемента с номером m приведён на рис. 5.27 .
После удаления элемента 4А фактически сдвига части массива на один элемент влево из массива изменится количество элементов в массиве (уменьшится на один), и у части элементов изменится индекс . Если элемент удалён, то на место него приходит следующий, передвигаться к которому (путём увеличения индекса на один) нет необходимости. Следующий элемент сам сдвинулся влево после удаления.
Если обрабатывается массив , в котором часть элементов удаляется, то после удаления элемента не надо переходить к следующему (при этом уменьшается количество элементов). В качестве примера рассмотрим следующую задачу.
ЗАДАЧА 5.1. Удалить из массива отрицательные элементы.
Алгоритм решения задачи довольно прост: перебираем все элементы массива, если элемент отрицателен, то удаляем его путём сдвига всех последующих на один влево. Единственное, о чём стоить помнить, - что после удаления элемента не надо переходить к следующему для последующей обработки, он сам сдвигается на место текущего. Блок-схема решения задачи 5.1 представлена на рис. 5.28 .
Ниже представлен текст программы с комментариями.
program upor_massiv; var i, n, j: byte; X: array [ 1.. 100 ] of real; begin writeln (’введите размер массива ’); readln (n); {Ввод массива.} for i:=1 to n do begin write (’X[ ’, i, ’ ]= ’); readln (X[ i ]); end; writeln (’массив X ’); for i:=1 to n do write (x [ i ] : 5: 2, ’ ’); writeln; i: = 1; while (i<=n) do {Если очередной элемент массива X[i] отрицателен, то} if x [ i ]<0 then begin {удаляем элемент массива с номером i.} for j:= i to n_1 do x [ j ] : = x [ j + 1 ]; {Уменьшаем размер массива.} {Не надо переходить к следующему элементу массива.} n:=n -1; end else {Если элемент не удалялся, то переходим к следующему элементу массива.} i:= i +1; writeln (’Изменённый массив ’); for i:=1 to n do {Вывод преобразованного массива.} write (X[ i ] : 5: 2, ’ ’); writeln; end.
Рис. 5.28.
Результаты работы программы представлены на рис. 5.29 .
Рис. 5.29.
5.9 Вставка элемента в массив
Рассмотрим несложную задачу: вставить число b в массив X(10) , между третьим и четвёртым элементами.
Для решения этой задачи необходимо все элементы массива, начиная со четвёртого, сдвинуть вправо на один элемент. Затем в четвёртый элемент массива нужно будет записать b (X:=b;) . Но чтобы не потерять соседнее значение , сдвигать на один вправо нужно сначала десятый элемент, затем девятый, восьмой и т. д. до четвёртого. Блок-схема алгоритма вставки приведена на рис. 5.30 .
Рис. 5.30.
В общем случае блок-схема вставки числа b в массив X(N) , между элементами c номерами m и m+1 представлена на рис. 5.31 .
Рис. 5.31.
Ниже представлен фрагмент программы, реализующий этот алгоритм 5При описании массива необходимо предусмотреть достаточный размер для вставки одного элемента. .
var i, n,m: byte; X: array [ 1.. 100 ] of real; b: real; begin writeln (’N= ’); readln (n); for i:=1 to n do begin write (’X[ ’, i, ’ ]= ’); readln (X[ i ]); end; writeln (’Массив X ’); for i:=1 to n do write (x [ i ] : 5: 2, ’ ’); writeln; writeln (’m= ’); readln (m); writeln (’ b= ’); readln (b); for i:=n downto m+1 do x [ i +1]:=x [ i ]; x :=b; n:=n+1; writeln (’Изменённый массив ’); for i:=1 to n do write (X[ i ] : 5: 2, ’ ’); writeln; end.
5.10 Использование подпрограмм для работы с массивами
Рассмотрим, как можно передавать массивы в подпрограмму. Как известно (см. главу 4), чтобы объявить переменные в списке формальных параметров подпрограммы, необходимо указать их имена и типы. Однако типом любого параметра в списке может быть только стандартный или ранее объявленный тип. Поэтому для того, чтобы передать в подпрограмму массив , необходимо вначале описать его тип 6Тип данных массива, объявление массива см. в п. 2.4.9. Подробно работа с массивами описана в данной главе. , а затем объявлять процедуру:
тип_массива = array [ список_индексов ] of тип;
procedure
имя_процедуры(имя_массива: тип_массива);
Например:
type vector=array [ 1.. 10 ] of byte; matrica=array [ 1.. 3, 1.. 3 ] of real; procedure proc (A: matrica; b: vector; var x: vector);
Понятно, что передача в подпрограмму строки вида
имя_переменной: string [ длина_строки ];
которая фактически является массивом 7Тип данных "строка", объявление строки см. в п. 2.4.9 , должна осуществляться аналогично:
тип_строки = string [ длина_строки ];
procedure
имя_процедуры(имя_строки: тип_ строки);
Например:
type stroka_5=string [ 5 ]; stroka_10=string [ 1 0 ]; function fun (S t r: stroka_5) : stroka_10;
Массивы в подпрограмму можно передавать, используя понятие открытого массива. Открытый массив - это массив 8Тип данных "массив", объявление массива, обращение к массиву см. в п. 2.4.9. , при описании которого указывается тип элементов, из которых он состоит, но не определяются границы изменения индексов:
имя_открытого_массива: array of array of... тип;
Например:
var massiv_1: array of real; massiv_2: array of array of char; massiv_3: array of array of array of byte;
Распределение памяти и указание границ индексов
end; {for i}
Вставка и удаление элемента в массив
Рассмотрим алгоритм вставки элемента в массив. Для простоты будем рассматривать только одномерные массивы. Массив состоит из некоторого количества элементов nmax (емкость
массива). Текущее количество элементов массива находится в переменной n.
Перед вставкой очередного элемента проверяем, что текущее количество элементов массива меньше, чем его емкость.
Далее проверяем, вставляется ли элемент в конец массива или нет. Если элемент вставляется в конец массива, то увеличиваем n на единицу и добавляем элемент. Иначе сдвигаем элементы массива индекс которых больше или равен индексу вставляемого элемента, рисунок 3.
Приведенный алгоритм реализован в программе, приведенной в листинге 6.
Листинг 6 – Вставка элемента в массив
{$MODE DELPHI} {$ENDIF}
{$APPTYPE CONSOLE} program InsElt;
i :integer;
//Ввод массива
//Элемент для вставки writeln("Vvedite element" ); readln(element);
//Индекс элемента
//Вставка элемента
if index < n+1 then begin
inc(n); //увеличиваем длину массива
if (Low(a) <= index) and (index <= n) then for i:=n downto index do
a[i]:=a; //сдвиг массива
a:=element; end
//Вывод элементов массива на экран for i:=1 to n do
writeln("a[" , i,"]=" , a[i]:6:2);
Удаление элемента происходит аналогично. Сначала проверяется, что индекс элемента не выходит за диапазон допустимых значений, а затем сдвигаются элементы таким образом, чтобы закрыть удаляемый элемент, рисунок 4
Листинг 7
{$MODE DELPHI} {$ENDIF}
{$APPTYPE CONSOLE} program DelElt;
const nmax = 5; //емкость массива
i :integer;
writeln("Vvedite chislo elementov massiva"); readln(n);
//Ввод массива
for i:=1 to n do begin write("a[" , i,"]=" ); readln(a[i]);
//Индекс элемента
writeln("Vvedite index elementa"); readln(index);
//Удаление элементов
if index if (Low(a) <= index) and (index <= n) then for i:=index to n do a[i]:=a;
//сдвиг массиваdec(n);
//уменьшаем длину массиваend
else begin writeln("Invalid index"
); readln; Чтобы пользоваться предварительным просмотром презентаций создайте себе аккаунт (учетную запись) Google и войдите в него: https://accounts.google.com Одномерные массивы Вставка и удаление элемента Вставка и удаление элементов Алгоритм удаления элемента: определить номер удаляемого элемента - k (ввести с клавиатуры или найти из каких-то условий) сдвинуть все элементы начиная с k -ого на 1 элемент влево последнему элементу массива присвоить значение 0 При удалении элемента размер массива не меняется! Поэтому необходимо далее в программе указывать не до n , а до n -1. Элемент который нужно удалить дан массив А: 3 5 6 8 12 15 17 18 20 25 k:=4 3 5 6 12 15 17 18 20 25 25 3 5 6 12 15 17 18 20 25 0 const n= 30; var a: array of integer; k, i: integer; begin {ввод массива и k } ... for i:= k to n-1 do a[i] := a; a[n] := 0; writeln( Результат: ); for i:= 1 to n-1 do write (a[i] :3); readln; end . Алгоритм вставки элемента: (после k -ого) первые k элементов остаются без изменений все элементы, начиная с k -ого сдвигаются на 1 позицию назад на место (k +1)-ого элемента записываем новый элемент. Массив из n элементов, в который вставляется k элементов необходимо определять как массив, имеющий размер n + k . Вставка перед элементом отличается только тем, что сдвигаются все элементы, начиная с k -ого и на место k -ого записываем новый дан массив А: k:=4 3 5 6 8 8 12 15 17 18 20 25 3 5 6 8 100 12 15 17 18 20 25 1 2 3 4 5 6 7 8 9 10 3 5 6 8 12 15 17 18 20 25 позиция для добавления нового элемента Пример: Вставить 100 после элемента номер которого вводится с клавиатуры: const n= 30; var a: array of integer; k, i: integer; begin { ввод массива и k} ... for i:= n downto k+1 do a := a[i]; a := 100; writeln( Результат: ); for i:= 1 to n+1 do write (a[i] :3); readln; end . «Одномерные массивы: решение задач на добавление и удаление элемента»
Конспект урока разработан для учащихся 10 классов изучающих язык программирования Pascal. В конспекте подробно на примерах объясняется, как можно добавить и удалить элементы в одномерном ма... Конспект урока по информатике на тему: Технология ввода текста. Редактирование текста: вставка, удаление и замена символов; вставка и удаление пустых строк. Цель урока: научить техноло... Схема конспекта урока «Одномерные массивы. Ввод и вывод одномерного массива»
Предмет «Информатика» Класс 9 Тема урока «Одномерные массивы. Ввод и вывод одномерного массива»Тип урока: комбинированныйОборудование: компью... Работа с элементами одномерного массива
Цель урока:формировать и развивать предметные и ключевые компетенции;расширять представление о зоне применения одномерных массивов;повышать культуру написания программ;прививать навыки структурировани... Тема урока:
«Вставка и удаление элементов массива». Предмет:
Информатика и ИКТ. Класс:
10 (профиль). Ключевые слова:
информатика, практическая работа, программирование, массивы, вставка, удаление элементов. Тип урока:
практическая работа. Оборудование:
Раздаточный материал; персональные компьютеры. Литература:
Попов В.Б. Turbo
Pascal
для школьников: Учебн. пособие - 3-е доп. изд. – М.: Финансы и статистика, 2004, - 528 с.: ил. Семашко Г.Л., Салтыков А.И. «Программирование на языке паскаль», М: «Наука», 1993 г. ФароновВ.
В. «
Turbo
Pascal
7.0.
Начальный курс», М: «Нолидж», 1997 г. Цель работы:
разобрать принципы вставки и удаления элементов в одномерных и двумерных массивах, закрепить полученные знания, путем решения задач. Время выполнения:
2 урока. Ход урока.
I
. Удаление элементов из массива.
Одномерный массив
Двумерный массив
Постановка задачи: Дан массив A
(N
). Удалить элемент, расположенный на месте k
. Дан массив B
(N
,M
). Удалить столбец с номером k
. (аналогично для удаления строки) Описание способа удаления: Сдвинуть весь «хвост» массива, начиная с элемента с номером k
+1, на одну позицию влево, т.е. выполняя операцию: a
i
=a
i
+1 , где i
= k
, k
+1, …, N
-1 Полученный массив будет содержать N
-1 элемент. Сдвинуть все столбцы, начиная с k
+1 по m
на одну позицию влево, выполнив операции: Для j
от 1 до m
-1 делать a
i
, j
=a
i
, j
+1 Дано: 3 5 7 8 9 N=5, k=2
Операции: a
2
:=a
3
; a
3
:=a
4
; a
4
:=a
5
Итог: 3 7 8 9
Дано: N
=3, M
=4, k
=2 Операции: Результат: 1 5 2 7 a 1,2:=a 1,3 ; a 1,3:=a 1,4 ; 8 4 3 5 a 2,2:=a 2,3 ; a 2,3:=a 2,4 ; 0 9 1 4 a 3,2:=a 3,3 ; a 3,3:=a 3,4 ; Программа Randomize
; Writeln
(‘Введите количество элементов’); Readln
(n
); Writeln
(‘Введите № удаляемого элемента’); Readln
(k
); {формирование массива случайным образом} For i:=1 to n do begin a[i]:=random(101)-50; end
; writeln
; {удаление заданного элемента} For i:=k to n-1 do {
выводитоговогомассива}
For i:=1 to n-1 do clrscr; randomize; writeln("
Введитекол-
вострокистолбцов");
writeln("
Введите №
удаляемогостолбца");
for i:=1 to n do begin {формируем массив} for j:=1 to m do begin b:=51*random-25; write(b:8:2) for j:=k to m-1 do {
удаляем k-
ыйстолбец}
for i:=1 to n do b:=b; {выводим получ
енный массив}
for i:=1 to n do begin for j:=1 to m-1 do begin write(b:8:2) В одномерном массиве A
(N
) найти min
элемент и удалить его. В двумерном массиве B
(N
,M
) удалить строку с номером k
. При этом выполнить проверку: не превышает ли значение k
количества строк массива B
. II
. Вставка (включение) элементов в массив.
Одномерный массив
Двумерный массив
Постановка задачи: Дан массив A
(N
). Включить на k
место в этом массиве элемент, равный m
. Дан массив B
(N
,M
). Добавить столбец с номером k
. Элементы нового столбца равны элементам массива C
(N
).(аналогично для добавления строки) Описание способа удаления: Перед включением заданного элемента в массив, необходимо раздвинуть этот массив, т.е. передвинуть «хвост» массива вправо на одну позицию, т.е. выполняя операцию: a
i
+1 =a
i
, где i
= N
, N
-1, …, k
. Перемещение элементов массива начинаем с конца, в противном случае весь хвост массива заполнится k
-ым элементом. Размер массива увеличится до N
+1 элемента. Сдвинуть все столбцы, начиная с m
по k
на одну позицию вправо, выполнив операции: для j
от m
до k
делать Перебрать все строки с 1 по n
, выполнив a
i
, j
+1 =a
i
, j
Затем в i
=1-ой по n
строках a
i
, k
:=c
i
В новом массиве будет M
-1 столбец. Важно:
при добавлении столбца (строки) в двумерный массив, элементы этого столбца (строки) берутся из дополнительного одномерного массива размером = кол-ву строк двумерного массива (=кол-ву столбцов) либо вводятся
с клавиатуры. Дано: 3 8 7 6 5 N=5, k=2, m=4
Операции: a
6
:=a
5
=5; a
5
:=a
4
=6; a
4
:=a
3
=7; a
3
:=a
2
=8
Итог: 3 4 8 7 6 5
Дано: N
=3, M
=4, k
=3 Операции: Результат: C(N)={6,8,2} a 1,5:=a 1,4 ; a 1,4:=a 1,3 ; 1 5 2 7 a 2,5:=a 2,4 ; a 2,4:=a 2,3 ; 8 4 3 5 a 3,5:=a 3,4 ; a 3,4:=a 3,3 ; Программа Var a:array of integer; n,k,i:byte; m:integer; Writeln("
Введитеколичествоэлементов");
Writeln("
Введите №
включаемогоэлемента");
Readln
(k
); Writeln
("Введите значение включаемого эл-та"); {
формируеммассив}
For i:=1 to n do begin a[i]:=random(101)-50; end
; writeln
; {раздвигаем эл-ты массива} For i:=n downto k do a
:=a
; {заносим новый эл-т на k-ую позицию} a
:=m
; {выводим получившийся массив} For i:=1 to n+1 do var b:array of real; i,j,m,n,k:byte; c:array of real; clrscr; randomize; writeln
("Введите кол-во строк и столбцов"); readln
(n
,m
); writeln
("Введите № добавляемого столбца"); for i:=1 to n do begin {формируем исходный массив} for j:=1 to m do begin b:=51*random-25; write(b:8:2) end;writeln;end;writeln; for i:=1 to n do begin {форм. массив доб-го столбца} c[i]:=51*random-25; write(c[i]:8:2) end; writeln; writeln; for j:=m downto k do {раздвигаем столбцы} for i:=1 to n do b:=b; for i:=1 to n do {добавляем столбец} for i:=1 to n do begin {выводим полученный массив} for j:=1 to m+1 do begin write(b:8:2) end; readln end. Задачи для самостоятельного решения:
В одномерном массиве A
(N
) найти max
элемент и вставить за ним элемент равный 2*max
. В двумерном массиве B
(N
,M
) вставить k
-ую строку элементов массива C
(M
). При этом выполнить проверку: не превышает ли значение k
количества строк массива B
.Подписи к слайдам:
По теме: методические разработки, презентации и конспекты