Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб 9.doc
Скачиваний:
2
Добавлен:
25.04.2019
Размер:
229.38 Кб
Скачать

Обработка нескольких массивов одновременно.

Если обрабатываются несколько массивов одновременно, то для каждого массива нужно выбрать подходящую схему перебора, завести свой индекс, следить , чтобы индекс не вышел за границы массива. В некоторых частных случаях для обработки нескольких массивов бывает достаточно одного индекса, потому что элементы массива обрабатываются «синхронно», то есть, зная индекс элемента одного массива, можно вычислить по некоторой формуле индекс соответствующего ему элемента другого массива. Если такой формулы установить не удается, то говорят, что массивы обрабатываютя «асинхронно».

Пример: Дан массив целых чисел. Необходимо сформировать второй массив, содержащий четные элементы первого массива, при этом расположить элементы во втором массиве:

а) на тех же позициях, что и в первом;

б) сдвинуть к началу массива.

Вариант 1.

const n=30;

var a,b: array [1..n] of integer;

i,n: integer;

begin

write (‘задайте количество элементов массива’);

readln (n);

for i:=1 to n do

begin

read (a[i]);

if a[i] mod 2 = 0 then b[i]:=a[i];

End;

for i: = 1 to n do

write (b[i],”);

End.

Вариант 2.

const n=30;

var a,b:array [1..n] of integer;

i,k,n:integer;

begin

write (‘задайте количество элементов массива’);

readln (n);

for i: = 1 to n do

read (a[i]);

k:=0; {в массиве b нет ещё элементов}

for i:=1 to n do

if a[i] mod 2 = 0 then begin

k:=k+1;

b[k]:=a[i];

end;

for i:=1 to k do

write (b[i], “);

End.

Поисковые задачи для массивов.

Часто в программировании возникает задача отыскать первый элемент, совпадающий с заданным х. Для решения этой задачи могут быть предложены следующие варианты:

  • линейный поиск;

  • поиск с барьером;

  • дихотомический поиск.

Линейный поиск

Алгоритмом такого поиска был рассмотрен при решении типовых задач на построение циклических алгоритмов. Напомним, что особенностью такого поиска является две причины прекращения поиска:

Элемент найден (это программируется с помощью логической переменной)

Просмотрены все элементы, но заданный элемент так и не нашли (i > n)

const n=20; {количество элементов в массиве}

var a:array [1..n] of integer; {исходный массив}

i,x:integer;

f:boolean;

begin

write(‘задайте искомый элемент’);

readln(x);

writeln(‘задайте элементы массива’);

for i:=1 to n do

readln(a[i]);

f:=false; {элемент ещё не найден}

i:=1;

while (i<=n) and not f do

if a[i]=x then f:=true {нашли}

else i:=i+1 {переходим к следующему элементу}

if f then writeln (‘ нашли элемент с номером‘, i)

else writeln (‘такого элемента нет’)

End.

Поиск с барьером

Применяется широко распространенный прием фиктивного элемента, или барьера, расположенного в конце массива. Использование барьера позволяет упростить условие окончания цикла, т.к. заранее ясно, что хотя бы один элемент, равный а, в массиве есть. При этом необходимо увеличить размер массива на 1.

сonst n=20; {количество элементов в массиве}

var a:array [1..n+1] of integer; {исходный массив}

i,x:integer;

begin

write (‘задайте искомый элемент’);

readln (x);

writeln (‘задайте элементы массива’);

for i:=1 to n do

readln (a[i]);

a[n+1]:=x; {установлен барьер, равный х, в конце}

i:=1; {массива}

while a[i]<>x do

i:=i+1; {переходим к следующему элементу}

if i<>n+1 then writeln (‘нашли элемент с номером’, i)

else writeln (‘такого элемента нет’):

End.

Дихотомический поиск (поиск элемента в упорядоченном массиве)

Алгоритм дихотомического поиска достаточно прост. Делим массив пополам и определяем в какой из частей может находиться искомый элемент. Поскольку массив упорядочен, то сравнивая искомый элемент со средним элементом массива, легко определить интересующую нас половину. Затем выбранную половину опять делим пополам и определяем в какой половине находится искомый элемент. Этот процесс продолжаем до тех пор, пока не будет найден искомый элемент, либо левая граница нового отрезка не станет больше правой. В последнем случае можно сделать вывод о том, что искомого элемента в массиве нет.

const n=20; {kоличество элементов в массиве}

var a:array [1..n] of integer; {исходный массив}

i,x,k,m:integer;

