ページ 11

配列に関する質問です。

Posted: 2019年5月05日(日) 20:48
by picusicu
N個のランダムに配置された数値の配列から、重複要素を調べるプログラムをc言語で作成したいです。
分かる方返信お願いします。

Re: 配列に関する質問です。

Posted: 2019年5月05日(日) 22:00
by littlestream
stdio.hと乱数作成の為にstdlib.hをインクルードしておいて

コード:

#define N 100
int RNDTBL[N];として、二重ループで
if(RNDTBL[i]==RNDTBL[j] && i!=j)
{
   //重複している
}
で良いのでは?

Re: 配列に関する質問です。

Posted: 2019年5月05日(日) 22:02
by かずま
調べた結果をどのように表示したいのですか?

具体的な例で考えてみてください。

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: 配列に関する質問です。

Posted: 2019年5月07日(火) 12:40
by picusicu
最初に配列をソートしてから重複要素だけを表示したいです。

Re: 配列に関する質問です。

Posted: 2019年5月07日(火) 14:07
by かずま
picusicu さんが書きました:
5年前
最初に配列をソートしてから重複要素だけを表示したいです。
ソートしたら、要素番号が変わりますが、
元の要素番号を表示したいのですか?

それとも、要素番号はどうでもいいから、
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: 配列に関する質問です。

Posted: 2019年5月07日(火) 23:31
by かずま
かずま さんが書きました:
5年前
ところで、[ url=rules]フォーラム(掲示)板ルー[/urlルは読みましたか?
すみません。タグの使い方を間違ったままプレビューもせずに
回答を送信してしまったことをお詫びします。正しくは、
「ところで、フォーラム(掲示板)ルールは読みましたか?」
です。
かずま さんが書きました:
5年前
使用するプログラミング言語は C ですか、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;
}
実行結果

コード:

30
40
分からないところは、質問してくだされば、説明します。

重ねてお願いします。
重複要素を調べた結果をどのように表示したいのかを教えてください。

Re: 配列に関する質問です。

Posted: 2019年5月07日(火) 23:41
by かずま
かずま さんが書きました:
5年前
お詫びに、重複要素の値だけを表示する Cプログラムをお見せします。
すみません。このままでも、コンパイルできて実行もできると思いますが、
#include <stdlib.h> を先頭に追加してください。
使用する関数 qsort の宣言がそこにあるはずです。

出題者は、ソートに標準関数の qsort ではなく、自前のソートを書いて
使うことを要求しているのかもしれませんね。どうなんでしょうか?

Re: 配列に関する質問です。

Posted: 2019年5月16日(木) 16:41
by かずま
かずま さんが書きました:
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;
		}
}
Cプログラムだと

コード:

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