配列から共通の文字を取り出したいです

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
プログラミング難しい
記事: 2
登録日時: 2年前

配列から共通の文字を取り出したいです

#1

投稿記事 by プログラミング難しい » 2年前

1.やりたいこと
配列1にABCDE
配列2にABDEF
が入っていた時にお互いの配列の共通点の数を取り出す
(今回だったらABDEが共通しているので4を取り出す)
ようなプログラミングをc言語で書きたいです。
2.作っているプログラム
#include <stdio.h>
#include <stdbool.h>
#include <math.h>

//節点
enum { S, A, B, C, D, E, F, G }; //Sは終端を表す

//枝の正常確率
double r = 0.9;

#define N 7
#define M 4


// 隣接リスト
int a[N + 1][M] = {
{S},
{B, C, S},
{A, C, D, S},
{A, B, E, S},
{B, E, F, S},
{C, D, G, S},
{D, S},
{E, S},
};

//隣接リスト表示
void printlist(void)
{
printf("入力した隣接リスト\n");
for (int i = 1; i <= N; i++)
{
// 隣接リストの成分判定
int edges[N + 1] = { 0 };
for (int j = 0; j < M; j++)
{
int y = a[j];
if (y == 0) {
edges[y] = 0;
}
else {
edges[y] = 1;
}
}
// 行の出力
printf("%d", edges[1]);
for (int j = 2; j <= N; j++)
{
printf(" %d", edges[j]);
}
printf("\n");
}
printf("\n");
}


// 経路
int path[N];
bool visited[N + 1];

// 経路の表示
void print_path(int n)
{
printf("経路%d ", n);
for (int i = 0; i < n; i++)
{
printf("%c ", 'A' + path - 1);
}
printf("\n");
for (int i = 0; i < n; i++)
{
printf("%d ", path );
}
printf("\n");
}



//タイセットごとの正常確率計算
void reliability(int n)
{
int i = 1;
n = n--;

printf("正常確率=%lf\n", pow(r, n));

probability(n);

}

//タイセットごとの正常確率
double arr[100];

//正常確率の格納
int probability(int n)
{
static int i = 1;


arr = pow(r, n);
return i++;
}


//タイセットの数
int tie_times(void)
{
static int count = 0;
return count++;
}


// 深さ優先探索
void dfs(int n, int goal)
{
int x = path[n - 1];
if (x == goal)
{
print_path(n);
reliability(n);
tie_times();

}
else
{
for (int i = 0; i < M; i++)
{
int y = a[x];
if (y == 0) break;
if (!visited[y])
{
path[n] = y;
visited[y] = true;
dfs(n + 1, goal);
visited[y] = false;
}
}
}
}




int main(void)
{
printlist();

path[0] = A;
visited[A] = true;
dfs(1, G);



printf("タイセットの数 %d\n", tie_times());

printf("正常 %lf", arr[1]);
printf("正常 %lf", arr[2]);
printf("正常 %lf", arr[3]);
printf("正常 %lf", arr[4]);
printf("\n");


return 0;
}

3.困っていること
書いてあるプログラムのほとんどがネットから持ってきたものなので、ネットで探して見つからないものができません。

4.知りたいこと
1.で述べたことが知りたいです。

5.c言語の自分の知識
昨日始めたので皆無です。

プログラミング難しい
記事: 2
登録日時: 2年前

Re: 配列から共通の文字を取り出したいです

#2

投稿記事 by プログラミング難しい » 2年前

コード:


#include <stdio.h>
#include <stdbool.h>
#include <math.h>

//節点
enum { S, A, B, C, D, E, F, G }; //Sは終端を表す

//枝の正常確率
double r = 0.9;

#define N 7
#define M 4


// 隣接リスト
int a[N + 1][M] = {
	{S},
	{B, C, S},
	{A, C, D, S},
	{A, B, E, S},
	{B, E, F, S},
	{C, D, G, S},
	{D, S},
	{E, S},
};

//隣接リスト表示
void printlist(void)
{
	printf("入力した隣接リスト\n");
	for (int i = 1; i <= N; i++)
	{
		// 隣接リストの成分判定
		int edges[N + 1] = { 0 };
		for (int j = 0; j < M; j++)
		{
			int y = a[i][j];
			if (y == 0) {
				edges[y] = 0;
			}
			else {
				edges[y] = 1;
			}
		}
		// 行の出力
		printf("%d", edges[1]);
		for (int j = 2; j <= N; j++)
		{
			printf(" %d", edges[j]);
		}
		printf("\n");
	}
	printf("\n");
}


// 経路
int path[N];
bool visited[N + 1];

// 経路の表示
void print_path(int n)
{
	printf("経路%d ", n);
	for (int i = 0; i < n; i++)
	{
		printf("%c ", 'A' + path[i] - 1);
	}
	printf("\n");
	for (int i = 0; i < n; i++)
	{
		printf("%d ",  path[i] );
	}
	printf("\n");
}



//タイセットごとの正常確率計算
void reliability(int n)
{
	int i = 1;
	n = n--;
	
	printf("正常確率=%lf\n", pow(r, n));

	probability(n);
	
}

//タイセットごとの正常確率
double arr[100];

//正常確率の格納
int probability(int n)
{
	static int i = 1;
	

	arr[i] = pow(r, n);
	return i++;
}


//タイセットの数
int tie_times(void)
{
	static int count = 0;
	return count++;
}


// 深さ優先探索
void dfs(int n, int goal)
{
	int x = path[n - 1];
	if (x == goal)
	{
		print_path(n);
		reliability(n);
		tie_times();
		
	}
	else
	{
		for (int i = 0; i < M; i++)
		{
			int y = a[x][i];
			if (y == 0) break;
			if (!visited[y])
			{
				path[n] = y;
				visited[y] = true;
				dfs(n + 1, goal);
				visited[y] = false;
			}
		}
	}
}




int main(void)
{
	printlist();

	path[0] = A;
	visited[A] = true;
	dfs(1, G);

	

	printf("タイセットの数 %d\n", tie_times());

	printf("正常 %lf", arr[1]);
	printf("正常 %lf", arr[2]);
	printf("正常 %lf", arr[3]);
	printf("正常 %lf", arr[4]);
	printf("\n");
	

	return 0;
}

見にくくてすみませんでした。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 配列から共通の文字を取り出したいです

#3

投稿記事 by みけCAT » 2年前

提示されているコードは残念ながらあまり関係無さそうなので一旦消すか脇に置いて、
まずは処理対象の「配列1」と「配列2」を用意しましょう。

配列を用意したら、以下のような手順で計算をするといいでしょう。
(各配列の要素に、配列内での重複が無い場合)

コード:

1. 共通点の数を0に初期化する
2. 配列1のそれぞれの要素について
   2-1. その要素が配列2にあるか検索する
        (線形探索、二分探索、ハッシュテーブルなど適当に)
   2-2. その要素が配列2にあれば、共通点の数を1増やす
配列内に重複した要素が存在しうる場合、まずは重複した要素をどう数えるかを定義するべきですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る