Решение №7 из главы 15.Заполните массив из 5 элементов случайными числами из любого диапазона. Далее пользователь вводит

Задача №7 из главы 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 // ввод пользователя<pre class="brush: delphi"></pre>
|0|0|0|0|0| // промежуточный результат
// Cообщение о завершении, т.к. все элементы удалены

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

program pascal_array_zero_delete;
type arr_int = array[1..5] of integer; // секция обьявления типов

{ функция заполнения массива }
function fill_array(): arr_int;
  var i, min, max : integer;
  filling_array : arr_int;
begin // начало тела функции
  randomize();
  min := 5;
  max := 25;
  for i := 1 to high( filling_array ) do
  begin
    filling_array[i] := random( max - ( min + 1 ) - min );
  end;
  fill_array := filling_array; // возврат значения функции
end; // завершение тела функции

{ функция сдвига  массива }
function shift_arr( var in_arr : arr_int;  len_arr, number : integer ): arr_int;
  var k : integer;
begin // начало тела функции
  if( number = len_arr ) then
     in_arr[len_arr] := 0
  else
  begin
      for k := number to len_arr - 1 do
      begin
         in_arr[k] := in_arr[k+1];
      end;
      in_arr[len_arr] := 0;
  end;
  shift_arr := in_arr; // возврат значения функции
end; // завершение тела функции

{ процедура вывода  массива }
procedure print_arr( arr_in : arr_int );
  var j : integer;
begin // начало тела процедуры
 for j := 1 to high( arr_in ) do
 begin
    write( arr_in[j], ' ' );
 end;
end; // завершение тела процедуры

{ процедура  изменения  и вывода  массива }
procedure get_array( count_in, sign_in, change_len_arr : integer; arr_change : arr_int );
   var value_in : integer;
begin // начало тела процедуры
  while( count_in < 5 )  do
  begin
      writeln( 'input a value between 1 to 5: ' );
      readln( value_in );
      if( value_in >= 1 ) and ( value_in <= 5 ) then
      begin
        if( count_in = 0 ) then
        begin
            print_arr( shift_arr( arr_change, change_len_arr, value_in )); // вызов процедуры
            change_len_arr -= 1;
            count_in += 1;
        end
        else
        begin
          if( value_in <= change_len_arr ) then
          begin
             print_arr( shift_arr( arr_change, change_len_arr, value_in )); // вызов процедуры
             change_len_arr -= 1;
             count_in += 1;
          end
          else
             print_arr( arr_change ); // вызов процедуры
        end;
      end
      else
         break;
  end;
  writeln;
  writeln('end');
end; //  завершение тела процедуры

{ основная программа }
var arr_change : arr_int; // секция обьявления переменных
  count, sign, change_len : integer;
begin //  начало тела основной  программы
  count := 0;
  sign := 1;
  arr_change := fill_array(); // вызов функции заполнения массива
  change_len := high( arr_change ); // длинна массива
  print_arr( arr_change ); // вызов функции вывода массива
  get_array( count, sign, change_len, arr_change ); // вызов процедуры 
  readln();
end. //  завершение тела основной  программы

program  while_input_digit_delete_zero_array;
type arr_int = array[1..5] of integer; // секция обьявления типов

{ функция заполнения массива }
function fill_array(): arr_int;
  var i, min, max : integer;
  filling_array : arr_int;
begin
  randomize();
  min := 5;
  max := 25;
  for i := 1 to high( filling_array ) do
  begin
    filling_array[i] := random( max - ( min + 1 ) - min );
  end;
  fill_array := filling_array; // возвращаем значение функции
end;

{ функция сдвига  массива }
 function shift_arr( var in_arr : arr_int;  len_arr, number : integer ): arr_int;
 var k : integer;
begin
  if( number = len_arr ) then
      in_arr[len_arr] := 0
  else
  begin
      for k := number to len_arr - 1 do
      begin
         in_arr[k] := in_arr[k+1];
      end;
      in_arr[len_arr] := 0;
  end;
  shift_arr := in_arr;  // возвращаем значение функции
end;

{ процедура вывода  массива }
procedure print_arr( arr_in : arr_int );
  var j : integer;
begin
 for j := 1 to high( arr_in ) do
 begin
    write( arr_in[j], ' ' );
 end;
 writeln();