left,right,mid:integer; {левая, правая граница и середина}

f:boolean; {отрезка}

begin

write (‘задайте искомый элемент’);

readln (k);

for i:=1 to n do

readln(a[i]);

{упорядочивание массива по возрастанию}

for i:=1 to n–1 do

begin

m:=i;

for j:= i+1 to n do

if a[j]<a[m] then m: =j;

x:=a[i];

a[i]:=a[m]; a[m]:=x

end;

{поиск элемента}

f:=false; {элемент не найден}

left:=1; right:=n;

repeat {поиск элемента в части массива от элемента [left] до

элемента [rigth]}

mid:=(left + right) div 2;

if k<a[mid] then right:=mid–1 {элемент в левой части}

else if k>a[mid] then left:=mid+1 {элемент в правой части}

else f:=true; {нашли}

else f:=true; {нашли}

until f or (left>rigth);

if f then writeln (‘элемент с номером’,mid:2,‘совпадает с

искомым’,k)

else writeln (‘не нашли’);

End.

Удаление и вставка элементов в массив

Пример. Удалить из массива максимальный элемент, если все элементы разные.

Для того, чтобы решить эту задачу, нужно:

  • найти номер максимального элемента k;

  • сдвинуть все элементы, начиная с k-го, на один элемент влево;

  • последнему элементу присвоить значение 0;

  • уменьшить количество элементов на единицу.

Примечание. При удалении элемента размерность массива не изменяется.

Program DeleteK;

Const m=30;

Type

Myarray= array[1..m] of integer;

Var

a:Myarray;

k:integer;

{процедура инициализации массива}

procedure InputMas(var x:Myarray);

Var

i:integer;

Begin

For i:= 1 to m do

x[i]:=Random(100);

end;

{процедура вывода элементов массива}

procedure PrintMas(x:Myarray; n: integer);

Var

i:integer;

Begin

For i:= 1 to n do

Write(x[i]:3,’’);

Writeln;

end;

{функция нахождения номера наибольшего элемента массива}

function Maximum(x:Myarray; n:integer):integer;

Var

i,max,maxi:integer;

Begin

max:=-maxint; {начальным значением переменной будет}

{наименьшее значение данного типа}

For i:= 1 to n do

if x[i]> max then

Begin max:= x[i]

maxi:=i;

end;

Maximum:= maxi;

end;

{процедура удаления элемента массива с номером k1}

procedure Delete(var x:Myarray; var n:integer; k1:integer);

Var

i:integer;

Begin

For i:= k1 to n-1 do

x[i]:= x[i+1];

x[n]:=0;

Dec(n);

end;

{основная программа}

Begin

writeln (‘Введите элементы массива:’);

InputMas(a);

PrintMas(a,m);

k:= Maximum(a,m);

Delete(a,m,k);

writeln (‘Массив после удаления элемента:’);

PrintMas(a,m-1);

End.

Вставка одного элемента

Пусть k – это номер элемента, после которого мы должны вставить x. Тогда вставка осуществляется следующим образом:

  • первые k элементов остаются без изменения;

  • все элементы, начиная с (k+1)-го, необходимо сдвинуть на один назад;

  • на место (k+1)-го элемента записываем значение х;

  • увеличить количество элементов в массиве на единицу.

Пример. Вставить введённое число х после элемента с номером k.

Program Vstavka;

Const n=10;

Type

Myarray= array[1..n+1] of integer;

Var

a:Myarray;

k,x:integer;

procedure InputMas(var m:Myarray);

Var

i:integer;

Begin

For i:= 1 to n do

m[i]:=Random(100);

end;

procedure PrintMas(m:Myarray; n: integer);

Var

i:integer;

Begin

For i:= 1 to n do

Write(m[i]:3,’’);

Writeln;

end;

procedure Ins(var m:Myarray; var n: integer; Mesto,Element:integer);

Var

i:integer;

Begin

For i:=n downto Mesto+1 do

m[i+1]:= m[i];

m[Mesto+1]:= Element;

Inc(n);

end;

Begin

writeln (‘Введите элементы массива:’);

InputMas(a);

PrintMas(a,n);

Writeln(‘Номер элемента, после которого вставлять: ’);

Readln(k);

Writeln(‘Вставляемое число х: ’);

Readln(х);

Ins(a,n,k,x);

PrintMas(a,n+1);

End.

Вставка нескольких элементов

Пример. Вставить число х после всех элементов, кратных трём.

Program Vstavka2;

Const n=10;

Type

