Удаление элемента массива по индексу
Динамически память не выделяете, STL не используете и режущий глаз вызов system(«PAUSE»); .
Судя по всему, много элементов удалять не придётся, а потому просто смещаете все элементы, кроме удаляемого, на 1 влево и уменьшаете длину массива на 1.
k - нужный индекс for (long i = k; i < n; ++i) < a[i] = a[i + 1]; >--n;
p.s. В C/C++ индексация массивов идёт с нуля. На будущее 😉
Отслеживать
ответ дан 28 ноя 2012 в 20:55
Алексей Лобанов Алексей Лобанов
1,202 9 9 серебряных знаков 22 22 бронзовых знака
Уточните, в массиве n или n+1 (как у автора вопроса) элементов? n+1 как-то глаз режет, а если n, то за границу вылазите.
28 ноя 2012 в 21:30
@avp n элементов, но мы «думаем», что индексация идёт с 1, как у ТС. И да, я согласен, это действительо глаз режет. p.s. Ну или, если быть кэпом, 3000 элементов.
Информатика. 10 класс (Повышенный уровень)
Среди задач преобразования элементов массива можно выделить задачи следующих типов:
1. Изменение элементов массива в зависимости от условий.
2. Обмен местами элементов в массиве.
3. Удаление элемента из массива.
4. Вставка элемента в массив.
Некоторые из задач преобразования массивов встречаются очень часто. Поэтому в класс vector были добавлены функции, позволяющие преобразовывать массивы.
Многие из функций для преобразования векторов аналогичны функциям преобразования строк как по синтаксису, так и выполняемому действию. Список функций можно посмотреть в Приложении к главе 1.
Удалить из массива элемент (С++)

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