Копирование несортированного массива C в другой, избегая дублирования - PullRequest
1 голос
/ 17 января 2020

Привет всем и спасибо за ваше время.

Для упражнения я хотел написать программу, которая копирует все элементы из массива в другой массив, но без дубликатов. Единственное условие - я не могу изменить исходный массив - поэтому не сортирую.

Я попытался создать функцию, которая проверяет, найден ли текущий элемент array1 в массиве, в который мы копируем (array2). Если нет, то мы копируем элемент во второй массив и увеличиваем размер на один .

Однако, это не работает:

Если у меня

int array1[15] = {3,2,4,7,9,1,4,6,7,0,1,2,3,4,5};
int array2[15];

array2 должно содержать следующие числа: 3,2,4,7,9,1,6,0,5

Но мой вывод выглядит следующим образом: 3,2,4,7,9,1,6

Вот код:

#include <stdio.h>
#include <stdlib.h>

int already_exists(int array2[], int size_arr2, int element)
{

    int i;

    for(i=0; i<size_arr2; i++)
    {
        if(array2[i] == element)
            return 1;
    }
    return 0;
}

int main()
{
    int array1[15] = {3,2,4,7,9,1,4,6,7,0,1,2,3,4,5};
    int array2[15];
    int i;
    int size_arr2=0;

    for(i=0; i<9; i++)
    {
        int element = array1[i];

        if(already_exists(array2, size_arr2, element) == 1)
            continue;
        else
        {
            array2[size_arr2] = element;
            size_arr2++;
        }
    }

    for(i=0; i<size_arr2; i++)
    {
        printf("%d, ", array2[i]);
    }
    return 0;
}

1 Ответ

3 голосов
/ 18 января 2020

У вас есть опечатка для l oop

for(i=0; i<9; i++)

Массив array1 содержит 15 элементов. Таким образом, l oop должно выглядеть так:

for ( i = 0; i < 15; i++ )

Причина ошибки в том, что вы используете «маги c числа» вместо именованных констант.

Тем не менее программа в Целое неэффективно, потому что функция already_exists вызывается для каждого элемента массива array1. По крайней мере, вы можете объявить ее как встроенную функцию.

Более того, она должна быть объявлена ​​как

int already_exists( const int array2[], size_t size_arr2, int element );

Вместо этой функции лучше написать функцию, которая выполняет полную операцию.

Вот демонстрационная программа.

#include <stdio.h>

size_t copy_unique( const int a1[], size_t n1, int a2[] )
{
    size_t n2 = 0;

    for ( size_t i = 0; i < n1; i++ )
    {
        size_t j = 0;
        while ( j < n2 && a2[j] != a1[i] ) j++;

        if ( j == n2 ) a2[n2++] = a1[i];
    }

    return n2;
}

int main(void) 
{
    enum { N = 15 };
    int array1[N] = { 3, 2, 4, 7, 9, 1, 4, 6, 7, 0, 1, 2, 3, 4, 5 };
    int array2[N];

    for ( size_t i = 0; i < N; i++ ) printf( "%d ", array1[i] );
    putchar( '\n' );

    size_t n2 = copy_unique( array1, N, array2 );

    for ( size_t i = 0; i < n2; i++ ) printf( "%d ", array2[i] );
    putchar( '\n' );

    return 0;
}

Его вывод

3 2 4 7 9 1 4 6 7 0 1 2 3 4 5 
3 2 4 7 9 1 6 0 5 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...