Remova as duplicatas da matriz e salve-as em outra [duplicata]

Nov 24 2020

Recebi a tarefa de fazer um array sem valores duplicados de outro array existente. Então, eu fiz isso, mas quero saber se existe alguma outra maneira melhor de fazer isso.

Exemplo de entrada / saída

Input: 1, 15, 1, 5, 1, 3

Output: 1, 15, 5, 3

Meu código

#include <stdio.h>

int main(void) {
  const int ARRAY_SIZE = 5;

  int m[ARRAY_SIZE], p[ARRAY_SIZE];


  for(int i = 0; i < ARRAY_SIZE; i++) {
    printf("Enter number: ");
    scanf("%d",&m[i]);
  }
  // k variable is used to be the new indexing of the array p;
  int k = 0;

  // if it has a duplication dup is changed to 1;
  int dup = 0;
  
  // Loops through the array.
  for(int i =0; i < ARRAY_SIZE; i++) {
    for(int j = i +1; j <ARRAY_SIZE ; j++) {
        if(m[i] == m[j]) {
            dup = 1;
            break;
        }
    }
    if(dup != 1) {
      p[k++] = m[i];
    }
    dup = 0;
  }

  printf("The array without repeated values\n");

  for(int i = 0; i < k; i++) {
    printf("%d\n",p[i]);
  }

  return 0;
}

Eu quero algumas sugestões.

Desde já, obrigado. :)

Respostas

1 TobySpeight Nov 24 2020 at 19:55

Se a entrada realmente tiver vírgulas entre os números, então vamos permitir isso aqui:

scanf("%d",&m[i]);

Em qualquer caso, é importante verificar o valor de retorno de scanf(), caso contrário, poderíamos estar usando valores que não foram inicializados corretamente.

Provavelmente, vale a pena escrever funções separadas para entrada, saída e processamento e, em seguida, ter um sistema simples main()que ligue os três.

1 Noname Nov 24 2020 at 18:25

Um sinalizador "dup" pode ser evitado reorganizando o loop interno. Aqui está uma versão compacta, de alguma forma um pouco de dentro para fora para que possamos fazer nossas coisas p[k++]=na hora:

    for (int i = 0; i < ARRAY_SIZE; i++) {

        for (int j = i + 1; m[i] != m[j]; j++) { /*NO! m[i+1] will be illegal */

            if (j == ARRAY_SIZE) {
                p[k++] = m[i];        // copy this one, next "i" please
                break;
            }
        }
    }

Para maior clareza, quase prefiro isso como o loop interno:


     for (int j = i + 1;; j++) {

          if (j == ARRAY_SIZE) {
              p[k++] = m[i];        // copy this one, next please
              break;
          }
          if (m[i] == m[j])
              break;               // skip, next 
     }

Isso é mais simétrico; você pode comparar facilmente as duas condições de saída para este loop eterno (sem expressão do meio).

É importante primeiro verificar se jatingiu ARRAY_SIZE e só depois usar em m[j].


Para uma matriz como 120000000...000012eu acho que seria mais rápido pesquisar na nova e única matriz ... mas sim, é por isso que a classificação é uma primeira (e principal) etapa útil.


A primeira versão (compacta) está até errada . m[j]já será ilegal para o último elemento.

for (int j = i + 1; m[i] != m[j];...