어레이에서 중복을 제거하고 다른 어레이에 저장 [중복]
나는 다른 기존 배열에서 중복 값없이 배열을 만드는 임무를 받았습니다. 그래서 해냈지만 다른 더 좋은 방법이 있는지 알고 싶습니다.
입력 / 출력 예
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;
}
몇 가지 제안을 원합니다.
미리 감사드립니다. :)
답변
입력에 실제로 숫자 사이에 쉼표가있는 경우 여기에서 허용하고 싶을 것입니다.
scanf("%d",&m[i]);
어쨌든에서 반환 값을 확인하는 것이 중요합니다 scanf()
. 그렇지 않으면 제대로 초기화되지 않은 값을 사용할 수 있습니다.
입력, 출력 및 처리를 위해 별도의 함수를 작성한 다음 main()
세 가지를 함께 연결 하는 간단한 함수를 작성하는 것이 좋습니다.
내부 루프를 재 배열하여 "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
}
이것은 더 대칭 적입니다. 이 영원한 루프의 두 종료 조건을 쉽게 비교할 수 있습니다 (중간 표현식 없음).
j
ARRAY_SIZE에 도달 했는지 먼저 확인한 다음에서 사용하는 것이 중요합니다 m[j]
.
120000000...000012
내가 생각하는 것과 같은 배열의 경우 새롭고 고유 한 배열에서 검색하는 것이 더 빠를 것입니다.
첫 번째 (콤팩트 한) 버전도 잘못되었습니다 . m[j]
이미 마지막 요소에 대해 불법입니다.
for (int j = i + 1; m[i] != m[j];...