Преобразование массива

При выполнении заданий на преобразование массива, как правило, не используются вспомогательные массивы. Задания выполняются путем манипуляции индексами массива и использования «буферных переменных» для временного хранения значений элементов массива.

Примеры решения задач

  1. Дан целочисленный массив размера N. Увеличить все четные числа, содержащиеся в массиве, на исходное значение первого четного числа. Если четные числа в массиве отсутствуют, то оставить массив без изменений.
  2. const
        n = 20;
    var
        i,j:byte;
        g:integer;
        a:array[1..n] of integer;
    begin
    ...
    {получение и вывод исходного массива}
    j := 0; {в массиве нет четных чисел}
    for i := 1 to n do
        if a[i] mod 2 = 0 then
        begin {нашли первое четное число}
            g := a[i]; {запомнили элемент}
            j := i; {и его индекс}
            break {вышли из цикла}
        end;
    if j = 0 then {скажем, что...}
        writeln("Четных чисел в массиве нет")
    else
        for i := j + 1 to n do {продолжим цикл со следующего}
            if a[i] mod 2 = 0 then
                inc(a[i], g); {реализация}   
    ...
    {выводим массив}
    end.
    
  3. Дан массив A размера N и целые числа K и L (1 ≤ K < L ≤ N). Переставить в обратном порядке элементы массива, расположенные между элементами AK и AL, не включая эти элементы.
  4. ...
    {получение исходного массива}
    for i := k + 1 to l - 1 do
    begin {реализация}
        buff := a[i];
        a[i] := a[l - i]; {иначе говоря: (l - 1) + 1 - i}
        a[l - i] := buff
    end;
    {и прочее}
    ...
    
  5. Дан массив размера N. Обнулить элементы массива, расположенные между его минимальным и максимальным элементами (не включая минимальный и максимальный элементы).
  6. ...
    {Получение массива}
    min := a[1]; l := 1; {Предположим, что min - это первый элемент}
    max := a[1]; k := 1; {или max - это первый элемент}
    for i := 2 to n do {поэтому начинаем со второго}
    begin {Поиск минимального и максимального элементов}
        if a[i] > max then
        begin
            k := i; {Сохраняем позицию max}
            max := a[i]
        end;
        if a[i] < min then
        begin
            l := i; {Сохраняем позицию min}  
            min := a[i]
        end
    end;
    if k > l then {А какой элемент находится левее?}
        for i := l + 1 to k - 1 do {если минимальный левее max}
            a[i] := 0
    else
        for i := k + 1 to l - 1 do {если максимальный левее min}
            a[i] := 0;
    ...
    {и прочее}
    end.
    
  7. Дан массив размера N. Осуществить сдвиг элементов массива вправо на одну позицию (при этом A1 перейдет в A2, A2 — в A3, …, AN–1 — в AN, a исходное значение последнего элемента будет потеряно). Первый элемент полученного массива положить равным 0.
  8. ...
    {предположим, что у нас не динамический массив, иначе:
    http://www.sources.ru/wiki/doku.php?id=pascal:dynamic_array
    т. е. объявлен массив с "запасом", чем заполнен реально, хотя, то что не заполнено имеет нулевые значения, память-то выделена!}
    for i := n downto 1 do
        a[i + 1] := a[i];
    a[1] := 0;
    ...
    

Домашнее задание

  1. Дан массив размера N. Поменять местами его минимальный и максимальный элементы.
  2. Дан массив размера N. Обнулить все его локальные максимумы (то есть числа, большие своих соседей).
  3. Дополнительно. Дан массив размера N. Возвести в квадрат все его локальные минимумы (то есть числа, меньшие своих соседей).
  4. Дополнительно. Дан массив размера N. Заменить каждый элемент массива на среднее арифметическое этого элемента и его соседей.

Добавить комментарий