Компания ALT Linux
Опубликован: 07.03.2015 | Доступ: свободный | Студентов: 2137 / 487 | Длительность: 24:14:00
Лекция 5:

Массивы

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

Для удаления элемента с индексом m из массива X, состоящего из n элементов, нужно записать (m + 1)-й элемент на место элемента m, (m + 2)-й — на место (m+1)-го и т.д., (n-1)-й — на место (n-2)-го. После удаления количество элементов в массиве уменьшилось на 1 (рис. 5.11).

Алгоритм удаления элемента из массива

Рис. 5.11. Алгоритм удаления элемента из массива

Фрагмент программы на С++:

cout<<" \n m = "; cin>>m; //Ввод номера элемента, подлежащего удалению.
for ( i=m; i<n-1;X [ i ]=X [ i +1 ], i++); //Удаление m-го элемента.
n--;
for ( i =0; i<n-1; i++)cout<<X [ i ]<<" \t "; //Вывод изменённого массива.

При написании программ, в которых удаляются элементы из массива, следует учитывать тот факт, что после удаления элемента все элементы, расположенные после удалённого, изменяют свои номера (индексы уменьшаются на один). Это особенно важно при удалении нескольких элементов из массива. Рассмотрим несколько задач.

Задача 5.7. Удалить из массива x[20] все элементы с пятого по десятый.

При решении задач, связанных с удалением подряд идущих элементов, следует понимать, что после удаления очередного элемента следующий переместился на место удалённого. Поэтому далее нужно будет удалять элемент с тем же самым номером. В нашем случае подлежит удалению 6 элементов с пятого по десятый. Однако, реально надо будет 6 раз удалить элемент с номером 5. Блок-схема алгоритма представлена на рис 5.12, текст программы приведён далее.

#include <iostream>
#include <math.h>
using namespace std;
int main ( int argc, char **argv )
{
	int i, j, n=20;
	float x [ n ]; //Выделяем память для динамического массива x.
	cout<<"Введите элементы массива X \n "; //Ввод элементов массива.
	for ( i =0; i<n; i++)
		cin>>x [ i ];
	for ( j =1; j <=6; j++) //Шесть раз повторяем алгоритм удаления элемента с индексом 5.
		for ( i =5; i<n-j; i++) //Удаление элемента с индексом 5.
			x [ i ]=x [ i + 1 ];
	cout<<"Преобразованный массив X \n "; //Вывод элементов массива.
	for ( i =0; i<n-6; i++)
		cout<<x [ i ]<<" \t ";
	cout<<endl;
	return 0;
}
Алгоритм решения задачи 5.7

Рис. 5.12. Алгоритм решения задачи 5.7

Задача 5.8. Удалить из массива X[n] все положительные элементы.

При удалении отдельных элементов из массива следует учитывать: при удалении элемента (сдвиге элементов влево и уменьшении n) не надо переходить к следующему, а если элемент не удалялся, то, наоборот, надо переходить к следующему.

Далее приведён текст программы решения задачи 5.8.

#include <iostream>
#include <math.h>
using namespace std;
int main ( int argc, char **argv )
{
	int i, j, n;
	cout<<" n = "; cin>>n;
	float x [ n ]; //Выделяем память для динамического массива x.
	cout<<"Введите элементы массива X \n "; //Ввод элементов массива.
	for ( i =0; i<n; i++)
		cin>>x [ i ];
	for ( i =0; i<n; )
		if ( x [ i ] >0) //Если текущий элемент положителен,
		{ //то удаляем элемент с индексом i.
			for ( j= i; j<n-1; j++)
			x [ j ]=x [ j + 1 ];
			n--;
		}
		else i ++; //иначе — переходим к следующему элементу массива.
	cout<<"Преобразованный массив X \n "; //Вывод элементов массива.
	for ( i =0; i<n; i++)
		cout<<x [ i ]<<" \t ";
	cout<<endl;
	return 0;
}
Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?