Myarray= array[1..2*n] of integer;

Var

a:Myarray;

k,x,i:integer;

procedure InputMas(var m:Myarray);

-----------

procedure PrintMas(m:Myarray; n: integer);

-----------

procedure InsN(var m:Myarray;var n: integer; Mesto,Element:integer);

Var

i:integer;

Begin

For i:=n downto Mesto+1 do

m[i+1]:= m[i];

m[Mesto+1]:= Element;

Inc(n);

end;

Begin

writeln (‘Введите элементы массива:’);

InputMas(a);

PrintMas(a,n);

Writeln(‘Вставляемое число х: ’);

Readln(х);

k:=0;

For i:=n downto 1 do

If a[i] mod 3=0

then Begin

InsN(a,n,i,x);

k:=k+1;

end;

PrintMas(a,n+k);

End.

Примечание. Если массив используется в качестве аргумента подпрограммы, то в основной программе в описании массив должен иметь тип, введённый в раделе описания типов type.

Лабораторная работа №9

Тема: «Решение задач обработки одномерных массивов»

Цель задания: получение практических навыков при работе с массивами, их ввода, вывода, закрепление навыков по организации программ циклической структуры, овладение навыками по организации программ вложенной циклической структуры.

Задание №1

1. В одномерном массиве А, состоящем из N вещественных элементов, вычислить:

a) сумму отрицательных элементов массива;

b) количество элементов, удовлетворяющих условию и .

2. В одномерном массиве В, состоящем из N вещественных элементов, вычислить:

a) сумму положительных элементов массива;

b) количество элементов, удовлетворяющих условию .

3. В одномерном массиве С, состоящем из N вещественных элементов, вычислить:

a) произведение элементов массива с чётными номерами;

b) количество элементов, удовлетворяющих условию .

4. В одномерном массиве А, состоящем из N вещественных элементов, вычислить:

a) произведение элементов массива с нечётными номерами;

b) количество элементов, удовлетворяющих условию или .

5. В одномерном массиве D, состоящем из N целых элементов, вычислить:

a) максимальный по модулю элемент;

b) количество элементов, кратных 3.

6. В одномерном массиве Х, состоящем из N целых элементов, вычислить:

a) минимальный по модулю элемент;

b) количество элементов, кратных 5.

7. В одномерном массиве А, состоящем из N целых элементов, вычислить:

a) номер минимального по модулю элемента;

b) количество чётных элементов.

8. В одномерном массиве Y, состоящем из N целых элементов, вычислить:

a) количество нулевых элементов;

b) произведение элементов кратных 5.

9. В одномерном массиве В состоящем из N целых элементов, вычислить:

a) количество элементов, равных по значению первому элементу;

b) произведение элементов из промежутка [-8;3].

10. В одномерном массиве Z, состоящем из N целых элементов, вычислить:

a) произведение отрицательных элементов;

b) количество элементов с номерами, кратными 3.

11. В одномерном массиве Х, состоящем из N целых элементов, вычислить:

a) количество элементов, удовлетворяющих условию ;

b) сумму элементов, кратных 3.

12. В одномерном массиве Х, состоящем из N вещественных элементов, вычислить:

a) количество элементов, меньших 5;

b) среднее арифметическое положительных элементов.

13. В одномерном массиве Y, состоящем из N целых элементов, вычислить:

a) количество элементов, равных последнему элементу массива;

b) среднее арифметическое элементов, кратных 3.

