ЛАБОРАТОРНАЯ РАБОТА №5 ОДНОМЕРНЫЕ МАССИВЫ Задача. Дан массив а, состоящий из 10 элементов. Составить программу поиска максимального элемента массива. Используем идею предыдущей задачи. Перед началом поиска выберем условно в качестве максимального первый элемент массива Max:=a[1]. Затем по очереди каждый элемент массива сравним со значением переменной m. Если он окажется больше, то изменим значение Max. После анализа всех элементов массива переменная Max содержит значение максимального элемента массива. . . . Max:=a[1]; for i := 2 to 10 do if Max<a[i] then Max := a[i]; . . . Задача. Дан массив а, состоящий из 10 элементов. Составить программу поиска элементов массива. program sorting; const n=20; {} Type Tarray=array[1..n] of integer; var i,buf,j:integer; a:Tarray; begin writeln('сортировка по возрастанию'); writeln('заполнение массива'); for i:=1 to n do begin a [i]:=random(100); write(a[i]:3, ' ' ); end; for i:=2 to n do for j:=n downto 1 do if a[j-1]>a[j] then begin buf:=a[j-1]; a[j-1]:=a[j]; a[j]:=buf; end; writeln('сортированный массив'); for j:=1 to n do write(a[j]:3, ' ' ); readln; end. Для реализации различных методов сортировки необходимо подготовить несколько вспомогательных процедур и функций. 1. Функция, которая ищет минимальный элемент правее некоторого заданного и возвращает его номер в качестве результата. Аргументами функции являются номер элемента массива и обрабатываемый массив: 2. Большинство методов сортировок основаны на обмене двух чисел. Для этой цели предназначена процедура, которая в качестве параметров берет два числа и меняет их значения 3. Также пригодится процедура, которая берет элемент с индексом i, перемещает его на место элемента с номером j. А все элементы, которые имеют индексы от j до i-1 сдвигает на одну позицию вправо. Доступ к элементам массива. Рассмотрите предложенные ниже фрагменты программ для решения некоторых типичных задач. Изменение значения некоторых элементов Задача. Заменить отрицательные элементы на противоположные по знаку. program Zamena; const n=20; Type Tarray=array[1..n] of integer; var i:integer; a:Tarray; begin writeln('замена отрицательного знака на положительный’); writeln('заполнение массива'); randomize; for i:=1 to n do begin a [i]:=random(10+20)-20; write(a[i]:3, ' ' ); end; for i:=1 to n do if a[i]<0 then a[i]:=-1*a[i]; writeln('новый массив'); for i:=1 to n do write(a[i]:3, ' ' ); readln; end. Нахождение номеров элементов с заданным свойством Задача. Найти и вывести на экран номера четных элементов. Для решения задачи необходимо просмотреть весь массив, и если просматриваемый элемент является четным, то выводить его номер.. program PoiskChet; const n=20; Type Tarray=array[1..n] of integer; var i:integer; a:Tarray; begin writeln('нахождение номера четного элемента'); writeln('заполнение массива'); randomize; for i:=1 to n do begin a [i]:=random(100); write(a[i]:3, ' ' ); end; writeln('номер четного элемента'); for i:=1 to n do if a[i] mod 2 = 0 then write(i:5); readln; end. Нахождение количества элементов с заданным свойством Задача. Найти количество положительных и отрицательных элементов в данном массиве. program kolichestvo; const n=20; {} Type Tarray=array[1..n] of integer; var i,k1,k2,j:integer; a:Tarray; begin writeln('подсчет положительных и отрицательных элементов в массиве '); writeln('заполнение массива'); randomize; for i:=1 to n do begin a [i]:=random(10+20)-20; write(a[i]:3, ' ' ); end; k1:=0; k2:=0; for i:=1 to n do if a[i] > 0 then inc(k1) else if a[i]<0 then inc(k2); writeln('количество положительных элементов'); writeln('k1=',k1); writeln('количество отрицательных элементов'); writeln('k2=',k2); readln; end. Удаление элементов из одномерного массива. Задача. Удалить из массива максимальный элемент, если все элементы разные. Для того, чтобы решить задачу нужно: найти номер максимального элемента k; сдвинуть все элементы, начиная с k-го, на один элемент влево; последнему элементу присвоить значение 0; уменьшить количество элементов массива на единицу. Рассмотрим задачу на конкретном примере. Пусть дан одномерный массив из целых чисел, состоящий из 10 элементов: 6, 3, 4, 7, 11, 2, 13, 8, 1, 5. Номер максимального элемента равен 7 (k=7), то есть, начиная с 7-го элемента, будем сдвигать элементы на один влево: 7-му присвоим значение 8-го, 8-му присвоим значение 9-го, 9му присвоим значение 10-го, на этом сдвиг заканчивается. Таким образом, сдвиг начинается с k-го элемента и идет по (n-1)-й (где n - количество элементов в массиве). После этого последнему элементу присвоим значение, равное 0, и тогда массив будет следующим: 6, 3, 4, 7, 11, 2, 8, 1, 5. Примечание. При удалении элемента размерность массива изменяется. Составим программу, удаляющую максимальный элемент из одномерного массива. Чтобы последний элемент не выводился, модифицируйте соответствующую процедуру таким образом, чтобы ей передавать не только массив, но и количество элементов, которые надо вывести, начиная с первого. program udalenie; const n=20; Type Tarray=array[1..n] of integer; var i,max,maxi:integer; a:Tarray; begin writeln('Удаление элемента'); writeln('заполнение массива'); randomize; for i:=1 to n do begin a [i]:=random(100); write(a[i]:3, ' ' ); end; max:=-maxint; for i:=1 to n do if a[i]>max then begin max:=a[i]; maxi:=i; end; for i:=maxi to n-1 do a[i]:=a[i+1]; a[n]:=0; writeln('номер максимального элемента= ', maxi); writeln('массив после удаления элемента' ); for i:=1 to n-1 do write(a[i]:3, ' ' ); readln; end. Вставка элементов в одномерный массив. Вставка одного элемента Вставлять элемент можно до или после данного элемента, номер этого элемента можно вводить с клавиатуры или искать при определенных условиях. Пусть k - это номер элемента, после которого необходимо вставить элемент х. Тогда вставка осуществляется следующим образом: первые k элементов массива остаются без изменения, все элементы, начиная с (k+1)-го, необходимо сдвинуть на один назад, на место (k+1)-го элемента записываем значение х; увеличить количество элементов в массиве на единицу. Задача. Вставить число после данного элемента массива. Рассмотрим на конкретном примере. Пусть задан следующий одномерный массив из N (N=10) элементов: 3, -12, 5, 14, 27, -6, 1, -34, 10, -15. Надо вставить 100 после пятого элемента массива, т. е. должен получиться следующий массив: 3, -12, 5, 14, 27, 100, -6, 1, -34, 10, -15. Таким образом, в массиве стало 11 элементов, то есть массив надо определять на N+1 элемент: Кроме того, в программе необходимо выводить массив два раза, сначала первые N элементов массива, а затем все N+1 элементы. program vstavka; const n=20; Type Tarray=array[1..n+1] of integer; var i,k,x:integer; a:Tarray; begin writeln('вставка элемента в массив'); writeln('заполнение массива'); randomize; for i:=1 to n do begin a [i]:=random(100); write(a[i]:3, ' ' ); end; writeln('введите номер элемента, после которого вставить новый элемент'); readln(k); writeln('введите число, которое надо вставить'); readln(x); for i:=n downto k+1 do a[i+1]:=a[i]; a[k+1]:=x; writeln('новый массив'); for i:=1 to n+1 do write(a[i]:3, ' ' ); readln; end. Вставка нескольких элементов Задача. Вставить число после всех элементов массива, кратных трем. Первое, на что необходимо обратить внимание - это описание массива: на сколько элементов может увеличиться массив? Максимальное количество элементов, после которых будет вставлен новый элемент, совпадает с количеством элементов массива, так как может случиться, что все элементы массива отвечают заданному свойству. Поэтому массив может увеличиться в два раза. Второе. Если просматривать массив с начала и вставлять новый после элемента с заданным свойством, то номер последнего элемента каждый раз может меняться, кроме того, будет просматриваться и новый (вставленный) элемент и его необходимо будет пропускать, поэтому решение будет не очень эффективным. Лучше всего просматривать массив, начиная с конца, тогда вставляемый элемент мешать не будет. Кроме того, номер последнего элемента можно будет знать (если знать, сколько элементов вставлено на данный момент), при этом просмотр будет последовательным от N-го до 1-го. program perestanovka; const n=20; Type Tarray=array[1..2*n] of integer; var i,k,x,j,mn:integer; a,b:Tarray; begin writeln('вставка элементов'); writeln('заполнение массива'); randomize; for i:=1 to n do begin a [i]:=random(100); write(a[i]:3, ' ' ); end; mn:=n; writeln('введите число, которое надо вставить'); readln(x); for i:=n downto 1 do if a[i] mod 3 = 0 then begin mn:=mn+1; for j:=mn downto i+1 do a[j+1]:=a[j]; a[i+1]:=x; end; writeln('новый массив'); for i:=1 to mn do write(a[i]:3, ' ' ); readln; end. Перестановка элементов массива. Перестановка двух элементов Задача. Поменять местами два элемента массива с номерами k1 и k2. Эту задачу можно решить следующим образом: Var m : MyArray; n, k1, k2, x : integer; Begin x:=m[k1]; m[k1] := m[k2]; m[k2] := x; End; Перестановка части массива Задача. Дан одномерный массив А, состоящий из 2n элементов. Поменять местами первую и вторую его половины Заметим лишь, что необходимо поменять местами элементы с номерами 1 и n+1, 2 и n+2 и т.д., последняя пара - n и 2n, а значит, обмен происходит по правилу: элемент с номером i меняется местами с элементом с номером n+i. Работа с несколькими массивами В Turbo Pascal можно одним оператором присваивания передать все элементы какого-либо массива другому массиву того же типа, например: Var a, b: array [1 .. 5] of integer; Begin ... a:=b; ... End. После такого присваивания все пять элементов массива a получат значения из массива b. Рассмотрим одну из типичных задач. Задача. Найти скалярное произведение двух массивов. Скалярным произведением двух массивов одинаковой размерности называется сумма произведений соответствующих элементов. Это можно записать так: a[1]*b[1] + a[2]*b[2] + ... + a[n-1]*b[n-1] + a[n]*b[n], где n - это количество элементов в массивах (размерность). Тогда можно составить следующую программу: Var a, b : MyArray; n, i : Integer; s : LongInt; Begin s:= 0; for i := 1 to n do s := s+a[i]*b[i]; Sp := s; Практическое задание Задание 1 1. Дан одномерный целочисленный массив. Составьте программу определения значения наибольшего элемента этого массива. Паскаль program Project1; var a:array [1..100] of integer; i,n,Max:integer; begin randomize; write('Введите кол-во элементов ='); read(n); for i:=1 to n do begin a[i]:=random(10); write(a[i], ' '); end; max:=a[1]; for i:=2 to n do if a[i]>max then max:=a[i]; writeln; write('Значение наибольшего элемента =',max); readln(); end. Задание 2 1. Удалить все повторяющиеся элементы, оставив только их первые вхождения, то есть получить массив различных элементов. //fpc 3.0.0 program udalenie; var a:array[1..100] of integer; n,i,j,k:integer; begin randomize; write('n=');readln(n); writeln('Ishodnyj massiv:'); for i:=1 to n do begin a[i]:=random(10); write(a[i],' '); end; writeln; i:=1; while i<=n do begin j:=i+1;{смотрим впереди} while j<=n do begin if a[j]=a[i] then{если такой же} begin for k:=j to n-1 do{сдвигаем на наго конец массива} a[k]:=a[k+1]; n:=n-1;{уменьшаем размер} end else j:=j+1; end; i:=i+1; end; writeln('Massiv bez povtorenij:'); for i:=1 to n do write(a[i],' '); readln end. Задание 3 1. Сформировать массив: Y[1]=A[1]+A[n] Y[2]= A[2]+A[n-1] Y[3]= A[3]+A[n-2] и т.д. (n - четное) program z3; var a:array[1..100] of integer; y:array[1..100] of integer; n,i,j,k:integer; begin randomize; write('n=');readln(n); writeln('Ishodnyj massiv:'); for i:=1 to n do begin a[i]:=random(10); write(a[i],' '); end; writeln; for i:=1 to n div 2 do y[i]:=a[i]+a[n-i+1]; writeln('Massiv y:'); for i:=1 to n div 2 do write(y[i],' '); readln end.