어레이에서 중복을 제거하고 다른 어레이에 저장 [중복]

Nov 24 2020

나는 다른 기존 배열에서 중복 값없이 배열을 만드는 임무를 받았습니다. 그래서 해냈지만 다른 더 좋은 방법이 있는지 알고 싶습니다.

입력 / 출력 예

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

Output: 1, 15, 5, 3

내 코드

#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;
}

몇 가지 제안을 원합니다.

미리 감사드립니다. :)

답변

1 TobySpeight Nov 24 2020 at 19:55

입력에 실제로 숫자 사이에 쉼표가있는 경우 여기에서 허용하고 싶을 것입니다.

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

어쨌든에서 반환 값을 확인하는 것이 중요합니다 scanf(). 그렇지 않으면 제대로 초기화되지 않은 값을 사용할 수 있습니다.

입력, 출력 및 처리를 위해 별도의 함수를 작성한 다음 main()세 가지를 함께 연결 하는 간단한 함수를 작성하는 것이 좋습니다.

1 Noname Nov 24 2020 at 18:25

내부 루프를 재 배열하여 "dup"플래그를 피할 수 있습니다. 다음은 p[k++]=그 자리에서 바로 작업을 수행 할 수 있도록 약간의 내부가 포함 된 컴팩트 버전입니다 .

    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;
            }
        }
    }

명확성을 위해 거의 이것을 내부 루프로 선호합니다.


     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 
     }

이것은 더 대칭 적입니다. 이 영원한 루프의 두 종료 조건을 쉽게 비교할 수 있습니다 (중간 표현식 없음).

jARRAY_SIZE에 도달 했는지 먼저 확인한 다음에서 사용하는 것이 중요합니다 m[j].


120000000...000012내가 생각하는 것과 같은 배열의 경우 새롭고 고유 한 배열에서 검색하는 것이 더 빠를 것입니다.


첫 번째 (콤팩트 한) 버전도 잘못되었습니다 . m[j]이미 마지막 요소에 대해 불법입니다.

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