アレイから重複を削除し、別のアレイに保存します[重複]

Nov 24 2020

私は、別の既存の配列から重複した値を使用せずに配列を作成するように依頼されました。だから私はそれをしました、しかし私はそれをする他のより良い方法があるか知りたいです。

入出力例

Input1, 15, 1, 5, 1, 3

Output1, 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()、3つをリンクする単純な関数を作成する価値があります。

1 Noname Nov 24 2020 at 18:25

フラグ「重複」は、内側のループを再配置することで回避できます。これはコンパクトなバージョンです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];...