Задание 9 Урок 15

Задание 9 Урок 15

Заполните массив из 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 - то это тоже была бы ситуация для завершения, но элементы в массиве ещё бы остались.

type arr = array[0..4] of integer;
var i,t,n : integer;
  completion : boolean;
  first_array, second_array : arr;
label  m1,m2;
procedure shift(f_array,s_array : arr; u : integer; var change : arr;
  var b : boolean);
var  g,p : integer;
begin
  b := true;
  for g := low(s_array) to high(s_array) do{накладываем первый массив на второй
  для отображения нулевого значения}
    begin
      if g = u then {начало сдвига}
        break;{останавливаем цикл на интересуещем нас значении для изменения
        условий перезаписи второго массива}
      s_array[g] := f_array[g];
    end;
  for g := u to high(s_array) do{запускаем цикл со значения остановки, номер
  ячейки g-1 обуславливает сдвиг}
    begin
    s_array[g-1] := f_array[g];
    end;
  for g := low(change) to high(change) do{перезаписываем первый массив вторым,
 для сдвига 0 влево}
    change[g] := s_array[g];
  for p := low(change) to high(change) do {проверка на последнее значение,
  чтобы исключить дальнейший вывод запроса и завершить программу}
    if change[p] <> 0 then{проверяем все ячейки, начиная с первой. Таким
    образом исключаем возможность рандомного выпадения 0}
      begin
       b := false;
       break;
      end
    else
      b := true;
end;
begin
  completion := false;
  for i := low(first_array) to high(first_array) do
    begin
      first_array[i] := random(10);{инициализируем первый массив случайным
      числом}
      second_array[i] := 0;
    end;
  for i := low(first_array) to high(first_array) do{выводим исходный массив}
    write('|', first_array[i], '|');
  writeln(' // исходный массив');
  for i := low(first_array) to high(first_array) do{запрашиваем значение}
    begin
      m1:
      write('Введите значение от 1 до 5: ');
      readln(n);
      if (n < 1) or (n > 5) then{проверка на идиота}
        begin
         writeln('Введенное значение не соответствует диапазону!');
         goto m1;
        end
      else
      begin
        shift(first_array, second_array,n,first_array,completion);{переход
        к сдвигу}
        if completion = false then
          begin
            for t := low(first_array) to high(first_array) do{выводим
            перезаписанный первый массив}
              write('|',first_array[t], '|');
          end
        else
          begin
            write('Программа завершена, нажмите ENTER!');
            goto m2;{Можно использовать break}
          end;
        writeln(' // промежуточный результат');
      end;
    end;
  m2:
  readln();
end.
vedro-compota's picture

переделать структуру, чтобы для сдвига и получения нового состояния массива использовалась функция:

  • она должна принимать массив и номер позиции для сдвига

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

Для сдвига использована функция, в решении используется один массив

type arr = array[1..5] of integer;
var  i,k,min,max,value_user : integer;
  first_array : arr;

function shift(value_u: integer; f_array: arr): arr;
var g: integer;
begin
  for g := value_user to (high(f_array)-1)  do
    f_array[g] := f_array[g+1];
  f_array[high(f_array)] := 0;
  result := f_array;
end;

begin
  min:= -5;
  max:= 12;
  randomize;
  for i := low(first_array) to high(first_array) do
    begin
      first_array[i] := min + random(max - min + 1);
      write('|', first_array[i], '|');
    end;
  writeln(' // исходный массив');
  i:= 0;
  while (i < 5) do
    begin
      write('Введите число от 1 до 5 и нажмите ENTER: ');
      readln(value_user);
      if (value_user < 1) or (value_user > 5) then
        begin
          write('Значение вне диапазона. Программа завершена!');
          break;
        end
      else
        first_array := shift(value_user,first_array);
      for k := low(first_array) to high(first_array) do
        write('|', first_array[k], '|');
      writeln(' // промежуточный диапазон');
      i += 1;
      if i = 5 then
        write('Все значения массива равны 0. Программа заершена!');
    end;
  readln();
end.

Нет проверки в 0 диапазоне массива

добавлена проверка, счетчик while изменен в обратную сторону

type arr = array[1..5] of integer;
var  i,k,min,max,value_user : integer;
  first_array : arr;
label m1;

function shift(value_u: integer; f_array: arr): arr;
var g: integer;
begin
  for g := value_user to (high(f_array)-1)  do
    f_array[g] := f_array[g+1];
  f_array[high(f_array)] := 0;
  result := f_array;
end;

begin
  min:= -5;
  max:= 12;
  randomize;
  for i := low(first_array) to high(first_array) do
    begin
      first_array[i] := min + random(max - min + 1);
      write('|', first_array[i], '|');
    end;
  writeln(' // исходный массив');
  i:= 5;
  while (i >= 1) do
    begin
      m1:
      write('Введите число от 1 до ', i, ' и нажмите ENTER: ');
      readln(value_user);
      if value_user <= i then
        i -= 1
      else
        goto m1;
      if (value_user < 1) or (value_user > 5) then
        begin
          write('Значение вне диапазона. Программа завершена!');
          break;
        end
      else
        first_array := shift(value_user,first_array);
      for k := low(first_array) to high(first_array) do
        write('|', first_array[k], '|');
      writeln(' // промежуточный диапазон');
      if i = 0 then
        write('Все значения массива равны 0. Программа заершена!');
    end;
  readln();
end.
vedro-compota's picture

момент с:

