Работа с массивами, формирование новых массивов по условию
Задание:Составить программу заданной обработки массива. В процессе обработки создавая новые массивы. Исходного массива запрашивать пользователем. Исходный и обработанный массив выводить на экран. Теоретический материал.
Теоретический материал
При выполнении лабораторных работ 2, 3 и 4 будет использоваться структурированный тип данных массив, который представляет собой фиксированное количество упорядоченных однотипных компонент, снабженных индексами. Он может быть однономерным и многомерным. В лабораторных работахбудут использоваться одномерные массивы.
Тип-массив описывается в разделе описания типов следующим образом:
type<имя типа> = аrrау[<тип индекса(индексов)>] of <тип компонент>;
Размерность массива может быть любой, компоненты массива могут быть любого (в том числе и структурированного) типа, индекс (индексы) может (могут) быть только интервального или перечисляемого типа. При употреблении в качестве типа индекса типа Integer или Word можно использовать только его диапазон.
При описании типа индекса (индексов) можно использовать константы, которые должны быть определены до определения типа.
Определенный в разделе описания типов тип-массив можно использовать для описания переменных и типизированных констант. Тип-массив можно вводить непосредственно и при определении соответствующих переменных или типизированных констант.
При задании значений константе-массиву компоненты указываются в круглых скобках и разделяются запятыми, причем, если массив многомерный, внешние круглые скобки соответствуют левому индексу, вложенные в них круглые скобки – следующему индексу и т. д. При этом все компоненты массива должны быть заполнены.
Доступ к компонентам массива осуществляется указанием имени массива, за которым в квадратных скобках помещается значение индекса (индексов) компоненты. В многомерных массивах значения индексов перечисляются через запятую.
Для работы с массивом как с единым целым используется идентификатор массива без указания индексов в квадратных скобках. Массив может участвовать только в операциях отношения («=», «<>») и в операторе присваивания.
Массивы, участвующие в этих действиях, должны быть идентичны по структуре, то есть иметь одинаковые базовые типы и типы индексов.
Задание значений переменной типа массив может осуществляться с клавиатуры, путем генерирования случайным образом либо иным способом. Когда значения элементов задаются с клавиатуры или генерируются случайным образом, необходима организация цикла, в котором последовательно происходит обращение к каждому элементу массива. Вывод значений элементов массива на экран или в файл также происходит в цикле.
При написании программ необходимо следить за тем, чтобы значения индексов не превышали границ, указанных при объявлении массива, так как выход индекса за границы массива приводит к сбою в работе программы. Контроль значений индексов массивов можно организовать при помощи директивы компилятора {$R+}, которая приводит к проверке всех индексных выражений на соответствие их значений диапазону индекса.
Пример
Для примера рассмотрим следующую задачу. Дан одномерный массив целых чисел. Удалить все отрицательные элементы, расположенные справа от максимального.
Прежде всего, определим алгоритм решения данной задачи. Вначале надо найти максимальный элемент среди элементов массива и запомнить его индекс. Затем, начиная со следующего за максимальным элементом, проверять элементы массива на знак, и если число оказывается отрицательным, то удаляем этот элемент из массива путем «сдвига» элементов массива влево и уменьшаем длину массива. При этом следует заметить, что в памяти переменная типа массив будет занимать столько же места, как и до удаления элементов.
В графическом виде этот алгоритм будет блок-схему, представленную на рис. 5.1.
Теперь пишем код программы.
Поскольку в программе требуется использование генератора случайных чисел, то необходимо подключить стандартный модуль CRT, в котором описана функция генерации случайных чисел.
Uses crt;
В разделе описания типов определим тип-массив:
type arr=array[1..15] of integer;
В разделе описания переменных описываем необходимые переменные:
Генератор случайных чисел активизируется командой randomize. Далее в цикле случайным образом задаются элементы массива. Функция random(41) возвращает случайное число в диапазоне от 0 до 40. Получается, что минимально возможное значение элементов массива будет равно -20 (к -20 прибавить 0, сгенерированный функцией random), максимально возможное – 20 (-20 плюс число 40, сгенерированное функцией random). Сразу же выводим значение элемента массива на экран. В цикле все элементы будут выводиться в строчку, т. к. используется команда вывода write. После генерации и вывода всех элементов массива осуществляется переход на новую строку.
Вторая часть алгоритма – поиск максимального элемента. Предположим, что первый элемент – максимальный, тогда запомним значение первого элемента в переменной max, а в переменную i_max, где будет запоминаться положение максимального элемента, запишем 1. Далее организуется цикл, в котором ищется элемент, больший чем max.
max:=a[1]; i_max:=1;
for i:=2 to n do
if a[i]>max then begin
max:=a[i]; i_max:=i;
end;
Далее, начиная с элемента, следующим за максимальным, организуется цикл проверки элементов массива на знак (важно заметить, что в данном случае нужно использовать цикл while, т. к. длина массива будет изменяться, и, соответственно, число итераций цикла также будет меняться). Если число оказывается отрицательным, то удаляем этот элемент из массива, для чего организуется еще один цикл, в котором на место удаляемого записывается стоящий следом элемент.
Внутренний цикл сдвига можно проиллюстрировать на примере удаления седьмого элемента из массива, содержащего 10 элементов (рис. 5.2).
Рис. 5.2. Схема удаления элемента из массива
В программе удаление элементов, находящихся справа от максимального, будет выглядеть следующим образом:
i:=i_max;
while i<=n do
begin
if a[i]<0 then
begin
for j:=i to n-1 do a[j]:=a[j+1]; n:=n-1;
end
else
i:=i+1;
end;
Еще одна тонкость данного фрагмента состоит в том, что переход к следующему элементу (i:=i+1) для проверки осуществляется только тогда, когда элемент не удовлетворяет условию. Если же i-й элемент окажется отрицательным, то после удаления на его месте окажется i+1-й элемент, который и нужно проверять на следующей итерации цикла.
Остается вывести результирующий массив на экран.
writeln('Результат обработки:'); for i:=1 to n do write(a[i]:4); readln;