Речь идет о 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.
С чего вдруг? Было бы нельзя - программа не компилировалась бы. А так практически любая комбинация программных едениц разрешена, всё ограничивается только вашей фантазией.
@Вероника, судя по индексации у вас предположительно два одномерных целочисленных массива, и конструкция A[B[i]] трактуется как значение массива А под индексом [значения i-го элемента массива B], так что в зависимости от начальных/текущих значений переменных и задачи, всё должно получиться ок, а для нюансов можно пошагово контролировать ход расчётов.
Машина делает только то, что сказано в программе, а не всегда то, что хотел сказать программист.
Индекс – целое число, не важно откуда, поэтому главное не перепутать A[индекс (i+j)] и A[индекс i+j]. Хотя для нелинейных индексов лучше подходят динамические конструкции вроде очереди/стека и, например, хеши/словари, через которые можно эмулировать дробные или текстовые “индексы”
Вот полный код. Ошибка в том, что не происходит никаких изменений, по какой причине найти не могу.
{Дано целое число 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.
Не используйте статические массивы, это старьё оставленное только ради совместимости со старыми паскалями.
Удаление элемента из середины массива - занятие муторное, для этого надо много кода. Для такого надо использовать список.
Хранить все серии одной кучей в массиве ужасно не удобно. Лучше объявить тип серии:
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.
Прочитал - и ничего не понял. Есть целочисленный массив размера n, заполненный случайными числами из интервала 0…9. Есть некоторое целое число k, значение которого произвольно. Надо удалить из массива некую “серию” с номером k. Что такое “серия” и что такое номер серии? А дальше читаем: “если серий в массиве меньше k…”. k - это же вроде какой-то “номер серии”. Как вдруг количество серий (которых теперь много?) можно сопоставлять с номером серии? Это что-то вроде сопоставления количества квартир в доме с номером квартиры?