ОБРАБОТКА МАССИВОВ 1. 2. 3. 4. 5. Включение элемента в заданную позицию массива Удаление элементов массива. Сортировка массива по возрастанию (убыванию) методом «Пузырька». Поиск в массиве. Строки. Использование ф-ции случайных чисел. Программа program qq; const N = 5; Активируем var a: array [1..N] of integer; функцию случайных i, iMax: integer; чисел Begin randomize; случайные числа в writeln('Исходный массив:'); интервале [50,150) for i:=1 i:=1 to to NN do do begin begin for a[i] a[i]:=:=random(100) random(100)+ +50; 50; поиск write(a[i]:4); write(a[i]:4); максимального end; end; iMax iMax := := 1; 1; {{ считаем, считаем, что что первый первый –– максимальный максимальный }} for {{ проверяем for i:=2 i:=2 to to NN do do проверяем все все остальные остальные }} if if a[i] a[i] >> a[iMax] a[iMax] then then {{ новый новый максимальный максимальный }} iMax {{ запомнить iMax := := i; i; запомнить ii }} writeln; {перейти на новую строку} 2 writeln('Максимальный элемент a[', iMax, ']=', a[iMax]); end; ВКЛЮЧЕНИЕ 1-ГО ЭЛЕМЕНТА В ЗАДАННУЮ ПОЗИЦИЮ МАССИВА 1. 2. 3. 4. Размер массива описывается с учетом вставляемого элемента. Для ввода элементов массива организуется цикл без учета вставляемого элемента. Перед включением нового элемента в К-ю позицию (пусть это будет 2-я ) необходимо раздвинуть массив, т.е. передвинуть «хвост» массива вправо на 1 позицию, выполняя операцию A[i+1]:=A[i]. Перемещение элементов массива начинают с «хвоста». 1 5. 2 10 3 2 4 3 5 4 6 5 0 6 Вставим новый элемент массива (например, 10) на 2-ю позицию. ПРИМЕР 1-ГО ЭЛЕМЕНТА 4-М ЭЛЕМЕНТАМИ. ПРОГРАММЫ ВСТАВКИ 3-М И В МАССИВ МЕЖДУ УДАЛЕНИЕ 1-ГО ЭЛЕМЕНТОВ 1. 2. Удалить элемент массива, расположенный на К-той позиции, можно, сдвинуть «хвост» массива, начиная с [k+1]го элемента, на одну позицию влево, т.е. выполняя операцию a[i]:=a[i+1]. Удалим 6-ой элемент массива: 1 3. МАССИВА. 2 3 4 5 67 78 89 910 10 Вывод элементов нового массива организуется на 1 элемент меньше. ПРИМЕР ПРОГРАММЫ УДАЛЕНИЯ 1-ГО ЭЛЕМЕНТА (ПУСТЬ ЭТО БУДЕТ 10 ЭЛЕМЕНТ). В МАССИВА УПОРЯДОЧЕНИЕ (СОРТИРОВКА) ЭЛЕМЕНТОВ МАССИВА ПО ВОЗРАСТАНИЮ (УБЫВАНИЮ) МЕТОДОМ «ПУЗЫРЬКА». Массив A[5] = {5, 7, 3, 6, 1} упорядочить (отсортировать) по возрастанию. Алгоритм: Шаг 1.Сравним 5-ый элемент с 4-м, если он меньше, поменяем их местами. Шаг 2 – 4. Те же действия выполним для 4 → 3, 3 → 2, 2 → 1. В результате самый маленький элемент переместиться на 1-е место. Повторим данный алгоритм сначала, но с (n-1) элемента, но 1-ый элемент рассматривать не будем, т.к. в него записан Min элемент массива. Так повторяем до тех пор, пока не упорядочим весь массив. 5 7 3 6 1 1 5 7 3 6 1 3 5 7 6 1 3 5 7 6 1 3 5 6 7 УПОРЯДОЧЕНИЕ (СОРТИРОВКА) ЭЛЕМЕНТОВ МАССИВА ПО ВОЗРАСТАНИЮ (УБЫВАНИЮ) МЕТОДОМ «ПУЗЫРЬКА». Для организации сравнивания одного элемента массива поочередно со всеми остальными, организуется вложенный цикл: For i:=2 to 9 do {Внешний цикл} Begin For j:=9 Downto i-1 Do Begin If A[j]>a[j+1] Then Begin {Меньший элемент массива меняется местами с большим} min:=A[j+1]; A[j+1]:=A[j]; A[j]:=min End; End; End; Дан целочисленный массив из 30 элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит второй максимум массива (элемент, который в отсортированном по невозрастанию массиве стоял бы вторым). Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них. const N=30; var a: array [1..N] of integer; i, k, max, max2: integer; begin for i:=1 to N do readln(a[i]); ... end. ПРИМЕР ПРОГРАММЫ СОРТИРОВКИ ЭЛЕМЕНТОВ МАССИВА ПО ВОЗРАСТАНИЮ МЕТОДОМ «ПУЗЫРЬКА». Сложность в том, что нужно найти не максимальный элемент, а второй по величине. Решение: const N=30; array [1..N] of integer; Вар.1var. a: Отсортировать массив по возрастанию (убыванию) и вывести k, max, max2: integer; нужныеi, элементы. begin Вар.2. Сначала найти максимум, а потом искать следующий за ним. for i:=1 to N do readln(a[i]); Вар.3.ifМожно сделать это за один проход по массиву. a[1] > a[2] then begin max:=a[1]; Нам нужны двеmax2:=a[2] переменные, max (максимальный элемент) и max2 end (второй максимум). else begin Сначала выбираем максимальный из первых двух элементов и max:=a[2]; max2:=a[1]в max, а второй по величине записываем в записываем его значение max2:end; for i:=3 to N do a[1] перебираем > a[2] then begin Затем в if цикле if a[i] > max then begin все элементы, начиная с 3-го (первые два уже max:=a[1]; max2:=a[2]; «задействованы»!) до последнего, 30-ого. max2 := max; end Если очередной max := a[i] элемент a[i] больше, чем max, записываем значение else begin max в max2 end (предыдущий максимум становится вторым), а значение a[i] max:=a[2]; max2:=a[1]; – в max. Иначе, else if a[i] >если max2a[i] thenбольше, max2 := чем a[i]; max2, записываем значение a[i] в end;завершения цикла выводим значение переменной max2. max2.writeln(max2) После end. Поиск в массиве Задача – найти в массиве элемент, равный X, или установить, что его нет. Решение: для произвольного массива: линейный поиск (перебор) недостаток: низкая скорость Как ускорить? – заранее подготовить массив для поиска • как именно подготовить? • как использовать "подготовленный массив"? 12 Линейный поиск nX – номер нужного элемента в массиве nX := 0; { пока не нашли ...} for i:=1 to N do { цикл по всем элементам } if A[i] = X then { если нашли, то ... } nX := i; { ... запомнили номер} if nX < 1 then writeln('Не нашли...') else writeln('A[', nX, ']=', X); Улучшение: после того, как нашли X, выходим из цикла. nX := 0; for i:=1 to N do if A[i] = X then begin nX := i; break; {выход из цикла} end; ? Что плохо? nX := 0; i := 1; while i <= N do begin if A[i] = X then begin nX := i; i := N; end; 13 i := i + 1; end;