Урок 15 Задача 10

Урок 15 Задача 10:

Заполните массив из 5 элементов случайными числами из любого диапазона.

Далее пользователь вводит в цикле значения от 1 до 5 -- удаляйте из массива очередной элемент с позиции очередного введенного пользователем числа, сдвигая оставшиеся элементы массива влево, заполняя то, что справа нулями. Распечатывайте промежуточной состояние массива, после каждого удаления.

Цикл должен работать до тех пор, пока в массиве не останется ненулевых элементов или пока пользователь не введет число большее чем 5 или меньшее чем 1.

Например:

|1|3|7|5|4| // исходный массив
3 // ввод пользователя
|1|3|5|4|0| // промежуточный результат
3 // ввод пользователя
|1|3|4|0|0| // промежуточный результат
2 // ввод пользователя
|1|4|0|0|0| // промежуточный результат
1 // ввод пользователя
|4|0|0|0|0| // промежуточный результат
1 // ввод пользователя
|0|0|0|0|0| // промежуточный результат
// Cообщение о завершении, т.к. все элементы удалены

-- в данном случае программа завершилась, так как удалены все элементы.
Если бы пользователь ввел число 10 или -5 - то это тоже была бы ситуация для завершения, но элементы в массиве ещё бы остались.

Примечание: оформить код сдвига элемента как функцию.

var
  m: array[1..5] of integer;
  i, x: integer;
  q, p: boolean;
function sdvig (a, b: integer): integer; // функция принимает текущий и следующий эл-т массива, возвращает новое значение текущего
begin
  a:=b;                                  // присваиваем текущему эл-ту значение след-го, последнему присвоится 0
  result:= a;                            // результат - новый текущий элемент
end;
begin
  randomize();
  for i:=low(m) to high(m) do          // цикл для присваивания случайных значений
  begin
    m[i] := random(9) + 1;
    write(m[i], ' ');
  end;                                 // конец цикла
  writeln(' -- исходный массив');
  while (p = false) do                 // цикл работает, пока переключатель остается в таком положении, т.е. пока не все эл-ты массива нулевые
  begin
    write('Введите число от 1 до 5: ');
    readln (x);                        // считываем введенное значение
    if (1<=x) and (x<=5)  then         // проверка, чтобы введенное значение было от 1 до 5
    begin
      q:= false;                       // ставим переключатель в исходное положение
      p:= true;                        // ставим второй переключатель в исходное положение
      for i:=low(m) to high(m) do      // вложенный цикл для обхода массива
      begin
        if (i = x) then                // когда счетчик сравнивается с введенным числом
          q:= true;                    // переключаем переключатель
        if q = true then               // когда переключатель переключен
          m[i]:= sdvig (m[i], m[i+1]); // передаем в функцию текущий и следующий эл-нт массива, получаем от ф-ции новый текущий эл-нт
        if not (m[i]=0) then           // если встретится ненулевой элемент
          p:= false;                   // переключаем второй переключатель
        write (m[i], ' ');
      end;
      if p = false then
        writeln(' -- промежуточный результат')
      else
        writeln(' -- не осталось ненулевых элементов');
    end;
  end;
  readln ();
end.
vedro-compota's picture

function sdvig
-- на вход получаем массив и позицию сдвига и возвращаем массив итоговом виде

_____________
матфак вгу и остальная классика =)

type
  massiv = array[1..5] of integer;
var
  m: massiv;
  n, i, k: integer;
function sdvig (ms: massiv; a, h: integer): massiv; // функция, возвращает массив после сдвига
var
  j: integer;                    // счетчик цикла
  q: boolean;                    // переключатель
begin
  q:= false;                     // ставим переключатель в исходное положение
  for j:=low(ms) to h do         // обходим до переданного значения (кол-во оставшихся элементов)
  begin
    if (j = a) then              // когда счетчик сравнялся с позицией сдвига
      q:= true;                  // переключаем переключатель
    if q = true then             // когда переключатель переключен
    begin
      if j = h then              // если счетчик дошел до переданного значения
        ms[j]:= 0                // присваиваем элементу ноль
      else                       // если не дошел
        ms[j]:= ms[j+1];         // присваиваем значение следующего элемента
    end;
  end;
  result:= ms;                   // результат - массив после сдвига
