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

var a: array [1..5] of integer;
    i, N , min, max: integer;


begin
  min := 1;
  max := 100;
  randomize();
  for i := 1 to 5 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
    end;
  writeln();
  repeat
    writeln('vvedi kluch dlya ydaleniya ');
    readln(N);
    for i := low(a) to high(a) do
      begin
        if (i < N) then
          a[i]:=a[i]
        else if(i < 5) then
          a[i] := a[i + 1]
        else
          a[i]:=0;
        write(a[i], ' ');
      end;
      writeln();
  until((N < 1) or (5 < N) or (a[1] = 0));
  writeln('finishhh');
  readln();
end. 
vedro-compota's picture

вынести сдвиг в продпрограмму

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

type inArr = array[1..5] of Integer;
var a: array [1..5] of integer;
    i, N , min, max: integer;

procedure moover(a: inArr; N: integer);
  begin
    for i := low(a) to high(a) do
      begin
        if (i < N) then
        else if(i < 5) then
          a[i] := a[i + 1]
        else
          a[i]:=0;
        write(a[i], ' ');
      end;
  end;

begin
  min := 1;
  max := 100;
  randomize();
  for i := 1 to 5 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
    end;
  writeln();
  repeat
    writeln('vvedi kluch dlya ydaleniya ');
    readln(N);
    moover(a,N);
    writeln();
  until((N < 1) or (5 < N) or (a[1] = 0));
  writeln('finishhh');
  readln();
end.
vedro-compota's picture

if (i < N) then
        else if(i < 5) then
          a[i] := a[i + 1]
        else
          a[i]:=0;

-- переписать нормально

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

type inArr = array[1..5] of Integer;
var a: array [1..5] of integer;
    i, N , min, max: integer;

procedure moover(var a: inArr; N: integer);
   begin
    for i := low(a) to high(a) do
      begin
        if (i >= N) then
          a[i] := a[i + 1]
        else if(i=(high(a)-1)) then
          a[i]:=0;
        write(a[i], ' ');
      end;
  end;


begin
  min := 1;
  max := 100;
  randomize();
  for i := 1 to 5 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
    end;
  writeln();
  repeat
    writeln('vvedi kluch dlya ydaleniya ');
    readln(N);
    moover(a,N);
    writeln();
  until((N < 1) or (5 < N) or (a[1] = 0));
  writeln('finishhh');
  readln();
end.  
vedro-compota's picture

procedure moover(var a: inArr; N: integer);
   begin
    for i := low(a) to high(a) do
      begin
        if (i >= N) then
          a[i] := a[i + 1]
        else if(i=(high(a)-1)) then
          a[i]:=0;
        write(a[i], ' ');
      end;
  end;

-- задать начальные и конечные индексы сразу, напр. нет смысл перебирать элементы "до N"

+ странность с условием:

else if(i=(high(a)-1)) then
          a[i]:=0;

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

type inArr = array[1..5] of Integer;
var a: array [1..5] of integer;
    i, N , min, max: integer;

procedure moover(var a: inArr; N: integer);
   begin
    for i := N to high(a) do
      begin
        a[i] := a[i + 1];
        if(i=high(a)) then
          a[i]:=0;
      end;
  end;


begin
  min := 1;
  max := 100;
  randomize();
  for i := 1 to 5 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
    end;
  writeln();
  repeat
    writeln('vvedi kluch dlya ydaleniya ');
    readln(N);
    moover(a,N);
    for i := low(a) to high(a) do //цикл вывода на экран начального массива
      write(a[i], ' ');
    writeln();
  until((N < 1) or (5 < N) or (a[1] = 0));
  writeln('finishhh');
  readln();
end.  
vedro-compota's picture

 for i := N to high(a) do
      begin
        a[i] := a[i + 1];

судя по всему есть выход за пределы массива

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

type inArr = array[1..5] of Integer;
var a: array [1..5] of integer;
    i, N , min, max: integer;

procedure moover(var a: inArr; N: integer);
begin
  for i := N to high(a) do
    begin
      a[i] := a[i + 1];
      if(i = high(a)) then
        a[i] := 0;
    end;
end;


begin
  min := 1;
  max := 100;
  randomize();
  for i := 1 to 5 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
    end;
  writeln();
  repeat
    writeln('vvedi kluch dlya ydaleniya ');
    readln(N);
    moover(a,N);
    for i := low(a) to high(a) do //цикл вывода на экран начального массива
      write(a[i], ' ');
    writeln();
  until((N < 1) or (5 < N) or (a[1] = 0));
  writeln('finishhh');
  readln();
end. 
vedro-compota's picture

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

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