Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Работа с элементами массива (разбор на примерах)




 

При работе с элементами массива можно выделить несколько видов задач.

 

Нахождение суммы

 (или произведения) элементов

 

Такая задача была рассмотрена выше. Часто встреча­ются различные модификации этой задачи, например, тре­буется найти сумму элементов с заданным свойством.

Пример

Найти сумму элементов, кратных заданному числу.

Решение

Изменим функцию Sumиз программы Example_89. Будем суммировать не все элементы, а только те, кото­рые удовлетворяют данному условию, то есть только те, которые делятся нацело на заданное число (остаток от деления на данное число равен 0).

Program Example_92;

Function Sum(m: myarray): Integer;

Var i, s, k: Integer;

Begin

Writeln('Введите число');

Readln(k);

s:=0; {Начальное значение суммы}

For i:=1 To n Do {Нахождение суммы}

If m[i] Mod k=0 Then s:=s+m[i];

{Если элемент кратен k, то прибавляем его

к сумме}

sum:=s;

End;

 

Остальную часть программы Example_89 можно ос­тавить без изменений.

 

Нахождение номеров элементов,

Обладающих заданным свойством

Пример

Найти номера четных элементов.

Решение

Необходимо просмотреть весь массив, и если просмат­риваемый элемент является четным, то вывести его номер. Опишем процедуру, которой передается данный массив и выводятся нужные номера.

Program Example_93;

Procedure Solve (m: myarray);

Var i: Integer;

Begin

For i:=1 To n Do

If m[i] Mod 2=0 Then Write(i:5);

End;

 

Нахождение количества элементов,

Обладающих заданным свойством

Пример

Найти количество положительных и отрицательных элементов в данном массиве.

Решение

Опишем процедуру, которая имеет три параметра −  массив и два счетчика, первый − для положительных элементов, второй − для отрицательных, элементы, рав­ные нулю, учитывать не будем.

Program Example_94;

Procedure Quantity(m: myarray;

Var k1, k2: Integer);

Var i: Integer;

Begin

k1:=0; k2:=0;

For i:=1 To n Do

If m[i]>0 Then Inc(k1)

Else If m[i]<0 Then Inc(k2);

End;

Смотрите программу Example_89. В разделе описания переменных Var дописать: pol, otr: Integer;. В основной программе записать обращение к процедуре Quantity(a,pol,otr).

Есть ли в данном массиве элементы с

Данным свойством, или найти первый

(последний) элемент, отвечающий

Заданным условиям

 

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

Пример 1

Есть ли отрицательный элемент в массиве?

Решение

Начинаем просматривать массив с первого элемен­та (i=1). Пока не просмотрен последний (i<=n) и не найден отрицательный (m[i]>=0), будем перехо­дить к следующему (inc(i)). Таким образом, мы закончим просмотр в одном из двух случаев: первый − просмотрели все элементы и не нашли отрицательно­го, тогда i>n, второй − нашли нужный, при этом i<=n. Опишем функцию, значение которой истина (True), если в массиве есть отрицательный элемент, и ложь (False), если его нет.

Program Example_95;

Function Controll (m: myarray): Boolean;

Var i: Integer;

Begin

i:=1;

While (i<=n) And (m[i]>=0) Do Inc(i);

Controll:=(i<=n)

End;

Пример 2

Найти номер последнего отрицательного элемента массива.

Решение

Последний отрицательный − это первый отрицатель­ный элемент, который встретится при просмотре масси­ва с конца. Если очередной элемент не является отрица­тельным, то нужно уменьшать значение текущего ин­декса, пока он не станет меньше номера первого эле­мента или не будет найден отрицательный элемент. Та­ким образом, можно модифицировать предыдущую функ­цию. Но поскольку надо найти номер элемента, тип ре­зультата будет целым.

Договоримся, что если в массиве нет отрицательного элемента, то значение функции будет равно 0.

Program Example_96;

Function Control2 (m: myarray): Integer;

Var i: Integer;

Begin

i:=n;

While (i>=1) And (m[i]>=0) Do Dec(i);

Control2:=i;

End.

Методы работы с элементами одномерного массива

 

Рассмотрим еще несколько типов задач.

