Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Работа с элементами массива (разбор на примерах)
При работе с элементами массива можно выделить несколько видов задач.
Нахождение суммы (или произведения) элементов
Такая задача была рассмотрена выше. Часто встречаются различные модификации этой задачи, например, требуется найти сумму элементов с заданным свойством. Пример Найти сумму элементов, кратных заданному числу. Решение Изменим функцию 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 Даны два одномерных массива одинаковой размерности. Получить третий массив такой же размерности, каждый элемент которого равен сумме соответствующих элементов данных массивов. Решение Пусть даны два массива − А и В, состоящие из пяти элементов. Получим из них массив С, тоже состоящий из пяти элементов, причем первый элемент этого массива равен сумме первых элементов массивов А и В, второй − сумме вторых элементов данных массивов − и так далее.
Для решения этой задачи опишем процедуру, которой передаются три параметра. Первые два − это два исходных одномерных массива, третий − это одномерный массив той же размерности, который является результатом и заполняется по указанному правилу. 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; просмотров: 249. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |