Сжать массив, удалив из него все элементы, величина которых находится в интервале [а, b]. Освободившиеся в конце массива элементы заполнить нулями.
Задачу можно разбить на три подзадачи:
Удаление элементов массива, принадлежащих заданному интервалу.
Сдвиг оставшихся элементов.
Заполнение «освободившейся» части массива нулями.
На самом деле первая и вторая подзадача решаются совместно по следующему алгоритму:
В цикле перебираем элементы массива, начиная с первого.
При обнаружении элемента, принадлежащего удаляемому интервалу,
размерность массива уменьшаем на единицу (поэтому лучше использовать цикл while, а не for.),
остальную (правую) часть массива сдвигаем на одну ячейку в лево.
Сдвиг правой части массива выполняется в цикле от текущего индекса элемента до размерности массива.
После того, как все элементы, принадлежащие заданному интервалу будут удалены, следует заполнить конец массива нулями от элемента с индексом на единицу больше новой размерности массива до количества элементов в «старом» массиве.
const N = 10;
var
a: array[1..N] of integer;
l, h: integer;
i, k, m: byte;
begin
write('Границы массива: ');
readln(l,h);
randomize;
for i:=1 to N do begin
a[i] := random(h-l) + l;
write(a[i]:4)
end;
writeln;
write('Удалить элементы в интервале: ');
readln(l,h);
i := 1;
m := N;
while i<=m do
if (a[i] >= l) and (a[i] <= h) then begin
m := m-1;
for k:=i to m do
a[k] := a[k+1];
{ здесь не сдвигаемся вперед, так как
записанный в текущую (i) ячейку элемент не проверялся }
end
else
i := i+1;
for i:=m+1 to N do
a[i] := 0;
for i:=1 to N do
write(a[i]:4);
writeln;
end.
Границы массива: -10 10
-5 -10 -6 3 4 4 -6 2 0 -6
Удалить элементы в интервале: -5 5
-10 -6 -6 -6 0 0 0 0 0 0
Язык Си
#include
#define N 10
main() {
int a[N], i,j, m, l,h;
printf("Границы массива: ");
scanf("%d%d", &l,&h);
srand(time(NULL));
for (i=0; i
a[i] = rand()%(h-l) + l;
printf("%d ", a[i]);
}
printf("\n");
printf("Удаляемый диапазон: ");
scanf("%d%d", &l,&h);
i = 0;
m = N;
while (i < m)
if (a[i] <= h && a[i] >= l) {
m -= 1;
for (j=i; j < m; j++)
a[j] = a[j+1];
} else
i += 1;
for (i=m; i
for (i=0; i
printf("%d ", a[i]);
}
printf("\n");
}
from random import random
N = 10
a = []
l = int(input('Нижняя граница массива: '))
h = int(input('Верхняя граница массива: '))
for i in range(N):
n = int(random()*(h-l)) + l
a.append(n)
print(a)
print('Удаляемый диапазон')
l = int(input(' нижняя граница: '))
h = int(input(' верхняя граница: '))
i = 0
m = N
while i < m:
if l <= a[i] <= h:
del a[i]
m -= 1
else:
i += 1
for i in range(m,N):
a.append(0)
print(a)
Нижняя граница массива: 50
Верхняя граница массива: 100
[77, 97, 57, 75, 73, 91, 78, 75, 58, 54]
Удаляемый диапазон
нижняя граница: 55
верхняя граница: 75
[77, 97, 91, 78, 54, 0, 0, 0, 0, 0]
КуМир
алг сжатие
нач
цел N = 10
цел таб a[1:N]
цел i,k,m, l,h
вывод "Границы массива: "
ввод l, h
нц для i от 1 до N
a[i] := irand(l,h)
вывод a[i], " "
кц
вывод нс
вывод "Границы удаляемого интервала: "
ввод l, h
i := 1
m := N
нц пока i <= m
если a[i] <= h и a[i] >= l то
m := m-1
нц для k от i до m
a[k] := a[k+1]
кц
иначе
i := i + 1
все
кц
нц для i от m+1 до N
a[i] := 0
кц
input "Нижняя граница массива: ", l
input "Верхняя граница массива: ", h
N = 10
dim a(N)
for i=0 to N-1
a[i] = int(rand*(h-l)) +l
print a[i] + " ";
next i
print
print "Удалить элементы в интервале"
input "от ", l
input "до ", h
i = 0
m = N
while i < m
if a[i] <= h and a[i] >= l then
m = m-1
for j=i to m-1
a[j] = a[j+1]
next j
else
i = i + 1
endif
endwhile
for i=m to N-1
a[i] = 0
next i
for i=0 to N-1
print a[i] + " ";
next i
print
Возникает ошибка, если последний элемент входит в удаляемый диапазон. Для цикла сдвига пишет, что начальный индекс больше конечного.
Подписаться
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Pascal
const N = 10; var a: array[1..N] of integer; l, h: integer; i, k, m: byte; begin write('Границы массива: '); readln(l,h); randomize; for i:=1 to N do begin a[i] := random(h-l) + l; write(a[i]:4) end; writeln;
write('Удалить элементы в интервале: '); readln(l,h); i := 1; m := N; while i= l) and (a[i]
Язык Си
#include #define N 10 main() { int a[N], i,j, m, l,h; printf("Границы массива: "); scanf("%d%d", &l,&h); srand(time(NULL)); for (i=0; i
Python
from random import random N = 10 a = [] l = int(input('Нижняя граница массива: ')) h = int(input('Верхняя граница массива: ')) for i in range(N): n = int(random()*(h-l)) + l a.append(n) print(a) print('Удаляемый диапазон') l = int(input(' нижняя граница: ')) h = int(input(' верхняя граница: ')) i = 0 m = N while i < m: if l
КуМир
алг сжатие нач цел N = 10 цел таб a[1:N] цел i,k,m, l,h вывод "Границы массива: " ввод l, h нц для i от 1 до N a[i] := irand(l,h) вывод a[i], " " кц вывод нс вывод "Границы удаляемого интервала: " ввод l, h i := 1 m := N нц пока i
Basic-256
input "Нижняя граница массива: ", l input "Верхняя граница массива: ", h N = 10 dim a(N) for i=0 to N-1 a[i] = int(rand*(h-l)) +l print a[i] + " "; next i print
print "Удалить элементы в интервале" input "от ", l input "до ", h i = 0 m = N while i < m if a[i] = l then m = m-1 for j=i to m-1 a[j] = a[j+1] next j else i = i + 1 endif endwhile
for i=m to N-1 a[i] = 0 next i
for i=0 to N-1 print a[i] + " "; next i print
Возникает ошибка, если последний элемент входит в удаляемый диапазон. Для цикла сдвига пишет, что начальный индекс больше конечного.