Изменение значений некоторых элементов

Пример 1

Заменить отрицательные элементы массива на их аб­солютные величины.

Решение

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

Program Example_97;

Procedure Substitution1 (Var m: myarray);

Var i: Integer;

Begin

    For i:=1 To n Do

If m[i]<0 Then m[i]:=-m[i];

End;

Пример 2

Прибавить к каждому элементу массива число 25.

Решение

Преобразуем предыдущую процедуру.

Program Example_98;

Procedure Substitution2 (Var m: myarray);

Var i: Integer;

Begin

For i:=1 To n Do m[i]:=m[i]+25;

End;

Пример 3

Если очередной элемент массива четный, то приба­вить к нему первый, если нечетный − прибавить послед­ний. Первый и последний элементы не изменять.

Решение

Просмотрим все элементы массива, кроме первого и последнего, и если очередной элемент четный, то есть делится на 2 без остатка, то увеличим его на значение первого элемента, иначе − увеличим его на значение по­следнего элемента.

Program Example_99;

Procedure Substitution3 (Var m: myarray);

Var i: Integer;

Begin

 For i:=2 To n-1 Do

If m[i] Mod 2=0 Then m[i]:=m[i]+m[1]

Else m[i]:=m[i]+m[n];

End;

 

Создание массива

 

Рассмотрим два примера.

Пример 1

Даны два одномерных массива одинаковой размер­ности. Получить третий массив такой же размерности, каждый элемент которого равен сумме соответствующих элементов данных массивов.

Решение

Пусть даны два массива − А и В, состоящие из пяти элементов. Получим из них массив С, тоже состоящий из пяти элементов, причем пер­вый элемент этого массива ра­вен сумме первых элементов массивов А и В, второй − сум­ме вторых элементов данных массивов − и так далее.

i 1 2 3 4 5
A 14 2 7 8 9
B 3 6 5 12 4
C 17 8 12 20 13

 

Для решения этой задачи опишем процедуру, которой передаются три параметра. Первые два − это два исходных одномерных массива, третий − это одномерный массив той же размерности, который является результатом и заполняется по указан­ному правилу.

Program Example_100;

Procedure Sum_Ar(a, b: myarray;

Var с: myarray);

Var i: Integer;

Begin

For i:=1 To n Do c[i]:=a[i]+b[i];

End;

Пример 2

Даны первый член арифметической прогрессии и ее разность. Записать в массив первые n членов прог­рессии.

Решение

Пусть а1 − первый член прогрессии, a k − ее разность, тогда i−й член можно найти по следующему правилу: a[i]:=a[i-1]+k, или

a[i]:=a1+k*(i-1); если i=1, тo a[i]:=a1. Опишем процедуру, в которую передаются два параметра, а результатом является одно­мерный массив. Его первый элемент равен первому чле­ну прогрессии, второй − второму − и так далее.

Program Example_101;

Procedure Progress (a1, k: Integer;

Var a: myarray);

Var i: Integer;

Begin

a[1]:=a1;

For i:=2 To n Do

Begin

a[i]:=a[i-1]+k;

Write(a[i]:5);

End;

End;

 

Работа с несколькими массивами

Пример

Даны два одномерных массива − А и В. Найти их скалярное произведение.

Решение

Скалярным произведением двух массивов одинако­вой размерности называется сумма произведений соот­ветствующих элементов:

a[1]*b[1]+a[2]*b[2]+...+a[n-1]*

*b[n-1]+...+а[n]*b[n],

где n − количество элементов в массивах.

Program Example_102;

Function Sp (a, b: myarray): longint;

Var i: Integer;

s: Longint;

Begin

s:=0;

For i:=1 To n Do s:=s+a[i]*b[i];

Sp:=s;

End;

Удаление элементов из одномерного массива

Пример 1

Удалить из массива, в котором все элементы различ­ны, максимальный элемент. После удаления максималь­ного элемента массив "уплотнить", сдвинув все следую­щие за ним элементы влево. Последнему (самому право­му) элементу массива присвоить 0.

Решение

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

¨ найти номер максимального элемента 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, 0.

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