Задание №2

  1. Вычислить , где и - сумма и количество положительных элементов массива Х(N); и - сумма и количество положительных элементов массива Y(M). Вычисление суммы и количества положительных элементов массива оформить в виде подпрограммы.

  1. Вычислить , где и - сумма и количество отрицательных элементов массива А(N); и - сумма и количество отрицательных элементов массива В(M). Вычисление суммы и количества отрицательных элементов массива оформить в виде подпрограммы.

  1. Составить программу, которая вычисляет наибольшие элементы и их порядковые номера для массивов Х(N), Y(M). Нахождение наибольших элементов и их порядковых номеров оформить в виде подпрограммы.

  1. Составить программу, которая все элементы массивов Х(1..10) и Y(1..13), расположенные на чётных местах заменяет нулями, а на нечётных – значением максимального элемента. Преобразование массива оформить в виде подпрограммы.

  1. Составить программу, которая переставляет элементы массивов А(1..10) и В(1..8) в обратном порядке, т. е. первый элемент обменивается своим значением с последним, второй – с предпоследним. Преобразование массива оформить в виде подпрограммы.

  1. Составить программу, которая находит максимальное и минимальное значения элементов в массивах А(M), B(N), C(K). Нахождение максимального и минимального значений элементов массива оформить в виде подпрограммы.

  1. Составить программу, которая определяет среднее арифметическое чётных элементов и среднее арифметическое нечётных элементов в массивах X(N) и Y(M). Нахождение средних арифметических оформить в виде подпрограммы.

  1. Составить программу, которая находит количество элементов, равных первому элементу, и количество элементов, равных последнему, в массивах X(N) и Y(M). Вычисление количества элементов оформить в виде подпрограммы.

  1. Составить программу, которая находит произведение элементов, меньших среднего арифметического всех элементов, сумму элементов, больших среднего арифметического, в массивах X(6) и Y(8). Вычисление суммы и произведения оформить в виде подпрограммы.

  1. Составить программу, которая определяет количество положительных элементов до последнего нулевого элемента и количество отрицательных после него в массивах Y(N) и X(M). Вычисление количества элементов оформить в виде подпрограммы.

  1. Составить программу, которая определяет сумму ненулевых элементов до последнего нулевого элемента и произведение ненулевых элементов после него в массивах А(N) и B(M). Вычисление суммы и произведения оформить в виде подпрограммы.

  1. Составить программу, которая преобразует массивы А(10) и В(12) следующим образом: элементы, меньшие среднего арифметического всех элементов заменить нулём. Преобразование массивов оформить в виде подпрограммы.

  1. Вычислить , где мах и min – наибольшее и наименшее значения элементов в массивах А(N) и B(M), состоящих из неповторяющихся значений, а - соответственно их порядковые номера в этих массивах. Вычисление максимального и минимального значений оформить в виде подпрограммы.

Задание №3

  1. Даны две последовательности и (m<n). В каждой из них числа различны. Верно ли, что все числа второй последовательности входят в первую.

  1. В одномерном массиве все отрицательные элементы переместить в начало массива, а остальные – в конец с сохранением порядка следования. Не использовать дополнительный массив.

  1. В одномерных массивах Х и Y одинакового размера n хранятся координаты n точек плоскости. Определить минимальный радиус круга с центром в начале координат, который содержит все точки.

  1. В одномерных массивах Х и Y одинакового размера n хранятся координаты n точек плоскости. Определить, сколько треугольников с вершинами в данных точках можно построить.

  1. Дан одномерный массив А, состоящий из N целых чисел. Составить программу, которая подсчитывает, наибольшее число положительных идущих подряд в нём чисел.

  1. В массиве целых положительных чисел, упорядоченных по возрастанию, определить положение наиболее длинной группы, представляющей собой отрезок натурального ряда чисел.

  1. Дан одномерный массив Х, состоящий из 20 целых чисел. Составить программу, которая подсчитывает количество различных по значению элементов в нём.

  1. Дан линейный неупорядоченный массив А, состоящий из 20 целых чисел. Составить программу, которая определяет количество инверсий в массиве, т. е. таких пар элементов, в которых большее число находится левее меньшего.

  1. Дан одномерный массив А, состоящий из N целых чисел. Сжать массив, удалив из него все элементы, модуль которых находится в интервале [a,b]. Освободившиеся в конце массива элементы заполнить нулями.

  1. Составить программу, которая отыскивает среди пар элементов одномерного массива М те, разность между элементами которых есть величина наибольшая для данного массива.

  1. Заданы два одномерных массива А и В размерности N. Составить программу, проверяющую, можно ли, меняя местами элементы одномерного массива А, получить одномерный массив В.

  1. Дан одномерный массив А, состоящий из N целых чисел. Составить программу, которая меняет порядок следования элементов на обратный.

  1. Дан одномерный массив А, состоящий из N целых чисел. Преобразовать массив таким образом, чтобы в первой его половине располагались все элементы, стоявшие в нечётных позициях, а во второй половине – элементы, стоявшие в чётных позициях.

Контрольные вопросы:

  1. Дайте определение массива.

  2. В каком разделе (разделах) программы допустимо описание данных типа массив?

  3. Какие типы данных недопустимы для компонентов массива? Какие допустимы?

  4. Дайте определение индекса. Какие типы данных можно использовать при описании индекса?

  5. Какой массив называется одномерным? Двумерным? N-мерным?

  6. Как располагаются в памяти элементы одномерного массива? Двумерного массива?

  7. Какие алгоритмы поиска в массиве Вам известны? Опишите один из них.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]