m1:
 write('Введите число от 1 до ', i, ' и нажмите ENTER: ');
 readln(value_user);
  if value_user <= i then
    i -= 1
  else
     goto m1;

работает некорректно для числа value_user > 5

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

  1. удалён goto
  2. исправлена проверка вне границ диапазона 1..5

type arr = array[1..5] of integer;
var  i,k,min,max,value_user : integer;
  first_array : arr;

function shift(value_u: integer; f_array: arr): arr;
var g: integer;
begin
  for g := value_u to (high(f_array)-1)  do
    f_array[g] := f_array[g+1];
  f_array[high(f_array)] := 0;
  result := f_array;
end;

begin
  min:= -5;
  max:= 12;
  randomize;
  for i := low(first_array) to high(first_array) do
    begin
      first_array[i] := min + random(max - min + 1);
      write('|', first_array[i], '|');
    end;
  writeln(' // исходный массив');
  i:= 5;
  while (i >= 1) do
    begin
      write('Введите число от 1 до ', i, ' и нажмите ENTER: ');
      readln(value_user);
      if (value_user < 1) or (value_user > 5) then
        begin
          write('Значение вне диапазона. Программа завершена!');
          break;
        end
      else
        if value_user <= i then
          i -= 1;
      first_array := shift(value_user,first_array);
      for k := low(first_array) to high(first_array) do
        write('|', first_array[k], '|');
      writeln(' // промежуточный диапазон');
      if i = 0 then
        write('Все значения массива равны 0. Программа заершена!');
    end;
  readln();
end.

консоль

|9||0||9||-3||-5| // исходный массив
Введите число от 1 до 5 и нажмите ENTER: 1
|0||9||-3||-5||0| // промежуточный диапазон
Введите число от 1 до 4 и нажмите ENTER: 5
|0||9||-3||-5||0| // промежуточный диапазон
Введите число от 1 до 4 и нажмите ENTER: 5
|0||9||-3||-5||0| // промежуточный диапазон
Введите число от 1 до 4 и нажмите ENTER: 4
|0||9||-3||0||0| // промежуточный диапазон
Введите число от 1 до 3 и нажмите ENTER: 1
|9||-3||0||0||0| // промежуточный диапазон
Введите число от 1 до 2 и нажмите ENTER: 2
|9||0||0||0||0| // промежуточный диапазон
Введите число от 1 до 1 и нажмите ENTER: 1
|0||0||0||0||0| // промежуточный диапазон
Все значения массива равны 0. Программа заершена!
|4||-5||9||12||8| // исходный массив
Введите число от 1 до 5 и нажмите ENTER: 1
|-5||9||12||8||0| // промежуточный диапазон
Введите число от 1 до 4 и нажмите ENTER: 6
Значение вне диапазона. Программа завершена!
|6||7||2||-2||1| // исходный массив
Введите число от 1 до 5 и нажмите ENTER: 4
|6||7||2||1||0| // промежуточный диапазон
Введите число от 1 до 4 и нажмите ENTER: -1
Значение вне диапазона. Программа завершена!
vedro-compota's picture

  1. if i = 0 then
            write('Все значения массива равны 0. Программа заершена!');
    

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

  2.     
    if value_user <= i then
              i -= 1;
      first_array := shift(value_user,first_array);
    

    -- в ряде случае shift(value_user,first_array); - тут будет выполнено в холостую. Переместите вызов этой операции.

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

Условие:

if i = 0 then
        write('Все значения массива равны 0. Программа заершена!')

вынесено из цикла

в строках:

if value_user <= i then
          i -= 1;
      first_array := shift(value_user,first_array);

проверка

if value_user <= i then

удалена. Вместо этого проверка if (value_user 5) then
доработана и привязана к счетчику

if (value_user < 1) or (value_user > i) then

также инициализация и вывод массива выведены в функцию и процедуру соответственно

type arr = array[1..5] of integer;
var  i,value_user : integer;
  first_array : arr;

function initialization_arr (f_array: arr): arr;
var f,min,max : integer;
begin
  min := -5;
  max := 12;
  for f := low(f_array) to high(f_array) do
    f_array[f] := min + random(max - min + 1);
  result := f_array;
end;

procedure print(x_array: arr);
var x : integer;
begin
  for x := low(x_array) to high(x_array) do
    write('|', x_array[x], '|');
end;

function shift(value_u: integer; f_array: arr): arr;
var g: integer;
begin
  for g := value_u to (high(f_array)-1)  do
    f_array[g] := f_array[g+1];
  f_array[high(f_array)] := 0;
  result := f_array;
end;

begin
  randomize;
  first_array := initialization_arr(first_array);
  print(first_array);
  writeln(' // исходный массив');
  i:= 5;
  while (i >= 1) do
    begin
      write('Введите число от 1 до ', i, ' и нажмите ENTER: ');
      readln(value_user);
      if (value_user < 1) or (value_user > i) then
        begin
          write('Значение вне диапазона. Программа завершена!');
          break;
        end
      else
        i -= 1;
      first_array := shift(value_user,first_array);
      print(first_array);
      writeln(' // промежуточный диапазон');
    end;
  if i = 0 then
    write('Все значения массива равны 0. Программа заершена!');
  readln();
end.
vedro-compota's picture

      if (value_user < 1) or (value_user > i) then
        begin
          write('Значение вне диапазона. Программа завершена!');

-- не по условию, число=5 по условию проходит нормально (если с ходу непонятно - лучше переделать)

Остальное правильно. решение засчитано.

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