Перейти к содержимому

Как удалить элемент массива в си

  • автор:

Удалить из массива элемент (С++)

Алгоритм удаления элемента сводится к сдвигу на одну позицию влево всех элементов, расположенных правее удаляемого. Подробно алгоритм рассмтрен в теме “Алгоритм: удаление элемента массива“. Тут приведем лишь иллюстрацию: Для начала найдем позицию удаляемого числа — функция возвращает позицию или -1 если такого числа нет:

int first_negative_pos(int* numbers, int size) < for (int i = 0; i < size; ++i) < if (numbers[i] < 0) return i; >return -1; >

Алгоритм удаления с помощью сдвига можно описать на Си так:

void remove_nth(int* numbers, int& size, int pos) < if (size --size; >

В функции main получим позицию первого отрицательного элемента и если это положительное число — вызовем remove_nth :

int negativePos = first_negative_pos(numbers, size); if (negativePos < 0) < printf("no negative elements\n"); >else

С использованием STL

В стандартной библиотеке C++ есть вектора, имеющие метод erase , на вход которого подается итератор удаляемого элемента. Кроме того, в стандартной библиотеке есть алгоритм для поиска элемента по условию. В итоге с использованием векторов задачу можно решить так:

#include #include #include using namespace std; void print(const vector& vec) < for (auto value : vec) < cout cout int main() < vectorvec(); print(vec); auto negative_it = find_if(vec.begin(), vec.end(), [](int value) < return value < 0; >); vec.erase(negative_it); print(vec); >

Алгоритмы С++ можно применять и к массивам в стиле Си, однако выглядит это весьма куцо. Для поиска можно применить тот же find_if , при этом вместо итераторов можно передать адреса начала и конца массива. Удаление реализует алгоритм std::remove (работать будет также как наша функция сдвига). Этот алгоритм не удаляет элемент физически, а лишь сдвигает его в конец, поэтому несмотря на применение алгоритмов, мы должны сами позаботиться об изменении размера массива (в Си иначе и быть не может):

void remove_first_negative(int* arr, int& size) < auto negative_it = find_if(arr, arr+size, [](int value) < return value < 0; >); std::remove(negative_it, arr+size, *negative_it); --size; > int main() < int n = 8; int arr[n] = ; print_array(arr, n); remove_first_negative(arr, n); print_array(arr, n); >

В любом случае, если знать как устроены алгоритмы STL – то можно сократить объем кода и меньше работать. Несмотря на то, что алгоритмы работают с Си-контейнерами – лучше так не делать (порог вхождения у полученного кода будет весьма высоким). Узнать много полезного про STL можно в статье “Практика: алгоритмы и стандартная библиотека C++“.

Массивы

Задача. Заменить отрицательные элементы на противоположные по знаку. Для этого опишем процедуру. Ей будем передавать параметры — количество элементов в массиве и массив, который будет также и результатом выполнения процедуры, так как некоторые его элементы могут быть заменены.

Procedure Zamena (Var m : MyArray; n:integer);
Var
i : integer;
Begin
for i := 1 to n do
if m[i] < 0
then
m[i] := -m[i];
End;

Нахождение номеров элементов с заданным свойством

Задача. Найти и вывести на экран номера четных элементов. Для решения задачи необходимо просмотреть весь массив, и если просматриваемый элемент является четным, то выводить его номер.

Procedure PoiskChet(m : MyArray; n:integer);
Var
i : integer;
Begin
for i := 1 to n do
if m[i] mod 2 =0
then
Write(i:5);
End;

Нахождение количества элементов с заданным свойством

Задача. Найти количество положительных и отрицательных элементов в данном массиве. Опишем процедуру, которой будем отправлять параметры — массив, количество элементов в массиве и два счетчика, один для элементов, больших нуля, а второй — для отрицательных элементов.

Procedure OtrPol(m : MyArray; n:integer; Var k1, k2 : Integer);
Var
i : integer;
Begin
k1 :=0;
k2 :=0;
for i := 1 to n do
if m[i] > 0
then
Inc(k1)
else
if m[i] < 0
then
Inc(k2);
End;

Есть ли в данном массиве элементы с данным свойством?

Для решения таких задач удобнее использовать циклы с условиями и составлять функции, результат которых имеет логический тип. Задача. Есть ли отрицательный элемент в массиве? Начинаем с первого элемента (i=1). Пока не просмотрен последний элемент (i<=n) и не найден отрицательный (m[i]>=0), будем переходить к следующему (Inc(i)). Таким образом, мы закончим просмотр массива в одном из двух случаев: первый – просмотрели все элементы и не нашли отрицательный, тогда i>n, второй – нашли нужный, при этом i

Function Control (m : MyArray; n:integer) : Boolean;
Var
i : integer;
Begin
i := 1;
while (i<=n) and (m[i]>0) do
Inc(i);
Control := (i<=n);
End;

Информатика. 10 класс (Повышенный уровень)

Среди задач преобразования элементов массива можно выделить задачи следующих типов:

1. Изменение элементов массива в зависимости от условий.
2. Обмен местами элементов в массиве.
3. Удаление элемента из массива.
4. Вставка элемента в массив.

Некоторые из задач преобразования массивов встречаются очень часто. Поэтому в класс vector были добавлены функции, позволяющие преобразовывать массивы.

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

Удаление элементов массива

Author24 — интернет-сервис помощи студентам

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

Задача:удалить все элементы меньше 3 и расположенные после первого отрицательного

Добавлено через 8 минут
Массив вещественный, Массив содержит не более 20 элементов, Вспомогательные массивы не использовать

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Удаление элементов массива
Помогите, пожалуйста, понять как реализовать на Си удаление повторяющихся элементов одномерного.

Удаление элементов массива
Добрый вечер! Написала код,который удаляет все элементы массива меньше 3, подскажите пожалуйста.

Удаление элементов массива
Здравствуйте. Дан двумерный массив (N=4, M=5). Удалить из строк все отрицательные элементы.

Удаление элементов массива
Допустим нам дан массив А . Как в данном массиве удалить , ну например 1 и 3 элементы , что бы на.

94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
dashaDK, если правильно понял. Если неправильно, другой поймёт правильно.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
///Задача:удалить все элементы меньше 3 и расположенные после первого отрицательного #include int main() { int N = 10; int k = N; float mass[N]; for( int i = 0; i  N; i++ ) scanf( "%f", &mass[i] ); /*--------до--------*/ for( int i = 0; i  N; i++ ) printf( "%.3f ", mass[i] ); for( int i = 0; i  N; i++ ) { if( mass[i]  3.0 && mass[i] > 0.0 ) { for( int j = i; j  N - 1; j++ ) mass[j] = mass[j+1]; mass[k-1] = 0.0; k--; i = -1; } else if( mass[i]  0.0) for( int s = N - 1; s >= i; s-- ) mass[s] = 0.0; } putchar( '\n' ); /*------после-------*/ for( int i = 0; i  N; i++ ) printf( "%.3f ", mass[i] ); return 0; }

Регистрация: 04.12.2017
Сообщений: 11

Пробую вводить код, который вы отправили, программа выдает следующие ошибки (см. вложения)
Видимо, нужно задать константное значение, и по-моему , тут не выделена память под массив ? Или я не права?

94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
dashaDK, ну сделайте перменную N константой
Регистрация: 04.12.2017
Сообщений: 11
Мы же не знаем конкретное число элементов массива , как мы можем задавать данную переменную?
Регистрация: 01.12.2017
Сообщений: 5
Вы же сами написали что не больше 20
Регистрация: 04.12.2017
Сообщений: 11

Я не совсем понимаю,как в этом случае задать константное значение. Вот есть код, тут он удаляет элементы меньше 3, расположенные до последнего минимального. как можно его переделать,чтобы удалял после первого отрицательного?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
#include #include #include #define DIM_A 20 double first(double *array, int *len_array); int input(double *array, int len_array); //длина массива, тоже что и К void output(double *array, int new_array); // ничего не возвращает int main() { int new_array = 0; double array[DIM_A], s = 0; setlocale(LC_NUMERIC, "eng"); setlocale(LC_ALL, "rus"); new_array = input(array, DIM_A); first(array, &new_array); output(array, new_array); return 0; } int input(double *array, int len_array) { int i, k; printf("Введите размер массива k:\n"); scanf_s("%d", &k); if (len_array k) { printf("Error"); return 0; } for (i = 0; ik; i++) { printf("array[%d]=", i); scanf_s("%lf", &array[i]); } return k; } double first(double *array, int *len_array) { int i = 0, j, t = 0, s; double a = array[0]; for (i = 0; i  (*len_array); i++) { if (array[i] >= a) { a = array[i]; t = i; } } for (i = (*len_array - 1); i >= 0; i--) if ((array[i]3) && (i  t)) { for (j = i; j(*len_array - 1); j++) array[j] = array[j + 1]; t--; (*len_array)--; } return 0; }

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *