Основы программирования (947332), страница 15
Текст из файла (страница 15)
Для целочисленного массива А(п), где п<10, разработатьпрограмму, определяющую количество отрицательных элементов среди элементов, стоящих в массиве на местах с четными номерами. Элементы массива пронумерованы, начиная с единицы.Для решения задачи необходимо проверить все элементы массива, имеющие значение индекса 2, 4, 6 и т.д. Поскольку количество повторений цикла несложно определить: оно равно п div 2, используем счетный цикл, выразив индекс элемента через переменную цикла: 2*i.Для подсчета количества искомых элементов вводим вспомогательнуюпеременную kol, начальное значение которой равно 0.
Если проверяемыйэлемент отрицателен, то значение переменной kol увеличивается на единицу.После обхода всего массива переменная kol будет содержать искомое значение.Program ex;Var a:array[L. 10] of integer; kol Lj, n: integer;BeginWriteLnCBeedume количество элементов массива <=10*);ReadLn(n); {вводим количество элементов}WriteLnCBeedume \п, * элементов массива *);for i:=l to п do ReadfafiJ); {вводим массив}WriteLnCВведенный массив');for i:=l to n do Write(a[i]:3); WriteLn; {выводим исходный массив}kol:-0; {обнуляем количество отрицательных элементов}for i:-l to п div 2 doifa[2*i]<0 then{если элемент отрицателен, то}kol:=kol+l; {увеличиваем количество на 1}ifkol-=0 thenWriteLnC Отрицательных элементов на четных местах нет*)elseWriteLnCKoлuчecmвo отрицательных элементов ко1-\ ко1:3);End89Часть L Основы алгорипщизации и процедурное программированПереформирование массива.
Переформирование массива предполагает изменение порядка элементов посредством их перемещения, удаления иливставки. При переформировании массива его размер может изменяться, а может оставаться без изменений.Следует учесть, что вставка или удаление элементов осуществляется засчет сдвига всех элементов той части массива, которая расположена послеудаляемого или вставляемого элемента. В зависимости от конкретных условий иногда такой сдвиг может быть совмещен с последовательной обработкой оставшихся элементов.
В остальных случаях он должен выполняться вспециальном вложенном цикле.Пример 4.6. Дан массив А(п), где п < 10, и число В. Разработать программу удаления из массива всех элементов, меньших заданного значения В.Для получения требуемого результата необходимо последовательно перебрать все элементы массива. Если очередной элемент меньше В, то его следует удалить, сдвигая на один элемент все элементы, расположенные посленего. Если в массиве были найдены элементы меньше В, то полученный массив будет иметь меньший размер.Для решения этой задачи можно предложить два алгоритма: с отдельнойи встроенной реализацией сдвига элементов.П е р в ы й а л г о р и т м представляет собой решение задачи «в лоб»:нашли элемент - исключили его, сдвинув остальные элементы, нашли следующий - исключили его и т. д.
(рис. 4.10).В т о р о й а л г о р и т м базируется на том, что нам не требуется, чтобы в момент анализа элементов массива все элементы располагались подрядбез пропусков. Следовательно, можно, используя две переменные для косвенной адресации, отслеживать как исследуемые элементы исходного массива, так и уже полученные элементы результирующего массива. Например,пусть переменная i изменяется в цикле и обеспечивает адресацию следующего анализируемого элемента. Тогда переменную к увеличиваем на едини11I 2\|Сдвинуть0.5-2.19.8I 2\1[ 3.5 1 0.5 [Ж 9.8вШ2:шРазмер массива=4Размер массива=5ВСЮРис.
4.10. Этапы выполнения программы:а - обнаружен элемент меньше заданного; б - остальные элементы сдвигаем на егоместо, уменьшаем размер массива и вновь анализируем элемент с тем же номером i904, Структурные типы данных3 . 5 ^ ^ 0.5]-2.1 Г 9 П3.5 I 0.5 { Щ 1-2.1 I 9.8ППбРис. 4.11. Этапы выполнения программы:а - пропускаем элемент, который необходимо удалить, и переходим канализу следующего; б - оставляем в массиве следующий элемент:увеличиваем к на единицу и переписываем элемент его на к-е место,затем переходим к анализу следующего элементацу, если обнаружен еще один элемент, который необходимо оставить в массиве.
При этом оставляемый элемент переписывается на место, указанноеданной переменной (рис. 4.11). После завершения цикла просмотра массивапеременная к содержит размер массива. Элементы, содержащиеся востальной части массива, на экран не выводятся.Если в массиве не содержится элементов, удовлетворяющих заданномуусловию, то при просмотре массива мы перепишем элементы сами в себя, азначение к будет равно п.Алгоритмы с отдельной и встроенной реализацией сдвига элементов показаны на рис. 4.12.Реализуем второй более простой вариант.Program ex;Var a:array[l.,10] of integer;Д /, k n:integer;BeginWriteLnf'Введите количество элементов « <= 10');ReadLn(n);WriteLn(*Введите \n,' элементов массива *);for i:^l to n do Read(a[i]);ReadLn; {вводим массив}WriteLnCBeedume В:*);ReadLn(B); {вводим В}WriteLnC Исходный массив ');for i:-l to n do Write(a[i]:5);FTrteZw; {выводим исходный масср^в}k:-0; {пока не найдено ни одного элемента массива}91Часть I.
Основы алгоритмизации и процедурное программированиеВывод/А(п),п /{У/"Массив/Конецпуст" //у^N.(Конец!)Рис. 4.12. Два алгоритма удаления из массива элементов меньше В:а - с отдельным циклом сдвига; б-со встроенным циклом сдвигаfor /:=i to п dobeginifA[i]>^B thenbeginA[k]:^A[i];endend;ifk^O then WriteLnCBce элементы вычеркнуты. Массив пуст. ^)else924. Структурные типы данныхbeginWriteLnC Результирующий массив из % к, * элеменпюв:^);for i:-l to к do Write(a[i]:5);WriteLn;end;End,В некоторых случаях при переформировании массива его размер не меняется.
Примерами подобной обработки служат перестановки различногохарактера (см., например, сортировку массивов в параграфе 4.3).Одновременная обработка нескольких массивов или подмассивов. Кэтому классу относятся задачи слияния массивов, переписи элементов одного массива, отвечающих определенному условию, в другой, формированиянового массива из элементов исходного в соответствии с заданным закономпреобразования и т. п. Особенностью таких задач является то, что у каждогомассива свой индекс, свой закон и диапазон его изменения.
При программировании таких действий можно использовать как счетные, так и итерационные циклы, причем выбор зависит от закона изменения индексов. При этом,если индексы обрабатываемых массивов связаны, то их получают один издругого (см. пример 4.2), а если не связаны, то формируют независимо.Пример 4.7. Разработать программу формирования из массива целоготипа А(п), где п < 40, нового массива В, содержащего только положительныеэлементы массива А.Для решения этой задачи необходимо перебрать все элементы массиваА, выбирая и записывая в массив В только положительные элементы.
В данном случае индексы массивов не связаны. Для просмотра элементов массиваА используем счетный цикл с индексом i, а для обращения к элементам нового массива используем индекс к, меняющийся только при записи новогоэлемента массива. Размер формируемого массива должен быть не меньшеисходного, так как все элементы массива могут оказаться положительными.Program ex;Var a,b:array[L,40] of integer;/, k n:integer;BeginWriteLn(*Введите количество элементов массива <=40*);ReadLnfn);WriteLn(*Введите \п, * элементов массива А *);for i:=] to п do Read(a[i]);ReadLn;WriteLn(*Исходный массив: ');fori:=ltondoWrite(a[i]:3);WriteLn;93Часть 1. Основы алгоритмизации и процедурное программированАг;=0;{начальное значение индекса формируемого массива}for i:-l to п doifa[i]>0 then {если элемент > 0}begink:=k+l; {изменение индекса формируемого массива}b[k]:-a[i]; {перепись найденного элемента}end;ifk=-0 thenWriteLnCB массиве A нет пололсительньрс элементов.
*)elsebeginWriteLnC массив результат В');for i:^l to к do Write(b[i]:3); WriteLn;end;End,Поиск элементов массива по заданным критериям. Примерами подобного рода задач могут служить поиск первого отрицательного, первогоположительного и любого первого элемента, отвечающего некоторому условию, а также поиск единственного или определенного количества элементов,равных некоторому конкретному значению.