end;

procedure change_array( arr_change : arr_int );
   var value_in, count_in, change_len_arr : integer;
begin
  count_in := 0;
  change_len_arr := high( arr_change );
  while( count_in < 5 ) do
  begin
      writeln( 'input a value between 1 to 5: ' );
      readln( value_in );
      if( value_in >= 1 ) and ( value_in <= 5 ) then
      begin
        if( count_in = 0 ) then
        begin
            print_arr( shift_arr( arr_change, change_len_arr, value_in ) );
            change_len_arr -= 1;
            count_in += 1;
        end
        else
        begin
          if( value_in <= change_len_arr ) then
          begin
             print_arr( shift_arr( arr_change, change_len_arr, value_in ) ); // вызов функции
             change_len_arr -= 1;
             count_in += 1;
          end
          else
             print_arr( arr_change ); // вызов функции
        end;
      end
      else
         break;
  end;
  writeln('end');
end; //  завершение тела основной  программы

{ основная программа }
var arr_change : arr_int; // секция обьявления переменных
begin //  начало тела основной  программы
  arr_change := fill_array(); // вызов функции
  print_arr( arr_change ); // вызов функции
  change_array( arr_change ); //  вызов процедуры
  readln();
end. // завершение тела основной  программы





vedro-compota's picture

if ((count_in = 0 ) OR ( value_in <= change_len_arr )) then

-- подумать может ли не быть при истинной первой части выражения, ложность второй части, и затем оптимизировать, уменьшить вложенность:

if( count_in = 0 ) then
        begin
            print_arr( shift_arr( arr_change, change_len_arr, value_in ) );
            change_len_arr -= 1;
            count_in += 1;
        end
        else
        begin
          if( value_in <= change_len_arr ) then
          begin
             print_arr( shift_arr( arr_change, change_len_arr, value_in ) ); // вызов функции
             change_len_arr -= 1;
             count_in += 1;
          end
          else
             print_arr( arr_change ); // вызов функции

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

исправил

program  while_input_digit_delete_zero_array;
type arr_int = array[1..5] of integer; // секция обьявления типов
  
{ функция заполнения массива }
function fill_array(): arr_int;
  var i, min, max : integer;
  filling_array : arr_int;
begin
  randomize();
  min := 5;
  max := 25;
  for i := 1 to high( filling_array ) do
  begin
    filling_array[i] := random( max - ( min + 1 ) - min );
  end;
  fill_array := filling_array; // возвращаем значение функции
end;
  
{ функция сдвига  массива }
function shift_arr( in_arr : arr_int;  len_arr, number : integer ): arr_int;
 var k : integer;
begin
  if( number = len_arr ) then
      in_arr[len_arr] := 0
  else
  begin
      for k := number to len_arr - 1 do
      begin
         in_arr[k] := in_arr[k+1];
      end;
      in_arr[len_arr] := 0;
  end;
  shift_arr := in_arr;  // возвращаем значение функции
end;
  
{ процедура вывода  массива }
procedure print_arr( arr_in : arr_int );
  var j : integer;
begin
 for j := 1 to high( arr_in ) do
 begin
    write( arr_in[j], ' ' );
 end;
 writeln();
end;
  
procedure change_array( arr_change : arr_int );
   var value_in, count_in, change_len_arr : integer;
begin
  count_in := 0;
  change_len_arr := high( arr_change );
  while( count_in < 5 ) do
  begin
      writeln( 'input a value between 1 to 5: ' );
      readln( value_in );
      if( value_in >= 1 ) and ( value_in <= 5 )  then
      begin
        if( value_in <= change_len_arr ) then
        begin
            arr_change := shift_arr( arr_change, change_len_arr, value_in );
            print_arr( arr_change );
            change_len_arr -= 1;
            count_in += 1;
        end
          else
             print_arr( arr_change ); // вызов функции
      end
      else
         break;
  end;
  writeln('end');
end; //  завершение тела основной  программы
  
{ основная программа }
var arr_change : arr_int; // секция обьявления переменных
begin //  начало тела основной  программы
  arr_change := fill_array(); // вызов функции
  print_arr( arr_change ); // вызов функции
  change_array( arr_change ); //  вызов процедуры
  readln();
end. // завершение тела основной  программы
vedro-compota's picture

решение засчитано

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