- •1. Двоичная система счисления.
- •2. Восьмеричная система счисления.
- •3. Шестнадцатеричная система счисления.
- •4. Сложение и вычитание в 2, 8 и 16 c/c.
- •2. Вещественные числа (числа с плавающей запятой).
- •3. Логические данные.
- •1. Алфавит языка Си
- •2. Элементы языка
- •3. Типы данных
- •1. Формульно-словесный способ.
- •2. Блок-схемный способ.
- •Ввод - вывод одномерного массива
- •2. Вывод одномерного массива на экран.
- •Примеры обработки одномерных массивов
- •Удаление элементов из массива
- •«Школьный» алгоритм сортировки
- •Группировка массива методом прямой выборки
- •Группировка массива методом прямого обмена
- •Вставка элемента в упорядоченный массив
- •1. Ввод элементов матрицы с клавиатуры.
- •2. Вывод матрицы на экран.
Удаление элементов из массива
Чтобы удалить элемент из массива , необходимо сдвинуть элементы на один "шаг" влево и уменьшить значение на 1. Если , то в этом случае достаточно выполнить .
Пример 1. Из массива Х удалить минимальный элемент.
#define NMAX 20
int main()
{
double Xmin, x[NMAX];
int n,i,imin;
//ВВод n и массива x
Xmin=x[0]; imin=0; // Определение положения
for (i=1; i<n; i++) // (индекса) минимального
if (x[i]<Xmin) // элемента
{ Xmin=x[i]; imin=i; }
for (i=imin; i<n-1; i++) // Удаление элемента
x[i]=x[i+1]; // с индексом imin
n--; // Уменьшение размера массива
//Печать массива x
getch();
return 0;
}
Если imin = n-1, то второй цикл for не работает (не выполняется условие входа в цикл), но размер массива n уменьшается на 1.
Пример 2. Из массива Х удалить все нулевые элементы.
В программе будем последовательно просматривать элементы массива и, если очередной элемент , то производим сдвиг подмассива на один элемент влево, одновременно уменьшая количество элементов .
Вариант 1.
#define NMAX 20
int main()
{
double x[NMAX];
int n=20,i,j;
//ВВод n и массива x
for (i=1; i<n; i++)
if (x[i]==0)
{
for (j=i; j<n-1; j++) // Удаление элемента
x[j]=x[j+1]; // с индексом i
n--; // Уменьшение размера массива
}
//Печать массива x
getch();
return 0;
}
По поводу программы вариант 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
i=0;
while ( i<n)
if (x[i]==0)
{
for (j=i; j<n-1; j++) // Удаление элемента
x[j]=x[j+1]; // с индексом i
n--; // Уменьшение размера массива
}
else i++;
//Печать массива x
Тот же эффект можно достичь с помощью оператора for, если просмотр массива выполнять справа налево.
Вариант 3 (фрагмент).
//ВВод n и массива x
for (i=n-1; i>=0; i--)
if (x[i]==0)
{
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
j=-1;
for (i=0; i<n-1; i++)
if (x[i]!=0)
{
j++;
if (j!=i) x[j]=x[i];
}
n=j+1;
//Печать массива x
В 4-м варианте перемещается лишь один элемент массива (и то не в каждом цикле), в то время как в предыдущих вариантах при удалении каждого элемента, кроме последнего, передвигается вся правая часть массива, причем чем ближе удаляемый элемент к началу массива, тем больше элементов перемещается справа налево. Этот способ является наиболее эффективным.