Удаление элементов из массива
Чтобы удалить элемент
из массива
, необходимо сдвинуть элементы
на один «шаг» влево и уменьшить значение
на 1. Если
, то в этом случае достаточно выполнить
.
Пример 1. Из массива Х удалить минимальный элемент.
double Xmin, x[NMAX];
//ВВод n и массива x
Xmin=x[0]; imin=0; // Определение положения
for (i=1; i<n; i++) // (индекса) минимального
if (x[i]<Xmin) // элемента
for (i=imin; i<n-1; i++) // Удаление элемента
x[i]=x[i+1]; // с индексом imin
n—; // Уменьшение размера массива
//Печать массива x
Если imin = n-1, то второй цикл for не работает (не выполняется условие входа в цикл), но размер массива n уменьшается на 1.
Пример 2. Из массива Х удалить все нулевые элементы.
В программе будем последовательно просматривать элементы массива и, если очередной элемент
, то производим сдвиг подмассива
на один элемент влево, одновременно уменьшая количество элементов
.
//ВВод n и массива x
for (j=i; j<n-1; j++) // Удаление элемента
x[j]=x[j+1]; // с индексом i
n—; // Уменьшение размера массива
//Печать массива x
По поводу программы вариант 1 можно сделать два замечания.
1. При i = n-1, когда анализируется последний элемент массива, параметр j принимает значение n-1, т.е. начальное значение параметра цикла не соответствует условию входа в цикл j<n-1. Оператор for в этом случае не выполняется, т.е. оператор цикла эквивалентен пустому оператору. Следовательно, при
происходит лишь уменьшение значения n, что соответствует алгоритму решения задачи.
2. Предположим, что в массиве X имеются подряд идущие нулевые элементы
и
. При i = k будет удален элемент
, а на его место перемещается элемент
, также равный нулю. Поскольку при новом повторении цикла for параметр цикла принимает очередное значение k+1, то новый нулевой элемент
не будет анализироваться повторно и, как следствие, не будет удален из массива. Поэтому при наличии в массиве подряд идущих нулевых элементов программа варианта 1 работает неправильно.
Для корректного решения поставленной задачи нужно, чтобы программа после удаления нулевого элемента
повторно анализировала этот же элемент и переходила к рассмотрению элемента
лишь при
0. Для этого нужно в программе вместо цикла for использовать цикл while:
Вариант 2 (фрагмент).
//Ввод n и массива x
for (j=i; j<n-1; j++) // Удаление элемента
x[j]=x[j+1]; // с индексом i
n—; // Уменьшение размера массива
//Печать массива x
Тот же эффект можно достичь с помощью оператора for, если просмотр массива выполнять справа налево.
Вариант 3 (фрагмент).
//ВВод n и массива x
for (j=i; j<n-1; j++) // Удаление элемента
x[j]=x[j+1]; // с индексом i
n—; // Уменьшение размера массива
//Печать массива x
Обнаружение нулевого элемента во внешнем цикле и, как следствие, его удаление из массива приводит к перемещению уже обработанных элементов в «хвосте» массива и не влияет ни на количество повторений внешнего цикла, ни на анализ оставшихся элементов.
Рассмотрим еще один вариант программы, предназначенной для удаления нулевых элементов из массива. В этом случае все ненулевые элементы переносятся в начало массива. Для этого в переменную j перед началом цикла заносится -1. Если был найден ненулевой элемент массива, значение увеличивается на 1, и найденный элемент массива переписывается на место j-го элемента, если j!=i. Таким образом, в j находится номер последнего ненулевого элемента, перенесенного в начало массива. После цикла устанавливается новая длина массива n=j+1.
Вариант 4 (фрагмент).
//ВВод n и массива x
//Печать массива x
В 4-м варианте перемещается лишь один элемент массива (и то не в каждом цикле), в то время как в предыдущих вариантах при удалении каждого элемента, кроме последнего, передвигается вся правая часть массива, причем чем ближе удаляемый элемент к началу массива, тем больше элементов перемещается справа налево. Этот способ является наиболее эффективным.
Удаление элемента массива по индексу
Нужно из этого массива сделать удаление элемента массива по индексу.
![]()
Как-то уж всё совсем печально.
Динамически память не выделяете, STL не используете и режущий глаз вызов system(«PAUSE»); .
Судя по всему, много элементов удалять не придётся, а потому просто смещаете все элементы, кроме удаляемого, на 1 влево и уменьшаете длину массива на 1.
Массивы
П усть нам необходимо работать с большим количеством однотипных данных. Например, у нас есть тысяча измерений координаты маятника с каким-то шагом по времени. Создавать 1000 переменных для хранения всех значений очень. обременительно. Вместо этого множество однотипных данных можно объединить под одним именем и обращаться к каждому конкретному элементу по его порядковому номеру.
Массив в си определяется следующим образом
<тип> <имя массива>[<размер>];
Например,
int a[100];
Мы получим массив с именем a, который содержит сто элементов типа int. Как и в случае с переменными, массив содержит мусор.
Для получения доступа до первого элемента, в квадратных скобках пишем его номер (индекс). Например
Первый элемент имеет порядковый номер 0. Важно понимать, почему. В дальнейшем будем представлять память компьютера в виде ленты. Имя массива — это указатель на адрес памяти, где располагаются элементы массива.
Рис. 1 Массив хранит адрес первого элемента. Индекс i элемента — это сдвиг на i*sizeof(тип) байт от начала
Индекс массива указывает, на сколько байт необходимо сместиться относительно начала массива, чтобы получить доступ до нужно элемента. Например, если массив A имеет тип int, то A[10] означает, что мы сместились на 10*sizeof(int) байт относительно начала. Первый элемент находится в самом начале и у него смещение 0*sizeof(int) .
В си массив не хранит своего размера и не проверяет индекс массива на корректность. Это значит, что можно выйти за пределы массива и обратиться к памяти, находящейся дальше последнего элемента массива (или ближе).
Начальная инициализация массива.
Н апишем простую программу. Создадим массив, после чего найдём его максимальный элемент.
Разберём пример. Сначала мы создаём массив и инициализируем его при создании. После этого присваиваем максимальному найденному элементу значение первого элемента массива.
После чего проходим по массиву. Так как мы уже просмотрели первый элемент (у него индекс 1), то нет смысла снова его просматривать.
Тот же пример, только теперь пользователь вводит значения
В том случае, если при инициализации указано меньше значений, чем размер массива, остальные элементы заполняются нулями.
Если необходимо заполнить весь массив нулями, тогда пишем
Можно не задавать размер массива явно, например
массив будет иметь размер 3
Размер массива
М ассив в си должен иметь константный размер. Это значит, что невозможно, например, запросить у пользователя размер, а потом задать этот размер массиву.
Создание динамических массивов будет рассмотрено дальше, при работе с указателями и памятью
В некоторых случаях можно узнать размер массива с помощью функции sizeof.
Но это вряд ли будет полезным. При передаче массива в качестве аргумента функции будет передаваться указатель, поэтому размер массива будет невозможно узнать.
Статические массивы удобны, когда заранее известно число элементов. Они предоставляют быстрый, но небезопасный доступ до элементов.
Переполнение массива
П ускай у вас есть такой код
- 1. Используйте тип size_t для индексирования. Он обезопасит вас от отрицательных значений и его всегда хватит для массива любого размера.
- 2. Помните, что массив начинается с нуля.
- 3. Последний элемент массива имеет индекс (размер массива — 1)
Примеры
Т еперь несколько типичных примеров работы с массивами
1. Переворачиваем массив.
Здесь незнакомая для вас конструкция
макрос. Во всём коде препроцессор автоматически заменит все вхождения SIZE на 10u.
2. Удаление элемента, выбранного пользователем.
Удаление элемента в данном случае, конечно, не происходит. Массив остаётся того же размера, что и раньше. Мы просто затираем удаляемый элемент следующим за ним и выводим SIZE-1 элементов.
3. Пользователь вводит значения в массив. После этого вывести все разные значения, которые он ввёл.
Пусть пользователь вводит конечное число элементов, допустим 10. Тогда заранее известно, что всего различных значений будет не более 10. Каждый раз, когда пользователь вводит число будем проходить по массиву и проверять, было ли такое число введено.
4. Пользователь вводит число — количество измерений (от 2 до 10). После этого вводит все измерения. Программа выдаёт среднее значение, дисперсию, погрешность.
5. Сортировка массива пузырьком
6. Перемешаем массив. Воспользуемся для этого алгоритмом Fisher-Yates:
Для i от N-1 до 1 выбираем случайное число j в пределах от 0 до i и меняем местами i-й и j-й элементы.

Всё ещё не понятно? – пиши вопросы на ящик
Как удалить элемент массива?

Третий пункт решается просто — вам нужно передвинуть элементы в массиве: присвоить a[i]=a[i+1] в цикле.
Я думаю, вам запрещено использовать STL, так что пишите циклы.
Формат данного сайта запрещает совмещать кучу вопросов в один, так что постарайтесь разделить темы.
- Вконтакте

В массивы C/C++ нельзя ничего добавлять и из них нельзя ничего удалять, массивы C/C++ статические.
Можно только создавать новые массивы, «похожие» на своих предшественников, где будет элементов больше или меньше . и каждый раз — копирование всех нужных элементов.
Добавлю:
— по п.п.4-5 — наслаждайтесь (случайные числа я генерить не стал — так нагляднее):
— а чтобы вою было меньше . исполняем:
— кстати, тот же трюк (без всяких malloc()) можете проделать и в современном C 😉