end;
begin                            // начало тела основной программы
  randomize();
  for i:=low(m) to high(m) do    // обходим маассив для присвоения случайных значений
  begin
    m[i] := random(9) + 1;
    write(m[i], ' ');            // выводим элементы в первоначальном виде
  end;
  writeln (' -- исходный массив');
  k:= high(m);                   // количество оставшихся элементов
  while (k > 0) do               // цикл работает, пока остаются не удаленные элементы
  begin
    write ('Введите число: ');
    readln (n);                  // считываем введенное число
    if (1<=n) and (n<=5) then    // проверяем, чтобы введенное число было от 1 до 5
    begin
      m:= sdvig (m, n, k);       // передаем массив, позицию сдвига и кол-во оставшихся эл-тов
      for i:=low(m) to high(m) do // обходим массив после сдвига для вывода на экран
        write(m[i], ' ');
      if n<=k then
      begin
        k:=k-1;
        if k>0 then
          write (' -- промежуточный результат')
        else
          write (' -- все элементы удалены')
      end;
     writeln;
    end else                     // когда введенное число не от 1 до 5
      break;                     // прерываем цикл
  end;
  readln ();
end. 

Вывод в консоли:

2 3 1 2 2  -- исходный массив
Введите число: 2
2 1 2 2 0  -- промежуточный результат
Введите число: 4
2 1 2 0 0  -- промежуточный результат
Введите число: 1
1 2 0 0 0  -- промежуточный результат
Введите число: 1
2 0 0 0 0  -- промежуточный результат
Введите число: 1
0 0 0 0 0  -- все элементы удалены
vedro-compota's picture

аналогично исправить сдвиг

_____________
матфак вгу и остальная классика =)

Для теста

var
  m: array[1..5] of integer;
  i, x, ov: integer;
  q, p: boolean;
function sdvig (a, b: integer): integer; // функция принимает текущий и следующий эл-т массива, возвращает новое значение текущего
begin
  a:=b;                                  // присваиваем текущему эл-ту значение след-го, последнему присвоится 0
  result:= a;                            // результат - новый текущий элемент
end;
begin
  randomize();
  for i:=low(m) to high(m) do          // цикл для присваивания случайных значений
  begin
    m[i] := random(9) + 1;
    write(m[i], ' ');
  end;                                 // конец цикла
  writeln(' -- исходный массив');
  while (p = false) do                 // цикл работает, пока переключатель остается в таком положении, т.е. пока не все эл-ты массива нулевые
  begin
    write('Введите число от 1 до 5: ');
    readln (x);                        // считываем введенное значение
    if (1<=x) and (x<=5)  then         // проверка, чтобы введенное значение было от 1 до 5
    begin
      q:= false;                       // ставим переключатель в исходное положение
      p:= true;                        // ставим второй переключатель в исходное положение
      for i:=low(m) to high(m) do      // вложенный цикл для обхода массива
      begin
        if (i = x) then                // когда счетчик сравнивается с введенным числом
          q:= true;                    // переключаем переключатель
        if q = true then begin
            if (i = high(m)) then
                ov := 0
            else
                ov := m[i+1];
          m[i]:= sdvig (m[i], ov); // передаем в функцию текущий и следующий эл-нт массива, получаем от ф-ции новый текущий эл-нт
        end;
        if not (m[i]=0) then           // если встретится ненулевой элемент
          p:= false;                   // переключаем второй переключатель
        write (m[i], ' ');
      end;
      if p = false then
        writeln(' -- промежуточный результат')
      else
        writeln(' -- не осталось ненулевых элементов');
    end;
  end;
  readln ();
end.
vedro-compota's picture

поправили запуск

_____________
матфак вгу и остальная классика =)