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

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

Заполнить массив из 9 элементов случайными числами, далее получить случайное число N из диапазона от 1 до 9 и затем "удалить" элемент с позиции N из массива, "сдвинув" значения влево и заполнив все что справа нулями.
Например:

|1|3|4|5|4|7|-8|-9|

Путь n=2, тогда после работы программы мы должны получить:

|1|4|5|4|7|-8|-9|0|

Примечание: операции сдвига элементов массива оформите в виде подпрограммы.

var
  m: array[1..9] of integer;
  i, x : integer;
  q: 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();
  x := random(9) + 1;                 // получаем случайное значение переменной
  writeln(x);                         // выводим случайную переменную на экран
  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]);   // передаем в ф-ю значения текущего и след-го эл-та, получаем новое значение текущего эл-та
    write (m[i], ' ');                // выводим смещенные элементы
  end;
  readln ();
end.        
vedro-compota's picture

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

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

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

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

2 7 2 6 4 3 2 7 7 
3
2 7 6 4 3 2 7 7 0 
vedro-compota's picture

function sdvig (ms: massiv; a: integer): massiv; // функция, принимает массив и позицию сдвига, возвращает массив после сдвига
var
  j: integer;                    // счетчик цикла
  q: boolean;                    // переключатель
begin
  q:= false;                     // ставим переключатель в исходное положение
  for j:=low(ms) to high(ms) do// обходим массив с первого до предпосл-го элемента
  begin
    if (j = a) then              // когда счетчик сравнялся с позицией сдвига
      q:= true;                  // переключаем переключатель
    if q = true then             // когда переключатель переключен
    begin
      if j = high(ms) then       // если это последний эл-т массива
        ms[high(ms)]:= 0         // присваиваем ему ноль
      else                       // если не последний
        ms[j]:= ms[j+1];         // присваиваем значение следующего
    end;
  end;
  result:= ms;                   // результат - массив после сдвига
end;

-- в цикле есть лишние итерации, можно сразу начинать перебор с известной позиции (+ возможно это сократит число переменных)

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