N個のランダムに配置された数値の配列から、重複要素を調べるプログラムをc言語で作成したいです。
分かる方返信お願いします。
配列に関する質問です。
-
- 記事: 48
- 登録日時: 7年前
Re: 配列に関する質問です。
stdio.hと乱数作成の為にstdlib.hをインクルードしておいて
で良いのでは?
最後に編集したユーザー littlestream on 2019年5月05日(日) 22:02 [ 編集 1 回目 ]
Re: 配列に関する質問です。
調べた結果をどのように表示したいのですか?
具体的な例で考えてみてください。
int a[5] = { 3, 1, 4, 2, 5 };
int b[5] = { 3, 1, 4, 1, 3 };
int c[5] = { 3, 3, 3, 3, 3 };
配列 a の場合、重複要素なし。
配列 b の場合、b[0] と b[4] が重複、b[1] と b[3] が重複。
配列 c の場合、全部の要素が重複。
これをどのように表示したいのですか?
返信してもらえれば、私はプログラムを作成できますが、
そうすると picusicu さんの「プログラムを作成したい」という
強い願望を台無しにしてしまうことになりませんか?
具体的な例で考えてみてください。
int a[5] = { 3, 1, 4, 2, 5 };
int b[5] = { 3, 1, 4, 1, 3 };
int c[5] = { 3, 3, 3, 3, 3 };
配列 a の場合、重複要素なし。
配列 b の場合、b[0] と b[4] が重複、b[1] と b[3] が重複。
配列 c の場合、全部の要素が重複。
これをどのように表示したいのですか?
返信してもらえれば、私はプログラムを作成できますが、
そうすると picusicu さんの「プログラムを作成したい」という
強い願望を台無しにしてしまうことになりませんか?
Re: 配列に関する質問です。
ソートしたら、要素番号が変わりますが、
元の要素番号を表示したいのですか?
それとも、要素番号はどうでもいいから、
2個以上重複する要素の値を表示したいのですか?
例えば、
int a[8] = { 30, 10, 40, 20, 50, 40, 30, 30 };
という配列があった時、
・重複要素の番号の場合、
0 6 7
2 4
・重複要素の値の場合、
30
40
・重複要素の値と元の要素番号の両方の場合
30: 0 6 7
40: 2 4
・重複要素の値とその個数の場合
30: 3
40: 2
とにかく、どんな表示を期待しているのかを決めないと
プログラムは書けません。
ところで、[url=rules]フォーラム(掲示)板ルー[/urlルは読みましたか?
使用するプログラミング言語は C ですか、C++ ですか?
Re: 配列に関する質問です。
すみません。タグの使い方を間違ったままプレビューもせずに
回答を送信してしまったことをお詫びします。正しくは、
「ところで、フォーラム(掲示板)ルールは読みましたか?」
です。
これも申し訳ありません。最初の質問に「C言語で」と明示されていましたね。かずま さんが書きました: ↑5年前使用するプログラミング言語は C ですか、C++ ですか?
お詫びに、重複要素の値だけを表示する Cプログラムをお見せします。
#include <stdio.h>
int comp(const void *ap, const void *bp)
{
int a = *(int*)ap, b = *(int*)bp;
return a < b ? -1 : a > b;
}
int main(void)
{
int a[] = { 30, 10, 40, 20, 50, 40, 30, 30 };
const int n = sizeof a / sizeof *a;
int dup = 0; // 重複要素値表示済みフラグ
qsort(a, n, sizeof *a, comp);
for (int i = 1; i < n; i++)
if (a[i] != a[i-1]) dup = 0;
else if (!dup) printf("%d\n", a[i]), dup = 1;
}
重ねてお願いします。
重複要素を調べた結果をどのように表示したいのかを教えてください。
Re: 配列に関する質問です。
すみません。このままでも、コンパイルできて実行もできると思いますが、かずま さんが書きました: ↑5年前お詫びに、重複要素の値だけを表示する Cプログラムをお見せします。
#include <stdlib.h> を先頭に追加してください。
使用する関数 qsort の宣言がそこにあるはずです。
出題者は、ソートに標準関数の qsort ではなく、自前のソートを書いて
使うことを要求しているのかもしれませんね。どうなんでしょうか?
Re: 配列に関する質問です。
すみません。かずま さんが書きました: ↑5年前例えば、
int a[8] = { 30, 10, 40, 20, 50, 40, 30, 30 };
という配列があった時、
....
・重複要素の値と元の要素番号の両方の場合
30: 0 6 7
40: 2 4
30: 0 6 7
40: 2 5
の間違いでした。
このように出力するための C++プログラム
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main()
{
int a[] = { 30, 10, 40, 20, 50, 40, 30, 30 };
const int n = sizeof a / sizeof *a;
map<int, vector<int>> m;
for (int i = 0; i < n; i++) m[a[i]].push_back(i);
for (auto& p : m)
if (p.second.size() > 1) {
cout << p.first << ':';
for (int i : p.second) cout << ' ' << i;
cout << endl;
}
}
#include <stdio.h>
#include <stdlib.h> // malloc, free
int main(void)
{
int a[] = { 30, 10, 40, 20, 50, 40, 30, 30 };
const int n = sizeof a / sizeof *a;
int *c = malloc(sizeof a);
int i, j, k;
for (i = 0; i < n; i++) c[i] = i;
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
if (a[c[i]] > a[c[j]]) k = c[i], c[i] = c[j], c[j] = k;
k = 0; // 重複検出フラグ
for (i = 0; i < n-1; i++)
if (a[c[i]] == a[c[i+1]]) {
if (!k) printf("%d:", a[c[i]]);
printf(" %d", c[i]), k = 1;
}
else if (k) printf(" %d\n", c[i]), k = 0;
if (k) printf(" %d\n", c[i]);
free(c);
}