Составим программу для удаления максимального эле­мента из одномерного массива, в ней воспользуемся дву­мя уже знакомыми процедурами инициализации масси­ва и вывода его на печать. Первая заполняет массив слу­чайными числами, а вторая выводит на печать этот мас­сив. Чтобы последний 0 не выводился на экран, мы мо­дифицируем процедуру вывода Print и будем ей пере­давать не только массив, но и количество элементов, ко­торые надо вывести, начиная с первого.

Program Example_103;

Const n=30; dd=51;

Type myarray = Array[l..n] Of Integer;

Var A: myarray;

k:Integer; {k - номер максимального

 элемента}

Procedure Init2 (Var m:myarray);

{Процедура заполнения (инициализации)

массива случайными числами}

...

Procedure Print1 (n1: Integer; m: myarray);

{Процедура вывода (распечатки) массива}

Var i: Integer;

Begin

For i:=1 To n1 Do Write(m[i]:5);

Writeln;

End;

Function Maximum (m: myarray): Integer;

Var i, max, maxi: Integer;

Begin

max:=-32768;

{Минимальное значение типа Integer

равно -32 768}

For i:=1 To n Do

{Просмотр всех элементов массива}

If m[i]>max Then

{Если данный элемент больше максимального

элемента, найденного среди первых

i-1 элементов, то}

Begin

max:=m[i];

{Новое значение максимального элемента}

maxi:=i;

{Номер максимального элемента в массиве} End;

Maximum:=maxi;

End;

Procedure Delete (k1: Integer;

Var m: myarray);

Var i: Integer;

Begin{Сдвиг элементов на один влево}

 For i:=k1 To n-1 Do m[i]:=m[i+1];

{i-му элементу присваиваем значение

(i+1)-го}

m[n]:=0;

{Последний элемент равен 0}

End;

Begin

Randomize;

{Инициализация генератора случайных

чисел}

Init2(A);

{Заполнение массива А}

Print1(n, A);

{Вывод заполненного массива А}

k:=Maximum(A);

{Поиск номера максимального элемента}

Delete(k, A);

{Удаление элемента с номером k}

Print1(n-1, А);

{Вывод нового массива А}

Readln;

End.

Пример 2

Решить предыдущую задачу, считая, что максималь­ный элемент может встречаться несколько раз.

Решение

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

For i:=В Downto A Do <тело цикла>

 

Значение переменной i будет уменьшаться на еди­ницу начиная от В до А.

Кроме того, номер максимального элемента запо­минать не будем, а просмотрим массив с конца, и если элемент имеет максимальное значение, то уда­лим его, при этом значение счетчика k будем увели­чивать на 1. Для решения этой задачи надо изменить функцию Maximum, сейчас нам нужен не номер, а значение максимального элемента. В программе это будет выглядеть так:

Program Example_104;

Const n=30; dd=51;

Type myarray=Array[1..n] Of Integer;

Var A: myarray;

m, k, i: Integer;

{m - значение максимального элемента

k - количество удаленных элементов}

Procedure Init2 (Var m:myarray);

{Процедура заполнения (инициализации)

массива случайными числами}

...

Procedure Print1 (n1: Integer; m: myarray);

{Процедура вывода (распечатки) массива}

...

Function Maximum (m: myarray): Integer;

Var i, max: Integer;

Begin

max:=-32768;

For i:=1 To n Do

{Просмотр всех элементов массива}

If m[i]>max Then max:=m[i];

{Новое значение максимального элемента}

Maximum:=max;

End;

Procedure Delete (k1: Integer;

Var m: myarray);

{Процедура удаления элемента с

данным номером}

...

Begin

Randomize;

{Инициализация генератора случайных чисел}

Init2 (А);

{Заполнение массива А}

Print1 (n, А);

{Вывод заполненного массива А}

{Поиск значения максимального элемента}

m:=Maximum(A); k:=0;

{Просмотр всех элементов начиная

с последнего}

For i:=n Downto 1 Do

If A[i]=m Then

{Если данный элемент имеет

 максимальное значение, то}

Begin

{Удаляем элемент с номером i}

Delete(i, A);

Inc(k);

End;

Print1(n-k, A); {Вывод нового массива А}

Readln;

End.










Последнее изменение этой страницы: 2018-05-31; просмотров: 215.

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