集合的交并差

本文探讨如何在C语言中进行集合的基本操作,包括计算两个集合的交集、并集和差集,详细阐述了相关算法和实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合的交并差

#include"stdio.h"
#include"stdlib.h"//exit函数的头文件
#include"time.h"
#define NUMBER1 7
#define NUMBER2 5
void collection(int Exple[], int);
void showElem(int Exple[], int);
int colCut_A_B(int A[],int B[],int C[], int, int);//A-B
int  colCross_A_B(int A[], int  B[], int  C[], int, int);//A∩B
int sum_A_B(int A[], int  B[], int C[], int, int);//A∪B
void menu()
{
	printf("1---输入集合A和B\n");
	printf("2---求集合A交B\n");
	printf("3---求集合A并B\n");
	printf("4---求集合A-B\n");
	printf("退出,输入一个负数!\n");
}
int main()
{
	srand((unsigned)time(NULL));
	int A[NUMBER1] = { 0 };
	int B[NUMBER2] = { 0 };
	int C[NUMBER1 + NUMBER2] = { 0 };
	int D[NUMBER1] = { 0 };
	int E[NUMBER1] = { 0 };
	int option = 0;
	while (true)
	{
		menu();
		printf("请输入你要进行的操作:");
		scanf("%d", &option);
		if (option >= 0)
		{
			switch (option)
			{
			case 1:
			{
					  collection(A, NUMBER1);
					  showElem(A, NUMBER1);
					  collection(B, NUMBER2);
					  showElem(B, NUMBER2);
			}
				break;
			case 2:
				//printf("求集合A交B\n");
			{
					  int num=colCross_A_B(A, B, C, NUMBER1, NUMBER2);
					  printf("\n求得交集的结果为:");
					  showElem(C, num);
			}
				break;
			case 3:
				//printf("求集合A并B\n");
			{
					  int num = sum_A_B(A, B, C, NUMBER1, NUMBER2);
					  printf("\n求得并集的结果为:");
					  showElem(C, num);
			}
				break;
			case 4:
				//printf("求集合A-B\n");
			{
					  int num = colCut_A_B(A, B, C, NUMBER1, NUMBER2);
					  printf("\n求得相对补(-)的结果为:");
					  showElem(C, num);
			}
				break;
			default:
				printf("请输入1-4的数字\n");
			}
		}
		else{
			printf("程序退出成功\n");
			exit(0);
		}
	}

	return 0;
}
void collection(int Exple[], int num)
{
	//printf("进去了");
	int flag = 0, value = 0, i, j;
	//利用随机数往集合中添加元素
	for (i = 0; i < num; i++)
	{
		//value:临时存放随机数的值
		//flag:跳出for循环之后,while循环关闭与否的条件
		flag = 1;
		while (flag)
		{
			//printf("进去了while循环了");
			value = 1 + rand() % 10;
			for (j = 0; j <= i; j++)
			{
				if (i == 0)//第一个数不可能存在重复,可以直接赋值
				{
					flag = 0;		//第一次写的时候这个地方没写出来
					break;
				}
				if (value == Exple[j])
					break;
				if (value != Exple[j] && j == i - 1)
				{
					flag = 0;//跳for循环之后,作为跳出while循环的条件
					break;//跳出for循环
				}
			}
			Exple[i] = value;
		}
	}
}
void showElem(int Exple[], int num)
{
	for (int i = 0; i < num; i++)
	{
		printf("%d ", Exple[i]);
	}
	printf("\n");
}
int colCut_A_B(int A[], int B[], int C[], int num1, int num2)//A-B
{
	int num = 0, i, j;
	for (i = 0; i < num1; i++)//从集合A中拿出一个数据
	{
		for (j = 0; j < num2; j++)
		{
			if (A[i] == B[j])
			{
				break;
			}
		}
		if (j == num2)
		{
			//此时会有两种情况,A[i] == B[j]相等时跳出循环
			//第二种情况就是遍历完集合B中的数组后不存在相同的元素
			C[num++] = A[i];
		}
	}
	return num;//返回数组C中的元素的个数
}
int  colCross_A_B(int A[], int  B[], int  C[], int num1, int num2)//A∩B
{
	int num = 0, i, j;
	for (i = 0; i < NUMBER1; i++)
	{
		//把A中的元素拿出来一个和B中的比较
		for (j = 0; j < NUMBER2; j++)
		{
			if (A[i] == B[j])
			{
				C[num++] = A[i];
			}
		}
	}
	return num;
}
int sum_A_B(int A[], int  B[], int C[], int num1, int num2)//A∪B
{
	int num = 0, i, j;
	for (i = 0; i < num1; i++)
	{
		C[num++] = A[i];//先把集合A中的元素赋值给集合C
	}
	for (i = 0; i < num2; i++)
	{
		for (j = 0; j < num1; j++)
		{
			if (B[i] == A[j])//从几个B中拿出元素和集合A中的比较
			{
				break;
			}
		}
		if (j == num1)
		{
			C[num++] = B[i];
		}
	}
	return num;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭就是我的姓i

你的鼓励是我创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值