Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.148.71] |
|
Сообщ.
#1
,
|
|
|
В общем задача такая: есть 2 массива нужно создать третий, который будет собирать общие еллементы первого и второго массива. Чет ни как не могу врубиться как это осуществить.
Пробывал что то типа: if (array_1[i]==array_2[i]) array_3[]=array_1[i] но тогда запарка с циклом, не знаю что делать. |
Сообщ.
#2
,
|
|
|
Посмотри в сторону stl-алгоритма std::set_intersection.
|
Сообщ.
#3
,
|
|
|
Трудновато для меня
|
Сообщ.
#4
,
|
|
|
Хотя по сути - именно то, что тебе нужно. Использовать можешь так:
int array1[10] = {...}; int array2[10] = {...}; int array3[10]; std::set_intersection(array1, array1 + 10, array2, array2 + 10, array3); единственное условие - array1 и array2 должны быть отсортированы по возрастанию. |
Сообщ.
#5
,
|
|
|
Вы меня не поняли
я имеюю ввиду трудновато потому что не знаю что такое стд::и т.п. мне бы стандартными средствами, в данном случае размер и скорость работы программы не имеет значения! |
Сообщ.
#6
,
|
|
|
Цитата zip, 20.02.04, 17:09 мне бы стандартными средствами Да куда уж стандартнее... Только в состав инклюдов надо включить: #include <algorithm> |
Сообщ.
#7
,
|
|
|
Да дело в том что преподаватель офигеет когда такое увидет! Сразу скажет что явно не я делал!
а стандартными средствами я имею ввиду не подключая библиотек кроме <iostream.h> ну и для генерация массива <stdlib.h> |
Сообщ.
#8
,
|
|
|
Цитата zip, 20.02.04, 17:15 Да дело в том что преподаватель офигеет когда такое увидет! Ну так с этого и надо было начинать. Тогда предлагаю посмотреть на реализацию: int* __set_intersection(int* __first1, int* __last1, int* __first2, int* __last2, int* __result) { while (__first1 != __last1 && __first2 != __last2) if (*__first1 < *__first2) ++__first1; else if *__first2 < *__first1) ++__first2; else { *__result = *__first1; ++__first1; ++__first2; ++__result; } return __result; } Но этот алгоритм предполагает, что последовательности отсортированы. |
Сообщ.
#9
,
|
|
|
Вот, вот это уже гораздо реальнее! Спасибо! Щас буду рабираться!
|
Сообщ.
#10
,
|
|
|
Цитата zip, 20.02.04, 16:52 Пробывал что то типа: if (array_1[i]==array_2[i]) array_3[]=array_1[i] но тогда запарка с циклом, не знаю что делать. Думать, не торопясь. Вот, если взять элемент первого массива и поискать такой же во втором? Если найдётся, значит, это - общий элемент. Ну и так далее, для каждого элемента первого массива повторить. Если элементы повторяются, можно проверять, нет ли уже такого общего элемента в третьем массиве. Предположим, массивы хранят int. ... int i, j, k = 0; /* Для каждого элемента первого массива */ for(i = 0; i < sizeof array1 / sizeof *array1; i++) { /* В целях эффективности в дальнейшем пользуемся локальной переменной */ int element = array1[i]; /* Ищем во втором массиве */ for(j = 0; j < sizeof array2 / sizeof *array2; j++) /* Если такой же элемент есть во втором массиве */ if(element == array2[j]) { /* Если требуется отсечь повторяющиеся элементы */ #ifdef UNIQUE int l; /* Проверяем, есть ли такой уже в третьем массиве */ for(l = 0; l < k; l++) if(element == array3[l]) break; /* Если такого элемента в array3 ещё нет */ if(l == k) /* Запоминаем его в третьем массиве и увеличиваем счётчик общих */ array3[k++] = element; /* Если не требуется отсекать повторяющиеся элементы */ #else /* Запоминаем его в третьем массиве и увеличиваем счётчик общих */ array3[k++] = element; #endif /* Обрываем сканирование array2 */ break; } } На выходе k содержит количество общих элементов. Те конструкции, что не можешь внятно объяснить, замени на собственные, а то препод не поверит. Например, такой конструкцией может быть sizeof array1 / sizeof *array1, - можешь заменить конкретными числами, к примеру. Реализация - в лоб, неэффективная. Можно найти более эффективные алгоритмы решения поставленной задачи. Edward. |