Попытка найти числа, повторенные в двух массивах - PullRequest
0 голосов
/ 26 мая 2011

Я пытаюсь найти все числа, которые повторяются в двух массивах .. Например:

array1[2]:    1,2 

array2[2]:    1,5

Число, которое повторяется: 1, поэтому мы создаем новый массив, который будет содержать 1.

array3[2]:    1

Мой код:

int func1(int  *str, int *str2)
{
    int i,j,temp,c[10];
    for(i=0;i<*(str+i);i++){
        for(j=0;j<*(str2+j);j++){
            if(*(str+i) == *(str+j))
            {
                temp = *(str+i);
                *(str+i) = temp;
                temp = *(c+i);
                return c[i];
            }
        }
    }
    return 0;
}

В чем проблема? (Логически)

Спасибо.

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

Есть несколько проблем:

  1. Условия в двух циклах for нечетны и, вероятно, неверны. Они эквивалентны:

    for (i = 0; i < str1[i]; i++)
        for (j = 0; j < str2[j]; j++)
    
  2. Вероятно, вы должны указать размеры входных массивов в интерфейсе функции.

  3. В C вы должны всегда знать размеры массивов.
  4. Вероятно, вы должны указать выходной массив в интерфейсе функции.
  5. Поскольку вам нужно будет узнать, сколько значений было найдено совместно, вам нужно будет вернуть это число из функции.
  6. Ваш выбор имен str1 и str2 необычен. Не технически неправильно, но, вероятно, не очень хорошая идея. Такие имена должны быть зарезервированы для символьных строк, а не массивов целых чисел.
  7. Ваш локальный массив c почти не используется и не используется безопасно.
  8. Ваш код возвращается, когда находит первую пару совпадающих чисел, а не все возможные совпадения.
  9. Первые две строки тела оператора if тщательно копируют значение в str[i] обратно в себя через temp.
  10. Третья строка тела оператора if копирует неинициализированное значение из массива c в переменную temp.
  11. Последняя строка тела if возвращает это неинициализированное значение.

Это добавляет к таким изменениям, как:

int func1(int *arr1, int num1, int *arr2, int num2, int *arr3)
{
    int k = 0;
    for (int i = 0; i < num1; i++)
    {
        for (int j = 0; j < num2; j++)
        {
            if (arr1[i] == arr2[j])
                arr3[k++] = arr1[i];
        }
    }
    return k;
}

Обратите внимание, что в этом коде предполагается, что размер arr3 (массив, а не сам указатель) такой же большой, как произведение num1 и num2. Если оба массива содержат список с одним и тем же значением, то в выходном массиве будет одна строка arr3 для каждой пары, поэтому он может использовать num1 * num2 строк. Это указывает на то, что код не имеет дело с подавлением дубликатов; если вам это нужно (скорее всего), тогда в теле оператора if необходимо выполнить поиск текущих значений в arr3, чтобы убедиться, что новое значение отсутствует. Было бы целесообразно добавить еще один параметр, int siz3, чтобы указать размер третьего массива; если вам не хватит места для значений, вы можете вернуть -1 в качестве индикации ошибки.

Кодированный алгоритм является квадратичным (или, точнее, пропорциональным произведению num1 * num2). Если вы знаете, что массивы сортируются при входе, вы можете уменьшить его до линейного алгоритма (пропорционального num1 + num2). С удалением дубликатов, это немного дороже - это не так просто, как «кубический». Если вы знаете, что входные массивы содержат уникальные значения (без дубликатов), удаление дубликатов, очевидно, не требуется.

1 голос
/ 26 мая 2011
 for(i=0;i<*(str+i);i++){
        for(j=0;j<*(str2+j);j++){

Не правы. Вы применяете условие «<» к целому числу к себе, и, следовательно, разрывается условие цикла. Итак, цикл никогда не запускается. </p>

И почему вы используете эти избыточные операторы?

 temp = *(str+i);
 *(str+i) = temp;

Кроме того, это неправильно

temp = *(c+i);
return c[i];

Попробуйте еще раз исправить эти утверждения. Если вы не можете повторить, я предоставлю вам решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...