На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Массивы
    В общем задача такая: есть 2 массива нужно создать третий, который будет собирать общие еллементы первого и второго массива. Чет ни как не могу врубиться как это осуществить.
    Пробывал что то типа: if (array_1[i]==array_2[i]) array_3[]=array_1[i] но тогда запарка с циклом, не знаю что делать.
    Сообщение отредактировано: zip -
      Посмотри в сторону stl-алгоритма std::set_intersection.
        Трудновато для меня :)
          Хотя по сути - именно то, что тебе нужно. Использовать можешь так:
          ExpandedWrap disabled
             
            int array1[10] = {...};
            int array2[10] = {...};
            int array3[10];
            std::set_intersection(array1, array1 + 10, array2, array2 + 10, array3);

          единственное условие - array1 и array2 должны быть отсортированы по возрастанию.
            Вы меня не поняли :)
            я имеюю ввиду трудновато потому что не знаю что такое стд::и т.п.
            мне бы стандартными средствами, в данном случае размер и скорость работы программы не имеет значения!
              Цитата
              zip, 20.02.04, 17:09
              мне бы стандартными средствами

              Да куда уж стандартнее... :)
              Только в состав инклюдов надо включить:
              #include <algorithm>
                Да дело в том что преподаватель офигеет когда такое увидет! Сразу скажет что явно не я делал! :(
                а стандартными средствами я имею ввиду не подключая библиотек кроме <iostream.h> ну и для генерация массива <stdlib.h>
                  Цитата
                  zip, 20.02.04, 17:15
                  Да дело в том что преподаватель офигеет когда такое увидет!

                  Ну так с этого и надо было начинать. Тогда предлагаю посмотреть на реализацию:
                  ExpandedWrap disabled
                     
                    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;
                    }

                  Но этот алгоритм предполагает, что последовательности отсортированы.
                  Сообщение отредактировано: Flex_Ferrum -
                    Вот, вот это уже гораздо реальнее! Спасибо! Щас буду рабираться! :)
                      Цитата
                      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.
                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0278 ]   [ 15 queries used ]   [ Generated: 15.05.24, 00:07 GMT ]