アレイから重複を削除し、別のアレイに保存します[重複]
私は、別の既存の配列から重複した値を使用せずに配列を作成するように依頼されました。だから私はそれをしました、しかし私はそれをする他のより良い方法があるか知りたいです。
入出力例
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()
、3つをリンクする単純な関数を作成する価値があります。
フラグ「重複」は、内側のループを再配置することで回避できます。これはコンパクトなバージョンです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
}
これはより対称的です。この永遠のループ(中間式なし)の2つの終了条件を簡単に比較できます。
最初j
にARRAY_SIZEに達しているかどうかを確認してから、でのみ使用することが重要m[j]
です。
120000000...000012
私のような配列の場合、新しい一意の配列を検索する方が速いと思います...しかし、そうです、それがソートが最初の(そしてメインの)ステップとして役立つ理由です。
最初の(コンパクトな)バージョンはさらに間違っています。m[j]
最後の要素についてはすでに違法になります。
for (int j = i + 1; m[i] != m[j];...