Другие языки программирования и технологии

Помогите с решением задач по С по теме "Динамическое выделение памяти"!

Буду рад любой помощи!

1. Даны два массива: А [M] и B[N] (M и N вводятся с клавиатуры). Необходимо создать третий массив минимально возможного размера, в котором нужно собрать элементы массива A, которые не включаются в массив B, без повторений.
2. Даны два массива: А [M] и B[N] (M и N вводятся с клавиатуры). Необходимо создать третий массив минимально возможного размера, в котором нужно собрать элементы массивов A и B, которые не являются общими для них, без повторений.
3. Даны два массива: А [M] и B[N] (M и N вводятся с клавиатуры). Необходимо создать третий массив минимально возможного размера, в котором нужно собрать элементы обоих массивов.
4. Дан массив: А [M] (M вводится с клавиатуры). Необходимо удалить из массива четные или нечетные значения. Пользователь вводит данные в массив, а также с помощью меню решает, что нужно удалить.
Задачи 1-3 можно решать вместе.

Это делается в 4 этапа:

1. Отсортировать массивы A и B допустим по возрастанию. Можно отсеять повторяющиеся элементы в каждом из массивов по ходу сортировки, но можно этого и не делать, дальше я предполагаю последний вариант. Готовых алгоритмов сортировки в сети уйма.

2. Просмотреть массивы начиная с первого элемента, посчитать количество одинаковых элементов: A[i]!=A[i-1] и B[j]!=B[j-1] для i=1..(M-1) и j=1..(N-1). А можно считать количество повторений - это не принципиально. Для каждого уникального элемента массива А нужно проверить, что в массиве B есть элемент, который равен найденному. Если таковой будет обнаружен, то увеличить счетчик общих элементов.
Мой код рабочий, но скорее всего его зарубят за интеллектуальность, так как я это делаю за единственный проход по массивам, так что будьте проще, пишите сами
int i=0, j=0;
int sA=0, sB=0, s=0;
do {
 // пропустим одинаковые и сосчитаем повторения
 while ((i<M-1) && (A[i]==A[i+1])) ++i, ++sA;
 while ((j<N-1) && (B[j]==B[j+1])) ++j, ++sB;

 // для отладки
 printf("A[%d]=%d, B[%d]=%d\n", i, (i<M)?A[i]:0, j, (j<N)?B[j]:0);

 // когда один кончился, добираем остатки другого
 if (i==M) ++j;
 else if (j==N) ++i;
 // продвигаем минимальный
 else if (A[i]<B[j]) ++i;
 else if (B[j]<A[i]) ++j;
 // продвигаем синхронно
 else /* A[i]==B[j] */++i, ++j, ++s;
} while (i<M || j<N);
Результатом станет количество уникальных элементов массива A, массива B и число общих.

3. На основании сосчитанных уникальных элементов и длин массивов A и B найти длины результирующих массивов и отвести под них память, не забыть в конце программы эту память освободить.

4. Немного изменив код пункта 2, можно заставить его заполнять результирующие массивы. Специально именно для этого я оставил в коде отладочный вывод значений проверяемых уникальных элементов.
АА
Анатолий Андреев
11 112
Лучший ответ
почитай про malloc() и free()
Олег Сафонькин
Олег Сафонькин
75 320