Возможна ли такая конструкция?


#1

Речь идет о 4 строчке. В массиве b записаны нужные позиции массива а. Нужно начать цикс именно с этото номера. При выполнении программы похоже эта часть вообще пропускается. Может по причине, что такая конструкци я не возможна(a[b[i]])? Ошибку одну нашла. b[m] := i-1; - в этой строке. Правильно - b[m] := i;. Но при этом стола затираться серия не правильно.

{Дано целое число K (> 1) и целочисленный массив размера N. 
Удалить из массива серию с номером K. 
Если серий в массиве меньше K, то вывести массив без изменений.}
var
  a, b: array [1..100] of integer;
  N, K, kol_seriy, m, j: integer;
  i: byte;

begin
  N := ReadInteger('Введите размер массива:');
  K := ReadInteger('Введите номер серии:');
  Print('Состав массива:');
  for i := 2 to N+1 do //чтобы в строке 18 не возникало ошибки ввыхода за границы массива
  begin
    a[i] := Random(10);
    write(a[i]:3);
  end;
  Println;
  (kol_seriy, m, j) := (0, 0, 1);
  for i := 2 to N do
  begin
    if (a[i] = a[i+1]) and (a[i] <> a[i-1]) then //подсчет серий
    kol_seriy += 1;
    if (a[i] = a[i+1]) and (a[i] <> a[i-1]) and (a[i] = K) then //если нашлась серия с номером K, записываем индекс в массив b
    begin
      m += 1;
      b[m] := i-1; 
    end;
  end;
  if (kol_seriy >= K) and (m > 0) then //m > 0 - если есть серия К
  begin
    for i := 1 to m do
        begin
        while a[b[i]] = a[b[i]+1] do //подсчет размера серии
          begin
          j += 1;
          a[b[i]] := a[b[i]+j];
          end;
        for var l := b[i]+1 to N-j-1 do //сдвиг массива с затиранием серии
          begin
          a[l] := a[l+(j-1)];
          end;
        end;
      end;
  writeln('Количество серий:', kol_seriy);
  Print('Массив после изменения:');
  for i := 2 to N+1 do
  write (a[i]:3);
  Println;
  Print('Номер в массиве с нужной серией:');
  for i := 1 to m do
  write (b[i]:3);
end.

#2

С какого с этого?

И выделите код так:

```
код
```

Знак ` находится за ё в англ раскладке.

С чего вдруг? Было бы нельзя - программа не компилировалась бы. А так практически любая комбинация программных едениц разрешена, всё ограничивается только вашей фантазией.


#3

Хорошо. Но почему тогда комп пропускает эти строчки? Буду разбираться дальше. Спасибо. А начинаться должно с номеров записанных в массиве b.


#4

@Вероника, судя по индексации у вас предположительно два одномерных целочисленных массива, и конструкция A[B[i]] трактуется как значение массива А под индексом [значения i-го элемента массива B], так что в зависимости от начальных/текущих значений переменных и задачи, всё должно получиться ок, а для нюансов можно пошагово контролировать ход расчётов.

Машина делает только то, что сказано в программе, а не всегда то, что хотел сказать программист.

Индекс – целое число, не важно откуда, поэтому главное не перепутать A[индекс (i+j)] и A[индекс i+j]. Хотя для нелинейных индексов лучше подходят динамические конструкции вроде очереди/стека и, например, хеши/словари, через которые можно эмулировать дробные или текстовые “индексы”


#5

Почему бы Вам не привести полный текст программы, чтобы ее можно было запустить и посмотреть, что работает не так, как Вам бы хотелось?


#6

Вот полный код. Ошибка в том, что не происходит никаких изменений, по какой причине найти не могу.

{Дано целое число K (> 1) и целочисленный массив размера N. 
Удалить из массива серию с номером K. 
Если серий в массиве меньше K, то вывести массив без изменений.}
var
  a, b: array [1..100] of integer;
  N, K, kol_seriy, m, j: integer;
  i: byte;

begin
  N := ReadInteger('Введите размер массива:');
  K := ReadInteger('Введите номер серии:');
  Print('Состав массива:');
  for i := 2 to N+1 do //чтобы в строке 18 не возникало ошибки ввыхода за границы массива
  begin
    a[i] := Random(10);
    write(a[i]:3);
  end;
  Println;
  (kol_seriy, m, j) := (0, 0, 1);
  for i := 2 to N do
  begin
    if (a[i] = a[i+1]) and (a[i] <> a[i-1]) then //подсчет серий
    kol_seriy += 1;
    if (a[i] = a[i+1]) and (a[i] <> a[i-1]) and (a[i] = K) then //если нашлась серия с номером K, записываем индекс в массив b
    begin
      m += 1;
      b[m] := i-1; 
    end;
  end;
  if (kol_seriy >= K) and (m > 0) then //m > 0 - если есть серия К
  begin
    for i := 1 to m do
        begin
        while a[b[i]] = a[b[i]+1] do //подсчет размера серии
          begin
          j += 1;
          a[b[i]] := a[b[i]+j];
          end;
        for var l := b[i]+1 to N-j-1 do //сдвиг массива с затиранием серии
          begin
          a[l] := a[l+(j-1)];
          end;
        end;
      end;
  writeln('Количество серий:', kol_seriy);
  Print('Массив после изменения:');
  for i := 2 to N+1 do
  write (a[i]:3);
  Println;
  Print('Номер в массиве с нужной серией:');
  for i := 1 to m do
  write (b[i]:3);
end.

#7

Да, все верно. Про динамические конструкции посмотрю, спасибо.)


#8
  1. Не используйте статические массивы, это старьё оставленное только ради совместимости со старыми паскалями.

  2. Удаление элемента из середины массива - занятие муторное, для этого надо много кода. Для такого надо использовать список.

  3. Хранить все серии одной кучей в массиве ужасно не удобно. Лучше объявить тип серии:

type
  ser = auto class
    
    el, c: integer;
    
    public function ToString: string; override;
    begin
      var res := new StringBuilder;
      
      var el_str := el.ToString;
      res += el_str;
      loop c-1 do
      begin
        res += ' ';
        res += el_str;
      end;
      
      Result := res.ToString;
    end;
    
  end;

begin
  var N := ReadlnInteger('N =');
  var K := ReadlnInteger('K =');
  
  var A := ArrRandom(N, 0, 9);
  A.Println;
  
  var sers := A.AdjacentGroup
  .Select(
    g->
    new ser(g[0],g.Length)
  )
  .ToList;
  
  sers.RemoveAt(K);
  sers.Println;
  
end.

#9

Прочитал - и ничего не понял. Есть целочисленный массив размера n, заполненный случайными числами из интервала 0…9. Есть некоторое целое число k, значение которого произвольно. Надо удалить из массива некую “серию” с номером k. Что такое “серия” и что такое номер серии? А дальше читаем: “если серий в массиве меньше k…”. k - это же вроде какой-то “номер серии”. Как вдруг количество серий (которых теперь много?) можно сопоставлять с номером серии? Это что-то вроде сопоставления количества квартир в доме с номером квартиры?