Удаление отрицательных элементов массива

Задача

Заполнить массив случайными положительными и отрицательными целыми числами. Вывести его на экран. Удалить из массива все отрицательные элементы и снова вывести.

Пояснение к задаче и алгоритм решения

Если очередной элемент массива отрицателен, то все элементы следующие за ним надо передвинуть на одну ячейку вперед. В результате отрицательный элемент как бы затрется, а учитываемую длину массива надо уменьшить на единицу.

Поскольку непредсказуемо могут меняться как длина массива, так и счетчик-индекс элементов, то цикл for не подходит. Когда встречается отрицательный элемент, то индекс не увеличивается, т.к. на это место записывается новый элемент, который будет проверяться в следующей итерации цикла. При этом надо уменьшить значение длины массива.
Если же элемент не отрицательный, то надо перейти к следующему элементу, т.е. увеличить индекс и при этом не уменьшать длину массива.

Исходный код на языке программирования Pascal

const N = 10;
var
    a: array[1..N] of integer;
    i, k, m: byte;
begin
    randomize;
    for i:=1 to N do begin
        a[i] := random(10) - 5;
        write(a[i]:4)
    end;
    writeln;
 
    i := 1;
    m := N;
    while i<=m do
        if a[i] < 0 then begin
            m := m-1;
            for k:=i to m do
                a[k] := a[k+1];
        end
        else
            i := i+1;
 
    for i:=1 to m do
        write(a[i]:4);
    writeln;
end.

Пример(ы) выполнения программы на языке Pascal

  -1  -3   2  -4  -5   3  -3   2  -5   4
   2   3   2   4

Исходный код на языке программирования C

#include <stdio.h>
#define N 10
main() {
    int a[N], i,j, m;
    srand(time(NULL));
    for (i=0; i<N; i++) {
        a[i] = rand()%10 - 5;
        printf("%d ", a[i]);
    }
    printf("\n");
    i = 0;
    m = N;
    while (i < m)
        if (a[i] < 0) {
            m -= 1;
            for (j=i; j < m; j++)
                a[j] = a[j+1];
        } else
            i += 1;
 
    for (i=0; i<m; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
}

Пример(ы) выполнения программы на языке C

3 4 4 -1 4 -1 1 4 3 2
3 4 4 4 1 4 3 2

Исходный код на языке программирования Python

from random import random
a = []
for i in range(10):
    n = int(random()*10) - 5
    a.append(n)
print(a)
i = 0
m = 10
while i < m:
    if a[i] < 0:
        del a[i]
        m -= 1
    else:
        i += 1
print(a)

Пример(ы) выполнения программы на языке Python

[-4, 0, 1, 3, -2, 4, 1, 3, -2, -4]
[0, 1, 3, 4, 1, 3]

Особенности решения на языке программирования Python

В Питоне задача решается проще, т.к. нет надобности сдвигать элементы. Можно просто удалить тот или иной элемент из списка с помощью функции del.

Исходный код на языке программирования КуМир

алг удаление элементов
нач
  цел N = 10
  цел таб a[1:N]
  цел i,k,m
  нц для i от 1 до N
    a[i] := int(rand(0,10)) - 5
    вывод a[i], " "
  кц
  вывод нс
  i := 1
  m := N
  нц пока i <= m
    если a[i] < 0 то
      m := m-1
      нц для k от i до m
        a[k] := a[k+1]
      кц
     иначе
      i := i + 1
    все
  кц
  нц для i от 1 до m
    вывод a[i], " "
  кц
кон

Пример(ы) выполнения программы на языке КуМир

1 2 -4 0 -2 -1 -5 3 0 -1
1 2 0 3 0

Исходный код на языке программирования Basic

N = 10
dim a(N)
for i=0 to N-1
        a[i] = int(rand*10) - 5
        print a[i] + " ";
next i
print
i = 0
m = N-1
while i <= m
        if a[i] < 0 then
                m = m-1
                for j=i to m
                        a[j] = a[j+1]
                next j
        else
                print a[i] + " ";
                i = i + 1
        endif
endwhile

Пример(ы) выполнения программы на языке Basic

-1 2 2 -5 0 1 -1 -1 0 4
2 2 0 1 0 4

Тема

Массивы

Уровень сложности

Сложный

Дата публикации